diff --git a/app/Jobs/MovePipeline/ProcessMovePipeline.php b/app/Jobs/MovePipeline/ProcessMovePipeline.php new file mode 100644 index 000000000..1a86ded22 --- /dev/null +++ b/app/Jobs/MovePipeline/ProcessMovePipeline.php @@ -0,0 +1,101 @@ +target = $target; + $this->activity = $activity; + } + + /** + * Get the middleware the job should pass through. + * + * @return array + */ + public function middleware(): array + { + return [new WithoutOverlapping($this->target)]; + } + + /** + * Execute the job. + */ + public function handle(): void + { + if (! self::checkTarget()) { + return; + } + + if (! self::checkActor()) { + return; + } + } + + protected function checkTarget() + { + $res = ActivityPubFetchService::fetchRequest($this->target, true); + + if (! $res || ! isset($res['alsoKnownAs'])) { + return false; + } + + $res = Helpers::profileFetch($this->target); + if (! $res) { + return false; + } + + if (is_string($res['alsoKnownAs'])) { + return self::lowerTrim($res['alsoKnownAs']) === self::lowerTrim($this->actor); + } + + if (is_array($res['alsoKnownAs'])) { + $map = array_map(self::lowerTrim(), $res['alsoKnownAs']); + + return in_array($this->actor, $map); + } + + return false; + } + + protected function checkActor() + { + $res = ActivityPubFetchService::fetchRequest($this->actor, true); + + if (! $res || ! isset($res['movedTo'])) { + return false; + } + + $res = Helpers::profileFetch($this->actor); + if (! $res) { + return false; + } + + if (is_string($res['movedTo'])) { + return self::lowerTrim($res['movedTo']) === self::lowerTrim($this->target); + } + + return false; + } + + protected function lowerTrim($str) + { + return trim(strtolower($str)); + } +}