Browse Source

Merge pull request #3997 from pixelfed/staging

Staging
daniel 2 years ago
parent
commit
61bed89526
3 changed files with 33 additions and 9 deletions
  1. 1 0
      CHANGELOG.md
  2. 2 0
      app/Models/CustomEmoji.php
  3. 30 9
      app/Services/CustomEmojiService.php

+ 1 - 0
CHANGELOG.md

@@ -65,6 +65,7 @@
 - Update CommentPipeline, remove expensive reply count re-calculation query ([b457a446](https://github.com/pixelfed/pixelfed/commit/b457a446))
 - Update FederationController, improve inbox/sharedInbox delete handling ([2180a2de](https://github.com/pixelfed/pixelfed/commit/2180a2de))
 - Update HashtagController, improve trending hashtag endpoint ([4873c7dd](https://github.com/pixelfed/pixelfed/commit/4873c7dd))
+- Fix CustomEmoji, properly handle shortcode updates and delete old copy in case the extension changes ([bc29073a](https://github.com/pixelfed/pixelfed/commit/bc29073a))
 -  ([](https://github.com/pixelfed/pixelfed/commit/))
 
 ## [v0.11.4 (2022-10-04)](https://github.com/pixelfed/pixelfed/compare/v0.11.3...v0.11.4)

+ 2 - 0
app/Models/CustomEmoji.php

@@ -14,6 +14,8 @@ class CustomEmoji extends Model
 	const SCAN_RE = "/(?<=[^[:alnum:]:]|\n|^):([a-zA-Z0-9_]{2,}):(?=[^[:alnum:]:]|$)/x";
 	const CACHE_KEY = "pf:custom_emoji:";
 
+	protected $guarded = [];
+
 	public static function scan($text, $activitypub = false)
 	{
 		if(config('federation.custom_emoji.enabled') == false) {

+ 30 - 9
app/Services/CustomEmojiService.php

@@ -6,6 +6,8 @@ use App\Models\CustomEmoji;
 use App\Util\ActivityPub\Helpers;
 use Illuminate\Support\Facades\Http;
 use Illuminate\Support\Facades\Cache;
+use Illuminate\Support\Facades\Storage;
+use Illuminate\Http\Client\RequestException;
 
 class CustomEmojiService
 {
@@ -33,7 +35,13 @@ class CustomEmojiService
 			return;
 		}
 
-		$res = Http::acceptJson()->get($url);
+		try {
+			$res = Http::acceptJson()->get($url);
+		} catch (RequestException $e) {
+			return;
+		} catch (\Exception $e) {
+			return;
+		}
 
 		if($res->successful()) {
 			$json = $res->json();
@@ -57,16 +65,23 @@ class CustomEmojiService
 				return;
 			}
 
-			$emoji = new CustomEmoji;
-			$emoji->shortcode = $json['name'];
-			$emoji->uri = $json['id'];
-			$emoji->domain = parse_url($json['id'], PHP_URL_HOST);
-			$emoji->image_remote_url = $json['icon']['url'];
-			$emoji->save();
+			$emoji = CustomEmoji::firstOrCreate([
+				'shortcode' => $json['name'],
+				'domain' => parse_url($json['id'], PHP_URL_HOST)
+			], [
+				'uri' => $json['id'],
+				'image_remote_url' => $json['icon']['url']
+			]);
+
+			if($emoji->wasRecentlyCreated == false) {
+				if(Storage::exists('public/' . $emoji->media_path)) {
+					Storage::delete('public/' . $emoji->media_path);
+				}
+			}
 
 			$ext = '.' . last(explode('/', $json['icon']['mediaType']));
 			$dest = storage_path('app/public/emoji/') . $emoji->id . $ext;
-			copy($emoji->image_remote_url, $dest);
+			copy($json['icon']['url'], $dest);
 			$emoji->media_path = 'emoji/' . $emoji->id . $ext;
 			$emoji->save();
 
@@ -84,7 +99,13 @@ class CustomEmojiService
 
 	public static function headCheck($url)
 	{
-		$res = Http::head($url);
+		try {
+			$res = Http::head($url);
+		} catch (RequestException $e) {
+			return false;
+		} catch (\Exception $e) {
+			return false;
+		}
 
 		if(!$res->successful()) {
 			return false;