Mercurial > hg > rc1
comparison plugins/enigma/enigma.js @ 0:1e000243b222
vanilla 1.3.3 distro, I hope
author | Charlie Root |
---|---|
date | Thu, 04 Jan 2018 15:50:29 -0500 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:1e000243b222 |
---|---|
1 /* Enigma Plugin */ | |
2 | |
3 window.rcmail && rcmail.addEventListener('init', function(evt) { | |
4 if (rcmail.env.task == 'settings') { | |
5 if (rcmail.gui_objects.keyslist) { | |
6 rcmail.keys_list = new rcube_list_widget(rcmail.gui_objects.keyslist, | |
7 {multiselect:true, draggable:false, keyboard:false}); | |
8 rcmail.keys_list | |
9 .addEventListener('select', function(o) { rcmail.enigma_keylist_select(o); }) | |
10 .addEventListener('keypress', function(o) { rcmail.enigma_keylist_keypress(o); }) | |
11 .init() | |
12 .focus(); | |
13 | |
14 rcmail.enigma_list(); | |
15 | |
16 rcmail.register_command('firstpage', function(props) { return rcmail.enigma_list_page('first'); }); | |
17 rcmail.register_command('previouspage', function(props) { return rcmail.enigma_list_page('previous'); }); | |
18 rcmail.register_command('nextpage', function(props) { return rcmail.enigma_list_page('next'); }); | |
19 rcmail.register_command('lastpage', function(props) { return rcmail.enigma_list_page('last'); }); | |
20 } | |
21 | |
22 if (rcmail.env.action == 'plugin.enigmakeys') { | |
23 rcmail.register_command('search', function(props) {return rcmail.enigma_search(props); }, true); | |
24 rcmail.register_command('reset-search', function(props) {return rcmail.enigma_search_reset(props); }, true); | |
25 rcmail.register_command('plugin.enigma-import', function() { rcmail.enigma_import(); }, true); | |
26 rcmail.register_command('plugin.enigma-import-search', function() { rcmail.enigma_import_search(); }, true); | |
27 rcmail.register_command('plugin.enigma-key-export', function() { rcmail.enigma_export(); }); | |
28 rcmail.register_command('plugin.enigma-key-export-selected', function() { rcmail.enigma_export(true); }); | |
29 rcmail.register_command('plugin.enigma-key-import', function() { rcmail.enigma_key_import(); }, true); | |
30 rcmail.register_command('plugin.enigma-key-delete', function(props) { return rcmail.enigma_delete(); }); | |
31 rcmail.register_command('plugin.enigma-key-create', function(props) { return rcmail.enigma_key_create(); }, true); | |
32 rcmail.register_command('plugin.enigma-key-save', function(props) { return rcmail.enigma_key_create_save(); }, true); | |
33 | |
34 rcmail.addEventListener('responseafterplugin.enigmakeys', function() { | |
35 rcmail.enable_command('plugin.enigma-key-export', rcmail.env.rowcount > 0); | |
36 }); | |
37 | |
38 if (rcmail.gui_objects.importform) { | |
39 // make sure Enter key in search input starts searching | |
40 // instead of submitting the form | |
41 $('#rcmimportsearch').keydown(function(e) { | |
42 if (e.which == 13) { | |
43 rcmail.enigma_import_search(); | |
44 return false; | |
45 } | |
46 }); | |
47 | |
48 $('input[type="button"]:first').focus(); | |
49 } | |
50 } | |
51 } | |
52 else if (rcmail.env.task == 'mail') { | |
53 if (rcmail.env.action == 'compose') { | |
54 rcmail.addEventListener('beforesend', function(props) { rcmail.enigma_beforesend_handler(props); }) | |
55 .addEventListener('beforesavedraft', function(props) { rcmail.enigma_beforesavedraft_handler(props); }); | |
56 | |
57 $('input,label', $('#enigmamenu')).mouseup(function(e) { | |
58 // don't close the menu on mouse click inside | |
59 e.stopPropagation(); | |
60 }); | |
61 | |
62 $('a.button.enigma').prop('tabindex', $('#messagetoolbar > a:first').prop('tabindex')); | |
63 } | |
64 | |
65 $.each(['encrypt', 'sign'], function() { | |
66 if (rcmail.env['enigma_force_' + this]) | |
67 $('[name="_enigma_' + this + '"]').prop('checked', true); | |
68 }); | |
69 | |
70 if (rcmail.env.enigma_password_request) { | |
71 rcmail.enigma_password_request(rcmail.env.enigma_password_request); | |
72 } | |
73 } | |
74 }); | |
75 | |
76 | |
77 /*********************************************************/ | |
78 /********* Enigma Settings/Keys/Certs UI *********/ | |
79 /*********************************************************/ | |
80 | |
81 // Display key(s) import form | |
82 rcube_webmail.prototype.enigma_key_import = function() | |
83 { | |
84 this.enigma_loadframe('&_action=plugin.enigmakeys&_a=import'); | |
85 }; | |
86 | |
87 // Display key(s) generation form | |
88 rcube_webmail.prototype.enigma_key_create = function() | |
89 { | |
90 this.enigma_loadframe('&_action=plugin.enigmakeys&_a=create'); | |
91 }; | |
92 | |
93 // Generate key(s) and submit them | |
94 rcube_webmail.prototype.enigma_key_create_save = function() | |
95 { | |
96 var options, lock, users = [], | |
97 password = $('#key-pass').val(), | |
98 confirm = $('#key-pass-confirm').val(), | |
99 size = $('#key-size').val(); | |
100 | |
101 $('[name="identity[]"]:checked').each(function() { | |
102 users.push(this.value); | |
103 }); | |
104 | |
105 // validate the form | |
106 if (!password || !confirm) | |
107 return alert(this.get_label('enigma.formerror')); | |
108 | |
109 if (password != confirm) | |
110 return alert(this.get_label('enigma.passwordsdiffer')); | |
111 | |
112 if (!users.length) | |
113 return alert(this.get_label('enigma.noidentselected')); | |
114 | |
115 // generate keys | |
116 // use OpenPGP.js if browser supports required features | |
117 if (window.openpgp && window.crypto && (window.crypto.getRandomValues || window.crypto.subtle)) { | |
118 lock = this.set_busy(true, 'enigma.keygenerating'); | |
119 options = { | |
120 numBits: size, | |
121 userId: users, | |
122 passphrase: password | |
123 }; | |
124 | |
125 openpgp.generateKeyPair(options).then(function(keypair) { | |
126 // success | |
127 var post = {_a: 'import', _keys: keypair.privateKeyArmored, _generated: 1, | |
128 _passwd: password, _keyid: keypair.key.primaryKey.fingerprint}; | |
129 | |
130 // send request to server | |
131 rcmail.http_post('plugin.enigmakeys', post, lock); | |
132 }, function(error) { | |
133 // failure | |
134 rcmail.set_busy(false, null, lock); | |
135 rcmail.display_message(rcmail.get_label('enigma.keygenerateerror'), 'error'); | |
136 }); | |
137 } | |
138 else { | |
139 rcmail.display_message(rcmail.get_label('enigma.keygennosupport'), 'error'); | |
140 } | |
141 }; | |
142 | |
143 // Action executed after successful key generation and import | |
144 rcube_webmail.prototype.enigma_key_create_success = function() | |
145 { | |
146 parent.rcmail.enigma_list(1); | |
147 }; | |
148 | |
149 // Delete key(s) | |
150 rcube_webmail.prototype.enigma_delete = function() | |
151 { | |
152 var keys = this.keys_list.get_selection(); | |
153 | |
154 if (!keys.length || !confirm(this.get_label('enigma.keyremoveconfirm'))) | |
155 return; | |
156 | |
157 var lock = this.display_message(this.get_label('enigma.keyremoving'), 'loading'), | |
158 post = {_a: 'delete', _keys: keys}; | |
159 | |
160 // send request to server | |
161 this.http_post('plugin.enigmakeys', post, lock); | |
162 }; | |
163 | |
164 // Export key(s) | |
165 rcube_webmail.prototype.enigma_export = function(selected) | |
166 { | |
167 var priv = false, | |
168 list = this.keys_list, | |
169 keys = selected ? list.get_selection().join(',') : '*', | |
170 args = {_keys: keys}; | |
171 | |
172 if (!keys.length) | |
173 return; | |
174 | |
175 // find out whether selected keys are private | |
176 if (keys == '*') | |
177 priv = true; | |
178 else | |
179 $.each(list.get_selection(), function() { | |
180 flags = $(list.rows[this].obj).data('flags'); | |
181 if (flags && flags.indexOf('p') >= 0) { | |
182 priv = true; | |
183 return false; | |
184 } | |
185 }); | |
186 | |
187 // ask the user about including private key in the export | |
188 if (priv) | |
189 return this.show_popup_dialog( | |
190 this.get_label('enigma.keyexportprompt'), | |
191 this.get_label('enigma.exportkeys'), | |
192 [{ | |
193 text: this.get_label('enigma.onlypubkeys'), | |
194 click: function(e) { | |
195 rcmail.enigma_export_submit(args); | |
196 $(this).remove(); | |
197 } | |
198 }, | |
199 { | |
200 text: this.get_label('enigma.withprivkeys'), | |
201 click: function(e) { | |
202 args._priv = 1; | |
203 rcmail.enigma_export_submit(args); | |
204 $(this).remove(); | |
205 } | |
206 }], | |
207 {width: 400} | |
208 ); | |
209 | |
210 this.enigma_export_submit(args); | |
211 }; | |
212 | |
213 // Sumbitting request for key(s) export | |
214 // Done this way to handle password input | |
215 rcube_webmail.prototype.enigma_export_submit = function(data) | |
216 { | |
217 var id = 'keyexport-' + new Date().getTime(), | |
218 form = $('<form>').attr({target: id, method: 'post', style: 'display:none', | |
219 action: '?_action=plugin.enigmakeys&_task=settings&_a=export'}), | |
220 iframe = $('<iframe>').attr({name: id, style: 'display:none'}) | |
221 | |
222 form.append($('<input>').attr({name: '_token', value: this.env.request_token})); | |
223 $.each(data, function(i, v) { | |
224 form.append($('<input>').attr({name: i, value: v})); | |
225 }); | |
226 | |
227 iframe.appendTo(document.body); | |
228 form.appendTo(document.body).submit(); | |
229 }; | |
230 | |
231 // Submit key(s) import form | |
232 rcube_webmail.prototype.enigma_import = function() | |
233 { | |
234 var form, file, lock, | |
235 id = 'keyexport-' + new Date().getTime(), | |
236 iframe = $('<iframe>').attr({name: id, style: 'display:none'}); | |
237 | |
238 if (form = this.gui_objects.importform) { | |
239 file = document.getElementById('rcmimportfile'); | |
240 if (file && !file.value) { | |
241 alert(this.get_label('selectimportfile')); | |
242 return; | |
243 } | |
244 | |
245 lock = this.set_busy(true, 'importwait'); | |
246 iframe.appendTo(document.body); | |
247 $(form).attr({target: id, action: this.add_url(form.action, '_unlock', lock)}) | |
248 .submit(); | |
249 } | |
250 }; | |
251 | |
252 // Ssearch for key(s) for import | |
253 rcube_webmail.prototype.enigma_import_search = function() | |
254 { | |
255 var form, search; | |
256 | |
257 if (form = this.gui_objects.importform) { | |
258 search = $('#rcmimportsearch').val(); | |
259 if (!search) { | |
260 return; | |
261 } | |
262 | |
263 this.enigma_find_publickey(search); | |
264 } | |
265 }; | |
266 | |
267 // list row selection handler | |
268 rcube_webmail.prototype.enigma_keylist_select = function(list) | |
269 { | |
270 var id = list.get_single_selection(), url; | |
271 | |
272 if (id) | |
273 url = '&_action=plugin.enigmakeys&_a=info&_id=' + id; | |
274 | |
275 this.enigma_loadframe(url); | |
276 this.enable_command('plugin.enigma-key-delete', 'plugin.enigma-key-export-selected', list.selection.length > 0); | |
277 }; | |
278 | |
279 rcube_webmail.prototype.enigma_keylist_keypress = function(list) | |
280 { | |
281 if (list.modkey == CONTROL_KEY) | |
282 return; | |
283 | |
284 if (list.key_pressed == list.DELETE_KEY || list.key_pressed == list.BACKSPACE_KEY) | |
285 this.command('plugin.enigma-key-delete'); | |
286 else if (list.key_pressed == 33) | |
287 this.command('previouspage'); | |
288 else if (list.key_pressed == 34) | |
289 this.command('nextpage'); | |
290 }; | |
291 | |
292 // load key frame | |
293 rcube_webmail.prototype.enigma_loadframe = function(url) | |
294 { | |
295 var win; | |
296 | |
297 if (win = this.get_frame_window(this.env.contentframe)) { | |
298 if (!url) { | |
299 if (win.location && win.location.href.indexOf(this.env.blankpage) < 0) | |
300 win.location.href = this.env.blankpage; | |
301 if (this.env.frame_lock) | |
302 this.set_busy(false, null, this.env.frame_lock); | |
303 return; | |
304 } | |
305 | |
306 this.env.frame_lock = this.set_busy(true, 'loading'); | |
307 win.location.href = this.env.comm_path + '&_framed=1' + url; | |
308 } | |
309 }; | |
310 | |
311 // Search keys/certs | |
312 rcube_webmail.prototype.enigma_search = function(props) | |
313 { | |
314 if (!props && this.gui_objects.qsearchbox) | |
315 props = this.gui_objects.qsearchbox.value; | |
316 | |
317 if (props || this.env.search_request) { | |
318 var params = {'_a': 'search', '_q': props}, | |
319 lock = this.set_busy(true, 'searching'); | |
320 // if (this.gui_objects.search_filter) | |
321 // addurl += '&_filter=' + this.gui_objects.search_filter.value; | |
322 this.env.current_page = 1; | |
323 this.enigma_loadframe(); | |
324 this.enigma_clear_list(); | |
325 this.http_post('plugin.enigmakeys', params, lock); | |
326 } | |
327 | |
328 return false; | |
329 }; | |
330 | |
331 // Reset search filter and the list | |
332 rcube_webmail.prototype.enigma_search_reset = function(props) | |
333 { | |
334 var s = this.env.search_request; | |
335 this.reset_qsearch(); | |
336 | |
337 if (s) { | |
338 this.enigma_loadframe(); | |
339 this.enigma_clear_list(); | |
340 | |
341 // refresh the list | |
342 this.enigma_list(); | |
343 } | |
344 | |
345 return false; | |
346 }; | |
347 | |
348 // Keys/certs listing | |
349 rcube_webmail.prototype.enigma_list = function(page, reset_frame) | |
350 { | |
351 if (this.is_framed()) | |
352 return parent.rcmail.enigma_list(page, reset_frame); | |
353 | |
354 var params = {'_a': 'list'}, | |
355 lock = this.set_busy(true, 'loading'); | |
356 | |
357 this.env.current_page = page ? page : 1; | |
358 | |
359 if (this.env.search_request) | |
360 params._q = this.env.search_request; | |
361 if (page) | |
362 params._p = page; | |
363 | |
364 this.enigma_clear_list(reset_frame); | |
365 this.http_post('plugin.enigmakeys', params, lock); | |
366 }; | |
367 | |
368 // Change list page | |
369 rcube_webmail.prototype.enigma_list_page = function(page) | |
370 { | |
371 if (page == 'next') | |
372 page = this.env.current_page + 1; | |
373 else if (page == 'last') | |
374 page = this.env.pagecount; | |
375 else if (page == 'prev' && this.env.current_page > 1) | |
376 page = this.env.current_page - 1; | |
377 else if (page == 'first' && this.env.current_page > 1) | |
378 page = 1; | |
379 | |
380 this.enigma_list(page); | |
381 }; | |
382 | |
383 // Remove list rows | |
384 rcube_webmail.prototype.enigma_clear_list = function(reset_frame) | |
385 { | |
386 if (reset_frame !== false) | |
387 this.enigma_loadframe(); | |
388 | |
389 if (this.keys_list) | |
390 this.keys_list.clear(true); | |
391 | |
392 this.enable_command('plugin.enigma-key-delete', 'plugin.enigma-key-delete-selected', false); | |
393 }; | |
394 | |
395 // Adds a row to the list | |
396 rcube_webmail.prototype.enigma_add_list_row = function(r) | |
397 { | |
398 if (!this.gui_objects.keyslist || !this.keys_list) | |
399 return false; | |
400 | |
401 var list = this.keys_list, | |
402 tbody = this.gui_objects.keyslist.tBodies[0], | |
403 rowcount = tbody.rows.length, | |
404 even = rowcount%2, | |
405 css_class = 'message' | |
406 + (even ? ' even' : ' odd'), | |
407 // for performance use DOM instead of jQuery here | |
408 row = document.createElement('tr'), | |
409 col = document.createElement('td'); | |
410 | |
411 row.id = 'rcmrow' + r.id; | |
412 row.className = css_class; | |
413 if (r.flags) $(row).data('flags', r.flags); | |
414 | |
415 col.innerHTML = r.name; | |
416 row.appendChild(col); | |
417 list.insert_row(row); | |
418 }; | |
419 | |
420 | |
421 /*********************************************************/ | |
422 /********* Enigma Message methods *********/ | |
423 /*********************************************************/ | |
424 | |
425 // handle message send/save action | |
426 rcube_webmail.prototype.enigma_beforesend_handler = function(props) | |
427 { | |
428 this.env.last_action = 'send'; | |
429 this.enigma_compose_handler(props); | |
430 }; | |
431 | |
432 rcube_webmail.prototype.enigma_beforesavedraft_handler = function(props) | |
433 { | |
434 this.env.last_action = 'savedraft'; | |
435 this.enigma_compose_handler(props); | |
436 }; | |
437 | |
438 rcube_webmail.prototype.enigma_compose_handler = function(props) | |
439 { | |
440 var form = this.gui_objects.messageform; | |
441 | |
442 // copy inputs from enigma menu to the form | |
443 $('#enigmamenu input').each(function() { | |
444 var id = this.id + '_cpy', input = $('#' + id); | |
445 | |
446 if (!input.length) { | |
447 input = $(this).clone(); | |
448 input.prop({id: id, type: 'hidden'}).appendTo(form); | |
449 } | |
450 | |
451 input.val(this.checked ? '1' : ''); | |
452 }); | |
453 | |
454 // disable signing when saving drafts | |
455 if (this.env.last_action == 'savedraft') { | |
456 $('input[name="_enigma_sign"]', form).val(0); | |
457 } | |
458 }; | |
459 | |
460 // Import attached keys/certs file | |
461 rcube_webmail.prototype.enigma_import_attachment = function(mime_id) | |
462 { | |
463 var lock = this.set_busy(true, 'loading'), | |
464 post = {_uid: this.env.uid, _mbox: this.env.mailbox, _part: mime_id}; | |
465 | |
466 this.http_post('plugin.enigmaimport', post, lock); | |
467 | |
468 return false; | |
469 }; | |
470 | |
471 // password request popup | |
472 rcube_webmail.prototype.enigma_password_request = function(data) | |
473 { | |
474 if (!data || !data.keyid) { | |
475 return; | |
476 } | |
477 | |
478 var ref = this, | |
479 msg = this.get_label('enigma.enterkeypass'), | |
480 myprompt = $('<div class="prompt">'), | |
481 myprompt_content = $('<div class="message">') | |
482 .appendTo(myprompt), | |
483 myprompt_input = $('<input>').attr({type: 'password', size: 30}) | |
484 .keypress(function(e) { | |
485 if (e.which == 13) | |
486 (ref.is_framed() ? window.parent.$ : $)('.ui-dialog-buttonpane button.mainaction:visible').click(); | |
487 }) | |
488 .appendTo(myprompt); | |
489 | |
490 data.key = data.keyid; | |
491 if (data.keyid.length > 8) | |
492 data.keyid = data.keyid.substr(data.keyid.length - 8); | |
493 | |
494 $.each(['keyid', 'user'], function() { | |
495 msg = msg.replace('$' + this, data[this]); | |
496 }); | |
497 | |
498 myprompt_content.text(msg); | |
499 | |
500 this.show_popup_dialog(myprompt, this.get_label('enigma.enterkeypasstitle'), | |
501 [{ | |
502 text: this.get_label('save'), | |
503 'class': 'mainaction', | |
504 click: function(e) { | |
505 e.stopPropagation(); | |
506 | |
507 var jq = ref.is_framed() ? window.parent.$ : $; | |
508 | |
509 data.password = myprompt_input.val(); | |
510 | |
511 if (!data.password) { | |
512 myprompt_input.focus(); | |
513 return; | |
514 } | |
515 | |
516 ref.enigma_password_submit(data); | |
517 jq(this).remove(); | |
518 } | |
519 }, | |
520 { | |
521 text: this.get_label('cancel'), | |
522 click: function(e) { | |
523 var jq = ref.is_framed() ? window.parent.$ : $; | |
524 e.stopPropagation(); | |
525 jq(this).remove(); | |
526 } | |
527 }], {width: 400}); | |
528 | |
529 if (this.is_framed() && parent.rcmail.message_list) { | |
530 // this fixes bug when pressing Enter on "Save" button in the dialog | |
531 parent.rcmail.message_list.blur(); | |
532 } | |
533 }; | |
534 | |
535 // submit entered password | |
536 rcube_webmail.prototype.enigma_password_submit = function(data) | |
537 { | |
538 var lock, form; | |
539 | |
540 if (this.env.action == 'compose' && !data['compose-init']) { | |
541 return this.enigma_password_compose_submit(data); | |
542 } | |
543 else if (this.env.action == 'plugin.enigmakeys' && (form = this.gui_objects.importform)) { | |
544 if (!$('input[name="_keyid"]', form).length) { | |
545 $(form).append($('<input>').attr({type: 'hidden', name: '_keyid', value: data.key})) | |
546 .append($('<input>').attr({type: 'hidden', name: '_passwd', value: data.password})) | |
547 } | |
548 | |
549 return this.enigma_import(); | |
550 } | |
551 | |
552 lock = data.nolock ? null : this.set_busy(true, 'loading'); | |
553 form = $('<form>') | |
554 .attr({method: 'post', action: data.action || location.href, style: 'display:none'}) | |
555 .append($('<input>').attr({type: 'hidden', name: '_keyid', value: data.key})) | |
556 .append($('<input>').attr({type: 'hidden', name: '_passwd', value: data.password})) | |
557 .append($('<input>').attr({type: 'hidden', name: '_token', value: this.env.request_token})) | |
558 .append($('<input>').attr({type: 'hidden', name: '_unlock', value: lock})); | |
559 | |
560 // Additional form fields for request parameters | |
561 $.each(data, function(i, v) { | |
562 if (i.indexOf('input') == 0) | |
563 form.append($('<input>').attr({type: 'hidden', name: i.substring(5), value: v})) | |
564 }); | |
565 | |
566 if (data.iframe) { | |
567 var name = 'enigma_frame_' + (new Date()).getTime(), | |
568 frame = $('<iframe>').attr({style: 'display:none', name: name}).appendTo(document.body); | |
569 form.attr('target', name); | |
570 } | |
571 | |
572 form.appendTo(document.body).submit(); | |
573 }; | |
574 | |
575 // submit entered password - in mail compose page | |
576 rcube_webmail.prototype.enigma_password_compose_submit = function(data) | |
577 { | |
578 var form = this.gui_objects.messageform; | |
579 | |
580 if (!$('input[name="_keyid"]', form).length) { | |
581 $(form).append($('<input>').attr({type: 'hidden', name: '_keyid', value: data.key})) | |
582 .append($('<input>').attr({type: 'hidden', name: '_passwd', value: data.password})); | |
583 } | |
584 else { | |
585 $('input[name="_keyid"]', form).val(data.key); | |
586 $('input[name="_passwd"]', form).val(data.password); | |
587 } | |
588 | |
589 this.submit_messageform(this.env.last_action == 'savedraft'); | |
590 }; | |
591 | |
592 // Display no-key error with key search button | |
593 rcube_webmail.prototype.enigma_key_not_found = function(data) | |
594 { | |
595 return this.show_popup_dialog( | |
596 data.text, | |
597 data.title, | |
598 [{ | |
599 text: data.button, | |
600 click: function(e) { | |
601 $(this).remove(); | |
602 rcmail.enigma_find_publickey(data.email); | |
603 } | |
604 }], | |
605 {width: 400, dialogClass: 'error'} | |
606 ); | |
607 }; | |
608 | |
609 // Search for a public key on the key server | |
610 rcube_webmail.prototype.enigma_find_publickey = function(email) | |
611 { | |
612 this.mailvelope_search_pubkeys([email], | |
613 function(status) {}, | |
614 function(key) { | |
615 var lock = rcmail.set_busy(true, 'enigma.importwait'), | |
616 post = {_a: 'import', _keys: key}; | |
617 | |
618 if (rcmail.env.action == 'plugin.enigmakeys') | |
619 post._refresh = 1; | |
620 | |
621 // send request to server | |
622 rcmail.http_post('plugin.enigmakeys', post, lock); | |
623 } | |
624 ); | |
625 }; |