From c0ba8ba1e8415062a46075839043e8709c97836f Mon Sep 17 00:00:00 2001 From: freamon Date: Tue, 21 Jan 2025 06:29:31 +0000 Subject: [PATCH] Hopefully temporary fix for nodebb bug --- app/activitypub/routes.py | 29 +++++++++++++++++++++++------ 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/app/activitypub/routes.py b/app/activitypub/routes.py index 8d2845e6..cbd2c608 100644 --- a/app/activitypub/routes.py +++ b/app/activitypub/routes.py @@ -415,16 +415,19 @@ def shared_inbox(): return '', 200 id = request_json['id'] + missing_actor_in_announce_object = False # nodebb if request_json['type'] == 'Announce' and isinstance(request_json['object'], dict): object = request_json['object'] - if not 'id' in object or not 'type' in object or not 'actor' in object or not 'object' in object: + if not 'actor' in object: + missing_actor_in_announce_object = True + if not 'id' in object or not 'type' in object or not 'object' in object: if 'type' in object and (object['type'] == 'Page' or object['type'] == 'Note'): log_incoming_ap(id, APLOG_ANNOUNCE, APLOG_IGNORED, saved_json, 'Intended for Mastodon') else: log_incoming_ap(id, APLOG_ANNOUNCE, APLOG_FAILURE, saved_json, 'Missing minimum expected fields in JSON Announce object') return '', 200 - if isinstance(object['actor'], str) and object['actor'].startswith('https://' + current_app.config['SERVER_NAME']): + if not missing_actor_in_announce_object and isinstance(object['actor'], str) and object['actor'].startswith('https://' + current_app.config['SERVER_NAME']): log_incoming_ap(id, APLOG_DUPLICATE, APLOG_IGNORED, saved_json, 'Activity about local content which is already present') return '', 200 @@ -499,6 +502,11 @@ def shared_inbox(): process_delete_request.delay(request_json, store_ap_json) return '' + if missing_actor_in_announce_object: + if ((request_json['object']['type'] == 'Create' or request_json['object']['type']) and + 'attributedTo' in request_json['object']['object'] and isinstance(request_json['object']['object']['attributedTo'], str)): + request_json['object']['actor'] = request_json['object']['object']['attributedTo'] + if current_app.debug: process_inbox_request(request_json, store_ap_json) else: @@ -528,17 +536,20 @@ def replay_inbox_request(request_json): return id = request_json['id'] + missing_actor_in_announce_object = False # nodebb if request_json['type'] == 'Announce' and isinstance(request_json['object'], dict): object = request_json['object'] - if not 'id' in object or not 'type' in object or not 'actor' in object or not 'object' in object: + if not 'actor' in object: + missing_actor_in_announce_object = True + if not 'id' in object or not 'type' in object or not 'object' in object: if 'type' in object and (object['type'] == 'Page' or object['type'] == 'Note'): log_incoming_ap(id, APLOG_ANNOUNCE, APLOG_IGNORED, request_json, 'REPLAY: Intended for Mastodon') else: log_incoming_ap(id, APLOG_ANNOUNCE, APLOG_FAILURE, request_json, 'REPLAY: Missing minimum expected fields in JSON Announce object') return - if isinstance(object['actor'], str) and object['actor'].startswith('https://' + current_app.config['SERVER_NAME']): - log_incoming_ap(id, APLOG_DUPLICATE, APLOG_IGNORED, saved_json, 'Activity about local content which is already present') + if not missing_actor_in_announce_object and isinstance(object['actor'], str) and object['actor'].startswith('https://' + current_app.config['SERVER_NAME']): + log_incoming_ap(id, APLOG_DUPLICATE, APLOG_IGNORED, request_json, 'REPLAY: Activity about local content which is already present') return # Ignore unutilised PeerTube activity @@ -573,6 +584,11 @@ def replay_inbox_request(request_json): process_delete_request(request_json, True) return + if missing_actor_in_announce_object: + if ((request_json['object']['type'] == 'Create' or request_json['object']['type']) and + 'attributedTo' in request_json['object']['object'] and isinstance(request_json['object']['object']['attributedTo'], str)): + request_json['object']['actor'] = request_json['object']['object']['attributedTo'] + process_inbox_request(request_json, True) return @@ -799,7 +815,8 @@ def process_inbox_request(request_json, store_ap_json): # inner object of Create is not a ChatMessage else: if (core_activity['object']['type'] == 'Note' and 'name' in core_activity['object'] and # Poll Votes - 'inReplyTo' in core_activity['object'] and 'attributedTo' in core_activity['object']): + 'inReplyTo' in core_activity['object'] and 'attributedTo' in core_activity['object'] and + not 'published' in core_activity['object']): post_being_replied_to = Post.query.filter_by(ap_id=core_activity['object']['inReplyTo']).first() if post_being_replied_to: poll_data = Poll.query.get(post_being_replied_to.id)