commit 5cda2f7

grunfink  ·  2025-08-31 08:03:11 +0000 UTC
parent 36d7bea
Some improvements to collect_replies().
1 files changed,  +29, -24
+29, -24
 1@@ -946,36 +946,33 @@ void collect_replies(snac *user, const char *id)
 2         return;
 3     }
 4 
 5-    const char *next = xs_dict_get_path(obj, "replies.first.next");
 6-    if (!xs_is_string(next)) {
 7-        snac_debug(user, 1, xs_fmt("collect_replies: object '%s' does not have a replies.first.next URL", id));
 8+    const xs_dict *replies_first = xs_dict_get_path(obj, "replies.first");
 9+    if (!xs_is_dict(replies_first)) {
10+        snac_debug(user, 1, xs_fmt("collect_replies: object '%s' does not have replies.first", id));
11         return;
12     }
13 
14-    /* pick the first level replies (may be empty) */
15-    const xs_list *level0_replies = xs_dict_get_path(obj, "replies.first.items");
16+    const xs_list *level0_replies = xs_dict_get(replies_first, "items");
17+    const xs_list *level1_replies = NULL;
18 
19+    const char *next = xs_dict_get(replies_first, "next");
20     xs *reply_obj = NULL;
21 
22-    if (!valid_status(object_get(next, &reply_obj))) {
23-        if (!valid_status(activitypub_request(user, next, &reply_obj))) {
24-            snac_debug(user, 1, xs_fmt("collect_replies: cannot get replies object '%s'", next));
25-            return;
26-        }
27-    }
28-
29-    const xs_list *level1_replies = xs_dict_get(reply_obj, "items");
30-    if (!xs_is_list(level1_replies)) {
31-        snac_debug(user, 1, xs_fmt("collect_replies: cannot get reply items from object '%s'", next));
32+    if (xs_is_string(next) && !valid_status(activitypub_request(user, next, &reply_obj))) {
33+        snac_debug(user, 1, xs_fmt("collect_replies: error getting next replies object '%s'", next));
34         return;
35     }
36 
37-    xs *items = NULL;
38+    if (xs_is_dict(reply_obj))
39+        level1_replies = xs_dict_get(reply_obj, "items");
40+
41+    xs *items = xs_list_new();
42 
43     if (xs_is_list(level0_replies))
44-        items = xs_list_cat(xs_dup(level0_replies), level1_replies);
45-    else
46-        items = xs_dup(level1_replies);
47+        items = xs_list_cat(items, level0_replies);
48+
49+    if (xs_is_list(level1_replies))
50+        items = xs_list_cat(items, level1_replies);
51 
52     const xs_val *v;
53 
54@@ -2538,10 +2535,14 @@ int process_input_message(snac *snac, const xs_dict *msg, const xs_dict *req)
55                 snac_log(snac, xs_fmt("malformed message: no 'id' field"));
56             else
57             if (object_here(id)) {
58-                object_add_ow(id, object);
59-                timeline_touch(snac);
60+                if (xs_startswith(id, srv_baseurl) && !xs_startswith(id, actor))
61+                    snac_log(snac, xs_fmt("ignored incorrect 'Update' %s %s", actor, id));
62+                else {
63+                    object_add_ow(id, object);
64+                    timeline_touch(snac);
65 
66-                snac_log(snac, xs_fmt("updated '%s' %s", utype, id));
67+                    snac_log(snac, xs_fmt("updated '%s' %s", utype, id));
68+                }
69             }
70             else
71                 snac_log(snac, xs_fmt("dropped update for unknown '%s' %s", utype, id));
72@@ -2578,8 +2579,12 @@ int process_input_message(snac *snac, const xs_dict *msg, const xs_dict *req)
73             snac_log(snac, xs_fmt("malformed message: no 'id' field"));
74         else
75         if (object_here(object)) {
76-            timeline_del(snac, object);
77-            snac_debug(snac, 1, xs_fmt("new 'Delete' %s %s", actor, object));
78+            if (xs_startswith(object, srv_baseurl) && !xs_startswith(object, actor))
79+                snac_log(snac, xs_fmt("ignored incorrect 'Delete' %s %s", actor, object));
80+            else {
81+                timeline_del(snac, object);
82+                snac_debug(snac, 1, xs_fmt("new 'Delete' %s %s", actor, object));
83+            }
84         }
85         else
86             snac_debug(snac, 1, xs_fmt("ignored 'Delete' for unknown object %s", object));