diff --git a/main.c b/main.c index ed8f199..5b8fe6d 100644 --- a/main.c +++ b/main.c @@ -47,8 +47,9 @@ int usage(void) printf("unlimit {basedir} {uid} {actor} Unlimits an actor\n"); printf("verify_links {basedir} {uid} Verifies a user's links (in the metadata)\n"); printf("search {basedir} {uid} {regex} Searches posts by content\n"); - printf("aka {basedir} {uid} {actor} Sets actor (@user@host or url) as an a.k.a.\n"); + printf("aka {basedir} {uid} {actor} Sets actor (@user@host or url) as the a.k.a.\n"); printf("export_csv {basedir} {uid} Exports data as CSV files into current directory\n"); + printf("migrate {basedir} {uid} Migrates the account to the one set as the a.k.a.\n"); return 1; } diff --git a/snac.h b/snac.h index 0d93659..693844e 100644 --- a/snac.h +++ b/snac.h @@ -284,10 +284,11 @@ int check_signature(const xs_dict *req, xs_str **err); srv_state *srv_state_op(xs_str **fname, int op); void httpd(void); -int webfinger_request_signed(snac *snac, const char *qs, char **actor, char **user); -int webfinger_request(const char *qs, char **actor, char **user); -int webfinger_get_handler(xs_dict *req, char *q_path, - char **body, int *b_size, char **ctype); +int webfinger_request_signed(snac *snac, const char *qs, xs_str **actor, xs_str **user); +int webfinger_request(const char *qs, xs_str **actor, xs_str **user); +int webfinger_request_fake(const char *qs, xs_str **actor, xs_str **user); +int webfinger_get_handler(xs_dict *req, const char *q_path, + xs_val **body, int *b_size, char **ctype); const char *default_avatar_base64(void); diff --git a/webfinger.c b/webfinger.c index 0c18362..bd7f946 100644 --- a/webfinger.c +++ b/webfinger.c @@ -8,7 +8,7 @@ #include "snac.h" -int webfinger_request_signed(snac *snac, const char *qs, char **actor, char **user) +int webfinger_request_signed(snac *snac, const char *qs, xs_str **actor, xs_str **user) /* queries the webfinger for qs and fills the required fields */ { int status; @@ -117,15 +117,34 @@ int webfinger_request_signed(snac *snac, const char *qs, char **actor, char **us } -int webfinger_request(const char *qs, char **actor, char **user) +int webfinger_request(const char *qs, xs_str **actor, xs_str **user) /* queries the webfinger for qs and fills the required fields */ { return webfinger_request_signed(NULL, qs, actor, user); } -int webfinger_get_handler(xs_dict *req, char *q_path, - char **body, int *b_size, char **ctype) +int webfinger_request_fake(const char *qs, xs_str **actor, xs_str **user) +/* queries the webfinger and, if it fails, a user is faked if possible */ +{ + int status; + + if (!valid_status(status = webfinger_request(qs, actor, user))) { + if (xs_startswith(qs, "https:/") || xs_startswith(qs, "http:/")) { + xs *l = xs_split(qs, "/"); + + /* i'll end up in hell for this */ + *user = xs_fmt("%s@%s", xs_list_get(l, 2), xs_list_get(l, -1)); + status = HTTP_STATUS_RESET_CONTENT; + } + } + + return status; +} + + +int webfinger_get_handler(xs_dict *req, const char *q_path, + xs_val **body, int *b_size, char **ctype) /* serves webfinger queries */ { int status;