From 16e07757175cc3ae7a458c9127d8cd7407c4234c Mon Sep 17 00:00:00 2001 From: Thomas Sileo Date: Tue, 16 Apr 2019 22:54:08 +0200 Subject: [PATCH] Improve retry handling --- activitypub.py | 12 ++++++------ app.py | 16 +++++++++------- 2 files changed, 15 insertions(+), 13 deletions(-) diff --git a/activitypub.py b/activitypub.py index d6c122d..f45aad9 100644 --- a/activitypub.py +++ b/activitypub.py @@ -367,14 +367,14 @@ class MicroblogPubBackend(Backend): ) logger.info(f"inbox_delete handle_replies obj={obj!r}") - in_reply_to = obj.inReplyTo + in_reply_to = obj.get_in_reply_to() if delete.get_object().ACTIVITY_TYPE != ap.ActivityType.NOTE: - in_reply_to = DB.activities.find_one( + in_reply_to = ap._get_id(DB.activities.find_one( { "activity.object.id": delete.get_object().id, "type": ap.ActivityType.CREATE.value, } - )["activity"]["object"].get("inReplyTo") + )["activity"]["object"].get("inReplyTo")) # Fake a Undo so any related Like/Announce doesn't appear on the web UI DB.activities.update( @@ -406,7 +406,7 @@ class MicroblogPubBackend(Backend): {"$set": {"meta.undo": True, "meta.exta": "object deleted"}}, ) - self._handle_replies_delete(as_actor, obj.inReplyTo) + self._handle_replies_delete(as_actor, obj.get_in_reply_to()) @ensure_it_is_me def inbox_update(self, as_actor: ap.Person, update: ap.Update) -> None: @@ -524,7 +524,7 @@ class MicroblogPubBackend(Backend): def _handle_replies(self, as_actor: ap.Person, create: ap.Create) -> None: """Go up to the root reply, store unknown replies in the `threads` DB and set the "meta.thread_root_parent" key to make it easy to query a whole thread.""" - in_reply_to = create.get_object().inReplyTo + in_reply_to = create.get_object().get_in_reply_to() if not in_reply_to: return @@ -563,7 +563,7 @@ class MicroblogPubBackend(Backend): # TODO(tsileo): parses the replies collection and import the replies? while reply is not None: - in_reply_to = reply.inReplyTo + in_reply_to = reply.get_in_reply_to() if not in_reply_to: break root_reply = in_reply_to diff --git a/app.py b/app.py index 15f20dd..27e47dd 100644 --- a/app.py +++ b/app.py @@ -901,7 +901,7 @@ def _build_thread(data, include_children=True): # noqa: C901 rep_id = rep["activity"]["object"]["id"] if rep_id == root_id: continue - reply_of = rep["activity"]["object"]["inReplyTo"] + reply_of = ap._get_id(rep["activity"]["object"]["inReplyTo"]) try: idx[reply_of]["_nodes"].append(rep) except KeyError: @@ -2544,7 +2544,8 @@ def invalidate_cache(activity): DB.cache2.remove() elif activity.has_type(ap.ActivityType.CREATE): note = activity.get_object() - if not note.inReplyTo or note.inReplyTo.startswith(ID): + in_reply_to = note.get_in_reply_to() + if not in_reply_to or in_reply_to.startswith(ID): DB.cache2.remove() # FIXME(tsileo): check if it's a reply of a reply @@ -2696,19 +2697,20 @@ def task_process_new_activity(): elif activity.has_type(ap.ActivityType.CREATE): note = activity.get_object() + in_reply_to = note.get_in_reply_to() # Make the note part of the stream if it's not a reply, or if it's a local reply - if not note.inReplyTo or note.inReplyTo.startswith(ID): + if not in_reply_to or in_reply_to.startswith(ID): tag_stream = True # FIXME(tsileo): check for direct addressing in the to, cc, bcc... fields - if (note.inReplyTo and note.inReplyTo.startswith(ID)) or note.has_mention( + if (in_reply_to and in_reply_to.startswith(ID)) or note.has_mention( ID ): should_keep = True - if note.inReplyTo: + if in_reply_to: try: - reply = ap.fetch_remote_activity(note.inReplyTo) + reply = ap.fetch_remote_activity(note.get_in_reply_to()) if ( reply.id.startswith(ID) or reply.has_mention(ID) ) and activity.is_public(): @@ -2731,7 +2733,7 @@ def task_process_new_activity(): should_forward = True # [X] The values of inReplyTo, object, target and/or tag are objects owned by the server - if not (note.inReplyTo and note.inReplyTo.startswith(ID)): + if not (in_reply_to and in_reply_to.startswith(ID)): should_forward = False elif activity.has_type(ap.ActivityType.DELETE):