'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:----Cv8uhVkFMf+/L48ER1CMRWif6NwdH2bS2ESPXrgzm3O3ydxT6AwNiVmaxTHqIAsgLXUpY/MOz8kyasChufodTR2fbXbyGuFfZ1eJTMmu32gzbrATe7dbhzB0ACqZa9dsq5i+odgWAGpYxeV3nBVGMQeyt7hbBElapGoH+kNnaMPjtWhHdjLR7vr0sps4YV5AbEv4EUMkgbz6SWSKVs9LmQkQk70Gdqw3UBrt/F2teI4d6tzcpVWdRh8EewgQ5Bd5OVl0StwLry5IgHWbxSLKi13sQzAJnO21HVpOmJbuocXxGEJ3neUE2DO3GihLuiqEt47ofXu3Pimnps2jcnBYFziprBHAcBuAENDnrY5ymEoMt8XP3FbURxan4BJqDw9lakBKRJVYPysxC3PjNI1z3ZXLxB9/YZxSxTyAnZaxR6G21Gd7z8Q3DtfGuC7dueZaW0JE4A/9MXlUCStNqoG6YwmZ9iRXzG394JPVCMnhJK8l7SXU5eOCme2AVql71BwKUlBapN4Oyf8jMpgi8n4pdl7G5tYI6Bf3f6UMthg2E7GInSN4Q3tVnAxNyoiv8D3qygc53zE7s3zhhreK7esijrD9Ix7wEkuxGfJxwPlRgIzPcuNyrKJeVu9/L7D52gHA4BCimnCCOl5KbfaUfvaD7yH1+pAwXn23qPenIGXbxSw=----ATTACHMENT:----MTA4MTc3NzY2ODAxMDE2OSA0Nzk4NDMwNzM2NDMyNTY1IDUwNTU3MzcxNTEwNjE5Mzk=