summaryrefslogtreecommitdiff
path: root/activitypub.c
diff options
context:
space:
mode:
authorGravatar grunfink2025-08-31 10:03:11 +0200
committerGravatar grunfink2025-08-31 10:03:11 +0200
commit5cda2f709c03222f02f088f3b9047b5ca7aba42a (patch)
treebbe469afc1bc4d0ce063a34825be46d82c573678 /activitypub.c
parentUpdated RELEASE_NOTES. (diff)
downloadpenes-snac2-5cda2f709c03222f02f088f3b9047b5ca7aba42a.tar.gz
penes-snac2-5cda2f709c03222f02f088f3b9047b5ca7aba42a.tar.xz
penes-snac2-5cda2f709c03222f02f088f3b9047b5ca7aba42a.zip
Some improvements to collect_replies().
Diffstat (limited to 'activitypub.c')
-rw-r--r--activitypub.c53
1 files changed, 29 insertions, 24 deletions
diff --git a/activitypub.c b/activitypub.c
index 065fbcd..34137da 100644
--- a/activitypub.c
+++ b/activitypub.c
@@ -946,36 +946,33 @@ void collect_replies(snac *user, const char *id)
946 return; 946 return;
947 } 947 }
948 948
949 const char *next = xs_dict_get_path(obj, "replies.first.next"); 949 const xs_dict *replies_first = xs_dict_get_path(obj, "replies.first");
950 if (!xs_is_string(next)) { 950 if (!xs_is_dict(replies_first)) {
951 snac_debug(user, 1, xs_fmt("collect_replies: object '%s' does not have a replies.first.next URL", id)); 951 snac_debug(user, 1, xs_fmt("collect_replies: object '%s' does not have replies.first", id));
952 return; 952 return;
953 } 953 }
954 954
955 /* pick the first level replies (may be empty) */ 955 const xs_list *level0_replies = xs_dict_get(replies_first, "items");
956 const xs_list *level0_replies = xs_dict_get_path(obj, "replies.first.items"); 956 const xs_list *level1_replies = NULL;
957 957
958 const char *next = xs_dict_get(replies_first, "next");
958 xs *reply_obj = NULL; 959 xs *reply_obj = NULL;
959 960
960 if (!valid_status(object_get(next, &reply_obj))) { 961 if (xs_is_string(next) && !valid_status(activitypub_request(user, next, &reply_obj))) {
961 if (!valid_status(activitypub_request(user, next, &reply_obj))) { 962 snac_debug(user, 1, xs_fmt("collect_replies: error getting next replies object '%s'", next));
962 snac_debug(user, 1, xs_fmt("collect_replies: cannot get replies object '%s'", next));
963 return;
964 }
965 }
966
967 const xs_list *level1_replies = xs_dict_get(reply_obj, "items");
968 if (!xs_is_list(level1_replies)) {
969 snac_debug(user, 1, xs_fmt("collect_replies: cannot get reply items from object '%s'", next));
970 return; 963 return;
971 } 964 }
972 965
973 xs *items = NULL; 966 if (xs_is_dict(reply_obj))
967 level1_replies = xs_dict_get(reply_obj, "items");
968
969 xs *items = xs_list_new();
974 970
975 if (xs_is_list(level0_replies)) 971 if (xs_is_list(level0_replies))
976 items = xs_list_cat(xs_dup(level0_replies), level1_replies); 972 items = xs_list_cat(items, level0_replies);
977 else 973
978 items = xs_dup(level1_replies); 974 if (xs_is_list(level1_replies))
975 items = xs_list_cat(items, level1_replies);
979 976
980 const xs_val *v; 977 const xs_val *v;
981 978
@@ -2538,10 +2535,14 @@ int process_input_message(snac *snac, const xs_dict *msg, const xs_dict *req)
2538 snac_log(snac, xs_fmt("malformed message: no 'id' field")); 2535 snac_log(snac, xs_fmt("malformed message: no 'id' field"));
2539 else 2536 else
2540 if (object_here(id)) { 2537 if (object_here(id)) {
2541 object_add_ow(id, object); 2538 if (xs_startswith(id, srv_baseurl) && !xs_startswith(id, actor))
2542 timeline_touch(snac); 2539 snac_log(snac, xs_fmt("ignored incorrect 'Update' %s %s", actor, id));
2540 else {
2541 object_add_ow(id, object);
2542 timeline_touch(snac);
2543 2543
2544 snac_log(snac, xs_fmt("updated '%s' %s", utype, id)); 2544 snac_log(snac, xs_fmt("updated '%s' %s", utype, id));
2545 }
2545 } 2546 }
2546 else 2547 else
2547 snac_log(snac, xs_fmt("dropped update for unknown '%s' %s", utype, id)); 2548 snac_log(snac, xs_fmt("dropped update for unknown '%s' %s", utype, id));
@@ -2578,8 +2579,12 @@ int process_input_message(snac *snac, const xs_dict *msg, const xs_dict *req)
2578 snac_log(snac, xs_fmt("malformed message: no 'id' field")); 2579 snac_log(snac, xs_fmt("malformed message: no 'id' field"));
2579 else 2580 else
2580 if (object_here(object)) { 2581 if (object_here(object)) {
2581 timeline_del(snac, object); 2582 if (xs_startswith(object, srv_baseurl) && !xs_startswith(object, actor))
2582 snac_debug(snac, 1, xs_fmt("new 'Delete' %s %s", actor, object)); 2583 snac_log(snac, xs_fmt("ignored incorrect 'Delete' %s %s", actor, object));
2584 else {
2585 timeline_del(snac, object);
2586 snac_debug(snac, 1, xs_fmt("new 'Delete' %s %s", actor, object));
2587 }
2583 } 2588 }
2584 else 2589 else
2585 snac_debug(snac, 1, xs_fmt("ignored 'Delete' for unknown object %s", object)); 2590 snac_debug(snac, 1, xs_fmt("ignored 'Delete' for unknown object %s", object));