Store remote avatars locally if S3 not enabled

This commit is contained in:
Daniel Supernault 2022-01-02 21:30:02 -07:00
parent 1a979bee5c
commit b4bd0400c2
No known key found for this signature in database
GPG key ID: 0DEF1C662C9033F7
4 changed files with 18 additions and 16 deletions

View file

@ -32,6 +32,13 @@ class RemoteAvatarFetch implements ShouldQueue
*/ */
public $deleteWhenMissingModels = true; public $deleteWhenMissingModels = true;
/**
* The number of times the job may be attempted.
*
* @var int
*/
public $tries = 1;
/** /**
* Create a new job instance. * Create a new job instance.
* *
@ -99,9 +106,7 @@ class RemoteAvatarFetch implements ShouldQueue
$avatar->remote_url = $icon['url']; $avatar->remote_url = $icon['url'];
$avatar->save(); $avatar->save();
if(config_cache('pixelfed.cloud_storage')) { MediaStorageService::avatar($avatar, config_cache('pixelfed.cloud_storage') == false);
MediaStorageService::avatar($avatar);
}
return 1; return 1;
} }

View file

@ -27,9 +27,9 @@ class MediaStorageService {
return; return;
} }
public static function avatar($avatar) public static function avatar($avatar, $local = false)
{ {
return (new self())->fetchAvatar($avatar); return (new self())->fetchAvatar($avatar, $local);
} }
public static function head($url) public static function head($url)
@ -177,11 +177,12 @@ class MediaStorageService {
unlink($tmpName); unlink($tmpName);
} }
protected function fetchAvatar($avatar) protected function fetchAvatar($avatar, $local = false)
{ {
$url = $avatar->remote_url; $url = $avatar->remote_url;
$driver = $local ? 'local' : config('filesystems.cloud');
if($url == null || Helpers::validateUrl($url) == false) { if(empty($url) || Helpers::validateUrl($url) == false) {
return; return;
} }
@ -220,7 +221,7 @@ class MediaStorageService {
return; return;
} }
$base = 'cache/avatars/' . $avatar->profile_id; $base = ($local ? 'public/cache/' : 'cache/') . 'avatars/' . $avatar->profile_id;
$ext = $head['mime'] == 'image/jpeg' ? 'jpg' : 'png'; $ext = $head['mime'] == 'image/jpeg' ? 'jpg' : 'png';
$path = Str::random(20) . '_avatar.' . $ext; $path = Str::random(20) . '_avatar.' . $ext;
$tmpBase = storage_path('app/remcache/'); $tmpBase = storage_path('app/remcache/');
@ -229,7 +230,7 @@ class MediaStorageService {
$data = file_get_contents($url, false, null, 0, $head['length']); $data = file_get_contents($url, false, null, 0, $head['length']);
file_put_contents($tmpName, $data); file_put_contents($tmpName, $data);
$disk = Storage::disk(config('filesystems.cloud')); $disk = Storage::disk($driver);
$file = $disk->putFileAs($base, new File($tmpName), $path, 'public'); $file = $disk->putFileAs($base, new File($tmpName), $path, 'public');
$permalink = $disk->url($file); $permalink = $disk->url($file);

View file

@ -586,9 +586,7 @@ class Helpers {
$profile->webfinger = Purify::clean($webfinger); $profile->webfinger = Purify::clean($webfinger);
$profile->last_fetched_at = now(); $profile->last_fetched_at = now();
$profile->save(); $profile->save();
if(config_cache('pixelfed.cloud_storage') == true) { RemoteAvatarFetch::dispatch($profile);
RemoteAvatarFetch::dispatch($profile);
}
return $profile; return $profile;
}); });
}); });
@ -603,9 +601,7 @@ class Helpers {
$profile->sharedInbox = isset($res['endpoints']) && isset($res['endpoints']['sharedInbox']) && Helpers::validateUrl($res['endpoints']['sharedInbox']) ? $res['endpoints']['sharedInbox'] : null; $profile->sharedInbox = isset($res['endpoints']) && isset($res['endpoints']['sharedInbox']) && Helpers::validateUrl($res['endpoints']['sharedInbox']) ? $res['endpoints']['sharedInbox'] : null;
$profile->save(); $profile->save();
} }
if(config_cache('pixelfed.cloud_storage') == true) { RemoteAvatarFetch::dispatch($profile);
RemoteAvatarFetch::dispatch($profile);
}
} }
return $profile; return $profile;
}); });

View file

@ -33,7 +33,7 @@ return [
], ],
'avatars' => [ 'avatars' => [
'store_local' => false 'store_local' => env('REMOTE_AVATARS', true),
], ],
'nodeinfo' => [ 'nodeinfo' => [