From 7b8a0af1c86ab74346e48ade7d5354dfbf69adbe Mon Sep 17 00:00:00 2001
From: Thomas Bruederli <thomas@roundcube.net>
Date: Tue, 26 May 2015 16:53:08 -0400
Subject: [PATCH] Add toolbar button to switch to Mailvelope encryption editor

---
 program/steps/mail/compose.inc          |    2 
 program/localization/en_US/messages.inc |    1 
 program/localization/en_US/labels.inc   |    2 +
 skins/larry/styles.css                  |    8 ++++
 program/js/app.js                       |   58 +++++++++++++++++++----------
 skins/larry/templates/compose.html      |    1 
 6 files changed, 51 insertions(+), 21 deletions(-)

diff --git a/program/js/app.js b/program/js/app.js
index 4cb6153..b43ca00 100644
--- a/program/js/app.js
+++ b/program/js/app.js
@@ -279,7 +279,7 @@
           this.env.address_group_stack = [];
           this.env.compose_commands = ['send-attachment', 'remove-attachment', 'send', 'cancel',
             'toggle-editor', 'list-adresses', 'pushgroup', 'search', 'reset-search', 'extwin',
-            'insert-response', 'save-response', 'menu-open', 'menu-close'];
+            'insert-response', 'save-response', 'menu-open', 'menu-close', 'compose-encrypted'];
 
           if (this.env.drafts_mailbox)
             this.env.compose_commands.push('savedraft')
@@ -3366,13 +3366,13 @@
 
     mailvelope.getKeyring(keyring).then(function(kr) {
       ref.mailvelope_keyring = kr;
-    }, function(err) {
+    }).catch(function(err) {
       // attempt to create a new keyring for this app/user
       mailvelope.createKeyring(keyring).then(function(kr) {
         ref.mailvelope_keyring = kr;
         keyring = keyring.identifier;
-      }, function(err) {
-        console.error(err)
+      }).catch(function(err) {
+        console.error(err);
       });
     });
 
@@ -3409,11 +3409,27 @@
   this.compose_encrypted = function(props)
   {
     var container = $('#' + this.env.composebody).parent();
-    mailvelope.createEditorContainer('#' + container.attr('id'), keyring).then(function(editor) {
-      ref.mailvelope_editor = editor;
-      container.addClass('mailvelope');
-      $('#' + ref.env.composebody).hide();
-    });
+
+    // remove Mailvelope editor if active
+    if (ref.mailvelope_editor) {
+      ref.mailvelope_editor = null;
+      ref.set_button('compose-encrypted', 'act');
+      container.removeClass('mailvelope')
+        .find('iframe:not([aria-hidden=true])').remove();
+      $('#' + ref.env.composebody).show();
+    }
+    // embed Mailvelope editor container
+    else {
+      var options = { predefinedText: $('#' + this.env.composebody).val() };
+      mailvelope.createEditorContainer('#' + container.attr('id'), ref.mailvelope_keyring.identifier, options).then(function(editor) {
+        ref.mailvelope_editor = editor;
+        ref.set_button('compose-encrypted', 'sel');
+        container.addClass('mailvelope');
+        $('#' + ref.env.composebody).hide();
+      }).catch(function(err) {
+        console.error(err);
+      });
+    }
   };
 
   // callback to replace the message body with the full armored
@@ -3427,7 +3443,6 @@
         rcpt = RegExp.$2
         recipients.push(rcpt);
         val = val.substr(val.indexOf(rcpt) + rcpt.length + 1).replace(/^\s*,\s*/, '');
-        console.log('*', val)
       }
     });
 
@@ -3435,29 +3450,32 @@
     var isvalid = recipients.length > 0;
     ref.mailvelope_keyring.validKeyForAddress(recipients).then(function(status) {
       $.each(status, function(k,v) {
-        console.log('validate', k, v)
-        if (!v) {
+        if (v === false) {
           isvalid = false;
-          alert("No key found for "+k)
+          alert(ref.get_label('nopubkeyfor').replace('$email', k));
         }
       });
 
       if (!isvalid) {
-        if (!recipients.length)
+        if (!recipients.length) {
           alert(ref.get_label('norecipientwarning'));
+          $("[name='_to']").focus();
+        }
         return false;
       }
 
       ref.mailvelope_editor.encrypt(recipients).then(function(armored) {
         console.log('encrypted message', armored);
-        var form = this.gui_objects.messageform;
+        var form = ref.gui_objects.messageform;
 
         // all checks passed, send message
         // var msgid = ref.set_busy(true, draft || saveonly ? 'savingmessage' : 'sendingmessage')
 
-      }, function(err) {
-        console.log(err)
+      }).catch(function(err) {
+        console.log(err);
       });
+    }).catch(function(err) {
+      console.error(err);
     });
 
     return false;
@@ -3466,12 +3484,12 @@
   // wrapper for the mailvelope.createDisplayContainer API call
   this.mailvelope_display_container = function(selector, data, keyring, msgid)
   {
-    mailvelope.createDisplayContainer(selector, data, keyring, {}).then(function() {
+    mailvelope.createDisplayContainer(selector, data, keyring, { showExternalContent: this.env.safemode }).then(function() {
       $(selector).addClass('mailvelope').find('.message-part, .part-notice').hide();
       ref.hide_message(msgid);
       setTimeout(function() { $(window).resize(); }, 10);
-    }, function(err) {
-      console.error(err)
+    }).catch(function(err) {
+      console.error(err);
       ref.hide_message(msgid);
       ref.display_message('Message decryption failed: ' + err.message, 'error')
     });
diff --git a/program/localization/en_US/labels.inc b/program/localization/en_US/labels.inc
index 8202b14..dd9b7b8 100644
--- a/program/localization/en_US/labels.inc
+++ b/program/localization/en_US/labels.inc
@@ -247,6 +247,8 @@
 $labels['addimage']       = 'Add image';
 $labels['selectmedia']    = 'Select movie';
 $labels['addmedia']       = 'Add movie';
+$labels['encrypt']        = 'Encrypt';
+$labels['encryptmessage'] = 'Encrypt message';
 
 $labels['editidents']    = 'Edit identities';
 $labels['spellcheck']    = 'Spell';
diff --git a/program/localization/en_US/messages.inc b/program/localization/en_US/messages.inc
index 15e39c3..2f712f3 100644
--- a/program/localization/en_US/messages.inc
+++ b/program/localization/en_US/messages.inc
@@ -57,6 +57,7 @@
 $messages['blockedimages'] = 'To protect your privacy, remote images are blocked in this message.';
 $messages['encryptedmessage'] = 'This is an encrypted message and can not be displayed. Sorry!';
 $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['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 5009c52..44f4612 100644
--- a/program/steps/mail/compose.inc
+++ b/program/steps/mail/compose.inc
@@ -83,7 +83,7 @@
     'messagesaved', 'converting', 'editorwarning', 'searching', 'uploading', 'uploadingmany',
     'fileuploaderror', 'sendmessage', 'newresponse', 'responsename', 'responsetext', 'save',
     'savingresponse', 'restoresavedcomposedata', 'restoremessage', 'delete', 'restore', 'ignore',
-    'selectimportfile', 'messageissent');
+    'selectimportfile', 'messageissent', 'nopubkeyfor');
 
 $OUTPUT->set_pagetitle($RCMAIL->gettext('compose'));
 
diff --git a/skins/larry/styles.css b/skins/larry/styles.css
index 327fd37..e418e0a 100644
--- a/skins/larry/styles.css
+++ b/skins/larry/styles.css
@@ -2008,6 +2008,14 @@
 	opacity: 0.4;
 }
 
+.toolbar a.button.selected {
+	color: #1978a1;
+}
+
+.toolbar a.button.hidden {
+	display: none;
+}
+
 .dropbutton {
 	display: inline-block;
 	position: relative;
diff --git a/skins/larry/templates/compose.html b/skins/larry/templates/compose.html
index 7a5fe42..0ee7339 100644
--- a/skins/larry/templates/compose.html
+++ b/skins/larry/templates/compose.html
@@ -33,6 +33,7 @@
 	<roundcube:button name="addattachment" type="link" class="button attach" label="attach" title="addattachment" onclick="UI.show_uploadform(event);return false" aria-haspopup="true" aria-expanded="false"tabindex="2" />
 	<roundcube:button command="insert-sig" type="link" class="button insertsig disabled" classAct="button insertsig" label="signature" title="insertsignature" tabindex="2" />
 	<a href="#responses" class="button responses" label="responses" title="<roundcube:label name='insertresponse' />" id="responsesmenulink" unselectable="on" onmousedown="return false" onclick="UI.toggle_popup('responsesmenu',event);return false" tabindex="2" aria-haspopup="true" aria-expanded="false" aria-owns="textresponsesmenu"><roundcube:label name="responses" /></a>
+	<roundcube:button command="compose-encrypted" type="link" class="button encrypt hidden" classAct="button encrypt" classSel="button encrypt selected" label="encrypt" title="encryptmessage" tabindex="2" />
 	<roundcube:container name="toolbar" id="compose-toolbar" />
 </div>
 

--
Gitblit v1.9.1