From fe087b221743824cd73ffeef82f68ae37d0d6215 Mon Sep 17 00:00:00 2001 From: Diogo Peralta Cordeiro Date: Sun, 2 Jan 2022 22:24:04 +0000 Subject: [PATCH] [PLUGIN][ActivityPub] Accept Undo Follow --- plugins/ActivityPub/Util/Model/Activity.php | 18 ++++++++++++ .../ActivityPub/Util/Model/ActivityFollow.php | 28 +++++++++++++++++++ 2 files changed, 46 insertions(+) diff --git a/plugins/ActivityPub/Util/Model/Activity.php b/plugins/ActivityPub/Util/Model/Activity.php index 10bfcf4e86..bae6636e00 100644 --- a/plugins/ActivityPub/Util/Model/Activity.php +++ b/plugins/ActivityPub/Util/Model/Activity.php @@ -32,6 +32,7 @@ declare(strict_types = 1); namespace Plugin\ActivityPub\Util\Model; +use _PHPStan_4a258568e\Nette\NotImplementedException; use ActivityPhp\Type; use ActivityPhp\Type\AbstractObject; use App\Core\Event; @@ -108,6 +109,23 @@ class Activity extends Model break; case 'Follow': ActivityFollow::handle_core_activity($actor, $type_activity, $type_object, $ap_act); + break; + case 'Undo': + $object_type = $type_object instanceof AbstractObject ? match ($type_object->get('type')) { + 'Note' => \App\Entity\Note::class, + // no break + default => throw new NotImplementedException('Unsupported Undo of Object Activity.'), + } : $type_object::class; + switch ($object_type) { + case GSActivity::class: + switch ($type_object->getVerb()) { + case 'subscribe': + ActivityFollow::handle_undo($actor, $type_activity, $type_object, $ap_act); + break; + } + break; + } + break; } return $ap_act; } diff --git a/plugins/ActivityPub/Util/Model/ActivityFollow.php b/plugins/ActivityPub/Util/Model/ActivityFollow.php index ff1d2601a3..4e0a88b0fb 100644 --- a/plugins/ActivityPub/Util/Model/ActivityFollow.php +++ b/plugins/ActivityPub/Util/Model/ActivityFollow.php @@ -83,4 +83,32 @@ class ActivityFollow extends Activity DB::persist($ap_act); return $ap_act; } + + public static function handle_undo(\App\Entity\Actor $actor, AbstractObject $type_activity, GSActivity $type_object, ?ActivitypubActivity &$ap_act): ActivitypubActivity + { + // Remove Subscription + DB::removeBy(Subscription::class, [ + 'subscriber_id' => $type_object->getActorId(), + 'subscribed_id' => $type_object->getObjectId(), + ]); + // Store Activity + $act = GSActivity::create([ + 'actor_id' => $actor->getId(), + 'verb' => 'undo', + 'object_type' => 'activity', + 'object_id' => $type_object->getId(), + 'created' => new DateTime($type_activity->get('published') ?? 'now'), + 'source' => 'ActivityPub', + ]); + DB::persist($act); + // Store ActivityPub Activity + $ap_act = ActivitypubActivity::create([ + 'activity_id' => $act->getId(), + 'activity_uri' => $type_activity->get('id'), + 'created' => new DateTime($type_activity->get('published') ?? 'now'), + 'modified' => new DateTime(), + ]); + DB::persist($ap_act); + return $ap_act; + } }