From 6c01db395d4e35b3680678910b52ba364115de1b Mon Sep 17 00:00:00 2001 From: the-djmaze <> Date: Wed, 7 Feb 2024 01:55:52 +0100 Subject: [PATCH] Added support to lookup public keys online #89 --- dev/View/Popup/OpenPgpImport.js | 20 ++++++++++++++++ .../app/libraries/RainLoop/Actions/Pgp.php | 8 +++++++ .../libraries/snappymail/pgp/keyservers.php | 23 +++++++++++-------- .../Views/User/PopupsOpenPgpImport.html | 5 ++++ 4 files changed, 47 insertions(+), 9 deletions(-) diff --git a/dev/View/Popup/OpenPgpImport.js b/dev/View/Popup/OpenPgpImport.js index 30b80f0e2..f13fb7d10 100644 --- a/dev/View/Popup/OpenPgpImport.js +++ b/dev/View/Popup/OpenPgpImport.js @@ -4,11 +4,16 @@ import { OpenPGPUserStore } from 'Stores/User/OpenPGP'; import { AbstractViewPopup } from 'Knoin/AbstractViews'; +import Remote from 'Remote/User/Fetch'; +import { i18n } from 'Common/Translator'; + export class OpenPgpImportPopupView extends AbstractViewPopup { constructor() { super('OpenPgpImport'); addObservablesTo(this, { + search: '', + key: '', keyError: false, keyErrorMessage: '', @@ -25,6 +30,21 @@ export class OpenPgpImportPopupView extends AbstractViewPopup { }); } + searchPGP() { + this.key(i18n('SUGGESTIONS/SEARCHING_DESC')); + Remote.request('SearchPGPKey', + (iError, oData) => { + if (iError) { + this.key(oData.ErrorMessage); + } else { + this.key(oData.Result); + } + }, { + query: this.search() + } + ); + } + submitForm() { let keyTrimmed = this.key().trim(); diff --git a/snappymail/v/0.0.0/app/libraries/RainLoop/Actions/Pgp.php b/snappymail/v/0.0.0/app/libraries/RainLoop/Actions/Pgp.php index 945b81a48..f36844cd0 100644 --- a/snappymail/v/0.0.0/app/libraries/RainLoop/Actions/Pgp.php +++ b/snappymail/v/0.0.0/app/libraries/RainLoop/Actions/Pgp.php @@ -10,6 +10,14 @@ trait Pgp * Also see trait Messages::DoMessagePgpVerify */ + public function DoSearchPGPKey() : array + { + $result = \SnappyMail\PGP\Keyservers::get( + $this->GetActionParam('query', '') + ); + return $this->DefaultResponse($result ?: false); + } + /** * @throws \MailSo\RuntimeException */ diff --git a/snappymail/v/0.0.0/app/libraries/snappymail/pgp/keyservers.php b/snappymail/v/0.0.0/app/libraries/snappymail/pgp/keyservers.php index 7b5b90417..74a509c5a 100644 --- a/snappymail/v/0.0.0/app/libraries/snappymail/pgp/keyservers.php +++ b/snappymail/v/0.0.0/app/libraries/snappymail/pgp/keyservers.php @@ -8,6 +8,10 @@ * https://datatracker.ietf.org/doc/html/rfc4387 * https://datatracker.ietf.org/doc/html/rfc7929 * https://datatracker.ietf.org/doc/html/draft-koch-openpgp-webkey-service-13 + * + * GET https://keys.openpgp.org/pks/lookup?op=get&options=mr&search=security@snappymail.eu + * GET https://keys.openpgp.org/vks/v1/by-fingerprint/445D265124E6072671E64D0733F868A7E35E8277 + * GET https://openpgpkey.example.org/.well-known/openpgpkey/example.org/hu/ihyath4noz8dsckzjbuyqnh4kbup6h4i?l=john.doe */ namespace SnappyMail\PGP; @@ -15,18 +19,16 @@ namespace SnappyMail\PGP; abstract class Keyservers { public static $hosts = [ + 'https://keys.openpgp.org' /* - 'https://keys.openpgp.org', 'https://pgp.mit.edu', 'https://keyring.debian.org', 'https://attester.flowcrypt.com', 'https://zimmermann.mayfirst.org', 'https://pool.sks-keyservers.net', 'https://keys.mailvelope.com', -*/ 'https://keyserver.ubuntu.com', - 'https://keys.fedoraproject.org', - 'https://keys.openpgp.org' +*/ ]; private static function fetch(string $host, string $op, string $search, bool $fingerprint = false, bool $exact = false) : ?\SnappyMail\HTTP\Response @@ -36,7 +38,9 @@ abstract class Keyservers $search = \urlencode($search); $fingerprint = $fingerprint ? '&fingerprint=on' : ''; $exact = $exact ? '&exact=on' : ''; - return static::HTTP()->doRequest('GET', "{$host}/pks/lookup?op={$op}&options=mr{$fingerprint}&search={$search}"); + $url = "{$host}/pks/lookup?op={$op}&options=mr{$fingerprint}&search={$search}"; + \SnappyMail\Log::debug('PGP', $url); + return static::HTTP()->doRequest('GET', $url); } private static $HTTP; @@ -56,11 +60,12 @@ abstract class Keyservers */ public static function get(string $keyId) : string { +/* // add the 0x prefix if absent if ('0x' !== \substr($keyId, 0, 2)) { $keyId = '0x' . $keyId; } - +*/ foreach (static::$hosts as $host) { $oResponse = static::fetch($host, 'get', $keyId); if (!$oResponse) { @@ -68,14 +73,14 @@ abstract class Keyservers continue; } if (200 !== $oResponse->status) { - \SnappyMail\Log::info('PGP', "{$oResponse->status} for key {$keyId} on {$host}"); + \SnappyMail\Log::debug('PGP', "{$oResponse->status} for key {$keyId} on {$host}"); continue; } return $oResponse->body; } - throw new \Exception('Could not obtain public key from the keyserver.'); + throw new \Exception('Could not obtain public key from the keyservers.'); } /** @@ -97,7 +102,7 @@ abstract class Keyservers continue; } if (200 !== $oResponse->status) { - \SnappyMail\Log::info('PGP', "{$oResponse->status} for search `{$search}` on {$host}"); + \SnappyMail\Log::debug('PGP', "{$oResponse->status} for search `{$search}` on {$host}"); continue; } diff --git a/snappymail/v/0.0.0/app/templates/Views/User/PopupsOpenPgpImport.html b/snappymail/v/0.0.0/app/templates/Views/User/PopupsOpenPgpImport.html index cfe8f1cb1..df56c6fcc 100644 --- a/snappymail/v/0.0.0/app/templates/Views/User/PopupsOpenPgpImport.html +++ b/snappymail/v/0.0.0/app/templates/Views/User/PopupsOpenPgpImport.html @@ -4,6 +4,11 @@