From 1c2be79dabc9c64742102f37f1320a1410679660 Mon Sep 17 00:00:00 2001 From: rimu <3310831+rimu@users.noreply.github.com> Date: Tue, 28 May 2024 15:15:53 +1200 Subject: [PATCH] Discourse follow community #111 --- app/activitypub/routes.py | 50 +++++++++++++++--------------------- app/activitypub/signature.py | 2 +- 2 files changed, 22 insertions(+), 30 deletions(-) diff --git a/app/activitypub/routes.py b/app/activitypub/routes.py index a976f170..c68f88dd 100644 --- a/app/activitypub/routes.py +++ b/app/activitypub/routes.py @@ -1277,19 +1277,27 @@ def user_inbox(actor): return shared_inbox() try: HttpSignature.verify_request(request, actor.public_key, skip_date=True) - if 'type' in request_json and request_json['type'] == 'Follow': - if current_app.debug: - process_user_follow_request(request_json, activity_log.id, actor.id) - else: - process_user_follow_request.delay(request_json, activity_log.id, actor.id) - return '' - if ('type' in request_json and request_json['type'] == 'Undo' and - 'object' in request_json and request_json['object']['type'] == 'Follow'): - if current_app.debug: - process_user_undo_follow_request(request_json, activity_log.id, actor.id) - else: - process_user_undo_follow_request.delay(request_json, activity_log.id, actor.id) - return '' + if 'type' in request_json: + if request_json['type'] == 'Follow': + if current_app.debug: + process_user_follow_request(request_json, activity_log.id, actor.id) + else: + process_user_follow_request.delay(request_json, activity_log.id, actor.id) + elif request_json['type'] == 'Undo' and 'object' in request_json and request_json['object']['type'] == 'Follow': + local_user_ap_id = request_json['object']['object'] + local_user = find_actor_or_create(local_user_ap_id, create_if_not_found=False) + remote_user = User.query.get(actor.id) + if local_user: + db.session.query(UserFollower).filter_by(local_user_id=local_user.id, remote_user_id=remote_user.id, is_accepted=True).delete() + activity_log.result = 'success' + else: + activity_log.exception_message = 'Could not find local user' + activity_log.result = 'failure' + db.session.commit() + elif request_json['type'] == 'Accept' or request_json['type'] == 'Reject': + if request_json['object']['type'] == 'Follow': + return shared_inbox() + except VerificationError: activity_log.result = 'failure' activity_log.exception_message = 'Could not verify signature' @@ -1349,22 +1357,6 @@ def process_user_follow_request(request_json, activitypublog_id, remote_user_id) db.session.commit() -@celery.task -def process_user_undo_follow_request(request_json, activitypublog_id, remote_user_id): - activity_log = ActivityPubLog.query.get(activitypublog_id) - local_user_ap_id = request_json['object']['object'] - local_user = find_actor_or_create(local_user_ap_id, create_if_not_found=False) - remote_user = User.query.get(remote_user_id) - if local_user: - db.session.query(UserFollower).filter_by(local_user_id=local_user.id, remote_user_id=remote_user.id, is_accepted=True).delete() - activity_log.result = 'success' - else: - activity_log.exception_message = 'Could not find local user' - activity_log.result = 'failure' - - db.session.commit() - - @bp.route('/c//inbox', methods=['GET', 'POST']) def community_inbox(actor): return shared_inbox() diff --git a/app/activitypub/signature.py b/app/activitypub/signature.py index a29f7614..20436ab0 100644 --- a/app/activitypub/signature.py +++ b/app/activitypub/signature.py @@ -172,7 +172,7 @@ class RsaKeys: return private_key_serialized, public_key_serialized -# Signatures +# Get a piece of the signature string. Similar to parse_signature except unencumbered by needing to return a HttpSignatureDetails def signature_part(signature, key): parts = signature.split(',') for part in parts: