Better solution for gpg 'socket name' error

Improment for #89
This commit is contained in:
the-djmaze 2022-01-22 09:21:21 +01:00
parent 6df7b76c8a
commit 51fedab4fc
3 changed files with 34 additions and 9 deletions

View file

@ -14,14 +14,36 @@ trait Pgp
return null; return null;
} }
$home = ($_SERVER['HOME'] ?: \exec('echo ~')) . '/.gnupg/'; $homedir = \dirname($this->StorageProvider()->GenerateFilePath(
if ($oAccount instanceof \RainLoop\Model\AdditionalAccount) { $oAccount,
$home .= \sha1($oAccount->ParentEmail()); \RainLoop\Providers\Storage\Enumerations\StorageType::PGP
} else { )) . '/.gnupg';
$home .= \sha1($oAccount->Email());
/**
* Workaround error: socket name for '/very/long/path/to/.gnupg/S.gpg-agent.extra' is too long
* BSD 4.4 max length = 104
*/
if (80 < \strlen($homedir)) {
// First try a symbolic link
$link = \sys_get_temp_dir() . '/snappymail';
if (\is_dir($link) || \mkdir($link, 0700, true)) {
$link = $tmpdir . '/' . \md5($homedir);
if (\is_link($homedir) || \symlink($homedir, $link)) {
$homedir = $link;
}
}
// Else try ~/.gnupg/ + hash(email address)
if (80 < \strlen($homedir)) {
$homedir = ($_SERVER['HOME'] ?: \exec('echo ~')) . '/.gnupg/';
if ($oAccount instanceof \RainLoop\Model\AdditionalAccount) {
$homedir .= \sha1($oAccount->ParentEmail());
} else {
$homedir .= \sha1($oAccount->Email());
}
}
} }
return \SnappyMail\PGP\GnuPG::getInstance($home); return \SnappyMail\PGP\GnuPG::getInstance($homedir);
} }
public function DoGnupgGetKeys() : array public function DoGnupgGetKeys() : array

View file

@ -14,13 +14,15 @@ class GnuPG
public static function isSupported() : bool public static function isSupported() : bool
{ {
return \class_exists('gnupg') return \class_exists('gnupg')
|| \stream_resolve_include_path('Crypt/GPG.php'); || \stream_resolve_include_path('Crypt/GPG.php')
|| \SnappyMail\PGP\GPG::isSupported();
} }
public static function getInstance(string $homedir) : ?self public static function getInstance(string $homedir) : ?self
{ {
$homedir = \rtrim($homedir, '/\\'); $homedir = \rtrim($homedir, '/\\');
if (107 <= \strlen($homedir . '/S.gpg-agent.extra')) { // BSD 4.4 max length
if (104 <= \strlen($homedir . '/S.gpg-agent.extra')) {
throw new \Exception('socket name for S.gpg-agent.extra is too long'); throw new \Exception('socket name for S.gpg-agent.extra is too long');
} }

View file

@ -88,7 +88,8 @@ class GPG
function __construct(string $homedir) function __construct(string $homedir)
{ {
$homedir = \rtrim($homedir, '/\\'); $homedir = \rtrim($homedir, '/\\');
if (107 <= \strlen($homedir . '/S.gpg-agent.extra')) { // BSD 4.4 max length
if (104 <= \strlen($homedir . '/S.gpg-agent.extra')) {
throw new \Exception("socket name for '{$homedir}/S.gpg-agent.extra' is too long"); throw new \Exception("socket name for '{$homedir}/S.gpg-agent.extra' is too long");
} }