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 3eb159341..d6a259b81 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 @@ -9,11 +9,19 @@ trait Pgp */ public function GnuPG() : ?\SnappyMail\PGP\GnuPG { - $pgp_dir = \dirname($this->StorageProvider()->GenerateFilePath( - $this->getAccountFromToken(), - \RainLoop\Providers\Storage\Enumerations\StorageType::PGP - )); - return \SnappyMail\PGP\GnuPG::getInstance($pgp_dir); + $oAccount = $this->getAccountFromToken(); + if (!$oAccount) { + return null; + } + + $home = ($_SERVER['HOME'] ?: \exec('echo ~')) . '/.gnupg/'; + if ($oAccount instanceof \RainLoop\Model\AdditionalAccount) { + $home .= \sha1($oAccount->ParentEmail()); + } else { + $home .= \sha1($oAccount->Email()); + } + + return \SnappyMail\PGP\GnuPG::getInstance($home); } public function DoGnupgGetKeys() : array diff --git a/snappymail/v/0.0.0/app/libraries/snappymail/pgp/gnupg.php b/snappymail/v/0.0.0/app/libraries/snappymail/pgp/gnupg.php index bc8f4a08a..017a68415 100644 --- a/snappymail/v/0.0.0/app/libraries/snappymail/pgp/gnupg.php +++ b/snappymail/v/0.0.0/app/libraries/snappymail/pgp/gnupg.php @@ -17,17 +17,22 @@ class GnuPG || \stream_resolve_include_path('Crypt/GPG.php'); } - public static function getInstance(string $base_dir) : ?self + public static function getInstance(string $homedir) : ?self { + $homedir = \rtrim($homedir, '/\\'); + if (107 <= \strlen($homedir . '/S.gpg-agent.extra')) { + throw new \Exception('socket name for S.gpg-agent.extra is too long'); + } + $self = null; - $home = $base_dir . '/.gnupg'; +// if (\version_compare(\phpversion('gnupg'), '1.5', '>=')) { if (\class_exists('gnupg')) { $self = new self; $self->GnuPG = new \gnupg([ // It is the file name of the executable program implementing this protocol which is usually path of the gpg executable. // 'file_name' => '/usr/bin/gpg', // It is the directory name of the configuration directory. It also overrides GNUPGHOME environment variable that is used for the same purpose. - 'home_dir' => $home + 'home_dir' => $homedir ]); // Output is ASCII $self->GnuPG->setarmor(1); @@ -42,13 +47,13 @@ class GnuPG $self->Crypt_GPG = new \Crypt_GPG([ // 'debug' => true, // 'binary' => $binary, - 'homedir' => $home + 'homedir' => $homedir ]); } } if ($self) { - $self->homedir = $home; -// \putenv("GNUPGHOME={$home}"); + $self->homedir = $homedir; +// \putenv("GNUPGHOME={$homedir}"); } return $self; } @@ -367,6 +372,14 @@ class GnuPG { if ($this->GnuPG) { return $this->GnuPG->keyinfo($pattern); +/* // v1.5 Slow and fails + return \array_merge( + // Public + $this->GnuPG->keyinfo($pattern), + // Private, read https://github.com/php-gnupg/php-gnupg/issues/5 + $this->GnuPG->keyinfo($pattern, 1) + ); +*/ } if ($this->Crypt_GPG) { return true; 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 fdb7235b1..c7cbb3e79 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 @@ -87,7 +87,16 @@ class GPG function __construct(string $homedir) { - $this->options['homedir'] = \rtrim($homedir, '/'); + $homedir = \rtrim($homedir, '/\\'); + if (107 <= \strlen($homedir . '/S.gpg-agent.extra')) { + throw new \Exception("socket name for '{$homedir}/S.gpg-agent.extra' is too long"); + } + + if (!\is_dir($homedir)) { + \mkdir($homedir, 0700, true); + } + + $this->options['homedir'] = $homedir; // the random seed file makes subsequent actions faster so only disable it if we have to. if ($this->options['homedir'] && !\is_writeable($this->options['homedir'])) { @@ -601,6 +610,12 @@ return []; */ } + public function agent() + { +// $home = \escapeshellarg($this->options['homedir']); +// echo `gpg-agent --daemon --homedir $home 2>&1`; + } + private function exec(array $arguments) { if (\version_compare($this->version, '2.2.5', '<')) {