mirror of
https://github.com/the-djmaze/snappymail.git
synced 2024-09-20 07:35:55 +08:00
#89 Added getEncryptedMessageKeys() to get used encryption keys
And when no passphrases are entered, use `--pinentry-mode cancel`
This commit is contained in:
parent
d3b60bf097
commit
dfd255545a
|
@ -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);
|
||||
|
|
|
@ -203,7 +203,9 @@ class GPG
|
|||
|
||||
$fclose = $this->setOutput($output);
|
||||
|
||||
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';
|
||||
}
|
||||
|
||||
if ($this->signKeys) {
|
||||
foreach ($this->signKeys as $fingerprint => $pass) {
|
||||
$arguments[] = '--local-user ' . \escapeshellarg($fingerprint);
|
||||
}
|
||||
$_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) {
|
||||
|
|
Loading…
Reference in a new issue