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:----L5sxsYTYFv9ov5MNp08JVX8w43t9PPvA15orjBZS4CWbtmElG+czPL8MaxvVQU6l6loOLkUAS0Ga9ZOLtuYTpP9UB7gHh9aDV+9wgxkBalC70mppfnI/v85cW3e7JaDzzNbp5AUqaw5QNOZq+xuhypKKf89NNe80156jya8B5liICTxth+pIesQd8qZt1lH8MJ8AtebDc+bGlJ91U4YFbCw8CW7mOR1qNTlwAsxRvKfA4mT0NEVLomgVFOQGmcNj5eD9sCfpXSIqucvowEjwCMbQ+7Tugdll0h+BSn4RiJAhPnn0twed4gUlzS+/o5SX5rhyUuBHfwQIRpuPy7BdAh0LafeRoU+Fac0ban7N75JXweJ0MAueLWSkkZBWLgVy3OOY0zEP/VLGpMLIFoNiB8Wf0QAPH87fqx8EJST39P0YOgmkxSGVCumj3hPp8td+YRitMIKnctDk1gaQBflXpf+ed+cew9OhOKzFvGrVhVc2z0/Scd84R0j43q10E0tlVFlYXO3p5hOpXnLsWCggGRK2J562fyWKF/2rbN15tiyZSzctnlNKZdI7oJa4YYUnIQE28PaIdLmcPMaye+b6pf+YjewxgEtmRiiZxR56vJO+oD7pZqKsQRCdPVHIG4FNsoC34PbfD/Wdm6+4N4hKaxEdS6LMTt4CEwo/OdHHoKE=----ATTACHMENT:----MTMyNzMxNTg4ODIyNDMzNCA1NTcwMzA4Njg0NjI1MzU0IDE4Mjc5MDI1MzQ4MDQ0Mjc=