summaryrefslogtreecommitdiff
path: root/mastoapi.c
diff options
context:
space:
mode:
Diffstat (limited to 'mastoapi.c')
-rw-r--r--mastoapi.c57
1 files changed, 45 insertions, 12 deletions
diff --git a/mastoapi.c b/mastoapi.c
index 03d081d..2337007 100644
--- a/mastoapi.c
+++ b/mastoapi.c
@@ -152,6 +152,7 @@ const char *login_page = ""
"<html>\n"
"<head>\n"
"<title>%s OAuth - Snac2</title>\n"
+"<meta content=\"width=device-width, initial-scale=1, minimum-scale=1, user-scalable=no\" name=\"viewport\">"
"<style>:root {color-scheme: light dark}</style>\n"
"</head>\n"
"<body><h1>%s OAuth identify</h1>\n"
@@ -338,11 +339,7 @@ int oauth_post_handler(const xs_dict *req, const char *q_path,
const char *cid = xs_dict_get(args, "client_id");
const char *csec = xs_dict_get(args, "client_secret");
const char *ruri = xs_dict_get(args, "redirect_uri");
- /* FIXME: this 'scope' parameter is mandatory for the official Mastodon API,
- but if it's enabled, it makes it crash after some more steps, which
- is FAR WORSE */
- const char *scope = NULL;
-// scope = xs_dict_get(args, "scope");
+ const char *scope = xs_dict_get(args, "scope");
/* no client_secret? check if it's inside an authorization header
(AndStatus does it this way) */
@@ -1164,8 +1161,10 @@ void credentials_get(char **body, char **ctype, int *status, snac snac)
acct = xs_dict_append(acct, "url", snac.actor);
acct = xs_dict_append(acct, "locked", xs_stock(XSTYPE_FALSE));
acct = xs_dict_append(acct, "bot", xs_dict_get(snac.config, "bot"));
+ acct = xs_dict_append(acct, "emojis", xs_stock(XSTYPE_LIST));
- xs *src = xs_json_loads("{\"privacy\":\"public\","
+ xs *src = xs_json_loads("{\"privacy\":\"public\", \"language\":\"en\","
+ "\"follow_requests_count\": 0,"
"\"sensitive\":false,\"fields\":[],\"note\":\"\"}");
/* some apps take the note from the source object */
src = xs_dict_set(src, "note", xs_dict_get(snac.config, "bio"));
@@ -1447,9 +1446,27 @@ int mastoapi_get_handler(const xs_dict *req, const char *q_path,
if (strcmp(opt, "featured_tags") == 0) {
/* snac doesn't have features tags, yet? */
/* implement empty response so apps like Tokodon don't show an error */
- *body = xs_dup("[]");
- *ctype = "application/json";
- status = HTTP_STATUS_OK;
+ out = xs_list_new();
+ }
+ else
+ if (strcmp(opt, "following") == 0) {
+ xs *wing = following_list(&snac1);
+ out = xs_list_new();
+ int c = 0;
+ const char *v;
+
+ while (xs_list_next(wing, &v, &c)) {
+ xs *actor = NULL;
+
+ if (valid_status(object_get(v, &actor))) {
+ xs *acct = mastoapi_account(actor);
+ out = xs_list_append(out, acct);
+ }
+ }
+ }
+ else
+ if (strcmp(opt, "followers") == 0) {
+ out = xs_list_new();
}
user_free(&snac2);
@@ -1470,9 +1487,7 @@ int mastoapi_get_handler(const xs_dict *req, const char *q_path,
if (strcmp(opt, "featured_tags") == 0) {
/* snac doesn't have features tags, yet? */
/* implement empty response so apps like Tokodon don't show an error */
- *body = xs_dup("[]");
- *ctype = "application/json";
- status = HTTP_STATUS_OK;
+ out = xs_list_new();
}
}
}
@@ -2408,6 +2423,14 @@ int mastoapi_post_handler(const xs_dict *req, const char *q_path,
const char *ruri = xs_dict_get(args, "redirect_uris");
const char *scope = xs_dict_get(args, "scope");
+ /* Ice Cubes sends these values as query parameters, so try these */
+ if (name == NULL && ruri == NULL && scope == NULL) {
+ args = xs_dup(xs_dict_get(req, "q_vars"));
+ name = xs_dict_get(args, "client_name");
+ ruri = xs_dict_get(args, "redirect_uris");
+ scope = xs_dict_get(args, "scope");
+ }
+
if (xs_type(ruri) == XSTYPE_LIST)
ruri = xs_dict_get(ruri, 0);
@@ -2914,6 +2937,10 @@ int mastoapi_post_handler(const xs_dict *req, const char *q_path,
if (op && id && xs_is_hex(id)) {
if (strcmp(op, "accounts") == 0) {
const xs_list *accts = xs_dict_get(args, "account_ids[]");
+
+ if (xs_is_null(accts))
+ accts = xs_dict_get(args, "account_ids");
+
int c = 0;
const char *v;
@@ -2921,6 +2948,7 @@ int mastoapi_post_handler(const xs_dict *req, const char *q_path,
list_content(&snac, id, v, 1);
}
+ *ctype = "application/json";
status = HTTP_STATUS_OK;
}
}
@@ -2993,6 +3021,10 @@ int mastoapi_delete_handler(const xs_dict *req, const char *q_path,
/* delete account from list */
p = xs_list_get(l, -2);
const xs_list *accts = xs_dict_get(args, "account_ids[]");
+
+ if (xs_is_null(accts))
+ accts = xs_dict_get(args, "account_ids");
+
int c = 0;
const char *v;
@@ -3008,6 +3040,7 @@ int mastoapi_delete_handler(const xs_dict *req, const char *q_path,
}
}
+ *ctype = "application/json";
status = HTTP_STATUS_OK;
}
else