diff options
| author | Carson Fleming <[email protected]> | 2025-01-01 22:31:52 -0800 |
|---|---|---|
| committer | Carson Fleming <[email protected]> | 2025-01-01 22:31:52 -0800 |
| commit | 1a93a383eab4c161a67a32e9dc715f6ee6106699 (patch) | |
| tree | da5eff266be98cfd11515869ba603229d99450cc /inbox_settings.php | |
| parent | dabf5e030c5a894ce7a1b02a35547e9d2abef93a (diff) | |
| download | rc-inbox-settings-1a93a383eab4c161a67a32e9dc715f6ee6106699.tar.gz | |
assume everything is a key of some kind
Diffstat (limited to 'inbox_settings.php')
| -rw-r--r-- | inbox_settings.php | 34 |
1 files changed, 26 insertions, 8 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; } |
