You can now store the avatar in a separate folder and host

This commit is contained in:
Michael 2022-06-15 03:59:26 +00:00
parent f839cd3826
commit 726c4dff7d
2 changed files with 66 additions and 15 deletions

View file

@ -32,7 +32,6 @@ use Friendica\Util\HTTPSignature;
use Friendica\Util\Images; use Friendica\Util\Images;
use Friendica\Util\Network; use Friendica\Util\Network;
use Friendica\Util\Proxy; use Friendica\Util\Proxy;
use Friendica\Util\Strings;
/** /**
* functions for handling contact avatar caching * functions for handling contact avatar caching
@ -139,20 +138,18 @@ class Avatar
return ''; return '';
} }
$path = self::BASE_PATH . $filename . $size . '.' . $image->getExt(); $path = $filename . $size . '.' . $image->getExt();
$filepath = DI::basePath() . $path; $basepath = self::basePath();
if (empty($basepath)) {
$dirpath = DI::basePath() . self::BASE_PATH;
DI::profiler()->startRecording('file');
if (!file_exists($dirpath)) {
if (!mkdir($dirpath, 0775)) {
Logger::warning('Base directory could not be created', ['directory' => $dirpath]);
return ''; return '';
} }
}
$filepath = $basepath . $path;
$dirpath = $basepath;
DI::profiler()->startRecording('file');
// Fetch the permission and group ownership of the "avatar" path and apply to all files // Fetch the permission and group ownership of the "avatar" path and apply to all files
$dir_perm = fileperms($dirpath) & 0777; $dir_perm = fileperms($dirpath) & 0777;
@ -198,7 +195,7 @@ class Avatar
return ''; return '';
} }
return DI::baseUrl() . $path . '?ts=' . $timestamp; return self::baseUrl() . $path . '?ts=' . $timestamp;
} }
/** /**
@ -221,16 +218,17 @@ class Avatar
private static function getCacheFile(string $avatar): string private static function getCacheFile(string $avatar): string
{ {
$parts = parse_url($avatar); $parts = parse_url($avatar);
if (empty($parts['host']) || ($parts['host'] != DI::baseUrl()->getHostname())) { if (empty($parts['host']) || ($parts['host'] != parse_url(self::baseUrl(), PHP_URL_HOST))) {
return ''; return '';
} }
$pos = strpos($parts['path'], DI::baseUrl()->getUrlPath() . self::BASE_PATH); $avatarpath = parse_url(self::baseUrl(), PHP_URL_PATH);
$pos = strpos($parts['path'], $avatarpath);
if ($pos !== 0) { if ($pos !== 0) {
return ''; return '';
} }
$filename = DI::basePath() . $parts['path']; $filename = self::basePath() . substr($parts['path'], strlen($avatarpath));
DI::profiler()->startRecording('file'); DI::profiler()->startRecording('file');
$exists = file_exists($filename); $exists = file_exists($filename);
@ -269,4 +267,47 @@ class Avatar
Logger::debug('Unlink avatar', ['avatar' => $avatar]); Logger::debug('Unlink avatar', ['avatar' => $avatar]);
} }
} }
/**
* Fetch the avatar base path
*
* @return string
*/
private static function basePath(): string
{
$basepath = DI::config()->get('system', 'avatar_cache_path');
if (empty($basepath)) {
$basepath = DI::basePath() . self::BASE_PATH;
}
$basepath = rtrim($basepath, '/') . '/';
if (!file_exists($basepath)) {
// We only automatically create the folder when it is in the web root
if (strpos($basepath, DI::basePath()) !== 0) {
Logger::warning('Base directory does not exist', ['directory' => $basepath]);
return '';
}
if (!mkdir($basepath, 0775)) {
Logger::warning('Base directory could not be created', ['directory' => $basepath]);
return '';
}
}
return $basepath;
}
/**
* Fetch the avatar base url
*
* @return string
*/
private static function baseUrl(): string
{
$baseurl = DI::config()->get('system', 'avatar_cache_url');
if (!empty($baseurl)) {
return rtrim($baseurl, '/') . '/';
}
return DI::baseUrl() . self::BASE_PATH;
}
} }

View file

@ -122,6 +122,16 @@ return [
// Cache avatar pictures as files (experimental) // Cache avatar pictures as files (experimental)
'avatar_cache' => false, 'avatar_cache' => false,
// avatar_cache_path (String)
// File path to the avatar cache. Default is /(your basepath)/avatar/
// The value has to be an absolute path and has to end with a "/"
'avatar_cache_path' => '',
// avatar_cache_url (String)
// Base URL of the avatar cache. Default is http(s)://(your hostname)/avatar/
// The value has to start with the scheme and end with a "/"
'avatar_cache_url' => '',
// big_emojis (Boolean) // big_emojis (Boolean)
// Display "Emoji Only" posts in big. // Display "Emoji Only" posts in big.
'big_emojis' => false, 'big_emojis' => false,