From ca27d0248a9244b71f6c44e8f1b598111b17e846 Mon Sep 17 00:00:00 2001 From: James Seward Date: Thu, 11 Jan 2024 13:36:16 +0000 Subject: [PATCH 1/2] Add missing fields to account verification This allows the Mona iOS app to successfully sign in. I wasn't sure what a suitable value for `last_status_at` would be so I just copied `published` since it's the right format. This also just sets the `bot` field to false regardless of the user's configuration, which probably isn't ideal. --- mastoapi.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/mastoapi.c b/mastoapi.c index d872c5d..5c89172 100644 --- a/mastoapi.c +++ b/mastoapi.c @@ -1118,9 +1118,14 @@ int mastoapi_get_handler(const xs_dict *req, const char *q_path, acct = xs_dict_append(acct, "acct", xs_dict_get(snac1.config, "uid")); acct = xs_dict_append(acct, "display_name", xs_dict_get(snac1.config, "name")); acct = xs_dict_append(acct, "created_at", xs_dict_get(snac1.config, "published")); + acct = xs_dict_append(acct, "last_status_at", xs_dict_get(snac1.config, "published")); acct = xs_dict_append(acct, "note", xs_dict_get(snac1.config, "bio")); acct = xs_dict_append(acct, "url", snac1.actor); acct = xs_dict_append(acct, "header", ""); + acct = xs_dict_append(acct, "header_static", ""); + acct = xs_dict_append(acct, "locked", xs_stock_false); + // FIXME: check value of "type" to set this correctly? + acct = xs_dict_append(acct, "bot", xs_stock_false); xs *src = xs_json_loads("{\"privacy\":\"public\"," "\"sensitive\":false,\"fields\":[],\"note\":\"\"}"); From c3fb6bab77f35be6cda261f257b8731d38e5265f Mon Sep 17 00:00:00 2001 From: James Seward Date: Thu, 11 Jan 2024 13:38:08 +0000 Subject: [PATCH 2/2] Support DELETE for Mastodon subscriptions While testing Mona, I noticed that after deleting my account entry for my snac server, Mona would repeatedly try to delete the subscription it thought it had created, resulting in many unhandled DELETE calls. This accepts the call and returns 200 for it, which makes Mona happy. --- httpd.c | 8 ++++++++ mastoapi.c | 16 ++++++++++++++++ snac.h | 2 ++ 3 files changed, 26 insertions(+) diff --git a/httpd.c b/httpd.c index ecb64b4..4c6d985 100644 --- a/httpd.c +++ b/httpd.c @@ -344,6 +344,14 @@ void httpd_connection(FILE *f) if (strcmp(method, "OPTIONS") == 0) { status = 200; } + else + if (strcmp(method, "DELETE") == 0) { +#ifndef NO_MASTODON_API + if (status == 0) + status = mastoapi_delete_handler(req, q_path, + &body, &b_size, &ctype); +#endif + } /* unattended? it's an error */ if (status == 0) { diff --git a/mastoapi.c b/mastoapi.c index 5c89172..c1a889d 100644 --- a/mastoapi.c +++ b/mastoapi.c @@ -2484,6 +2484,22 @@ int mastoapi_post_handler(const xs_dict *req, const char *q_path, } +int mastoapi_delete_handler(const xs_dict *req, const char *q_path, + char **body, int *b_size, char **ctype) { + + if (!xs_startswith(q_path, "/api/v1/") && !xs_startswith(q_path, "/api/v2/")) + return 0; + + srv_debug(1, xs_fmt("mastoapi_delete_handler %s", q_path)); + xs *cmd = xs_replace_n(q_path, "/api", "", 1); + if (xs_startswith(cmd, "/v1/push/subscription") || xs_startswith(cmd, "/v2/push/subscription")) { /** **/ + // pretend we deleted it, since it doesn't exist anyway + return 200; + } + return 0; +} + + int mastoapi_put_handler(const xs_dict *req, const char *q_path, const char *payload, int p_size, char **body, int *b_size, char **ctype) diff --git a/snac.h b/snac.h index 5843c5a..e960d0d 100644 --- a/snac.h +++ b/snac.h @@ -312,6 +312,8 @@ int oauth_post_handler(const xs_dict *req, const char *q_path, char **body, int *b_size, char **ctype); int mastoapi_get_handler(const xs_dict *req, const char *q_path, char **body, int *b_size, char **ctype); +int mastoapi_delete_handler(const xs_dict *req, const char *q_path, + char **body, int *b_size, char **ctype); int mastoapi_post_handler(const xs_dict *req, const char *q_path, const char *payload, int p_size, char **body, int *b_size, char **ctype);