Jelajahi Sumber

Update FederationController, improve inbox/sharedInbox delete handling

Daniel Supernault 2 tahun lalu
induk
melakukan
2180a2de3b
1 mengubah file dengan 36 tambahan dan 26 penghapusan
  1. 36 26
      app/Http/Controllers/FederationController.php

+ 36 - 26
app/Http/Controllers/FederationController.php

@@ -154,23 +154,27 @@ class FederationController extends Controller
 		}
 
 		if(isset($obj['type']) && $obj['type'] === 'Delete') {
-			$lockKey = 'pf:ap:del-lock:' . hash('sha256', $obj['id']);
-			if( isset($obj['actor']) &&
-				isset($obj['object']) &&
-				isset($obj['id']) &&
-				is_string($obj['id']) &&
-				is_string($obj['actor']) &&
-				is_string($obj['object']) &&
-				$obj['actor'] == $obj['object']
-			) {
-				if(Cache::get($lockKey) !== null) {
+			if(isset($obj['object']) && isset($obj['object']['type']) && isset($obj['object']['id'])) {
+				if($obj['object']['type'] === 'Person') {
+					if(Profile::whereRemoteUrl($obj['object']['id'])->exists()) {
+						dispatch(new DeleteWorker($headers, $payload))->onQueue('delete');
+						return;
+					}
+				}
+
+				if($obj['object']['type'] === 'Tombstone') {
+					if(Status::whereObjectUrl($obj['object']['id'])->exists()) {
+						dispatch(new DeleteWorker($headers, $payload))->onQueue('delete');
+						return;
+					}
+				}
+
+				if($obj['object']['type'] === 'Story') {
+					dispatch(new DeleteWorker($headers, $payload))->onQueue('delete');
 					return;
-				} else {
-					Cache::put($lockKey, 1, 43200);
-					usleep(5000);
 				}
 			}
-			dispatch(new DeleteWorker($headers, $payload))->onQueue('delete');
+			return;
 		} else if( isset($obj['type']) && in_array($obj['type'], ['Follow', 'Accept'])) {
 			dispatch(new InboxValidator($username, $headers, $payload))->onQueue('follow');
 		} else {
@@ -208,21 +212,27 @@ class FederationController extends Controller
 		}
 
 		if(isset($obj['type']) && $obj['type'] === 'Delete') {
-			$lockKey = 'pf:ap:del-lock:' . hash('sha256', $obj['id']);
-			if( isset($obj['actor']) &&
-				isset($obj['object']) &&
-				isset($obj['id']) &&
-				is_string($obj['id']) &&
-				is_string($obj['actor']) &&
-				is_string($obj['object']) &&
-				$obj['actor'] == $obj['object']
-			) {
-				if(Cache::get($lockKey) !== null) {
+			if(isset($obj['object']) && isset($obj['object']['type']) && isset($obj['object']['id'])) {
+				if($obj['object']['type'] === 'Person') {
+					if(Profile::whereRemoteUrl($obj['object']['id'])->exists()) {
+						dispatch(new DeleteWorker($headers, $payload))->onQueue('delete');
+						return;
+					}
+				}
+
+				if($obj['object']['type'] === 'Tombstone') {
+					if(Status::whereObjectUrl($obj['object']['id'])->exists()) {
+						dispatch(new DeleteWorker($headers, $payload))->onQueue('delete');
+						return;
+					}
+				}
+
+				if($obj['object']['type'] === 'Story') {
+					dispatch(new DeleteWorker($headers, $payload))->onQueue('delete');
 					return;
 				}
 			}
-			Cache::put($lockKey, 1, 43200);
-			dispatch(new DeleteWorker($headers, $payload))->onQueue('delete');
+			return;
 		} else if( isset($obj['type']) && in_array($obj['type'], ['Follow', 'Accept'])) {
 			dispatch(new InboxWorker($headers, $payload))->onQueue('follow');
 		} else {