summaryrefslogtreecommitdiff
path: root/activitypub.c
diff options
context:
space:
mode:
authordefault <nobody@localhost>2023-05-12 19:01:53 +0200
committerdefault <nobody@localhost>2023-05-12 19:01:53 +0200
commit24f802be7ea8c1f2eeeb8ab0d1f88f325265fb90 (patch)
treeef7b3ec47679045978a82694ebff21f682337836 /activitypub.c
parentcada652f3ff1f8c3fa114e4af3c3de99114ccbbf (diff)
Use a different approach towards incomplete mentions.
This time, incomplete mentions are completed using a) the host of the first mention, if there are any, or b) the current host.
Diffstat (limited to 'activitypub.c')
-rw-r--r--activitypub.c88
1 files changed, 46 insertions, 42 deletions
diff --git a/activitypub.c b/activitypub.c
index 51a2cfa..13415df 100644
--- a/activitypub.c
+++ b/activitypub.c
@@ -368,6 +368,31 @@ void process_tags(snac *snac, const char *content, xs_str **n_content, xs_list *
xs_val *v;
int n = 0;
+ /* create a default server for incomplete mentions */
+ xs *def_srv = NULL;
+
+ if (xs_list_len(tl)) {
+ /* if there are any mentions, get the server from
+ the first one, which is the inReplyTo author */
+ p = tl;
+ while (xs_list_iter(&p, &v)) {
+ const char *type = xs_dict_get(v, "type");
+ const char *name = xs_dict_get(v, "name");
+
+ if (type && name && strcmp(type, "Mention") == 0) {
+ xs *l = xs_split(name, "@");
+
+ def_srv = xs_dup(xs_list_get(l, -1));
+
+ break;
+ }
+ }
+ }
+
+ if (xs_is_null(def_srv))
+ /* use this same server */
+ def_srv = xs_dup(xs_dict_get(srv_config, "host"));
+
split = xs_regex_split(content, "(@[A-Za-z0-9_]+(@[A-Za-z0-9\\.-]+)?|&#[0-9]+;|#[^ ,\\.:;<]+)");
p = split;
@@ -375,57 +400,36 @@ void process_tags(snac *snac, const char *content, xs_str **n_content, xs_list *
if ((n & 0x1)) {
if (*v == '@') {
xs *link = NULL;
+ xs *wuid = NULL;
if (strchr(v + 1, '@') == NULL) {
/* only one @? it's a dumb Mastodon-like mention
- without server; check if there is anybody
- whose name starts with this in the tag list */
- xs_list *p2 = tl;
- xs_dict *v2;
- xs *pname = xs_fmt("%s@", v);
-
- while (xs_list_iter(&p2, &v2)) {
- const char *type = xs_dict_get(v2, "type");
-
- if (type && strcmp(type, "Mention") == 0) {
- const char *name = xs_dict_get(v2, "name");
- const char *href = xs_dict_get(v2, "href");
-
- if (name && href && (xs_startswith(name, pname) ||
- xs_startswith(name, pname + 1))) {
- /* good enough :shrug2: */
- link = xs_fmt(
- "<a href=\"%s\" class=\"u-url mention\">%s</a>", href, name);
-
- break;
- }
- }
- }
-
- snac_debug(snac, 2, xs_fmt(
- "mention without server '%s' (%s)", v, link ? link : "none"));
+ without server; add the default one */
+ wuid = xs_fmt("%s@%s", v, def_srv);
+
+ snac_debug(snac, 2, xs_fmt("mention without server '%s' '%s'", v, wuid));
}
- else {
- /* query the webfinger about this fellow */
- xs *v2 = xs_strip_chars_i(xs_dup(v), "@.");
- xs *actor = NULL;
- xs *uid = NULL;
- int status;
+ else
+ wuid = xs_dup(v);
+
+ /* query the webfinger about this fellow */
+ xs *actor = NULL;
+ xs *uid = NULL;
+ int status;
- status = webfinger_request(v2, &actor, &uid);
+ status = webfinger_request(wuid, &actor, &uid);
- if (valid_status(status)) {
- xs *d = xs_dict_new();
- xs *n = xs_fmt("@%s", uid);
+ if (valid_status(status)) {
+ xs *d = xs_dict_new();
+ xs *n = xs_fmt("@%s", uid);
- d = xs_dict_append(d, "type", "Mention");
- d = xs_dict_append(d, "href", actor);
- d = xs_dict_append(d, "name", n);
+ d = xs_dict_append(d, "type", "Mention");
+ d = xs_dict_append(d, "href", actor);
+ d = xs_dict_append(d, "name", n);
- tl = xs_list_append(tl, d);
+ tl = xs_list_append(tl, d);
- link = xs_fmt("<a href=\"%s\" class=\"u-url mention\">%s</a>", actor, n);
- }
+ link = xs_fmt("<a href=\"%s\" class=\"u-url mention\">%s</a>", actor, n);
}
if (!xs_is_null(link))