import logging from . import activity from . import serializers logger = logging.getLogger(__name__) inbox = activity.InboxRouter() outbox = activity.OutboxRouter() def with_recipients(payload, to=[], cc=[]): if to: payload["to"] = to if cc: payload["cc"] = cc return payload @inbox.register({"type": "Follow"}) def inbox_follow(payload, context): context["recipient"] = [ ii.actor for ii in context["inbox_items"] if ii.type == "to" ][0] serializer = serializers.FollowSerializer(data=payload, context=context) if not serializer.is_valid(raise_exception=context.get("raise_exception", False)): logger.debug( "Discarding invalid follow from {}: %s", context["actor"].fid, serializer.errors, ) return autoapprove = serializer.validated_data["object"].should_autoapprove_follow( context["actor"] ) follow = serializer.save(approved=True if autoapprove else None) if follow.approved: outbox.dispatch({"type": "Accept"}, context={"follow": follow}) return {"object": follow.target, "related_object": follow} @inbox.register({"type": "Accept"}) def inbox_accept(payload, context): context["recipient"] = [ ii.actor for ii in context["inbox_items"] if ii.type == "to" ][0] serializer = serializers.AcceptFollowSerializer(data=payload, context=context) if not serializer.is_valid(raise_exception=context.get("raise_exception", False)): logger.debug( "Discarding invalid accept from {}: %s", context["actor"].fid, serializer.errors, ) return serializer.save() obj = serializer.validated_data["follow"] return {"object": obj, "related_object": obj.target} @outbox.register({"type": "Accept"}) def outbox_accept(context): follow = context["follow"] if follow._meta.label == "federation.LibraryFollow": actor = follow.target.actor else: actor = follow.target payload = serializers.AcceptFollowSerializer(follow, context={"actor": actor}).data yield { "actor": actor, "type": "Accept", "payload": with_recipients(payload, to=[follow.actor]), "object": follow, "related_object": follow.target, } @outbox.register({"type": "Follow"}) def outbox_follow(context): follow = context["follow"] if follow._meta.label == "federation.LibraryFollow": target = follow.target.actor else: target = follow.target payload = serializers.FollowSerializer(follow, context={"actor": follow.actor}).data yield { "type": "Follow", "actor": follow.actor, "payload": with_recipients(payload, to=[target]), "object": follow.target, "related_object": follow, }