Merge pull request #11643 from annando/avatar-path
You can now store the avatar in a separate folder and host
This commit is contained in:
commit
98954dd14e
2 changed files with 66 additions and 15 deletions
|
@ -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,21 +138,19 @@ 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)) {
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
|
||||||
$dirpath = DI::basePath() . self::BASE_PATH;
|
$filepath = $basepath . $path;
|
||||||
|
|
||||||
|
$dirpath = $basepath;
|
||||||
|
|
||||||
DI::profiler()->startRecording('file');
|
DI::profiler()->startRecording('file');
|
||||||
|
|
||||||
if (!file_exists($dirpath)) {
|
|
||||||
if (!mkdir($dirpath, 0775)) {
|
|
||||||
Logger::warning('Base directory could not be created', ['directory' => $dirpath]);
|
|
||||||
return '';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 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;
|
||||||
$file_perm = fileperms($dirpath) & 0666;
|
$file_perm = fileperms($dirpath) & 0666;
|
||||||
|
@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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,
|
||||||
|
|
Loading…
Reference in a new issue