From a9d399155d205ae41015d7d205c6dacd7ecfc0d2 Mon Sep 17 00:00:00 2001 From: Kyle Francis <franck6@rpi.edu> Date: Wed, 30 Mar 2016 09:33:53 -0400 Subject: [PATCH] Implemented attaching pub PGP key to outgoing messages. --- plugins/enigma/lib/enigma_driver_gnupg.php | 11 +++++ plugins/enigma/lib/enigma_ui.php | 24 +++++++++++ plugins/enigma/lib/enigma_engine.php | 32 ++++++++++++++++ 3 files changed, 66 insertions(+), 1 deletions(-) diff --git a/plugins/enigma/lib/enigma_driver_gnupg.php b/plugins/enigma/lib/enigma_driver_gnupg.php index 5ddf724..ab4aa45 100644 --- a/plugins/enigma/lib/enigma_driver_gnupg.php +++ b/plugins/enigma/lib/enigma_driver_gnupg.php @@ -339,6 +339,17 @@ } } + public function pubkey_for_attach($email) + { + try { + $pubkey = $this->gpg->exportPublicKey($email, true); + return $pubkey; + } + catch (Exception $e) { + return $this->get_error_from_exception($e); + } + } + /** * Converts Crypt_GPG exception into Enigma's error object * diff --git a/plugins/enigma/lib/enigma_engine.php b/plugins/enigma/lib/enigma_engine.php index 96f792d..d2f3972 100644 --- a/plugins/enigma/lib/enigma_engine.php +++ b/plugins/enigma/lib/enigma_engine.php @@ -921,6 +921,38 @@ return $result; } + function get_gpg_pubkey_for_attach($email) + { + $this->load_pgp_driver(); + $result = $this->pgp_driver->pubkey_for_attach($email); + + if ($result instanceof enigma_error) { + rcube::raise_error(array( + 'code' => 600, 'type' => 'php', + 'file' => __FILE__, 'line' => __LINE__, + 'message' => "Enigma plugin: " . $result->getMessage() + ), true, false); + } + + return $result; + } + + function get_keyID($email) + { + $this->load_pgp_driver(); + $result = $this->pgp_driver->get_keyID($email); + + if ($result instanceof enigma_error) { + rcube::raise_error(array( + 'code' => 600, 'type' => 'php', + 'file' => __FILE__, 'line' => __LINE__, + 'message' => "Enigma plugin: " . $result->getMessage() + ), true, false); + } + + return $result; + } + /** * Find PGP private/public key * diff --git a/plugins/enigma/lib/enigma_ui.php b/plugins/enigma/lib/enigma_ui.php index 6ae69da..f0963dc 100644 --- a/plugins/enigma/lib/enigma_ui.php +++ b/plugins/enigma/lib/enigma_ui.php @@ -929,11 +929,15 @@ } /** - * Handle message_ready hook (encryption/signing) + * Handle message_ready hook (encryption/signing/attach public key) */ function message_ready($p) { $savedraft = !empty($_POST['_draft']) && empty($_GET['_saveonly']); + + if (!$savedraft && rcube_utils::get_input_value('_enigma_attachpubkey', rcube_utils::INPUT_POST)) { + $p = $this->attach_public($p); + } if (!$savedraft && rcube_utils::get_input_value('_enigma_sign', rcube_utils::INPUT_POST)) { $this->enigma->load_engine(); @@ -972,6 +976,24 @@ } /** + * Add sender's public key (PGP). + */ + function attach_public($p) + { + // get sender's PGP pubkey for attachment + $this->enigma->load_engine(); + $key = $this->enigma->engine->list_keys($p['message']->headers()['From']); + $keyID = $key[0]->subkeys[0]->get_short_id(); + $pubkey_armor = $this->enigma->engine->get_gpg_pubkey_for_attach($p['message']->headers()['From']); + + if(!$pubkey_armor instanceof enigma_error) { + $p['message']->addAttachment($pubkey_armor, 'application/pgp-keys', "0x$keyID.asc", false); + } + + 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. -- Gitblit v1.9.1