From 5d08d570054a118da512374371ac5fb3087b0855 Mon Sep 17 00:00:00 2001 From: Aleksander Machniak <alec@alec.pl> Date: Wed, 27 Apr 2016 04:46:20 -0400 Subject: [PATCH] Don't log ajax requests/responses, browser development tools already can show this information --- program/js/app.js | 108 ++++++++++++++++++++++++++++++++--------------------- 1 files changed, 65 insertions(+), 43 deletions(-) diff --git a/program/js/app.js b/program/js/app.js index 78df592..e2c8930 100644 --- a/program/js/app.js +++ b/program/js/app.js @@ -295,7 +295,7 @@ else if (this.env.action == 'compose') { this.env.address_group_stack = []; this.env.compose_commands = ['send-attachment', 'remove-attachment', 'send', 'cancel', - 'toggle-editor', 'list-adresses', 'pushgroup', 'search', 'reset-search', 'extwin', + 'toggle-editor', 'list-addresses', 'pushgroup', 'search', 'reset-search', 'extwin', 'insert-response', 'save-response', 'menu-open', 'menu-close']; if (this.env.drafts_mailbox) @@ -381,7 +381,7 @@ if (this.gui_objects.addressbookslist) { this.gui_objects.folderlist = this.gui_objects.addressbookslist; - this.enable_command('list-adresses', true); + this.enable_command('list-addresses', true); } // ask user to send MDN @@ -581,7 +581,12 @@ this.display_message.apply(this, this.pending_message); // init treelist widget - if (this.gui_objects.folderlist && window.rcube_treelist_widget) { + if (this.gui_objects.folderlist && window.rcube_treelist_widget + // some plugins may load rcube_treelist_widget and there's one case + // when this will cause problems - addressbook widget in compose, + // which already has been initialized using rcube_list_widget + && this.gui_objects.folderlist != this.gui_objects.addressbookslist + ) { this.treelist = new rcube_treelist_widget(this.gui_objects.folderlist, { selectable: true, id_prefix: 'rcmli', @@ -1019,7 +1024,7 @@ break; } - this.goto_url('get', qstring+'&_download=1', false); + this.goto_url('get', qstring+'&_download=1', false, true); break; case 'select-all': @@ -1161,7 +1166,7 @@ this.change_identity($("[name='_from']")[0], true); break; - case 'list-adresses': + case 'list-addresses': this.list_contacts(props); this.enable_command('add-recipient', false); break; @@ -1225,10 +1230,10 @@ case 'download': if (this.env.action == 'get') { - location.href = location.href.replace(/_frame=/, '_download='); + location.href = this.secure_url(location.href.replace(/_frame=/, '_download=')); } else if (uid = this.get_single_uid()) { - this.goto_url('viewsource', this.params_from_uid(uid, {_save: 1})); + this.goto_url('viewsource', this.params_from_uid(uid, {_save: 1}), false, true); } break; @@ -1316,13 +1321,13 @@ case 'export': if (this.contact_list.rowcount > 0) { - this.goto_url('export', { _source: this.env.source, _gid: this.env.group, _search: this.env.search_request }); + this.goto_url('export', { _source: this.env.source, _gid: this.env.group, _search: this.env.search_request }, false, true); } break; case 'export-selected': if (this.contact_list.rowcount > 0) { - this.goto_url('export', { _source: this.env.source, _gid: this.env.group, _cid: this.contact_list.get_selection().join(',') }); + this.goto_url('export', { _source: this.env.source, _gid: this.env.group, _cid: this.contact_list.get_selection().join(',') }, false, true); } break; @@ -1437,7 +1442,7 @@ if (task == 'mail') url += '&_mbox=INBOX'; else if (task == 'logout' && !this.env.server_error) { - url += '&_token=' + this.env.request_token; + url = this.secure_url(url); this.clear_compose_data(); } @@ -1485,6 +1490,12 @@ return url + '?' + name + '=' + value; }; + + // append CSRF protection token to the given url + this.secure_url = function(url) + { + return this.add_url(url, '_token', this.env.request_token); + }, this.is_framed = function() { @@ -3393,12 +3404,12 @@ mailvelope.getKeyring(keyring).then(function(kr) { ref.mailvelope_keyring = kr; ref.mailvelope_init(action, kr); - }).catch(function(err) { + }, function(err) { // attempt to create a new keyring for this app/user mailvelope.createKeyring(keyring).then(function(kr) { ref.mailvelope_keyring = kr; ref.mailvelope_init(action, kr); - }).catch(function(err) { + }, function(err) { console.error(err); }); }); @@ -3526,7 +3537,7 @@ ref.remove_from_attachment_list(name); }); } - }).catch(function(err) { + }, function(err) { console.error(err); console.log(options); }); @@ -3649,15 +3660,15 @@ form.submit(); - }).catch(function(err) { + }, function(err) { console.log(err); }); // mailvelope_editor.encrypt() - }).catch(function(err) { + }, function(err) { console.error(err); }); // mailvelope_keyring.validKeyForAddress(senders) - }).catch(function(err) { + }, function(err) { console.error(err); }); // mailvelope_keyring.validKeyForAddress(recipients) @@ -3671,7 +3682,7 @@ $(selector).addClass('mailvelope').children().not('iframe').hide(); ref.hide_message(msgid); setTimeout(function() { $(window).resize(); }, 10); - }).catch(function(err) { + }, function(err) { console.error(err); ref.hide_message(msgid); ref.display_message('Message decryption failed: ' + err.message, 'error') @@ -3727,7 +3738,7 @@ if (missing_keys.length) { ref.display_message(ref.get_label('nopubkeyfor').replace('$email', missing_keys.join(', ')), 'warning'); } - }, function() { + }).fail(function() { console.error('Pubkey lookup failed with', arguments); ref.hide_message(lock); ref.display_message('pubkeysearcherror', 'error'); @@ -3825,7 +3836,7 @@ btn.closest('.key').fadeOut(); ref.display_message(ref.get_label('keyimportsuccess').replace('$key', $key), 'confirmation'); } - }).catch(function(err) { + }, function(err) { console.log(err); }); }); @@ -3962,7 +3973,7 @@ } if (!html_mode) { - pos = this.env.top_posting ? 0 : input_message.value.length; + pos = this.env.top_posting && this.env.compose_mode ? 0 : input_message.value.length; // add signature according to selected identity // if we have HTML editor, signature is added in a callback @@ -7819,8 +7830,6 @@ var url = '?_task=utils&_action=' + (format == 'html' ? 'html2text' : 'text2html'), lock = this.set_busy(true, 'converting'); - this.log('HTTP POST: ' + url); - $.ajax({ type: 'POST', url: url, data: text, contentType: 'application/octet-stream', error: function(o, status, err) { ref.http_error(o, status, err, lock); }, success: function(data) { @@ -7894,9 +7903,11 @@ } }; - this.goto_url = function(action, query, lock) + this.goto_url = function(action, query, lock, secure) { - this.redirect(this.url(action, query), lock); + var url = this.url(action, query) + if (secure) url = this.secure_url(url); + this.redirect(url, lock); }; this.location_href = function(url, target, frame) @@ -8000,22 +8011,23 @@ if (response.env) this.set_env(response.env); + var i; + // we have labels to add if (typeof response.texts === 'object') { - for (var name in response.texts) - if (typeof response.texts[name] === 'string') - this.add_label(name, response.texts[name]); + for (i in response.texts) + if (typeof response.texts[i] === 'string') + this.add_label(i, response.texts[i]); } // if we get javascript code from server -> execute it if (response.exec) { - this.log(response.exec); eval(response.exec); } // execute callback functions of plugins if (response.callbacks && response.callbacks.length) { - for (var i=0; i < response.callbacks.length; i++) + for (i=0; i < response.callbacks.length; i++) this.triggerEvent(response.callbacks[i][0], response.callbacks[i][1]); } @@ -8110,7 +8122,10 @@ this.enable_command('set-listmode', this.env.threads && !is_multifolder); if (list.rowcount > 0 && !$(document.activeElement).is('input,textarea')) list.focus(); - this.msglist_select(list); + + // trigger 'select' so all dependent actions update its state + // e.g. plugins use this event to activate buttons (#1490647) + list.triggerEvent('select'); } if (response.action != 'getunread') @@ -8377,7 +8392,7 @@ // html5 file-drop API this.document_drag_hover = function(e, over) { - e.preventDefault(); + // don't e.preventDefault() here to not block text dragging on the page (#1490619) $(this.gui_objects.filedrop)[(over?'addClass':'removeClass')]('active'); }; @@ -8755,14 +8770,10 @@ if (!this.env.browser_capabilities) this.env.browser_capabilities = {}; - if (this.env.browser_capabilities.pdf === undefined) - this.env.browser_capabilities.pdf = this.pdf_support_check(); - - if (this.env.browser_capabilities.flash === undefined) - this.env.browser_capabilities.flash = this.flash_support_check(); - - if (this.env.browser_capabilities.tif === undefined) - this.tif_support_check(); + $.each(['pdf', 'flash', 'tif'], function() { + if (ref.env.browser_capabilities[this] === undefined) + ref.env.browser_capabilities[this] = ref[this + '_support_check'](); + }); }; // Returns browser capabilities string @@ -8781,11 +8792,14 @@ this.tif_support_check = function() { - var img = new Image(); + window.setTimeout(function() { + var img = new Image(); + img.onload = function() { ref.env.browser_capabilities.tif = 1; }; + img.onerror = function() { ref.env.browser_capabilities.tif = 0; }; + img.src = ref.assets_path('program/resources/blank.tif'); + }, 10); - img.onload = function() { ref.env.browser_capabilities.tif = 1; }; - img.onerror = function() { ref.env.browser_capabilities.tif = 0; }; - img.src = this.assets_path('program/resources/blank.tif'); + return 0; }; this.pdf_support_check = function() @@ -8821,6 +8835,14 @@ return 1; } + window.setTimeout(function() { + $('<object>').css({position: 'absolute', left: '-10000px'}) + .attr({data: ref.assets_path('program/resources/dummy.pdf'), width: 1, height: 1, type: 'application/pdf'}) + .load(function() { ref.env.browser_capabilities.pdf = 1; }) + .error(function() { ref.env.browser_capabilities.pdf = 0; }) + .appendTo($('body')); + }, 10); + return 0; }; -- Gitblit v1.9.1