aescrypt dev
[anomen-overlay.git] / www-apps / pmwiki / cookbook / AesCrypt / aescrypt.php.00
blob7257c6e70f4aa2d64c245328e644933b89c8d3f4
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-12-17-DEV';
15 SDV($AesCryptKDF, 'sha256_dup');
16 SDV($AesCryptPlainToken, '(:encrypt ');
17 SDV($AesCryptCipherToken, '(:aes ');
18 SDV($AesCryptEndToken, ':)');
19 SDV($AesCryptPadding, 8);
20 SDV($AesCryptSelectionMode, true);
22 SDV($HTMLStylesFmt['aescrypt'], "
23 .aescrypt_overlay {
24      visibility: hidden;
25      position: absolute;
26      left: 0px;
27      top: 0px;
28      width:100%;
29      height:100%;
30      text-align:center;
31      z-index: 1000;
34 .aescrypt_overlay div {
35      width:300px;
36      margin: 100px auto;
37      background-color: #ffffff;
38      border:1px solid #000000;
39      padding:15px;
40      text-align:center;
42 ");
45 $HTMLHeaderFmt['aescrypt_common'] = "
46 <script type=\"text/javascript\" src=\"\$PubDirUrl/aescrypt/aescrypt.js\"></script>
47 <script type=\"text/javascript\">
48 // <![CDATA[
50 function aescryptOverlay(id, state) {
51   var el = document.getElementById('aescrypt_o_'+id);
52   el.style.visibility = state ? 'visible' : 'hidden';
53   if (state) {
54     var pw = document.getElementById('aescrypt_p_'+id);
55     pw.focus();
56   }
59 function aescryptDecSubmit(id)
61  aescryptOverlay(id, false);
62  var pwel = document.getElementById('aescrypt_p_'+id);
63  var pw = pwel.value;
64  var pwel = document.getElementById('aescrypt_c_'+id);
66  var contentel = document.getElementById('aescrypt_c_'+id);
67  var cipher = contentel.childNodes[0].nodeValue;
68  var plain = AesCtr.decrypt(cipher,pw,256);
69  contentel.childNodes[0].nodeValue = plain;
70  contentel.style.display='block';
72  var linkel = document.getElementById('aescrypt_a_'+id);
73  linkel.style.visibility='hidden';
74  linkel.style.display='none';
79 AesCtr.kdf = function(password, nBits, nonce) {
80     return AesCtr.kdf_$AesCryptKDF (password, nBits, nonce);
83 function aescryptDecClick(elem) {
84     var node = elem.childNodes[0];
85     var nodeDec = elem.childNodes[1];
86     if (nodeDec.style.visibility=='hidden') {
87         return;
88     }
89     var aesDecrypt = node.childNodes[0].nodeValue;
90     var res = AesCtr.decrypt(aesDecrypt,prompt('Decrypt key','TopSecret'),256);
91     res = res.replace(/^\\s\\s*/, '').replace(/\\s\\s*\$/, '');
92     node.childNodes[0].nodeValue = res;
93     node.style.display='block';
94     nodeDec.style.visibility='hidden';
95     nodeDec.style.display='none';
98 function aescryptOverlayDecClick(elem) {
99     aescryptOverlay();
100     var node = elem.childNodes[0];
101     var crypted = node.childNodes[0].nodeValue;
102     var aesDecrypt = getElementById('aescryptLabel').nodevalue = crypted;
106 // ]]>
107 </script>
110 if ($action == 'edit') {
111 $HTMLHeaderFmt['aescrypt_edit'] = "
112 <script type=\"text/javascript\">
113 // <![CDATA[
115 function aescryptEncSubmit() {
117     var pwel = document.getElementById('aescrypt_p_0');
118     var pw = pwel.value;
120     aescryptOverlay(0, false);
122   // find selection
123   var textarea = document.getElementById('text');
125   if (document.selection) { // IE variant
126     textarea.focus();
127     var sel = document.selection.createRange();
128     // alert the selected text in textarea
129     // alert(sel.text);
130     // Finally replace the value of the selected text with this new replacement one
131     if (sel != null && sel.text != null && sel.text != '' ) {
132         sel.text = aesPrompt(pw, sel.text);
133     } else {
134         alert('Please select text to encrypt');
135     }
136   } else {
137     var len = textarea.value.length;
138     var start = textarea.selectionStart;
139     var end = textarea.selectionEnd;
140     var sel = textarea.value.substring(start, end);
141            
142     if (start  < end) {
143         var replace =  aesOverlayPrompt(pw, sel);
144         // Here we are replacing the selected text with this one
145         textarea.value =  textarea.value.substring(0,start) + replace + textarea.value.substring(end,len);
146     }
147     else {
148         alert('Please select text to encrypt');
149         return;
150     }
151   }
155 function aesOverlayPrompt(pass, tpart) {
156     var padding = $AesCryptPadding;
157     var tarr = '$AesCryptCipherToken';
158     var markup_end = '$AesCryptEndToken';
160     while ((tpart.length % padding) > 0) {
161        tpart = tpart.concat(' ');
162     }
164     tarr +=AesCtr.encrypt(tpart,pass,256);
165     tarr += ' ';
166     tarr += markup_end;
167     return tarr;
170 function aesPrompt(tmark, tpart) {
171     var padding = $AesCryptPadding;
172     var tarr = '$AesCryptCipherToken';
173     var markup_end = '$AesCryptEndToken';
175     var tpass = prompt('Encrypt key for text starting at position '+tmark,'TopSecret');
177     while ((tpart.length % padding) > 0) {
178        tpart = tpart.concat(' ');
179     }
181     tarr +=AesCtr.encrypt(tpart,tpass,256);
182     tarr += ' ';
183     tarr += markup_end;
184     return tarr;
187 function aesSelectionClick() {
189   var textarea = document.getElementById('text');
191   if (document.selection) { // IE variant
192     textarea.focus();
193     var sel = document.selection.createRange();
194     // alert the selected text in textarea
195     // alert(sel.text);
196     // Finally replace the value of the selected text with this new replacement one
197     if (sel != null && sel.text != null && sel.text != '' ) {
198         sel.text = aesPrompt('[selection]', sel.text);
199     } else {
200         alert('Please select text to encrypt');
201     }
202   } else {
203     var len = textarea.value.length;
204     var start = textarea.selectionStart;
205     var end = textarea.selectionEnd;
206     var sel = textarea.value.substring(start, end);
207            
208     if (start  < end) {
209         var replace =  aesPrompt(start, sel);
210         // Here we are replacing the selected text with this one
211         textarea.value =  textarea.value.substring(0,start) + replace + textarea.value.substring(end,len);
212     }
213     else {
214         alert('Please select text to encrypt');
215         return;
216     }
217   }
218   
221 function aescryptDecSubmit($id)
223     aescryptOverlay(false);
224     var textField = document.getElementById('aescrypt_c_$id');
225     var enc = elem.childNodes[0];
226     alert (enc);
229 function aesClick() {
231   var textField = document.getElementById('text');
233   var markup1 = '$AesCryptPlainToken';
234   var markup2 = '$AesCryptCipherToken';
235   var markup_end = '$AesCryptEndToken';
236   var padding = $AesCryptPadding;
238   var testt = textField.value;
239   var tmark2 = 0;
240   var tarr = new String;
241   var tmark = testt.indexOf(markup1);
243   while(tmark >= 0) {
244    tarr += testt.substring(tmark2,tmark);
245    tmark2 = testt.indexOf(markup_end,tmark);
246    var tpart = testt.substring(tmark+markup1.length,tmark2);
248    tarr += aesPrompt(tmark, tpart);
250    tmark2 += markup_end.length;
251    tmark = testt.indexOf(markup1,tmark2);
252   }
254   tarr += testt.substr(tmark2);
256   textField.value = tarr;
259 function registerAesEvent()
261   // TODO: add protection handler to save buttons
263   var formElement = document.getElementById('text').parentNode;
264   //alert(formElement.nodeValue);
266   var inputs = document.getElementsByTagName('input');
267   var button;
268   for (var i=0; i < inputs.length; i++)
269   {
270      if ((inputs[i].getAttribute('type') == 'submit') && (inputs[i].getAttribute('name') == name))
271      {
272         button = inputs[i];
273      }
274   }
275   */
276   
279 if ( document.addEventListener ) {
280   window.addEventListener( 'load', registerAesEvent, false );
281 } else if ( document.attachEvent ) {
282   window.attachEvent( 'onload', registerAesEvent );
285 // ]]>
286 </script>
291 function aescryptMarkup($ciphertext)
293     static $id = 0;
294     $id++;
295     $res = "\n";
296     $res .= "<div id=\"aescrypt_c_$id\" style=\"white-space:pre;display:none;\">$ciphertext</div>";
297     $res .= "<div id=\"aescrypt_d_$id\">";
298     $res .= "<a id=\"aescrypt_a_$id\" href=\"javascript:void (0);\" onClick=\"aescryptOverlay($id, true);\">";
299     $res .= "[Decrypt]";
300     $res .= "</a>";
301     $res .= "</div>";
302     $c = $ciphertext;
303     if (strlen($c) > 30) {
304       $c = substr($c, 0, 27) . "...";
305     }
306     $res .= "<div id=\"aescrypt_o_$id\" class=\"aescrypt_overlay\">
307      <div>
308           <p id=\"aescrypt_l_$id\">Decrypting \"$c\".</p>
309           <form id=\"aescrypt_f_$id\" onsubmit=\"aescryptDecSubmit($id);return false;\">
310            <label for=\"aescrypt_p_$id\">Password </label>
311            <input type=\"password\" name=\"aescrypt_p_$id\" id=\"aescrypt_p_$id\" />
312            <input type=\"submit\"  />
313           </form>
314         </div>
315     </div>";
317     return $res;
320 Markup('aescrypt',
321        'directives',
322        "/\\Q$AesCryptCipherToken\\E\\s*(.*?)\\s*\\Q$AesCryptEndToken\\E/se",
323        "aescryptMarkup('$1')");
325 if ($action == 'edit') {
327  if (IsEnabled($EnableGUIButtons)) {
328   $GUIButtons['aescrypt'] = array(750, '', '', '',
329   // TODO:  add overlay DIV here & test browsers
330    "<a href='#' onclick=\"aescryptOverlay(0, true);\"><img src='\$GUIButtonDirUrlFmt/aescrypt.png' title='Encrypt' /></a>
331      <div id=\"aescrypt_o_0\" class=\"aescrypt_overlay\">
332      <div>
333           <p id=\"aescrypt_l_0\">Encrypt selected text:</p>
334           <form id=\"aescrypt_f_0\" onsubmit=\"aescryptEncSubmit();return false;\">
335            <input type=\"password\" name=\"aescrypt_p_0\" id=\"aescrypt_p_0\" />
336            <input type=\"submit\"  />
337           </form>
338         </div>
339     </div>");
341  } else {
342   // TODO: simply add overlay DIV here
343   $MessagesFmt[] = "<input type='button' name='aesButton' value='Encrypt' onClick=\"aescryptOverlay(0, true);\"/>
344      <div id=\"aescrypt_o_0\" class=\"aescrypt_overlay\">
345      <div>
346           <p id=\"aescrypt_l_0\">Encrypt selected text:</p>
347           <form id=\"aescrypt_f_0\" onsubmit=\"aescryptEncSubmit();return false;\">
348            <input type=\"password\" name=\"aescrypt_p_0\" id=\"aescrypt_p_0\" />
349            <input type=\"submit\"  />
350           </form>
351         </div>
352     </div>";
353