diff --git a/html.c b/html.c index 2c353d2..f2b1252 100644 --- a/html.c +++ b/html.c @@ -2996,6 +2996,51 @@ int html_get_handler(const xs_dict *req, const char *q_path, } else { const char *q = xs_dict_get(q_vars, "q"); + xs *url_acct = NULL; + + /* searching for an URL? */ + if (q && xs_match(q, "https://*|http://*")) { + /* may by an actor; try a webfinger */ + xs *actor_obj = NULL; + + if (valid_status(webfinger_request(q, &actor_obj, &url_acct))) { + /* it's an actor; do the dirty trick of changing q to the account name */ + q = url_acct; + } + else { + /* if it's not already here, try to bring it to the user's timeline */ + xs *md5 = xs_md5_hex(q, strlen(q)); + + if (!timeline_here(&snac, md5)) { + xs *object = NULL; + int status; + + status = activitypub_request(&snac, q, &object); + snac_debug(&snac, 1, xs_fmt("Request searched URL %s %d", q, status)); + + if (valid_status(status)) { + /* got it; also request the actor */ + const char *attr_to = get_atto(object); + + if (!xs_is_null(attr_to)) { + status = actor_request(&snac, attr_to, &actor_obj); + + snac_debug(&snac, 1, xs_fmt("Request author %s of %s %d", attr_to, q, status)); + + if (valid_status(status)) { + /* add the actor */ + actor_add(attr_to, actor_obj); + + /* add the post to the timeline */ + timeline_add(&snac, q, object); + } + } + } + } + } + + /* fall through */ + } if (q && *q) { if (xs_regex_match(q, "^@?[a-zA-Z0-9_]+@[a-zA-Z0-9-]+\\.")) {