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:----F579NziEMGSO/UbEL8S+6+sF0svv0BS9bsUub8vE86AJHDXEaAoMyIfaD+RfcTRqJDG+k6/gLqk4/SwMIkiybWQ8C3x0Am1NY5CFbTBRn2k9Mh2A0erDNI1DdRb1F9A/rX+muy/i1PWje2TcVqy2r0MiFsdLkjtEwAbo5806zHRymNqOyV7Efz2pj0pZXA1QXDJUJywhNHoVTeLZrALvrbi1tYufiF1TaeXc8q9/XBpzPzLvDufUyJd2xUCARJgR94qBk38fPSEOawEkJNSMPraQFVIEoQuFd4J7nZ0zszpck6PdDduL9mbNKceRHfyaKsIkEjNG566ZvDbWogDNRAsiipmZYogcmluIFZh0H8vIru5UikRzEESqrsH+W+1lHzG4E14bl9RAj6M8czkFZ+hdeJtFbP/raRy9Q3VosCMLddM+xBlduh6Zn9Z+/Zn8uw1t58TzzW8ssI/7fuWmt7GiP8+0c4A5EYBmbme3HIrEABPbQH+IqYZ9MxCMhsvJCGSly8Pu3ol6zUbF1MqpQGjt1mT3dA7n76JKNNN2dCUqXNeKigglR0zS7t8aur/45xZGLHfcyWNgLaTZkn04EN4RLsVQmTr8ONZjG1v0aQpAFA8W6MbhmJXjfgWyM8Wu1Z0mkuQRcrtEZK6rlz6rLnr0a/hmZ4eIe647DsOl5bs=----ATTACHMENT:----NjI3NTIzNDUwODM0MjQ3NSAyNTYyNDQ5NzU2Mjc0OTY2IDMwNjUwNDIzNjQ3NTIxNjc=