Pass encrypted draft and reply messages to Mailvelope editor; add toolbar icon for encryption mode toggeling

pull/297/head
Thomas Bruederli 10 years ago
parent 40d152cfdc
commit 3167e58ff9

@ -3396,8 +3396,7 @@ function rcube_webmail()
type: 'GET', type: 'GET',
url: this.url('get', { '_mbox': this.env.mailbox, '_uid': this.env.uid, '_part': this.env.pgp_mime_part }), url: this.url('get', { '_mbox': this.env.mailbox, '_uid': this.env.uid, '_part': this.env.pgp_mime_part }),
error: function(o, status, err) { error: function(o, status, err) {
ref.hide_message(msgkey); ref.http_error(o, status, err, msgid);
ref.http_error(o, status, err, lock);
}, },
success: function(data) { success: function(data) {
ref.mailvelope_display_container(selector, data, keyring, msgid); ref.mailvelope_display_container(selector, data, keyring, msgid);
@ -3406,11 +3405,31 @@ function rcube_webmail()
} }
} }
else if (action == 'compose' && window.mailvelope) { else if (action == 'compose' && window.mailvelope) {
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);
},
success: function(data) {
ref.set_busy(false, null, lock);
ref.compose_encrypted({ quotedMail: data });
ref.enable_command('compose-encrypted', true);
}
});
}
else {
// enable encrypted compose toggle
this.enable_command('compose-encrypted', true); this.enable_command('compose-encrypted', true);
} }
}
}; };
// handler for the 'compose-encrypt' command // handler for the 'compose-encrypted' command
this.compose_encrypted = function(props) this.compose_encrypted = function(props)
{ {
var container = $('#' + this.env.composebody).parent(); var container = $('#' + this.env.composebody).parent();
@ -3429,6 +3448,14 @@ function rcube_webmail()
// embed Mailvelope editor container // embed Mailvelope editor container
else { else {
var options = { predefinedText: $('#' + this.env.composebody).val() }; var options = { predefinedText: $('#' + this.env.composebody).val() };
if (props.quotedMail) {
options = { quotedMail: props.quotedMail, quotedMailIndent: false };
}
if (this.env.compose_mode == 'reply') {
options.quotedMailIndent = true;
options.quotedMailHeader = this.env.compose_reply_header;
}
mailvelope.createEditorContainer('#' + container.attr('id'), ref.mailvelope_keyring, options).then(function(editor) { mailvelope.createEditorContainer('#' + container.attr('id'), ref.mailvelope_keyring, options).then(function(editor) {
ref.mailvelope_editor = editor; ref.mailvelope_editor = editor;
ref.compose_skip_unsavedcheck = true; ref.compose_skip_unsavedcheck = true;
@ -3436,6 +3463,15 @@ function rcube_webmail()
container.addClass('mailvelope'); container.addClass('mailvelope');
$('#' + ref.env.composebody).hide(); $('#' + ref.env.composebody).hide();
// notify user about loosing attachments
if (ref.env.attachments && !$.isEmptyObject(ref.env.attachments)) {
alert(ref.get_label('encryptnoattachments'));
$.each(ref.env.attachments, function(name, attach) {
ref.remove_from_attachment_list(name);
});
}
}).catch(function(err) { }).catch(function(err) {
console.error(err); console.error(err);
}); });

@ -59,6 +59,7 @@ $messages['encryptedmessage'] = 'This is an encrypted message and can not be dis
$messages['externalmessagedecryption'] = 'This is an encrypted message and can be decrypted with your browser extension.'; $messages['externalmessagedecryption'] = 'This is an encrypted message and can be decrypted with your browser extension.';
$messages['nopubkeyfor'] = 'No valid public key found for $email'; $messages['nopubkeyfor'] = 'No valid public key found for $email';
$messages['nopubkeyforsender'] = 'No valid public key found for your sender identity. Do you want to encrypt the message for the recipients only?'; $messages['nopubkeyforsender'] = 'No valid public key found for your sender identity. Do you want to encrypt the message for the recipients only?';
$messages['encryptnoattachments'] = 'Alraady uploaded attachments cannot be encrypted. Please re-add them in the encryption editor.';
$messages['nocontactsfound'] = 'No contacts found.'; $messages['nocontactsfound'] = 'No contacts found.';
$messages['contactnotfound'] = 'The requested contact was not found.'; $messages['contactnotfound'] = 'The requested contact was not found.';
$messages['contactsearchonly'] = 'Enter some search terms to find contacts'; $messages['contactsearchonly'] = 'Enter some search terms to find contacts';

@ -83,7 +83,8 @@ $OUTPUT->add_label('nosubject', 'nosenderwarning', 'norecipientwarning', 'nosubj
'messagesaved', 'converting', 'editorwarning', 'searching', 'uploading', 'uploadingmany', 'messagesaved', 'converting', 'editorwarning', 'searching', 'uploading', 'uploadingmany',
'fileuploaderror', 'sendmessage', 'newresponse', 'responsename', 'responsetext', 'save', 'fileuploaderror', 'sendmessage', 'newresponse', 'responsename', 'responsetext', 'save',
'savingresponse', 'restoresavedcomposedata', 'restoremessage', 'delete', 'restore', 'ignore', 'savingresponse', 'restoresavedcomposedata', 'restoremessage', 'delete', 'restore', 'ignore',
'selectimportfile', 'messageissent', 'nopubkeyfor', 'nopubkeyforsender'); 'selectimportfile', 'messageissent', 'loadingdata', 'nopubkeyfor', 'nopubkeyforsender',
'encryptnoattachments');
$OUTPUT->set_pagetitle($RCMAIL->gettext('compose')); $OUTPUT->set_pagetitle($RCMAIL->gettext('compose'));
@ -749,6 +750,21 @@ function rcmail_prepare_message_body()
} }
foreach ($MESSAGE->parts as $part) { foreach ($MESSAGE->parts as $part) {
if ($part->realtype == 'multipart/encrypted') {
// find the encrypted message payload part
foreach ($MESSAGE->mime_parts as $mime_id => $mpart) {
if ($mpart->mimetype == 'application/octet-stream' || !empty($mpart->filename)) {
$RCMAIL->output->set_env('pgp_mime_message', array(
'_mbox' => $RCMAIL->storage->get_folder(), '_uid' => $MESSAGE->uid, '_part' => $mime_id,
));
$RCMAIL->output->set_env('compose_mode', $compose_mode);
$MESSAGE->pgp_mime = true;
break;
}
}
continue;
}
// skip no-content and attachment parts (#1488557) // skip no-content and attachment parts (#1488557)
if ($part->type != 'content' || !$part->size || $MESSAGE->is_attachment($part)) { if ($part->type != 'content' || !$part->size || $MESSAGE->is_attachment($part)) {
continue; continue;
@ -771,15 +787,22 @@ function rcmail_prepare_message_body()
} }
// compose reply-body // compose reply-body
if ($compose_mode == RCUBE_COMPOSE_REPLY) if ($compose_mode == RCUBE_COMPOSE_REPLY) {
$body = rcmail_create_reply_body($body, $isHtml); $body = rcmail_create_reply_body($body, $isHtml);
if ($MESSAGE->pgp_mime) {
$RCMAIL->output->set_env('compose_reply_header', rcmail_get_reply_header($MESSAGE));
}
}
// forward message body inline // forward message body inline
else if ($compose_mode == RCUBE_COMPOSE_FORWARD) else if ($compose_mode == RCUBE_COMPOSE_FORWARD) {
$body = rcmail_create_forward_body($body, $isHtml); $body = rcmail_create_forward_body($body, $isHtml);
}
// load draft message body // load draft message body
else if ($compose_mode == RCUBE_COMPOSE_DRAFT || $compose_mode == RCUBE_COMPOSE_EDIT) else if ($compose_mode == RCUBE_COMPOSE_DRAFT || $compose_mode == RCUBE_COMPOSE_EDIT) {
$body = rcmail_create_draft_body($body, $isHtml); $body = rcmail_create_draft_body($body, $isHtml);
} }
}
else { // new message else { // new message
$isHtml = rcmail_compose_editor_mode(); $isHtml = rcmail_compose_editor_mode();
} }
@ -808,7 +831,7 @@ function rcmail_prepare_message_body()
function rcmail_compose_part_body($part, $isHtml = false) function rcmail_compose_part_body($part, $isHtml = false)
{ {
global $RCMAIL, $MESSAGE, $LINE_LENGTH, $compose_mode; global $RCMAIL, $COMPOSE, $MESSAGE, $LINE_LENGTH, $compose_mode;
// Check if we have enough memory to handle the message in it // Check if we have enough memory to handle the message in it
// #1487424: we need up to 10x more memory than the body // #1487424: we need up to 10x more memory than the body
@ -824,6 +847,14 @@ function rcmail_compose_part_body($part, $isHtml = false)
return ''; return '';
} }
// register this part as pgp encrypted
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,
));
}
if ($isHtml) { if ($isHtml) {
if ($part->ctype_secondary == 'html') { if ($part->ctype_secondary == 'html') {
} }
@ -990,16 +1021,7 @@ function rcmail_create_reply_body($body, $bodyIsHtml)
{ {
global $RCMAIL, $MESSAGE, $LINE_LENGTH; global $RCMAIL, $MESSAGE, $LINE_LENGTH;
// build reply prefix $prefix = rcmail_get_reply_header($MESSAGE);
$from = array_pop(rcube_mime::decode_address_list($MESSAGE->get_header('from'), 1, false, $MESSAGE->headers->charset));
$prefix = $RCMAIL->gettext(array(
'name' => 'mailreplyintro',
'vars' => array(
'date' => $RCMAIL->format_date($MESSAGE->headers->date, $RCMAIL->config->get('date_long')),
'sender' => $from['name'] ? $from['name'] : rcube_utils::idn_to_utf8($from['mailto']),
)
));
$reply_mode = intval($RCMAIL->config->get('reply_mode')); $reply_mode = intval($RCMAIL->config->get('reply_mode'));
if (!$bodyIsHtml) { if (!$bodyIsHtml) {
@ -1043,6 +1065,19 @@ function rcmail_create_reply_body($body, $bodyIsHtml)
return $prefix . $body . $suffix; return $prefix . $body . $suffix;
} }
function rcmail_get_reply_header($message)
{
global $RCMAIL;
$from = array_pop(rcube_mime::decode_address_list($message->get_header('from'), 1, false, $message->headers->charset));
return $RCMAIL->gettext(array(
'name' => 'mailreplyintro',
'vars' => array(
'date' => $RCMAIL->format_date($message->headers->date, $RCMAIL->config->get('date_long')),
'sender' => $from['name'] ?: rcube_utils::idn_to_utf8($from['mailto']),
)
));
}
function rcmail_create_forward_body($body, $bodyIsHtml) function rcmail_create_forward_body($body, $bodyIsHtml)
{ {
@ -1170,6 +1205,10 @@ function rcmail_write_compose_attachments(&$message, $bodyIsHtml)
$cid_map = array(); $cid_map = array();
$messages = array(); $messages = array();
if ($message->pgp_mime) {
return $cid_map;
}
foreach ((array)$message->mime_parts as $pid => $part) { foreach ((array)$message->mime_parts as $pid => $part) {
if ($part->disposition == 'attachment' || ($part->disposition == 'inline' && $bodyIsHtml) || $part->filename) { if ($part->disposition == 'attachment' || ($part->disposition == 'inline' && $bodyIsHtml) || $part->filename) {
// skip parts that aren't valid attachments // skip parts that aren't valid attachments
@ -1236,6 +1275,11 @@ function rcmail_write_inline_attachments(&$message)
global $RCMAIL, $COMPOSE; global $RCMAIL, $COMPOSE;
$cid_map = array(); $cid_map = array();
if ($message->pgp_mime) {
return $cid_map;
}
foreach ((array)$message->mime_parts as $pid => $part) { foreach ((array)$message->mime_parts as $pid => $part) {
if (($part->content_id || $part->content_location) && $part->filename) { if (($part->content_id || $part->content_location) && $part->filename) {
if ($attachment = rcmail_save_attachment($message, $pid)) { if ($attachment = rcmail_save_attachment($message, $pid)) {
@ -1263,6 +1307,10 @@ function rcmail_write_forward_attachments()
$names = array(); $names = array();
$refs = array(); $refs = array();
if ($MESSAGE->pgp_mime) {
return;
}
$loaded_attachments = array(); $loaded_attachments = array();
foreach ((array)$COMPOSE['attachments'] as $attachment) { foreach ((array)$COMPOSE['attachments'] as $attachment) {
$loaded_attachments[$attachment['name'] . $attachment['mimetype']] = $attachment; $loaded_attachments[$attachment['name'] . $attachment['mimetype']] = $attachment;

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 39 KiB

@ -1302,6 +1302,11 @@ div.message-partheaders .headers-table td.header {
bottom: 42px; bottom: 42px;
} }
#composebodycontainer.mailvelope {
right: 0;
z-index: 10;
}
#composebodycontainer.mailvelope > iframe[scrolling='no'] { #composebodycontainer.mailvelope > iframe[scrolling='no'] {
position: relative; position: relative;
top: -12px; top: -12px;

@ -2160,6 +2160,14 @@ ul.proplist li {
background-position: center -1932px; background-position: center -1932px;
} }
.toolbar a.button.encrypt {
background-position: center -2025px;
}
.toolbar a.button.encrypt.selected {
background-position: center -2065px;
}
a.menuselector { a.menuselector {
display: inline-block; display: inline-block;
border: 1px solid #ababab; border: 1px solid #ababab;

Loading…
Cancel
Save