aescrypt - dev - overlay
[anomen-overlay.git] / www-apps / pmwiki / cookbook / AesCrypt / aescrypt.php
blob1ab907cd9b132840589fbd5e513fe4e81988f93b
1 <?php if (!defined('PmWiki')) exit();
3 /*
4 AesCrypt
6 Copyright 2011 Anomen (ludek_h@seznam.cz)
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published
9 by the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
13 $RecipeInfo['AesCrypt']['Version'] = '2012-DEV';
15 SDV($AesCryptKDF, 'sha256_dup');
16 SDV($AesCryptPlainToken, '(:encrypt ');
17 SDV($AesCryptCipherToken, '(:aes ');
18 SDV($AesCryptEndToken, ':)');
19 SDV($AesCryptPadding, 6);
20 SDV($AesCryptSelectionMode, true);
22 SDV($HTMLStylesFmt['aescrypt'], "
23 #aescryptPopupMask {
24 position: absolute;
25 z-index: 200;
26 top: 0px;
27 left: 0px;
28 width: 100%;
29 height: 100%;
30 opacity: .4;
31 filter: alpha(opacity=40);
32 /* this hack is so it works in IE
33 * I find setting the color in the css gives me more flexibility
34 * than the PNG solution.
36 background-color:transparent !important;
37 background-color: #333333;
38 /* this hack is for opera support
39 * you can uncomment the background-image if you don't care about opera.
40 * this gives you the flexibility to use any bg color that you want, instead of the png
42 background-image/**/: url('$PubDirUrl/aescrypt/maskBG.png') !important; // For browsers Moz, Opera, etc.
43 background-image:none;
44 background-repeat: repeat;
45 display:none;
48 .aescrypt_overlay {
49 visibility: hidden;
50 position: absolute;
51 left: 0px;
52 top: 0px;
53 width:100%;
54 height:100%;
55 text-align:center;
56 z-index: 1000;
59 .aescrypt_overlay div {
60 width:300px;
61 margin: 100px auto;
62 background-color: #ffffff;
63 border:1px solid #000000;
64 padding:15px;
65 text-align:center;
67 ");
70 $HTMLHeaderFmt['aescrypt_common'] = "
71 <script type=\"text/javascript\" src=\"\$PubDirUrl/aescrypt/aescrypt.js\"></script>
72 <script type=\"text/javascript\">
73 // <![CDATA[
75 /**
76 * Displays and hides modal dialog.
78 function aescryptOverlay(id, state) {
79 var el = document.getElementById('aescrypt_o_'+id);
80 el.style.visibility = (state ? 'visible' : 'hidden');
81 if (state) {
82 var pw = document.getElementById('aescrypt_p_'+id);
83 pw.focus();
84 pw.value = '';
88 /**
89 * Function invoked on submit of password modal dialog.
90 * Performs decryption.
92 function aescryptDecSubmit(id)
94 aescryptOverlay(id, false);
95 var pwel = document.getElementById('aescrypt_p_'+id);
96 var pw = pwel.value;
97 pwel.value = 'TopSecret';
98 // decrypt all ?
99 var allEl = document.getElementById('aescrypt_b_'+id);
101 var i = id;
102 var to = id;
103 if (allEl.checked) {
104 i = 1;
105 to = 10000; // just some big number
108 while (i <= to) {
109 var contentel = document.getElementById('aescrypt_c_'+i);
110 if (!contentel) {
111 break;
113 if (contentel.style.display == 'none') {
114 var cipher = contentel.childNodes[0].nodeValue;
115 var plain = AesCtr.decrypt(cipher,pw,256);
116 var plainTrim = plain.replace(/\\s\\s*\$/, '');
117 contentel.childNodes[0].nodeValue = plainTrim;
118 contentel.style.display='block';
119 var linkel = document.getElementById('aescrypt_a_'+i);
120 if (!linkel) {
121 alert(i);
122 } else {
123 linkel.style.visibility='hidden';
124 linkel.style.display='none';
127 i++;
132 * Key derivation function selected by AesCryptKDF variable.
134 AesCtr.kdf = function(password, nBits, nonce) {
135 return AesCtr.kdf_$AesCryptKDF (password, nBits, nonce);
138 // ]]>
139 </script>
142 if ($action == 'edit') {
143 $HTMLHeaderFmt['aescrypt_edit'] = "
144 <script type=\"text/javascript\">
145 // <![CDATA[
147 var aeascryptPopupDiv = false;
149 * display modal box for encryption
151 function aescryptEncPopup()
153 // alert('123');
154 aescryptSelectionRange = aescryptSaveSelection();
156 // alert(aescryptSelectionRange);
157 if (!aeascryptPopupDiv) {
158 var popup = '<div id=\'aescrypt_o_enc\' class=\'aescrypt_overlay\'>'
159 + '<div>'
160 + '<p id=\'aescrypt_l_enc\'>Encrypt selected text:</p>'
161 + '<form id=\'aescrypt_f_enc\' onsubmit=\'aescryptEncSubmit();return false;\'>'
162 + '<input type=\'password\' name=\'aescrypt_p_enc\' id=\'aescrypt_p_enc\' />'
163 + '<input type=\'submit\' />'
164 + '</form>' + '</div>' + '</div>';
166 var theBody = document.getElementsByTagName('BODY')[0];
167 var popmask = document.createElement('div');
168 popmask.id = 'aescryptPopupMask';
169 var popcont = document.createElement('div');
170 popcont.id = 'aescrypt_x_enc';
171 popcont.innerHTML = popup;
173 theBody.appendChild(popmask);
174 theBody.appendChild(popcont);
176 aeascryptPopupDiv = true;
178 var pwel = document.getElementById('aescrypt_p_enc');
179 pwel.value = '';
181 aescryptOverlay('enc',true);
185 * Hide modal box and encrypt selection
186 * - how to get selection?
187 * -
189 function aescryptEncSubmit() {
191 var tpart = aescryptGetSelection();
193 var pwel = document.getElementById('aescrypt_p_enc');
194 var pw = pwel.value;
195 pwel.value = 'TopSecret';
197 aescryptOverlay('enc', false);
199 var padding = $AesCryptPadding;
200 var tarr = '$AesCryptCipherToken';
201 var markup_end = '$AesCryptEndToken';
203 while ((tpart.length % padding) > 0) {
204 tpart = tpart.concat(' ');
206 tpart = tpart.concat(' ');
208 tarr +=AesCtr.encrypt(tpart, pw, 256);
209 tarr += ' ';
210 tarr += markup_end;
211 alert('encrypted: ' + tarr);
213 // TODO write result
214 aescryptReplaceSelection(tarr);
217 var aescryptSelectionRange = [0, 0];
220 * Get selection to be encrypted (selection mode)
222 function aescryptSaveSelection() {
224 var textarea = document.getElementById('text');
226 if (document.selection) { // IE variant
227 textarea.focus();
228 //var sel = document.selection.createRange();
230 // TODO: save selection object (easier, might not work)
231 // or save start,length and reconstruct later ?
232 var bm = document.selection.createRange().getBookmark();
233 var sel = textarea.createTextRange();
234 sel.moveToBookmark(bm);
236 var sleft = textarea.createTextRange();
237 sleft.collapse(true);
238 sleft.setEndPoint('EndToStart', sel);
239 var start = sleft.text.length
240 var end = sleft.text.length + sel.text.length;
241 return [start, end];
243 // alert the selected text in textarea
244 // alert(sel.text);
245 } else {
246 var start = textarea.selectionStart;
247 var end = textarea.selectionEnd;
248 if (start < end) {
249 return [start, end];
251 else {
252 alert('Please select text to encrypt');
253 return [0,0];
258 function aescryptGetSelection() {
259 var start = aescryptSelectionRange[0];
260 var end = aescryptSelectionRange[1];
261 var textarea = document.getElementById('text');
262 var sel = textarea.value.substring(start, end);
263 return sel;
266 function aescryptReplaceSelection(replace) {
267 var textarea = document.getElementById('text');
268 var start = aescryptSelectionRange[0];
269 var end = aescryptSelectionRange[1];
270 var len = textarea.value.length;
271 textarea.value = textarea.value.substring(0,start) + replace + textarea.value.substring(end,len);
274 // ]]>
275 </script>
280 /* generate decryption code */
281 function aescryptMarkup($ciphertext)
283 static $id = 0;
284 $id++;
285 $res = "\n";
286 $res .= "<div id=\"aescrypt_c_$id\" style=\"white-space:pre;display:none;\">$ciphertext</div>";
287 $res .= "<div id=\"aescrypt_d_$id\">";
288 $res .= "<a id=\"aescrypt_a_$id\" href=\"javascript:void (0);\" onClick=\"aescryptOverlay($id, true);\">";
289 $res .= "[Decrypt]";
290 $res .= "</a>";
291 $res .= "</div>";
292 $c = $ciphertext;
293 if (strlen($c) > 30) {
294 $c = substr($c, 0, 27) . "...";
296 $res .= "<div id=\"aescrypt_o_$id\" class=\"aescrypt_overlay\">
297 <div>
298 <p id=\"aescrypt_l_$id\">Decrypting \"$c\".</p>
299 <form id=\"aescrypt_f_$id\" onsubmit=\"aescryptDecSubmit($id);return false;\">
300 <label for=\"aescrypt_p_$id\">Password </label>
301 <input type=\"password\" name=\"aescrypt_p_$id\" id=\"aescrypt_p_$id\" />
302 <br />
303 <input type=\"checkbox\" name=\"aescrypt_b_$id\" id=\"aescrypt_b_$id\" value=\"true\" />
304 <label for=\"aescrypt_b_$id\">decrypt all</label>
305 <br />
306 <input type=\"submit\" />
307 </form>
308 </div>
309 </div>";
311 return $res;
314 Markup('aescrypt',
315 'directives',
316 "/\\Q$AesCryptCipherToken\\E\\s*(.*?)\\s*\\Q$AesCryptEndToken\\E/se",
317 "aescryptMarkup('$1')");
319 if ($action == 'edit') {
321 if (IsEnabled($EnableGUIButtons)) {
322 $GUIButtons['aescrypt'] = array(750, '', '', '',
323 // TODO: add overlay DIV here & test browsers
324 "<a href='#' onclick='aescryptEncPopup();'><img src='\$GUIButtonDirUrlFmt/aescrypt.png' title='Encrypt' /></a>");
325 } else {
326 // TODO: simply add overlay DIV here
327 $MessagesFmt[] = "<input type='button' name='aesButton' value='Encrypt' onClick='aescryptEncPopup();'/>";