diff options
| -rw-r--r-- | activitypub.c | 53 |
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)); |