diff --git a/snappymail/v/0.0.0/app/libraries/MailSo/Mail/Message.php b/snappymail/v/0.0.0/app/libraries/MailSo/Mail/Message.php index b26a6ac74..f339cef81 100644 --- a/snappymail/v/0.0.0/app/libraries/MailSo/Mail/Message.php +++ b/snappymail/v/0.0.0/app/libraries/MailSo/Mail/Message.php @@ -500,9 +500,6 @@ class Message implements \JsonSerializable $gEncryptedParts = $oBodyStructure->SearchByContentType('multipart/encrypted'); foreach ($gEncryptedParts as $oPart) { if ($oPart->IsPgpEncrypted()) { - if (!$oMessage->aPgpEncrypted) { - $oMessage->aPgpEncrypted = []; - } $oMessage->aPgpEncrypted = [ 'PartId' => $oPart->SubParts()[1]->PartID() ]; @@ -582,6 +579,19 @@ class Message implements \JsonSerializable } else { + if (\str_contains($sText, '-----BEGIN PGP MESSAGE-----')) + { + $keyIds = []; + if (\SnappyMail\PGP\GPG::isSupported()) { + $GPG = new \SnappyMail\PGP\GPG(''); + $keyIds = $GPG->getEncryptedMessageKeys($sText); + } + $oMessage->aPgpEncrypted = [ + 'PartId' => $oPart->PartID(), + 'KeyIds' => $keyIds + ]; + } + if ($oPart->IsFlowedFormat()) { $sText = Utils::DecodeFlowedFormat($sText); diff --git a/snappymail/v/0.0.0/app/libraries/snappymail/pgp/gpg.php b/snappymail/v/0.0.0/app/libraries/snappymail/pgp/gpg.php index 7e725e9fd..12eaefb69 100644 --- a/snappymail/v/0.0.0/app/libraries/snappymail/pgp/gpg.php +++ b/snappymail/v/0.0.0/app/libraries/snappymail/pgp/gpg.php @@ -203,7 +203,9 @@ class GPG $fclose = $this->setOutput($output); - $_ENV['PINENTRY_USER_DATA'] = \json_encode($this->decryptKeys); + if ($this->decryptKeys) { + $_ENV['PINENTRY_USER_DATA'] = \json_encode($this->decryptKeys); + } $result = $this->exec(['--decrypt','--skip-verify']); @@ -728,10 +730,12 @@ class GPG $arguments[] = '--textmode'; } - foreach ($this->signKeys as $fingerprint => $pass) { - $arguments[] = '--local-user ' . \escapeshellarg($fingerprint); + if ($this->signKeys) { + foreach ($this->signKeys as $fingerprint => $pass) { + $arguments[] = '--local-user ' . \escapeshellarg($fingerprint); + } + $_ENV['PINENTRY_USER_DATA'] = \json_encode($this->signKeys); } - $_ENV['PINENTRY_USER_DATA'] = \json_encode($this->signKeys); $result = $this->exec($arguments); @@ -904,6 +908,26 @@ class GPG // echo `gpg-agent --daemon --homedir $home 2>&1`; } + public function getEncryptedMessageKeys(/*string|resource*/ $data) : array + { + $this->setInput($data); +// $_ENV['PINENTRY_USER_DATA'] = null; + $result = $this->exec(['--decrypt','--skip-verify']); + $info = [ + 'ENC_TO' => [], +// 'KEY_CONSIDERED' => [], +// 'NO_SECKEY' => [], +// 'errors' => $result['errors'] + ]; + foreach ($result['status'] as $line) { + $tokens = \explode(' ', $line); + if (isset($info[$tokens[0]])) { + $info[$tokens[0]][] = $tokens[1]; + } + } + return $info['ENC_TO']; + } + private function exec(array $arguments) /*: array|false*/ { if (\version_compare($this->version, '2.2.5', '<')) { @@ -923,7 +947,8 @@ class GPG // '--no-use-agent', // < 2.0.0 '--exit-on-status-write-error', // 1.4.2+ '--trust-model always', // 1.3.2+ else --always-trust - '--pinentry-mode loopback' // 2.1.13+ + // If no passphrases are set, cancel them + '--pinentry-mode ' . (empty($_ENV['PINENTRY_USER_DATA']) ? 'cancel' : 'loopback') // 2.1.13+ ]; if (!$this->strict) {