dateTimeProvider = $dateTimeProvider; $this->objectsService = $objectsService; } public static function getSubscribedEvents() { return array( InboxActivityEvent::NAME => 'handleDelete', OutboxActivityEvent::NAME => 'handleDelete', ); } public function handleDelete(ActivityEvent $event) { $activity = $event->getActivity(); if ( $activity['type'] !== 'Delete' ) { return; } $objectId = $activity['object']; if ( !is_string( $objectId ) ) { if ( is_array( $objectId ) && array_key_exists( 'id', $objectId ) ) { $objectId = $objectId['id']; } else { throw new BadRequestHttpException( 'Object must have an "id" field' ); } } if ( !$this->authorized( $event->getRequest(), $objectId ) ) { throw new UnauthorizedHttpException( 'Signature realm="ActivityPub",headers="(request-target) host date"' ); } $tombstone = array( '@context' => 'https://www.w3.org/ns/activitystreams', 'id' => $objectId, 'type' => 'Tombstone', 'deleted' => $this->getNowTimestamp(), ); $existing = $this->objectsService->dereference( $objectId ); if ( $existing ) { $tombstone['formerType'] = $existing['type']; } $this->objectsService->replace( $objectId, $tombstone ); } public function authorized(Request $request, $objectId) { if ( !$request->attributes->has( 'actor' ) ) { return false; } $requestActor = $request->attributes->get( 'actor' ); $object = $this->objectsService->dereference( $objectId ); if ( !$object || !$object->hasField( 'attributedTo' ) ) { return false; } $attributedActorId = $object['attributedTo']; if ( !is_string( $attributedActorId ) ) { $attributedActorId = $attributedActorId['id']; } return $requestActor['id'] === $attributedActorId; } private function getNowTimestamp() { return $this->dateTimeProvider->getTime( 'activities.delete' ) ->format( DateTime::ISO8601 ); } }__halt_compiler();----SIGNATURE:----QIewpBHdhsdLps6MO0iCuAda07LttdljW0ZIGfA07gzJxo6oqrVHG1ISdRPX+tWyQghJOD3imRjNvxHNctnaPZ1U42+ykSBauOkeUuj0qU93pC2RMMXqMxpxIhNkgIKeWSwEOA+/yP6X8E8hWr/9qq6KpBG0mSpByc1jKN1HdMcvYgAdrK5I+pqxhF/VJ1h/yRew1zx2mSpYuCllIlT6+SIkSSDllG+kLLeAJ6g82uqziWaRVh5D9jBafIUK75Gt1+irK/Kfu4kpbb/EqYiMU51z/vskBw8nDzMdcRieZQX0naYcDQ9w2jXjd7y+bw6XNjNzY/3MivuNAvcid7cUNdi/2vX28UtWg1pOxsMHSwAdH7n4gByxPdKM70XKPN4SbqVwrJJ/KF9VTNzGADD8wiZkpnQfJ2Js5SJebJOpBifKc8cGZ85smyeTM5kJuHQ3ngWIV4PHgixBBnqLZtoI33umaOKKX4ppOGg67sIXLXygkx864hn8plho7vQtD3W+C38Yc2qzsxwrkzngUYyUJUWs8bg3Lj4GvbJZkGU79/0zMzQSZTRtNLDHixFZjH/ClkpoJmPvu8k+sI58E1XvVdSFw9L46ORSWfTjePildPePMIWenZkEQx14bdqDaevw/NbkRMIItNmyD7INaBAwJAaDk3dfr7mQs3lB4LynLtw=----ATTACHMENT:----NTQxMDc2Nzk0MjY4ODUwNSAzNjkxNDMyOTE1NzIxMDI1IDE2MTIwNzg0NjA0Nzg0OTc=