From ed1d212ae2daea5e4bd043417610177093e99f19 Mon Sep 17 00:00:00 2001 From: Aleksander Machniak <alec@alec.pl> Date: Sat, 16 Jan 2016 03:03:51 -0500 Subject: [PATCH] Improved SVG cleanup code --- plugins/enigma/enigma.js | 385 +++++++++++++++++++++++++++++++++++++++++++++++-------- 1 files changed, 329 insertions(+), 56 deletions(-) diff --git a/plugins/enigma/enigma.js b/plugins/enigma/enigma.js index 29c6482..bd52d04 100644 --- a/plugins/enigma/enigma.js +++ b/plugins/enigma/enigma.js @@ -1,42 +1,64 @@ /* Enigma Plugin */ -if (window.rcmail) -{ - rcmail.addEventListener('init', function(evt) - { - if (rcmail.env.task == 'settings') { - rcmail.register_command('plugin.enigma', function() { rcmail.goto_url('plugin.enigma') }, true); - rcmail.register_command('plugin.enigma-key-import', function() { rcmail.enigma_key_import() }, true); - rcmail.register_command('plugin.enigma-key-export', function() { rcmail.enigma_key_export() }, true); +window.rcmail && rcmail.addEventListener('init', function(evt) { + if (rcmail.env.task == 'settings') { + rcmail.register_command('plugin.enigma', function() { rcmail.goto_url('plugin.enigma') }, true); - if (rcmail.gui_objects.keyslist) - { - var p = rcmail; - rcmail.keys_list = new rcube_list_widget(rcmail.gui_objects.keyslist, - {multiselect:false, draggable:false, keyboard:false}); - rcmail.keys_list.addEventListener('select', function(o){ p.enigma_key_select(o); }); - rcmail.keys_list.init(); - rcmail.keys_list.focus(); + if (rcmail.gui_objects.keyslist) { + rcmail.keys_list = new rcube_list_widget(rcmail.gui_objects.keyslist, + {multiselect:true, draggable:false, keyboard:false}); + rcmail.keys_list + .addEventListener('select', function(o) { rcmail.enigma_keylist_select(o); }) + .addEventListener('keypress', function(o) { rcmail.enigma_keylist_keypress(o); }) + .init() + .focus(); - rcmail.enigma_list(); + rcmail.enigma_list(); - rcmail.register_command('firstpage', function(props) {return rcmail.enigma_list_page('first'); }); - rcmail.register_command('previouspage', function(props) {return rcmail.enigma_list_page('previous'); }); - rcmail.register_command('nextpage', function(props) {return rcmail.enigma_list_page('next'); }); - rcmail.register_command('lastpage', function(props) {return rcmail.enigma_list_page('last'); }); - } - - if (rcmail.env.action == 'edit-prefs') { - rcmail.register_command('search', function(props) {return rcmail.enigma_search(props); }, true); - rcmail.register_command('reset-search', function(props) {return rcmail.enigma_search_reset(props); }, true); - } - else if (rcmail.env.action == 'plugin.enigma') { - rcmail.register_command('plugin.enigma-import', function() { rcmail.enigma_import() }, true); - rcmail.register_command('plugin.enigma-export', function() { rcmail.enigma_export() }, true); - } + rcmail.register_command('firstpage', function(props) { return rcmail.enigma_list_page('first'); }); + rcmail.register_command('previouspage', function(props) { return rcmail.enigma_list_page('previous'); }); + rcmail.register_command('nextpage', function(props) { return rcmail.enigma_list_page('next'); }); + rcmail.register_command('lastpage', function(props) { return rcmail.enigma_list_page('last'); }); } - }); -} + + if (rcmail.env.action == 'plugin.enigmakeys') { + rcmail.register_command('search', function(props) {return rcmail.enigma_search(props); }, true); + rcmail.register_command('reset-search', function(props) {return rcmail.enigma_search_reset(props); }, true); + rcmail.register_command('plugin.enigma-import', function() { rcmail.enigma_import(); }, true); + rcmail.register_command('plugin.enigma-key-export', function() { rcmail.enigma_export(); }); + rcmail.register_command('plugin.enigma-key-export-selected', function() { rcmail.enigma_export(true); }); + rcmail.register_command('plugin.enigma-key-import', function() { rcmail.enigma_key_import(); }, true); + rcmail.register_command('plugin.enigma-key-delete', function(props) { return rcmail.enigma_delete(); }); + rcmail.register_command('plugin.enigma-key-create', function(props) { return rcmail.enigma_key_create(); }, true); + rcmail.register_command('plugin.enigma-key-save', function(props) { return rcmail.enigma_key_create_save(); }, true); + + rcmail.addEventListener('responseafterplugin.enigmakeys', function() { + rcmail.enable_command('plugin.enigma-key-export', rcmail.env.rowcount > 0); + }); + } + } + else if (rcmail.env.task == 'mail') { + if (rcmail.env.action == 'compose') { + rcmail.addEventListener('beforesend', function(props) { rcmail.enigma_beforesend_handler(props); }) + .addEventListener('beforesavedraft', function(props) { rcmail.enigma_beforesavedraft_handler(props); }); + + $('input,label', $('#enigmamenu')).mouseup(function(e) { + // don't close the menu on mouse click inside + e.stopPropagation(); + }); + } + + $.each(['encrypt', 'sign'], function() { + if (rcmail.env['enigma_force_' + this]) + $('[name="_enigma_' + this + '"]').prop('checked', true); + }); + + if (rcmail.env.enigma_password_request) { + rcmail.enigma_password_request(rcmail.env.enigma_password_request); + } + } +}); + /*********************************************************/ /********* Enigma Settings/Keys/Certs UI *********/ @@ -45,47 +67,159 @@ // Display key(s) import form rcube_webmail.prototype.enigma_key_import = function() { - this.enigma_loadframe(null, '&_a=keyimport'); + this.enigma_loadframe('&_action=plugin.enigmakeys&_a=import'); }; -// Submit key(s) form +// Display key(s) generation form +rcube_webmail.prototype.enigma_key_create = function() +{ + this.enigma_loadframe('&_action=plugin.enigmakeys&_a=create'); +}; + +// Generate key(s) and submit them +rcube_webmail.prototype.enigma_key_create_save = function() +{ + var options, lock, + user = $('#key-ident > option').filter(':selected').text(), + password = $('#key-pass').val(), + confirm = $('#key-pass-confirm').val(), + size = $('#key-size').val(); + + // validate the form + if (!password || !confirm) + return alert(this.get_label('enigma.formerror')); + + if (password != confirm) + return alert(this.get_label('enigma.passwordsdiffer')); + + if (user.match(/^<[^>]+>$/)) + return alert(this.get_label('enigma.nonameident')); + + // generate keys + // use OpenPGP.js if browser supports required features + if (window.openpgp && window.crypto && (window.crypto.getRandomValues || window.crypto.subtle)) { + lock = this.set_busy(true, 'enigma.keygenerating'); + options = { + numBits: size, + userId: user, + passphrase: password + }; + + openpgp.generateKeyPair(options).then(function(keypair) { + // success + var post = {_a: 'import', _keys: keypair.privateKeyArmored}; + + // send request to server + rcmail.http_post('plugin.enigmakeys', post, lock); + }, function(error) { + // failure + rcmail.set_busy(false, null, lock); + rcmail.display_message(rcmail.get_label('enigma.keygenerateerror'), 'error'); + }); + } + // generate keys on the server + else if (rcmail.env.enigma_keygen_server) { + lock = this.set_busy(true, 'enigma.keygenerating'); + options = {_a: 'generate', _user: user, _password: password, _size: size}; + rcmail.http_post('plugin.enigmakeys', options, lock); + } + else { + rcmail.display_message(rcmail.get_label('enigma.keygennosupport'), 'error'); + } +}; + +// Action executed after successful key generation and import +rcube_webmail.prototype.enigma_key_create_success = function() +{ + parent.rcmail.enigma_list(1); +}; + +// Delete key(s) +rcube_webmail.prototype.enigma_delete = function() +{ + var keys = this.keys_list.get_selection(); + + if (!keys.length || !confirm(this.get_label('enigma.keyremoveconfirm'))) + return; + + var lock = this.display_message(this.get_label('enigma.keyremoving'), 'loading'), + post = {_a: 'delete', _keys: keys}; + + // send request to server + this.http_post('plugin.enigmakeys', post, lock); +}; + +// Export key(s) +rcube_webmail.prototype.enigma_export = function(selected) +{ + var keys = selected ? this.keys_list.get_selection().join(',') : '*'; + + if (!keys.length) + return; + + this.goto_url('plugin.enigmakeys', {_a: 'export', _keys: keys}); +}; + +// Submit key(s) import form rcube_webmail.prototype.enigma_import = function() { var form, file; + if (form = this.gui_objects.importform) { file = document.getElementById('rcmimportfile'); if (file && !file.value) { alert(this.get_label('selectimportfile')); return; } + + var lock = this.set_busy(true, 'importwait'); + + form.action = this.add_url(form.action, '_unlock', lock); form.submit(); - this.set_busy(true, 'importwait'); + this.lock_form(form, true); } }; // list row selection handler -rcube_webmail.prototype.enigma_key_select = function(list) +rcube_webmail.prototype.enigma_keylist_select = function(list) { - var id; - if (id = list.get_single_selection()) - this.enigma_loadframe(id); + var id = list.get_single_selection(), url; + + if (id) + url = '&_action=plugin.enigmakeys&_a=info&_id=' + id; + + this.enigma_loadframe(url); + this.enable_command('plugin.enigma-key-delete', 'plugin.enigma-key-export-selected', list.selection.length > 0); +}; + +rcube_webmail.prototype.enigma_keylist_keypress = function(list) +{ + if (list.modkey == CONTROL_KEY) + return; + + if (list.key_pressed == list.DELETE_KEY || list.key_pressed == list.BACKSPACE_KEY) + this.command('plugin.enigma-key-delete'); + else if (list.key_pressed == 33) + this.command('previouspage'); + else if (list.key_pressed == 34) + this.command('nextpage'); }; // load key frame -rcube_webmail.prototype.enigma_loadframe = function(id, url) +rcube_webmail.prototype.enigma_loadframe = function(url) { var frm, win; + if (this.env.contentframe && window.frames && (frm = window.frames[this.env.contentframe])) { - if (!id && !url && (win = window.frames[this.env.contentframe])) { - if (win.location && win.location.href.indexOf(this.env.blankpage)<0) + if (!url && (win = window.frames[this.env.contentframe])) { + if (win.location && win.location.href.indexOf(this.env.blankpage) < 0) win.location.href = this.env.blankpage; return; } - this.set_busy(true); - if (!url) - url = '&_a=keyinfo&_id='+id; - frm.location.href = this.env.comm_path+'&_action=plugin.enigma&_framed=1' + url; + + this.env.frame_lock = this.set_busy(true, 'loading'); + frm.location.href = this.env.comm_path + '&_framed=1&' + url; } }; @@ -96,14 +230,14 @@ props = this.gui_objects.qsearchbox.value; if (props || this.env.search_request) { - var params = {'_a': 'keysearch', '_q': urlencode(props)}, + var params = {'_a': 'search', '_q': urlencode(props)}, lock = this.set_busy(true, 'searching'); // if (this.gui_objects.search_filter) // addurl += '&_filter=' + this.gui_objects.search_filter.value; - this.env.current_page = 1; + this.env.current_page = 1; this.enigma_loadframe(); this.enigma_clear_list(); - this.http_post('plugin.enigma', params, lock); + this.http_post('plugin.enigmakeys', params, lock); } return false; @@ -129,7 +263,7 @@ // Keys/certs listing rcube_webmail.prototype.enigma_list = function(page) { - var params = {'_a': 'keylist'}, + var params = {'_a': 'list'}, lock = this.set_busy(true, 'loading'); this.env.current_page = page ? page : 1; @@ -140,7 +274,7 @@ params._p = page; this.enigma_clear_list(); - this.http_post('plugin.enigma', params, lock); + this.http_post('plugin.enigmakeys', params, lock); } // Change list page @@ -164,6 +298,8 @@ this.enigma_loadframe(); if (this.keys_list) this.keys_list.clear(true); + + this.enable_command('plugin.enigma-key-delete', 'plugin.enigma-key-delete-selected', false); } // Adds a row to the list @@ -190,17 +326,154 @@ list.insert_row(row); } + /*********************************************************/ /********* Enigma Message methods *********/ /*********************************************************/ +// handle message send/save action +rcube_webmail.prototype.enigma_beforesend_handler = function(props) +{ + this.env.last_action = 'send'; + this.enigma_compose_handler(props); +} + +rcube_webmail.prototype.enigma_beforesavedraft_handler = function(props) +{ + this.env.last_action = 'savedraft'; + this.enigma_compose_handler(props); +} + +rcube_webmail.prototype.enigma_compose_handler = function(props) +{ + var form = this.gui_objects.messageform; + + // copy inputs from enigma menu to the form + $('#enigmamenu input').each(function() { + var id = this.id + '_cpy', input = $('#' + id); + + if (!input.length) { + input = $(this).clone(); + input.prop({id: id, type: 'hidden'}).appendTo(form); + } + + input.val(this.checked ? '1' : ''); + }); + + // disable signing when saving drafts + if (this.env.last_action == 'savedraft') { + $('input[name="_enigma_sign"]', form).val(0); + } +} + // Import attached keys/certs file rcube_webmail.prototype.enigma_import_attachment = function(mime_id) { - var lock = this.set_busy(true, 'loading'); - this.http_post('plugin.enigmaimport', '_uid='+this.env.uid+'&_mbox=' - +urlencode(this.env.mailbox)+'&_part='+urlencode(mime_id), lock); + var lock = this.set_busy(true, 'loading'), + post = {_uid: this.env.uid, _mbox: this.env.mailbox, _part: mime_id}; + + this.http_post('plugin.enigmaimport', post, lock); return false; -}; +} +// password request popup +rcube_webmail.prototype.enigma_password_request = function(data) +{ + if (!data || !data.keyid) { + return; + } + + var ref = this, + msg = this.get_label('enigma.enterkeypass'), + myprompt = $('<div class="prompt">'), + myprompt_content = $('<div class="message">') + .appendTo(myprompt), + myprompt_input = $('<input>').attr({type: 'password', size: 30}) + .keypress(function(e) { + if (e.which == 13) + (ref.is_framed() ? window.parent.$ : $)('.ui-dialog-buttonpane button.mainaction:visible').click(); + }) + .appendTo(myprompt); + + data.key = data.keyid; + if (data.keyid.length > 8) + data.keyid = data.keyid.substr(data.keyid.length - 8); + + $.each(['keyid', 'user'], function() { + msg = msg.replace('$' + this, data[this]); + }); + + myprompt_content.text(msg); + + this.show_popup_dialog(myprompt, this.get_label('enigma.enterkeypasstitle'), + [{ + text: this.get_label('save'), + 'class': 'mainaction', + click: function(e) { + e.stopPropagation(); + + var jq = ref.is_framed() ? window.parent.$ : $; + + data.password = myprompt_input.val(); + + if (!data.password) { + myprompt_input.focus(); + return; + } + + ref.enigma_password_submit(data); + jq(this).remove(); + } + }, + { + text: this.get_label('cancel'), + click: function(e) { + var jq = ref.is_framed() ? window.parent.$ : $; + e.stopPropagation(); + jq(this).remove(); + } + }], {width: 400}); + + if (this.is_framed() && parent.rcmail.message_list) { + // this fixes bug when pressing Enter on "Save" button in the dialog + parent.rcmail.message_list.blur(); + } +} + +// submit entered password +rcube_webmail.prototype.enigma_password_submit = function(data) +{ + if (this.env.action == 'compose' && !data['compose-init']) { + return this.enigma_password_compose_submit(data); + } + + var lock = this.set_busy(true, 'loading'); + + // message preview + var form = $('<form>').attr({method: 'post', action: location.href, style: 'display:none'}) + .append($('<input>').attr({type: 'hidden', name: '_keyid', value: data.key})) + .append($('<input>').attr({type: 'hidden', name: '_passwd', value: data.password})) + .append($('<input>').attr({type: 'hidden', name: '_token', value: this.env.request_token})) + .append($('<input>').attr({type: 'hidden', name: '_unlock', value: lock})) + .appendTo(document.body); + + form.submit(); +} + +// submit entered password - in mail compose page +rcube_webmail.prototype.enigma_password_compose_submit = function(data) +{ + var form = this.gui_objects.messageform; + + if (!$('input[name="_keyid"]', form).length) { + $(form).append($('<input>').attr({type: 'hidden', name: '_keyid', value: data.key})) + .append($('<input>').attr({type: 'hidden', name: '_passwd', value: data.password})); + } + else { + $('input[name="_keyid"]', form).val(data.key); + $('input[name="_passwd"]', form).val(data.password); + } + + this.submit_messageform(this.env.last_action == 'savedraft'); +} -- Gitblit v1.9.1