diff --git a/program/js/app.js b/program/js/app.js index 19c5f9bab..8a9712fbc 100644 --- a/program/js/app.js +++ b/program/js/app.js @@ -325,7 +325,9 @@ function rcube_webmail() else if (this.env.action == 'get') this.enable_command('download', 'print', true); // show printing dialog - else if (this.env.action == 'print' && this.env.uid) { + else if (this.env.action == 'print' && this.env.uid + && !this.env.is_pgp_content && !this.env.pgp_mime_part + ) { this.print_dialog(); } @@ -3361,13 +3363,13 @@ function rcube_webmail() } }; - // + // Load Mailvelope functionality (and initialize keyring if needed) this.mailvelope_load = function(action) { if (this.env.browser_capabilities) this.env.browser_capabilities['pgpmime'] = 1; - var keyring = this.get_local_storage_prefix(); + var keyring = this.env.user_id; mailvelope.getKeyring(keyring).then(function(kr) { ref.mailvelope_keyring = kr; @@ -3383,17 +3385,20 @@ function rcube_webmail() }); }; - // + // Initializes Mailvelope editor or display container this.mailvelope_init = function(action, keyring) { - if (action == 'show' || action == 'preview') { + if (!window.mailvelope) + return; + + if (action == 'show' || action == 'preview' || action == 'print') { // decrypt text body - if (this.env.is_pgp_content && window.mailvelope) { + if (this.env.is_pgp_content) { var data = $(this.env.is_pgp_content).text(); ref.mailvelope_display_container(this.env.is_pgp_content, data, keyring); } // load pgp/mime message and pass it to the mailvelope display container - else if (this.env.pgp_mime_part && window.mailvelope) { + else if (this.env.pgp_mime_part) { var msgid = this.display_message(this.get_label('loadingdata'), 'loading'), selector = this.env.pgp_mime_container; @@ -3409,21 +3414,32 @@ function rcube_webmail() }); } } - else if (action == 'compose' && window.mailvelope) { + else if (action == 'compose') { this.env.compose_commands.push('compose-encrypted'); + // display the toolbar button + $('#' + this.buttons['compose-encrypted'][0].id).show(); + + var is_html = $('input[name="_is_html"]').val() > 0; if (this.env.pgp_mime_message) { // fetch PGP/Mime part and open load into Mailvelope editor var lock = this.set_busy(true, this.get_label('loadingdata')); + $.ajax({ type: 'GET', url: this.url('get', this.env.pgp_mime_message), error: function(o, status, err) { ref.http_error(o, status, err, lock); - ref.enable_command('compose-encrypted', true); + ref.enable_command('compose-encrypted', !is_html); }, success: function(data) { ref.set_busy(false, null, lock); + + if (is_html) { + ref.command('toggle-editor', {html: false, noconvert: true}); + $('#' + ref.env.composebody).val(''); + } + ref.compose_encrypted({ quotedMail: data }); ref.enable_command('compose-encrypted', true); } @@ -3431,7 +3447,7 @@ function rcube_webmail() } else { // enable encrypted compose toggle - this.enable_command('compose-encrypted', true); + this.enable_command('compose-encrypted', !is_html); } } }; @@ -3439,7 +3455,7 @@ function rcube_webmail() // handler for the 'compose-encrypted' command this.compose_encrypted = function(props) { - var container = $('#' + this.env.composebody).parent(); + var options, container = $('#' + this.env.composebody).parent(); // remove Mailvelope editor if active if (ref.mailvelope_editor) { @@ -3458,10 +3474,16 @@ function rcube_webmail() } // embed Mailvelope editor container else { - var options = { predefinedText: $('#' + this.env.composebody).val() }; + if (this.spellcheck_state()) + this.editor.spellcheck_stop(); + if (props.quotedMail) { options = { quotedMail: props.quotedMail, quotedMailIndent: false }; } + else { + options = { predefinedText: $('#' + this.env.composebody).val() }; + } + if (this.env.compose_mode == 'reply') { options.quotedMailIndent = true; options.quotedMailHeader = this.env.compose_reply_header; @@ -3629,7 +3651,7 @@ function rcube_webmail() this.mailvelope_display_container = function(selector, data, keyring, msgid) { mailvelope.createDisplayContainer(selector, data, keyring, { showExternalContent: this.env.safemode }).then(function() { - $(selector).addClass('mailvelope').find('.message-part, .part-notice').hide(); + $(selector).addClass('mailvelope').children().not('iframe').hide(); ref.hide_message(msgid); setTimeout(function() { $(window).resize(); }, 10); }).catch(function(err) { @@ -3772,7 +3794,7 @@ function rcube_webmail() ref.hide_message(lock); if (errorCode) { - ref.display_message('Failed to get key from keyserver', 'error'); + ref.display_message(ref.get_label('keyservererror'), 'error'); return; } @@ -3782,9 +3804,9 @@ function rcube_webmail() // alert(ref.get_label('Key import was rejected')); } else { + var $key = keyid.substr(-8).toUpperCase(); btn.closest('.key').fadeOut(); - ref.display_message(ref.get_label('Public key $key successfully imported into your key ring') - .replace('$key', keyid.substr(-8).toUpperCase()), 'confirmation'); + ref.display_message(ref.get_label('keyimportsuccess').replace('$key', $key), 'confirmation'); } }).catch(function(err) { console.log(err); @@ -4244,6 +4266,8 @@ function rcube_webmail() if (result) { // update internal format flag $("input[name='_is_html']").val(props.html ? 1 : 0); + // enable encrypted compose toggle + this.enable_command('compose-encrypted', !props.html); } return result; diff --git a/program/localization/en_US/messages.inc b/program/localization/en_US/messages.inc index d7bef0e49..cc8d5ea11 100644 --- a/program/localization/en_US/messages.inc +++ b/program/localization/en_US/messages.inc @@ -62,6 +62,8 @@ $messages['nopubkeyforsender'] = 'No valid public key found for your sender iden $messages['encryptnoattachments'] = 'Already uploaded attachments cannot be encrypted. Please re-add them in the encryption editor.'; $messages['searchpubkeyservers'] = 'Do you want to search public key servers for the missing keys?'; $messages['encryptpubkeysfound'] = 'The following public keys have been found:'; +$messages['keyservererror'] = 'Failed to get key from keyserver'; +$messages['keyimportsuccess'] = 'Public key $key successfully imported into your key ring'; $messages['nocontactsfound'] = 'No contacts found.'; $messages['contactnotfound'] = 'The requested contact was not found.'; $messages['contactsearchonly'] = 'Enter some search terms to find contacts'; diff --git a/program/steps/mail/compose.inc b/program/steps/mail/compose.inc index fd8726687..0b047d465 100644 --- a/program/steps/mail/compose.inc +++ b/program/steps/mail/compose.inc @@ -88,7 +88,7 @@ $OUTPUT->add_label('nosubject', 'nosenderwarning', 'norecipientwarning', 'nosubj 'selectimportfile', 'messageissent', 'loadingdata', 'nopubkeyfor', 'nopubkeyforsender', 'encryptnoattachments','encryptedsendialog','searchpubkeyservers', 'importpubkeys', 'encryptpubkeysfound', 'search', 'close', 'import', 'keyid', 'keylength', 'keyexpired', - 'keyrevoked'); + 'keyrevoked', 'keyimportsuccess', 'keyservererror'); $OUTPUT->set_pagetitle($RCMAIL->gettext('compose')); @@ -788,7 +788,6 @@ function rcmail_prepare_message_body() '_uid' => $MESSAGE->uid, '_part' => $pgp_mime_part->mime_id, )); - $RCMAIL->output->set_env('compose_mode', $compose_mode); } continue; } @@ -876,7 +875,7 @@ function rcmail_compose_part_body($part, $isHtml = false) } // register this part as pgp encrypted - if (strpos($body, 'BEGIN PGP MESSAGE') !== false) { + if (strpos($body, '-----BEGIN PGP MESSAGE-----') !== false) { $MESSAGE->pgp_mime = true; $RCMAIL->output->set_env('pgp_mime_message', array( '_mbox' => $RCMAIL->storage->get_folder(), '_uid' => $MESSAGE->uid, '_part' => $part->mime_id, diff --git a/program/steps/mail/func.inc b/program/steps/mail/func.inc index 920eb80bf..f4569457f 100644 --- a/program/steps/mail/func.inc +++ b/program/steps/mail/func.inc @@ -1237,8 +1237,8 @@ function rcmail_message_body($attrib) } // check if the message body is PGP encrypted - if (strpos($body, 'BEGIN PGP MESSAGE') !== false) { - $OUTPUT->set_env('is_pgp_content', '#' . $attrib['id']); + if (strpos($body, '-----BEGIN PGP MESSAGE-----') !== false) { + $OUTPUT->set_env('is_pgp_content', '#message-part' . ($part_no + 1)); } $plugin = $RCMAIL->plugins->exec_hook('message_body_prefix', @@ -1261,8 +1261,11 @@ function rcmail_message_body($attrib) $out .= html::div($div_attr, $plugin['prefix'] . $body); } - else - $out .= html::div('message-part', $plugin['prefix'] . $body); + else { + $container_id = 'message-part' . (++$part_no); + $div_attr = array('class' => 'message-part', 'id' => $container_id); + $out .= html::div($div_attr, $plugin['prefix'] . $body); + } } } } diff --git a/skins/larry/mail.css b/skins/larry/mail.css index cac86e544..80e210946 100644 --- a/skins/larry/mail.css +++ b/skins/larry/mail.css @@ -879,10 +879,6 @@ div.hide-headers { margin: 8px; } -#messagebody.mailvelope > iframe { - width: 99% !important; -} - #message-objects div, #messagebody span.part-notice { margin: 8px; diff --git a/skins/larry/styles.css b/skins/larry/styles.css index 0896a9e27..88459af36 100644 --- a/skins/larry/styles.css +++ b/skins/larry/styles.css @@ -2021,6 +2021,10 @@ ul.proplist li { color: #1978a1; } +.toolbar a.button.selected:focus { + color: #fff; +} + .toolbar a.button.hidden { display: none; } diff --git a/skins/larry/templates/compose.html b/skins/larry/templates/compose.html index 77b9cfdd3..262a89db8 100644 --- a/skins/larry/templates/compose.html +++ b/skins/larry/templates/compose.html @@ -33,7 +33,7 @@