瀏覽代碼

Merge pull request #3501 from pixelfed/staging

Staging
daniel 3 年之前
父節點
當前提交
0b16a79fcc

+ 3 - 0
CHANGELOG.md

@@ -23,6 +23,9 @@
 - Update adminReportController, fix mail verification request 500 bug by changing filter precedence to catch deleted users that may still be cached in AccountService ([3f322e29](https://github.com/pixelfed/pixelfed/commit/3f322e29))
 - Update AP Helpers, fix getSensitive and getScope missing parameters ([657c66c1](https://github.com/pixelfed/pixelfed/commit/657c66c1))
 - Fix mastodon api compatibility ([#3499](https://github.com/pixelfed/pixelfed/pull/3499))
+- Add ffmpeg config, disable logging by default ([108e3803](https://github.com/pixelfed/pixelfed/commit/108e3803))
+- Refactor AP profileFetch logic to fix race conditions and improve updating fields and avatars ([505261da](https://github.com/pixelfed/pixelfed/commit/505261da))
+-  ([](https://github.com/pixelfed/pixelfed/commit/))
 
 ## [v0.11.3 (2022-05-09)](https://github.com/pixelfed/pixelfed/compare/v0.11.2...v0.11.3)
 

+ 1 - 1
app/Profile.php

@@ -26,7 +26,7 @@ class Profile extends Model
 	];
 	protected $hidden = ['private_key'];
 	protected $visible = ['id', 'user_id', 'username', 'name'];
-	protected $fillable = ['user_id'];
+	protected $guarded = [];
 
 	public function user()
 	{

+ 65 - 46
app/Util/ActivityPub/Helpers.php

@@ -36,6 +36,7 @@ use App\Jobs\MediaPipeline\MediaStoragePipeline;
 use App\Jobs\AvatarPipeline\RemoteAvatarFetch;
 use App\Util\Media\License;
 use App\Models\Poll;
+use Illuminate\Contracts\Cache\LockTimeoutException;
 
 class Helpers {
 
@@ -664,26 +665,43 @@ class Helpers {
 		return;
 	}
 
-	public static function profileFirstOrNew($url, $runJobs = false)
+	public static function profileFirstOrNew($url)
 	{
 		$url = self::validateUrl($url);
-		if($url == false || strlen($url) > 190) {
+		if($url == false) {
 			return;
 		}
+
+		$host = parse_url($url, PHP_URL_HOST);
+		$local = config('pixelfed.domain.app') == $host ? true : false;
+
+		if($local == true) {
+			$id = last(explode('/', $url));
+			return Profile::whereNull('status')
+				->whereNull('domain')
+				->whereUsername($id)
+				->firstOrFail();
+		}
+
+		if($profile = Profile::whereRemoteUrl($url)->first()) {
+			if($profile->last_fetched_at->lt(now()->subHours(24))) {
+				return self::profileUpdateOrCreate($url);
+			}
+			return $profile;
+		}
+
+		return self::profileUpdateOrCreate($url);
+	}
+
+	public static function profileUpdateOrCreate($url)
+	{
 		$hash = base64_encode($url);
 		$key = 'ap:profile:by_url:' . $hash;
-		$ttl = now()->addSeconds(60);
-		$profile = Cache::remember($key, $ttl, function() use($url, $runJobs) {
-			$host = parse_url($url, PHP_URL_HOST);
-			$local = config('pixelfed.domain.app') == $host ? true : false;
+		$lock = Cache::lock($key, 30);
+		$profile = null;
 
-			if($local == true) {
-				$id = last(explode('/', $url));
-				return Profile::whereNull('status')
-					->whereNull('domain')
-					->whereUsername($id)
-					->firstOrFail();
-			}
+		try {
+			$lock->block(5);
 
 			$res = self::fetchProfileFromUrl($url);
 			if(isset($res['id']) == false) {
@@ -703,47 +721,48 @@ class Helpers {
 			abort_if(!self::validateUrl($res['inbox']), 400);
 			abort_if(!self::validateUrl($res['id']), 400);
 
-			$profile = Profile::whereRemoteUrl($res['id'])->first();
-			if(!$profile) {
-				$instance = Instance::firstOrCreate([
+			$profile = DB::transaction(function() use($domain, $webfinger, $res) {
+				$instance = Instance::updateOrCreate([
 					'domain' => $domain
 				]);
 				if($instance->wasRecentlyCreated == true) {
 					\App\Jobs\InstancePipeline\FetchNodeinfoPipeline::dispatch($instance)->onQueue('low');
 				}
-				$profile = DB::transaction(function() use($domain, $webfinger, $res, $runJobs) {
-					$profile = new Profile();
-					$profile->domain = strtolower($domain);
-					$profile->username = Purify::clean($webfinger);
-					$profile->name = isset($res['name']) ? Purify::clean($res['name']) : 'user';
-					$profile->bio = isset($res['summary']) ? Purify::clean($res['summary']) : null;
-					$profile->sharedInbox = isset($res['endpoints']) && isset($res['endpoints']['sharedInbox']) ? $res['endpoints']['sharedInbox'] : null;
-					$profile->inbox_url = $res['inbox'];
-					$profile->outbox_url = isset($res['outbox']) ? $res['outbox'] : null;
-					$profile->remote_url = $res['id'];
-					$profile->public_key = $res['publicKey']['publicKeyPem'];
-					$profile->key_id = $res['publicKey']['id'];
-					$profile->webfinger = Purify::clean($webfinger);
-					$profile->last_fetched_at = now();
-					$profile->save();
-					RemoteAvatarFetch::dispatch($profile);
-					return $profile;
-				});
-			} else {
-				// Update info after 24 hours
-				if($profile->last_fetched_at == null ||
-				   $profile->last_fetched_at->lt(now()->subHours(24)) == true
+
+				$profile = Profile::updateOrCreate(
+					[
+						'domain' => strtolower($domain),
+						'username' => Purify::clean($webfinger),
+						'remote_url' => $res['id'],
+					],
+					[
+						'name' => isset($res['name']) ? Purify::clean($res['name']) : 'user',
+						'bio' => isset($res['summary']) ? Purify::clean($res['summary']) : null,
+						'sharedInbox' => isset($res['endpoints']) && isset($res['endpoints']['sharedInbox']) ? $res['endpoints']['sharedInbox'] : null,
+						'inbox_url' => $res['inbox'],
+						'outbox_url' => isset($res['outbox']) ? $res['outbox'] : null,
+						'public_key' => $res['publicKey']['publicKeyPem'],
+						'key_id' => $res['publicKey']['id'],
+						'webfinger' => Purify::clean($webfinger),
+					]
+				);
+
+				if( $profile->last_fetched_at == null ||
+					$profile->last_fetched_at->lt(now()->subHours(24))
 				) {
-					$profile->name = isset($res['name']) ? Purify::clean($res['name']) : 'user';
-					$profile->bio = isset($res['summary']) ? Purify::clean($res['summary']) : null;
-					$profile->last_fetched_at = now();
-					$profile->sharedInbox = isset($res['endpoints']) && isset($res['endpoints']['sharedInbox']) && Helpers::validateUrl($res['endpoints']['sharedInbox']) ? $res['endpoints']['sharedInbox'] : null;
-					$profile->save();
+					RemoteAvatarFetch::dispatch($profile);
 				}
-				RemoteAvatarFetch::dispatch($profile);
-			}
+				$profile->last_fetched_at = now();
+				$profile->save();
+				return $profile;
+			});
+
 			return $profile;
-		});
+		} catch (LockTimeoutException $e) {
+		} finally {
+		    optional($lock)->release();
+		}
+
 		return $profile;
 	}
 

+ 21 - 0
config/laravel-ffmpeg.php

@@ -0,0 +1,21 @@
+<?php
+
+return [
+    'ffmpeg' => [
+        'binaries' => env('FFMPEG_BINARIES', 'ffmpeg'),
+
+        'threads' => 12,   // set to false to disable the default 'threads' filter
+    ],
+
+    'ffprobe' => [
+        'binaries' => env('FFPROBE_BINARIES', 'ffprobe'),
+    ],
+
+    'timeout' => 3600,
+
+    'enable_logging' => env('FFMPEG_LOG', false),
+
+    'set_command_and_error_output_on_exception' => false,
+
+    'temporary_files_root' => env('FFMPEG_TEMPORARY_FILES_ROOT', sys_get_temp_dir()),
+];

+ 2 - 0
database/migrations/2022_04_20_061915_create_conversations_table.php

@@ -16,6 +16,8 @@ class CreateConversationsTable extends Migration
      */
     public function up()
     {
+    	Schema::dropIfExists('conversations');
+
         Schema::create('conversations', function (Blueprint $table) {
             $table->bigIncrements('id');
             $table->bigInteger('to_id')->unsigned()->index();