diff options
| author | 2013-05-30 17:41:32 -0300 | |
|---|---|---|
| committer | 2013-05-30 17:41:32 -0300 | |
| commit | 47320d60c110fe6058937f996da750caf669d7ed (patch) | |
| tree | 73288c7b833daa42ac200025ed41c940cc8a76f9 /nikola/plugins/task_render_posts.py | |
| parent | 432fee57865e02af455e877a9597ef730397146c (diff) | |
| parent | f794eee787e9cde54e6b8f53e45d69c9ddc9936a (diff) | |
Merge tag 'upstream/5.4.4'
Upstream version 5.4.4
Diffstat (limited to 'nikola/plugins/task_render_posts.py')
| -rw-r--r-- | nikola/plugins/task_render_posts.py | 84 |
1 files changed, 74 insertions, 10 deletions
diff --git a/nikola/plugins/task_render_posts.py b/nikola/plugins/task_render_posts.py index a4d5578..4be68bf 100644 --- a/nikola/plugins/task_render_posts.py +++ b/nikola/plugins/task_render_posts.py @@ -23,10 +23,20 @@ # SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. from copy import copy -import os +import codecs +import string from nikola.plugin_categories import Task -from nikola import utils +from nikola import utils, rc4 + + +def wrap_encrypt(path, password): + """Wrap a post with encryption.""" + with codecs.open(path, 'rb+', 'utf8') as inf: + data = inf.read() + "<!--tail-->" + data = CRYPT.substitute(data=rc4.rc4(password, data)) + with codecs.open(path, 'wb+', 'utf8') as outf: + outf.write(data) class RenderPosts(Task): @@ -41,25 +51,26 @@ class RenderPosts(Task): "translations": self.site.config["TRANSLATIONS"], "timeline": self.site.timeline, "default_lang": self.site.config["DEFAULT_LANG"], + "hide_untranslated_posts": self.site.config['HIDE_UNTRANSLATED_POSTS'], } flag = False for lang in kw["translations"]: - # TODO: timeline is global, get rid of it deps_dict = copy(kw) deps_dict.pop('timeline') for post in kw['timeline']: source = post.source_path dest = post.base_path - if lang != kw["default_lang"]: - dest += '.' + lang - source_lang = source + '.' + lang - if os.path.exists(source_lang): - source = source_lang + if not post.is_translation_available(lang) and kw["hide_untranslated_posts"]: + continue + else: + source = post.translated_source_path(lang) + if lang != post.default_lang: + dest = dest + '.' + lang flag = True - yield { + task = { 'basename': self.name, - 'name': dest.encode('utf-8'), + 'name': dest, 'file_dep': post.fragment_deps(lang), 'targets': [dest], 'actions': [(self.site.get_compiler(post.source_path), @@ -67,6 +78,9 @@ class RenderPosts(Task): 'clean': True, 'uptodate': [utils.config_changed(deps_dict)], } + if post.meta('password'): + task['actions'].append((wrap_encrypt, (dest, post.meta('password')))) + yield task if flag is False: # Return a dummy task yield { 'basename': self.name, @@ -74,3 +88,53 @@ class RenderPosts(Task): 'uptodate': [True], 'actions': [], } + + +CRYPT = string.Template("""\ +<script> +function rc4(key, str) { + var s = [], j = 0, x, res = ''; + for (var i = 0; i < 256; i++) { + s[i] = i; + } + for (i = 0; i < 256; i++) { + j = (j + s[i] + key.charCodeAt(i % key.length)) % 256; + x = s[i]; + s[i] = s[j]; + s[j] = x; + } + i = 0; + j = 0; + for (var y = 0; y < str.length; y++) { + i = (i + 1) % 256; + j = (j + s[i]) % 256; + x = s[i]; + s[i] = s[j]; + s[j] = x; + res += String.fromCharCode(str.charCodeAt(y) ^ s[(s[i] + s[j]) % 256]); + } + return res; +} +function decrypt() { + key = $$("#key").val(); + crypt_div = $$("#encr") + crypted = crypt_div.html(); + decrypted = rc4(key, window.atob(crypted)); + if (decrypted.substr(decrypted.length - 11) == "<!--tail-->"){ + crypt_div.html(decrypted); + $$("#pwform").hide(); + crypt_div.show(); + } else { alert("Wrong password"); }; +} +</script> + +<div id="encr" style="display: none;">${data}</div> +<div id="pwform"> +<form onsubmit="javascript:decrypt(); return false;" class="form-inline"> +<fieldset> +<legend>This post is password-protected.</legend> +<input type="password" id="key" placeholder="Type password here"> +<button type="submit" class="btn">Show Content</button> +</fieldset> +</form> +</div>""") |
