'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:----1fTZ6MK5zDLyDBHBUSN2pvmHRg3q7y1TfDcyOueupQ/b+P/mxZiu7p8lhaWjq+GxdtS8sC6rjj0wheL6mF59vZHD5dEHbooEseco1F4e+HjwFRkOKb1rhvgoozhETra0XplrtKxIWq6r5MAKmtRaxT3WKLhFSc02BddLLLT9sS/C8/k/4RYRMOtqDW0O+SUkyBByddS0b0mZ//FcvFpWC2eF1Lr1wCbVPTI0A8vdOIG76zDQrMsr20F4Cj/XOHyHCdWdf/yddPpjxDB8rYR8aR+sDj79IGKCPQMRPZzmiPaJEuHjPqQ6uYI9mEzJk1lgP5Js2ksGepfZXwgQzRdMy7ruf/ovGXrA+PeE+16nTrT7RPcFQnIqYJhld4asnCFFDtf/ibJDqSwUTdUxtPCfZqZlEcQQZi0+igbr4Wr4zFM5qv0vbfpBsXlFuGMQAUyCmwiQOfPLndeeUYrBkI+m/kDO0qk6rpAjNHyDY6OuYxSydtuOGiKznmhZDaOotOkKKWE7tM+962mGG9AIdN7NPTvwDlQexin+yc7HL+ZzdsjQKb7Pfe0a53DDrHn52X2bd+edeVsC3q6jSN+b/b+/U6XAg2hBAU2KinsZVr7IovSipkNO77hB57Xw4EmWGB1nZlav3ot5RL4WQPYsFjspR+f772dMntKi7mnUl0AUMxY=----ATTACHMENT:----Mjc3ODEzMTkxOTc4MTM3NSA5NTI3ODA3Mjc5MDE4NjQwIDI0Njk3MDAyMDY4MDY4Njg=