mirror of
https://github.com/the-djmaze/snappymail.git
synced 2024-09-20 07:35:55 +08:00
Added option to load known favicon of domainname
This commit is contained in:
parent
700543c573
commit
0b494a13a5
|
@ -10,12 +10,12 @@ class AvatarsPlugin extends \RainLoop\Plugins\AbstractPlugin
|
|||
NAME = 'Avatars',
|
||||
AUTHOR = 'SnappyMail',
|
||||
URL = 'https://snappymail.eu/',
|
||||
VERSION = '1.17',
|
||||
RELEASE = '2024-05-26',
|
||||
VERSION = '1.18',
|
||||
RELEASE = '2024-06-24',
|
||||
REQUIRED = '2.25.0',
|
||||
CATEGORY = 'Contacts',
|
||||
LICENSE = 'MIT',
|
||||
DESCRIPTION = 'Show graphic of sender in message and messages list (supports BIMI, Gravatar and identicon, Contacts is still TODO)';
|
||||
DESCRIPTION = 'Show graphic of sender in message and messages list (supports BIMI, Gravatar, favicon and identicon, Contacts is still TODO)';
|
||||
|
||||
public function Init() : void
|
||||
{
|
||||
|
@ -72,6 +72,7 @@ class AvatarsPlugin extends \RainLoop\Plugins\AbstractPlugin
|
|||
if (!$this->Config()->Get('plugin', 'delay', true)
|
||||
&& ($this->Config()->Get('plugin', 'gravatar', false)
|
||||
|| ($this->Config()->Get('plugin', 'bimi', false) && 'pass' == $mFrom['dkimStatus'])
|
||||
|| ($this->Config()->Get('plugin', 'favicon', false) && 'pass' == $mFrom['dkimStatus'])
|
||||
)
|
||||
) try {
|
||||
// Base64Url
|
||||
|
@ -134,12 +135,14 @@ class AvatarsPlugin extends \RainLoop\Plugins\AbstractPlugin
|
|||
->SetDefaultValue(true),
|
||||
\RainLoop\Plugins\Property::NewInstance('bimi')->SetLabel('BIMI')
|
||||
->SetType(\RainLoop\Enumerations\PluginPropertyType::BOOL)
|
||||
// ->SetAllowedInJs(true)
|
||||
->SetDefaultValue(false)
|
||||
->SetDescription('https://bimigroup.org/ (DKIM header must be valid)'),
|
||||
\RainLoop\Plugins\Property::NewInstance('favicon')->SetLabel('Favicon')
|
||||
->SetType(\RainLoop\Enumerations\PluginPropertyType::BOOL)
|
||||
->SetDefaultValue(false)
|
||||
->SetDescription('Fetch favicon from domain (DKIM header must be valid)'),
|
||||
\RainLoop\Plugins\Property::NewInstance('gravatar')->SetLabel('Gravatar')
|
||||
->SetType(\RainLoop\Enumerations\PluginPropertyType::BOOL)
|
||||
// ->SetAllowedInJs(true)
|
||||
->SetDefaultValue(false)
|
||||
->SetDescription('https://wikipedia.org/wiki/Gravatar'),
|
||||
]);
|
||||
|
@ -147,7 +150,6 @@ class AvatarsPlugin extends \RainLoop\Plugins\AbstractPlugin
|
|||
defined('RainLoop\\Enumerations\\PluginPropertyType::SELECT')
|
||||
? \RainLoop\Plugins\Property::NewInstance('identicon')->SetLabel('Identicon')
|
||||
->SetType(\RainLoop\Enumerations\PluginPropertyType::SELECT)
|
||||
// ->SetAllowedInJs(true)
|
||||
->SetDefaultValue([
|
||||
['id' => '', 'name' => 'Name characters else silhouette'],
|
||||
['id' => 'identicon', 'name' => 'Name characters else squares'],
|
||||
|
@ -156,7 +158,6 @@ class AvatarsPlugin extends \RainLoop\Plugins\AbstractPlugin
|
|||
->SetDescription('https://wikipedia.org/wiki/Identicon')
|
||||
: \RainLoop\Plugins\Property::NewInstance('identicon')->SetLabel('Identicon')
|
||||
->SetType(\RainLoop\Enumerations\PluginPropertyType::SELECTION)
|
||||
// ->SetAllowedInJs(true)
|
||||
->SetDefaultValue(['','identicon','jdenticon'])
|
||||
->SetDescription('empty = default, identicon = squares, jdenticon = Triangles shape')
|
||||
,
|
||||
|
@ -171,7 +172,6 @@ class AvatarsPlugin extends \RainLoop\Plugins\AbstractPlugin
|
|||
if (\class_exists('OC') && isset(\OC::$server)) {
|
||||
$aResult[] = \RainLoop\Plugins\Property::NewInstance('nextcloud')->SetLabel('Lookup Nextcloud Contacts')
|
||||
->SetType(\RainLoop\Enumerations\PluginPropertyType::BOOL)
|
||||
// ->SetAllowedInJs(true)
|
||||
->SetDefaultValue(false);
|
||||
}
|
||||
*/
|
||||
|
@ -289,11 +289,10 @@ class AvatarsPlugin extends \RainLoop\Plugins\AbstractPlugin
|
|||
break;
|
||||
}
|
||||
}
|
||||
/*
|
||||
if (!$aResult) {
|
||||
$aResult = static::getFavicon($sEmail, $sDomain);
|
||||
|
||||
if (!$aResult && $this->Config()->Get('plugin', 'favicon', false)) {
|
||||
$aResult = static::getFavicon($sDomain);
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
||||
return $aResult;
|
||||
|
@ -311,10 +310,13 @@ class AvatarsPlugin extends \RainLoop\Plugins\AbstractPlugin
|
|||
|
||||
private static function cacheImage(string $sEmail, array $aResult) : void
|
||||
{
|
||||
$sEmailId = \sha1(\mb_strtolower(\SnappyMail\IDN::emailToAscii($sEmail)));
|
||||
if (!\is_dir(\APP_PRIVATE_DATA . 'avatars')) {
|
||||
\mkdir(\APP_PRIVATE_DATA . 'avatars', 0700);
|
||||
}
|
||||
$sEmailId = \mb_strtolower(\SnappyMail\IDN::emailToAscii($sEmail));
|
||||
if (\str_contains($sEmail, '@')) {
|
||||
$sEmailId = \sha1($sEmailId);
|
||||
}
|
||||
\file_put_contents(
|
||||
\APP_PRIVATE_DATA . 'avatars/' . $sEmailId . \SnappyMail\File\MimeType::toExtension($aResult[0]),
|
||||
$aResult[1]
|
||||
|
@ -326,33 +328,61 @@ class AvatarsPlugin extends \RainLoop\Plugins\AbstractPlugin
|
|||
{
|
||||
$sEmail = \mb_strtolower(\SnappyMail\IDN::emailToAscii($sEmail));
|
||||
$aFiles = \glob(\APP_PRIVATE_DATA . "avatars/{$sEmail}.*");
|
||||
if (!$aFiles && \str_contains($sEmail, '@')) {
|
||||
$sEmailId = \sha1($sEmail);
|
||||
$aFiles = \glob(\APP_PRIVATE_DATA . "avatars/{$sEmailId}.*");
|
||||
if (!$aFiles) {
|
||||
$sDomain = \explode('@', $sEmail);
|
||||
$sDomain = \array_pop($sDomain);
|
||||
$aFiles = \glob(\APP_PRIVATE_DATA . "avatars/{$sDomain}.*");
|
||||
}
|
||||
}
|
||||
if ($aFiles) {
|
||||
\MailSo\Base\Http::setLastModified(\filemtime($aFiles[0]));
|
||||
return [
|
||||
\SnappyMail\File\MimeType::fromFile($aFiles[0]),
|
||||
\file_get_contents($aFiles[0])
|
||||
];
|
||||
}
|
||||
$sEmailId = \sha1($sEmail);
|
||||
$aFiles = \glob(\APP_PRIVATE_DATA . "avatars/{$sEmailId}.*");
|
||||
if ($aFiles) {
|
||||
\MailSo\Base\Http::setLastModified(\filemtime($aFiles[0]));
|
||||
return [
|
||||
\mime_content_type($aFiles[0]),
|
||||
\file_get_contents($aFiles[0])
|
||||
];
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
private static function getFavicon(string $sEmail, string $sDomain) : ?array
|
||||
private static function getFavicon(string $sDomain) : ?array
|
||||
{
|
||||
$aResult = static::getUrl('https://' . $sDomain . '/favicon.ico')
|
||||
?: static::getUrl('https://' . static::serviceDomain($sDomain) . '/favicon.ico')
|
||||
?: static::getUrl('https://www.' . static::serviceDomain($sDomain) . '/favicon.ico');
|
||||
// Also detect <link rel="shortcut icon" href="...">
|
||||
?: static::getUrl('https://www.' . static::serviceDomain($sDomain) . '/favicon.ico')
|
||||
?: static::getUrl("https://www.google.com/s2/favicons?sz=48&domain_url={$sDomain}")
|
||||
?: static::getUrl("https://api.faviconkit.com/{$sDomain}/48")
|
||||
// ?: static::getUrl("https://api.statvoo.com/favicon/{$sDomain}")
|
||||
;
|
||||
/*
|
||||
Also detect the following?
|
||||
|
||||
<link sizes="16x16" rel="shortcut icon" type="image/x-icon" href="/..." />
|
||||
<link sizes="16x16" rel="shortcut icon" type="image/png" href="/..." />
|
||||
<link sizes="32x32" rel="shortcut icon" type="image/png" href="/..." />
|
||||
<link sizes="96x96" rel="shortcut icon" type="image/png" href="/..." />
|
||||
|
||||
<link sizes="36x36" rel="icon" type="image/png" href="/..." />
|
||||
<link sizes="48x48" rel="icon" type="image/png" href="/..." />
|
||||
<link sizes="72x72" rel="icon" type="image/png" href="/..." />
|
||||
<link sizes="96x96" rel="icon" type="image/png" href="/..." />
|
||||
<link sizes="144x144" rel="icon" type="image/png" href="/..." />
|
||||
<link sizes="192x192" rel="icon" type="image/png" href="/..." />
|
||||
|
||||
<link sizes="57x57" rel="apple-touch-icon" type="image/png" href="/..." />
|
||||
<link sizes="60x60" rel="apple-touch-icon" type="image/png" href="/..." />
|
||||
<link sizes="72x72" rel="apple-touch-icon" type="image/png" href="/..." />
|
||||
<link sizes="76x76" rel="apple-touch-icon" type="image/png" href="/..." />
|
||||
<link sizes="114x114" rel="apple-touch-icon" type="image/png" href="/..." />
|
||||
<link sizes="120x120" rel="apple-touch-icon" type="image/png" href="/..." />
|
||||
<link sizes="144x144" rel="apple-touch-icon" type="image/png" href="/..." />
|
||||
<link sizes="152x152" rel="apple-touch-icon" type="image/png" href="/" />
|
||||
<link sizes="180x180" rel="apple-touch-icon" type="image/png" href="/..." />
|
||||
<link sizes="192x192" rel="apple-touch-icon" type="image/png" href="/..." />
|
||||
*/
|
||||
if ($aResult) {
|
||||
static::cacheImage($sEmail, $aResult);
|
||||
static::cacheImage($sDomain, $aResult);
|
||||
}
|
||||
return $aResult;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue