From 58c2798fae7749cf7b4aee471a696aed389d0941 Mon Sep 17 00:00:00 2001 From: Aleksander Machniak <alec@alec.pl> Date: Sun, 07 Jun 2015 11:54:01 -0400 Subject: [PATCH] Implemented password prompt when entering compose page of encrypted message --- plugins/enigma/lib/enigma_ui.php | 83 ++++++++++++++++++++++++++++++++--------- 1 files changed, 65 insertions(+), 18 deletions(-) diff --git a/plugins/enigma/lib/enigma_ui.php b/plugins/enigma/lib/enigma_ui.php index e866ba3..c76583e 100644 --- a/plugins/enigma/lib/enigma_ui.php +++ b/plugins/enigma/lib/enigma_ui.php @@ -1,5 +1,6 @@ <?php -/* + +/** +-------------------------------------------------------------------------+ | User Interface for the Enigma Plugin | | | @@ -131,9 +132,10 @@ /** * Initializes key password prompt * - * @param enigma_error Error object with key info + * @param enigma_error $status Error object with key info + * @param array $params Optional prompt parameters */ - function password_prompt($status) + function password_prompt($status, $params = array()) { $data = $status->getData('missing'); @@ -142,6 +144,10 @@ } $data = array('keyid' => key($data), 'user' => $data[key($data)]); + + if (!empty($params)) { + $data = array_merge($params, $data); + } if ($this->rc->action == 'send') { $this->rc->output->command('enigma_password_request', $data); @@ -337,23 +343,28 @@ */ function tpl_key_data($attrib) { - $out = ''; + $out = ''; $table = new html_table(array('cols' => 2)); // Key user ID $table->add('title', $this->enigma->gettext('keyuserid')); $table->add(null, rcube::Q($this->data->name)); + // Key ID $table->add('title', $this->enigma->gettext('keyid')); $table->add(null, $this->data->subkeys[0]->get_short_id()); + // Key type $keytype = $this->data->get_type(); - if ($keytype == enigma_key::TYPE_KEYPAIR) + if ($keytype == enigma_key::TYPE_KEYPAIR) { $type = $this->enigma->gettext('typekeypair'); - else if ($keytype == enigma_key::TYPE_PUBLIC) + } + else if ($keytype == enigma_key::TYPE_PUBLIC) { $type = $this->enigma->gettext('typepublickey'); + } $table->add('title', $this->enigma->gettext('keytype')); $table->add(null, $type); + // Key fingerprint $table->add('title', $this->enigma->gettext('fingerprint')); $table->add(null, $this->data->subkeys[0]->get_fingerprint()); @@ -476,6 +487,9 @@ $this->rc->output->send(); } + /** + * Init compose UI (add task button and the menu) + */ private function compose_ui() { $this->add_css(); @@ -493,12 +507,6 @@ 'height' => 32 ), 'toolbar'); - // Options menu contents - $this->enigma->add_hook('render_page', array($this, 'compose_menu')); - } - - function compose_menu($p) - { $menu = new html_table(array('cols' => 2)); $chbox = new html_checkbox(array('value' => 1)); @@ -512,12 +520,10 @@ $menu->add(null, $chbox->show($this->rc->config->get('enigma_encrypt_all') ? 1 : 0, array('name' => '_enigma_encrypt', 'id' => 'enigmaencryptopt'))); - $menu = html::div(array('id' => 'enigmamenu', 'class' => 'popupmenu'), - $menu->show()); + $menu = html::div(array('id' => 'enigmamenu', 'class' => 'popupmenu'), $menu->show()); - $p['content'] .= $menu; - - return $p; + // Options menu contents + $this->rc->output->add_footer($menu); } /** @@ -646,7 +652,7 @@ { $engine = $this->enigma->load_engine(); - // handle attachments vcard attachments + // handle keys/certs in attachments foreach ((array) $p['object']->attachments as $attachment) { if ($engine->is_keys_part($attachment)) { $this->keys_parts[] = $attachment->mime_id; @@ -746,4 +752,45 @@ return $p; } + /** + * Handler for message_compose_body hook + * Display error when the message cannot be encrypted + * and provide a way to try again with a password. + */ + function message_compose($p) + { + $engine = $this->enigma->load_engine(); + + // skip: message has no signed/encoded content + if (!$this->enigma->engine) { + return $p; + } + + $engine = $this->enigma->engine; + + // Decryption status + foreach ($engine->decryptions as $status) { + if ($status instanceof enigma_error) { + $code = $status->getCode(); + + if ($code == enigma_error::E_KEYNOTFOUND) { + $msg = rcube::Q(str_replace('$keyid', enigma_key::format_id($status->getData('id')), + $this->enigma->gettext('decryptnokey'))); + } + else if ($code == enigma_error::E_BADPASS) { + $this->password_prompt($status, array('compose-init' => true)); + return $p; + } + else { + $msg = rcube::Q($this->enigma->gettext('decrypterror')); + } + } + } + + if ($msg) { + $this->rc->output->show_message($msg, 'error'); + } + + return $p; + } } -- Gitblit v1.9.1