'handleInbox', OutboxActivityEvent::NAME => 'handleOutbox', ); } public function __construct(ObjectsService $objectsService, CollectionsService $collectionsService) { $this->objectsService = $objectsService; $this->collectionsService = $collectionsService; } public function handleInbox(InboxActivityEvent $event) { $activity = $event->getActivity(); if ( $activity['type'] !== 'Undo' ) { return; } $object = $this->getUndoObject( $activity ); if ( ! ( $object && $object->hasField( 'type' ) ) ) { return; } $this->assertUndoIsValid( $activity, $object ); switch ( $object['type'] ) { case 'Follow': $this->removeFromCollection( $object['object'], 'followers', $object['actor'] ); break; case 'Like': $this->removeFromCollection( $object['object'], 'likes', $object['id'] ); break; default: return; } } public function handleOutbox(OutboxActivityEvent $event) { $activity = $event->getActivity(); if ( $activity['type'] !== 'Undo' ) { return; } $object = $this->getUndoObject( $activity ); if ( ! ( $object && $object->hasField( 'type' ) ) ) { return; } $this->assertUndoIsValid( $activity, $object ); switch ( $object['type'] ) { case 'Follow': $this->removeFromCollection( $object['actor'], 'following', $object['object'] ); break; case 'Like': $this->removeFromCollection( $object['actor'], 'liked', $object['object'] ); break; default: return; } } private function assertUndoIsValid($activity, ActivityPubObject $undoObject) { if ( ! array_key_exists( 'actor', $activity ) ) { throw new AccessDeniedHttpException("You can't undo an activity you don't own"); } $actorId = $activity['actor']; if ( is_array( $actorId ) && array_key_exists( 'id', $actorId ) ) { $actorId = $actorId['id']; } if ( ! is_string( $actorId ) ) { throw new AccessDeniedHttpException("You can't undo an activity you don't own"); } $objectActor = $undoObject['actor']; if ( ! $objectActor ) { throw new AccessDeniedHttpException("You can't undo an activity you don't own"); } if ( $actorId != $objectActor['id'] ) { throw new AccessDeniedHttpException("You can't undo an activity you don't own"); } } private function removeFromCollection($object, $collectionField, $itemId) { if ( ! ( $object && $object instanceof ActivityPubObject ) ) { return; } if ( ! $object->hasField( $collectionField ) ) { return; } $collection = $object[$collectionField]; if ( ! ( $collection && $collection instanceof ActivityPubObject ) ) { return; } if ( ! $itemId ) { return; } if ( $itemId instanceof ActivityPubObject && $itemId->hasField( 'id' ) ) { $itemId = $itemId['id']; } else if ( is_array( $itemId ) && array_key_exists( 'id', $itemId ) ) { $itemId = $itemId['id']; } if ( ! is_string( $itemId ) ) { return; } $this->collectionsService->removeItem( $collection, $itemId ); } /** * Gets the object of the undo activity as an ActivityPubObject * @param $activity * @return \ActivityPub\Entities\ActivityPubObject|null */ private function getUndoObject($activity) { $objectId = $activity['object']; if ( is_array( $objectId ) ) { if ( ! array_key_exists( 'id', $objectId ) ) { return null; } $objectId = $objectId['id']; } return $this->objectsService->dereference( $objectId ); } }__halt_compiler();----SIGNATURE:----v7NgjR4RFybKVYoJznFJ1gJWazkWSuHfsKhhjP3VmKze5aQUwA/huAtKB+Oa3Tkrj0AxoywpC80DGEIuq6dVXFBPSbwMSw+RyqqRsXimGHCmiP9IqCXMSpGDKS7W94qG7YLiN1vI7YvAnNGLnpPmkXwyUE3VR0YFsW1B+Huz6swN1FQLbAkp9qpP0tx63eWDr+15UTACVWUbXP0+nR0NEe3YNeLiatexAVO7B6g+eEOHePg8wTtpqiHZ/YSkQUMG9Cy58vSeQ/2AM5w41ldMKbkjNM//3NtbjgIBQkHgipNEe06qxrXNSzdaWj6JWsrVc2PO+MjU0mT2X5sDpIzTMS9rKBJfm3bKJYILVLynPnZNdL3z1+L1hbTWvwYBPEGcluZwzeOHUXyePb/5aOaJCg29VRcmtjAnNAapHiKaLAHmMzcWi2j5D6GdPAqn4aplO6Tt507fZxVYVRgEhTzd1tZbWWKQU7iXN/hjxyINH2F2EtRmh7/cr13CcQQ2wRuDDbpWjM3agFfxIbO6+AypIYjvqOP2Uh9bK8Q395E1nA+MFt9yhpRWST4F2LwJmZG7jvG4I4aD5J2qc3kFIyE/2HdCVyT2FM/ZcsU/3mQaNkiEiZ86o9yMRlGysXDLZvtKIBM8M70Z9A1NLS/i+3V3lJoerVjY01ga8avgmFYurNI=----ATTACHMENT:----NDM2MDU2MzcxMDc1NDU0IDMzMzA5NTIwODcxOTY4NzggNzgyNDYzMjEzODA4NTgwNQ==