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:----uNPEie/tSRTuYy3HwvfHgSQqmXG/qZRhSJ1yQYTdTbw065bT5DwOzsEldfudTjq7motBhnzPohcdgJabaR3Nk5EKUd8Ss2nPOoBYtT4yC04RDQPEqc/ljl+Jkqfyt68FKKx7A7KINCkeLZ7WQcz+lH4g54XPf6pOOmaF3QPjZOeiIroUtaFJ+bSi6GM2f91o3O4ZbKKkD91iaCnGN4qUxPh4AcINN1O6HEVjSCzsgOB6nwi7GqHTzTZRyxBRYj9RUQIVZ6qMecyPVS63aSL+dKS/mTixsIdc9jA6xGqy5nOV6H6kUeMbul+67hv4E6iGNzRudaQIiGQnY3Ws76qrgmPkeAMe56/HHfE8bErygCYd6q2fT62dAST0qW0PQY0jJDWjKzWvYLhW5QvA7LpGanIiY9u8cgJOW318H8edW7Ic5kXY6btZrBgmzBKCIhgvcq8DEQpOwcY3wCe3/yH2fAA6jLOYiAz7kR0tuHSN/2xlEUVn8tdvAy9kihhbEbX3vXiFBYpCUN0ICiWQx4E3Q/r56q6aRLswsmlG7+HEQEiCawdfizU3Ydgj2xQM0fDaNbD7MRkAI1sbEg5eE4rEtg+TneyjP/oPszGrmH5hBVY6M55HF8X+mXIjhHF0msys8X2uGQHwrmVUi4bZ8KC8YvuPeR+cuqZbwIX3U28+gGg=----ATTACHMENT:----Nzk3MDE2NDAyODIxMjA2IDU0ODEzMTM1MDEyNDQxMTUgNjQ3NTQwNDEyMzU3NTY0MA==