diff options
-rwxr-xr-x | boot.php | 3 | ||||
-rw-r--r-- | include/bbcode.php | 11 | ||||
-rw-r--r-- | js/crypto.js | 181 | ||||
-rw-r--r-- | view/php/theme_init.php | 2 | ||||
-rwxr-xr-x | view/tpl/head.tpl | 1 |
5 files changed, 188 insertions, 10 deletions
@@ -990,7 +990,8 @@ class App { '$icon' => head_get_icon(), '$head_css' => head_get_css(), '$head_js' => head_get_js(), - '$js_strings' => js_strings() + '$js_strings' => js_strings(), + '$zid' => get_my_address(), )) . $this->page['htmlhead']; } diff --git a/include/bbcode.php b/include/bbcode.php index 14d0ce14a..de71eb4e3 100644 --- a/include/bbcode.php +++ b/include/bbcode.php @@ -121,14 +121,7 @@ function bb_parse_crypt($match) { if ($matches[1] != "") $hint = html_entity_decode($matches[1],ENT_QUOTES,'UTF-8'); - // Next we really should link to a JS routine based on the algorithm which prompts for a key - // something like zdecrypt_{algorithm}, which will be a no-op if the decryption algorithm is not present - // We can either pass the text or pass a message ID and let the decryption module call /viewsrc or something - // to get the text. The text might be large so the message ID might be preferable. But if we pass the - // text directly we won't have to do a network fetch; and can potentially display the results in a popup. - - - $Text = '<br/><img src="' . z_root() . '/images/lock_icon.gif" alt="' . t('Encrypted content') . '" title="' . t('Encrypted content') . '" /><br />' . t('Algorithm: ') . $algorithm . '<br />' . t('Key hint: ') . $hint . '<br />'; + $Text = '<br/><img src="' . z_root() . '/images/lock_icon.gif" onclick="red_decrypt(\'' . $algorithm . '\',\'' . $hint . '\',\'' . $match[2] . '\');" alt="' . t('Encrypted content') . '" title="' . t('Encrypted content') . '" /><br />'; return $Text; @@ -503,7 +496,7 @@ function bbcode($Text,$preserve_nl = false, $tryoembed = true) { } if (strpos($Text,'[/crypt]') !== false) { - $Text = preg_replace("/\[crypt\](.*?)\[\/crypt\]/ism",'<br/><img src="' .$a->get_baseurl() . '/images/lock_icon.gif" alt="' . t('Encrypted content') . '" title="' . t('Encrypted content') . '" /><br />', $Text); + $Text = preg_replace("/\[crypt\](.*?)\[\/crypt\]/ism",'<br/><img src="' .$a->get_baseurl() . '/images/lock_icon.gif" onclick="red_decrypt(\'rot13\',\'\',\'$1\');" alt="' . t('Encrypted content') . '" title="' . t('Encrypted content') . '" /><br />', $Text); $Text = preg_replace_callback("/\[crypt (.*?)\](.*?)\[\/crypt\]/ism", 'bb_parse_crypt', $Text); } // Try to Oembed diff --git a/js/crypto.js b/js/crypto.js new file mode 100644 index 000000000..022613128 --- /dev/null +++ b/js/crypto.js @@ -0,0 +1,181 @@ + + +function str_rot13 (str) { + // http://kevin.vanzonneveld.net + // + original by: Jonas Raoni Soares Silva (http://www.jsfromhell.com) + // + improved by: Ates Goral (http://magnetiq.com) + // + bugfixed by: Onno Marsman + // + improved by: Rafa? Kukawski (http://blog.kukawski.pl) + // * example 1: str_rot13('Kevin van Zonneveld'); + // * returns 1: 'Xriva ina Mbaariryq' + // * example 2: str_rot13('Xriva ina Mbaariryq'); + // * returns 2: 'Kevin van Zonneveld' + // * example 3: str_rot13(33); + // * returns 3: '33' + return (str + '').replace(/[a-z]/gi, function (s) { + return String.fromCharCode(s.charCodeAt(0) + (s.toLowerCase() < 'n' ? 13 : -13)); + }); +} + + +function red_encrypt(alg, elem,text) { + var enc_text = ''; + var newdiv = ''; + + if(! alg) + alg = 'rot13'; + + if((alg == 'rot13') || (alg == 'triple-rot13')) + newdiv = "[crypt alg='rot13']" + str_rot13(text) + '[/crypt]'; + else if(alg == 'aes256') { + var enc_key = prompt('key'); + var enc_hint = prompt('hint'); + + enc_text = base64_encode(CryptoJS.AES.encrypt(text,key)); + + newdiv = "[crypt alg='aes256' hint=' + hint + ']" + enc_text + '[/crypt]'; + } + + alert(newdiv); + + + textarea = document.getElementById(elem); + if (document.selection) { + textarea.focus(); + selected = document.selection.createRange(); + selected.text = newdiv; + } else if (textarea.selectionStart || textarea.selectionStart == "0") { + var start = textarea.selectionStart; + var end = textarea.selectionEnd; + textarea.value = textarea.value.substring(0, start) + newdiv + textarea.value.substring(end, textarea.value.length); + } +} + +function red_decrypt(alg,hint,text) { + + var enc_text = ''; + + if(alg == 'rot13' || alg == 'triple-rot13') + enc_text = str_rot13(text); + + if(alg == 'aes256') { + var enc_key = prompt(hint); + enc_text = CryptoJS.AES.decrypt(base64_decode(text),enc_key); + } + + alert(enc_text); + +} + + + + + +function base64_encode (data) { + // http://kevin.vanzonneveld.net + // + original by: Tyler Akins (http://rumkin.com) + // + improved by: Bayron Guevara + // + improved by: Thunder.m + // + improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net) + // + bugfixed by: Pellentesque Malesuada + // + improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net) + // + improved by: Rafa? Kukawski (http://kukawski.pl) + // * example 1: base64_encode('Kevin van Zonneveld'); + // * returns 1: 'S2V2aW4gdmFuIFpvbm5ldmVsZA==' + // mozilla has this native + // - but breaks in 2.0.0.12! + //if (typeof this.window['btoa'] === 'function') { + // return btoa(data); + //} + var b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; + var o1, o2, o3, h1, h2, h3, h4, bits, i = 0, + ac = 0, + enc = "", + tmp_arr = []; + + if (!data) { + return data; + } + + do { // pack three octets into four hexets + o1 = data.charCodeAt(i++); + o2 = data.charCodeAt(i++); + o3 = data.charCodeAt(i++); + + bits = o1 << 16 | o2 << 8 | o3; + + h1 = bits >> 18 & 0x3f; + h2 = bits >> 12 & 0x3f; + h3 = bits >> 6 & 0x3f; + h4 = bits & 0x3f; + + // use hexets to index into b64, and append result to encoded string + tmp_arr[ac++] = b64.charAt(h1) + b64.charAt(h2) + b64.charAt(h3) + b64.charAt(h4); + } while (i < data.length); + + enc = tmp_arr.join(''); + + var r = data.length % 3; + + return (r ? enc.slice(0, r - 3) : enc) + '==='.slice(r || 3); + +} + + +function base64_decode (data) { + // http://kevin.vanzonneveld.net + // + original by: Tyler Akins (http://rumkin.com) + // + improved by: Thunder.m + // + input by: Aman Gupta + // + improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net) + // + bugfixed by: Onno Marsman + // + bugfixed by: Pellentesque Malesuada + // + improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net) + // + input by: Brett Zamir (http://brett-zamir.me) + // + bugfixed by: Kevin van Zonneveld (http://kevin.vanzonneveld.net) + // * example 1: base64_decode('S2V2aW4gdmFuIFpvbm5ldmVsZA=='); + // * returns 1: 'Kevin van Zonneveld' + // mozilla has this native + // - but breaks in 2.0.0.12! + //if (typeof this.window['atob'] === 'function') { + // return atob(data); + //} + var b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; + var o1, o2, o3, h1, h2, h3, h4, bits, i = 0, + ac = 0, + dec = "", + tmp_arr = []; + + if (!data) { + return data; + } + + data += ''; + + do { // unpack four hexets into three octets using index points in b64 + h1 = b64.indexOf(data.charAt(i++)); + h2 = b64.indexOf(data.charAt(i++)); + h3 = b64.indexOf(data.charAt(i++)); + h4 = b64.indexOf(data.charAt(i++)); + + bits = h1 << 18 | h2 << 12 | h3 << 6 | h4; + + o1 = bits >> 16 & 0xff; + o2 = bits >> 8 & 0xff; + o3 = bits & 0xff; + + if (h3 == 64) { + tmp_arr[ac++] = String.fromCharCode(o1); + } else if (h4 == 64) { + tmp_arr[ac++] = String.fromCharCode(o1, o2); + } else { + tmp_arr[ac++] = String.fromCharCode(o1, o2, o3); + } + } while (i < data.length); + + dec = tmp_arr.join(''); + + return dec; +} + + diff --git a/view/php/theme_init.php b/view/php/theme_init.php index 8b75bc940..0cb5d4d68 100644 --- a/view/php/theme_init.php +++ b/view/php/theme_init.php @@ -25,9 +25,11 @@ head_add_js('library/jquery_ac/friendica.complete.js'); head_add_js('library/tiptip/jquery.tipTip.minified.js'); head_add_js('library/jgrowl/jquery.jgrowl_minimized.js'); head_add_js('library/tinymce/jscripts/tiny_mce/tiny_mce_src.js'); +head_add_js('library/cryptojs/rollups/aes.js'); head_add_js('js/acl.js'); head_add_js('js/webtoolkit.base64.js'); head_add_js('js/main.js'); +head_add_js('js/crypto.js'); head_add_js('library/jslider/bin/jquery.slider.min.js'); head_add_js('docready.js'); head_add_js('library/prettyphoto/js/jquery.prettyPhoto.js'); diff --git a/view/tpl/head.tpl b/view/tpl/head.tpl index 4211eeab3..eb4c6c2ad 100755 --- a/view/tpl/head.tpl +++ b/view/tpl/head.tpl @@ -23,6 +23,7 @@ var updateInterval = {{$update_interval}}; var localUser = {{if $local_user}}{{$local_user}}{{else}}false{{/if}}; + var zid = {{if $zid}}'{{$zid}}'{{else}}null{{/if}}; </script> |