summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarson Fleming <[email protected]>2025-01-01 22:31:52 -0800
committerCarson Fleming <[email protected]>2025-01-01 22:31:52 -0800
commit1a93a383eab4c161a67a32e9dc715f6ee6106699 (patch)
treeda5eff266be98cfd11515869ba603229d99450cc
parentdabf5e030c5a894ce7a1b02a35547e9d2abef93a (diff)
downloadrc-inbox-settings-1a93a383eab4c161a67a32e9dc715f6ee6106699.tar.gz
assume everything is a key of some kind
-rw-r--r--inbox_settings.php34
-rw-r--r--localization/en_US.inc3
2 files changed, 28 insertions, 9 deletions
diff --git a/inbox_settings.php b/inbox_settings.php
index 47c25b9..27480bc 100644
--- a/inbox_settings.php
+++ b/inbox_settings.php
@@ -203,6 +203,11 @@ class inbox_settings extends rcube_plugin {
'display_message', $this->gettext('invalid_pgp_data'), 'error');
return false;
}
+ if (empty($dearmored_key_data)) {
+ $this->rcmail->output->command(
+ 'display_message', $this->gettext('no_key_data'), 'error');
+ return false;
+ }
$comment = $_POST['comment'];
if (empty($comment)) $comment = null;
@@ -359,21 +364,34 @@ class inbox_settings extends rcube_plugin {
return null;
$parsed_data = OpenPGP_Message::parse($dearmored);
- if (!($parsed_data instanceof OpenPGP_Message) || !is_array($parsed_data->packets)) {
+ if (!($parsed_data instanceof OpenPGP_Message) || !is_array($parsed_data->packets))
throw new IllegalArgumentException(
'Input data was not a PGP message with data packets.');
- }
$parsed_keys = [];
+ $fingerprint = null;
+ $data_blob = '';
foreach ($parsed_data->packets as $data_packet) {
- // TODO: maybe we keep uids and such
- if (!($data_packet instanceof OpenPGP_PublicKeyPacket))
+ if ($data_packet instanceof OpenPGP_SecretKeyPacket)
+ throw new IllegalArgumentException('Input data contains private keys.');
+
+ if ($data_packet instanceof OpenPGP_PublicKeyPacket
+ && !($data_packet instanceof OpenPGP_PublicSubkeyPacket)) {
+ $parsed_keys[] = ['fingerprint' => $fingerprint, 'data_blob' => $data_blob];
+ $fingerprint = $data_packet->fingerprint;
+ $data_blob = '';
+ } else if (!($data_packet instanceof OpenPGP_UserIDPacket)
+ && !($data_packet instanceof OpenPGP_SignaturePacket)
+ && !($data_packet instanceof OpenPGP_PublicSubkeyPacket)) {
+ // ignore unknown packet types for the time being
continue;
+ }
+
+ $data_blob .= $data_packet->to_bytes();
+ }
- $parsed_keys[] = [
- 'fingerprint' => $data_packet->fingerprint,
- 'data_blob' => $data_packet->to_bytes()
- ];
+ if (!is_null($fingerprint) && !empty($data_blob)) {
+ $parsed_keys[] = ['fingerprint' => $fingerprint, 'data_blob' => $data_blob];
}
return $parsed_keys;
}
diff --git a/localization/en_US.inc b/localization/en_US.inc
index 1aec5fa..3e042f1 100644
--- a/localization/en_US.inc
+++ b/localization/en_US.inc
@@ -18,7 +18,8 @@ $labels['fingerprint'] = 'Key Fingerprint';
$labels['comment'] = 'Comment';
$labels['comment_placeholder'] = 'A comment to remember this key by';
$labels['paste_key_data'] = 'Paste ASCII-armored PGP public key(s) here. Please do not upload private keys.';
-$labels['invalid_pgp_data'] = 'Imported key contains invalid PGP data';
+$labels['invalid_pgp_data'] = 'Imported blob does not contain valid PGP data, or contains private keys';
+$labels['no_key_data'] = 'Imported blob does not contain any PGP public keys';
$labels['keys_imported'] = 'Encryption key(s) added';
$labels['confirm_delete_key'] = 'Are you sure you want to remove this encryption key from your account?';
$labels['deleting_key'] = 'Removing encryption key...';