From ca3c2b097c16ab720119fb79ebf485fd9a5292eb Mon Sep 17 00:00:00 2001 From: nekobit Date: Thu, 19 May 2022 04:18:14 +0000 Subject: [PATCH] Config rewrite FossilOrigin-Name: df35b1f1ef947cf36dab970ebd120b8029a972030283a011efe4bbd83d6ec336 --- src/account.c | 26 +++++----- src/attachments.c | 8 +-- src/attachments.h | 5 +- src/base_page.c | 4 +- src/cookie.c | 4 +- src/cookie.h | 39 +++++++------- src/error.c | 2 +- src/error.h | 2 +- src/key.c | 35 ++++++++++--- src/key.h | 43 +++++++++++++--- src/local_config.h | 1 - src/local_config_set.c | 95 ++++++++++++++++++++--------------- src/local_config_set.h | 14 ++++-- src/login.c | 22 ++++---- src/main.c | 21 ++++---- src/notifications.c | 12 ++--- src/query.c | 45 +++++++---------- src/query.h | 83 +++++++++++++----------------- src/search.c | 14 +++--- src/session.h | 2 +- src/status.c | 38 +++++++------- src/timeline.c | 32 ++++++------ static/config_appearance.html | 3 +- static/config_general.html | 2 + 24 files changed, 301 insertions(+), 251 deletions(-) diff --git a/src/account.c b/src/account.c index a592b34..1dfcc0d 100644 --- a/src/account.c +++ b/src/account.c @@ -108,7 +108,7 @@ static char* account_statuses_cb(struct session* ssn, if (statuses) { // If not set, set it - start_id = ssn->post.start_id ? ssn->post.start_id : statuses[0].id; + start_id = keystr(ssn->post.start_id) ? keystr(ssn->post.start_id) : statuses[0].id; navigation_box = construct_navigation_box(start_id, statuses[0].id, statuses[statuses_len-1].id, @@ -403,8 +403,8 @@ void content_account_statuses(struct session* ssn, mastodont_t* api, char** data .exclude_reblogs = 0, .exclude_replies = 0, .tagged = NULL, - .max_id = ssn->post.max_id, - .min_id = ssn->post.min_id, + .max_id = keystr(ssn->post.max_id), + .min_id = keystr(ssn->post.min_id), .since_id = NULL, .offset = 0, .limit = 20, @@ -427,8 +427,8 @@ void content_account_pinned(struct session* ssn, mastodont_t* api, char** data) .exclude_reblogs = 0, .exclude_replies = 0, .tagged = NULL, - .max_id = ssn->post.max_id, - .min_id = ssn->post.min_id, + .max_id = keystr(ssn->post.max_id), + .min_id = keystr(ssn->post.min_id), .since_id = NULL, .offset = 0, .limit = 20, @@ -447,8 +447,8 @@ void content_account_media(struct session* ssn, mastodont_t* api, char** data) .exclude_reblogs = 0, .exclude_replies = 0, .tagged = NULL, - .max_id = ssn->post.max_id, - .min_id = ssn->post.min_id, + .max_id = keystr(ssn->post.max_id), + .min_id = keystr(ssn->post.min_id), .since_id = NULL, .offset = 0, .limit = 20, @@ -496,9 +496,9 @@ void content_account_bookmarks(struct session* ssn, mastodont_t* api, char** dat char* start_id; struct mstdnt_bookmarks_args args = { - .max_id = ssn->post.max_id, + .max_id = keystr(ssn->post.max_id), .since_id = NULL, - .min_id = ssn->post.min_id, + .min_id = keystr(ssn->post.min_id), .limit = 20, }; @@ -517,7 +517,7 @@ void content_account_bookmarks(struct session* ssn, mastodont_t* api, char** dat if (statuses) { // If not set, set it - start_id = ssn->post.start_id ? ssn->post.start_id : statuses[0].id; + start_id = keystr(ssn->post.start_id) ? keystr(ssn->post.start_id) : statuses[0].id; navigation_box = construct_navigation_box(start_id, statuses[0].id, statuses[status_count-1].id, @@ -557,8 +557,8 @@ void content_account_favourites(struct session* ssn, mastodont_t* api, char** da char* start_id; struct mstdnt_favourites_args args = { - .max_id = ssn->post.max_id, - .min_id = ssn->post.min_id, + .max_id = keystr(ssn->post.max_id), + .min_id = keystr(ssn->post.min_id), .limit = 20, }; @@ -577,7 +577,7 @@ void content_account_favourites(struct session* ssn, mastodont_t* api, char** da if (statuses) { // If not set, set it - start_id = ssn->post.start_id ? ssn->post.start_id : statuses[0].id; + start_id = keystr(ssn->post.start_id) ? keystr(ssn->post.start_id) : statuses[0].id; navigation_box = construct_navigation_box(start_id, statuses[0].id, statuses[status_count-1].id, diff --git a/src/attachments.c b/src/attachments.c index c755d30..4f65536 100644 --- a/src/attachments.c +++ b/src/attachments.c @@ -42,7 +42,7 @@ int try_upload_media(struct mstdnt_storage** storage, struct mstdnt_attachment** attachments, char*** media_ids) { - size_t size = ssn->post.files.array_size; + size_t size = keyfile(ssn->post.files).array_size; if (!FILES_READY(ssn)) return 1; @@ -54,7 +54,7 @@ int try_upload_media(struct mstdnt_storage** storage, for (int i = 0; i < size; ++i) { - struct file_content* content = ssn->post.files.content + i; + struct file_content* content = keyfile(ssn->post.files).content + i; struct mstdnt_upload_media_args args = { .file = { .file = content->content, @@ -104,7 +104,7 @@ int try_upload_media(struct mstdnt_storage** storage, void cleanup_media_storages(struct session* ssn, struct mstdnt_storage* storage) { if (!FILES_READY(ssn)) return; - for (size_t i = 0; i < ssn->post.files.array_size; ++i) + for (size_t i = 0; i < keyfile(ssn->post.files).array_size; ++i) mastodont_storage_cleanup(storage + i); free(storage); } @@ -113,7 +113,7 @@ void cleanup_media_ids(struct session* ssn, char** media_ids) { if (!FILES_READY(ssn)) return; if (!media_ids) return; - for (size_t i = 0; i < ssn->post.files.array_size; ++i) + for (size_t i = 0; i < keyfile(ssn->post.files).array_size; ++i) free(media_ids[i]); free(media_ids); } diff --git a/src/attachments.h b/src/attachments.h index 91c3738..a23d9b8 100644 --- a/src/attachments.h +++ b/src/attachments.h @@ -21,8 +21,9 @@ #include #include "session.h" -#define FILES_READY(ssn) (ssn->post.files.array_size && \ - ssn->post.files.content && ssn->post.files.content[0].content_size) +#define FILES_READY(ssn) (ssn->post.files.type.f.array_size && \ + ssn->post.files.type.f.content && \ + ssn->post.files.type.f.content[0].content_size) int try_upload_media(struct mstdnt_storage** storage, struct session* ssn, diff --git a/src/base_page.c b/src/base_page.c index 5ca10f7..27f830b 100644 --- a/src/base_page.c +++ b/src/base_page.c @@ -50,8 +50,6 @@ void render_base_page(struct base_page* page, struct session* ssn, mastodont_t* struct mstdnt_notification* notifs = NULL; size_t notifs_len = 0; - read_config(ssn); - if (ssn->config.logged_in) login_string = ""; @@ -61,7 +59,7 @@ void render_base_page(struct base_page* page, struct session* ssn, mastodont_t* } // If user is logged in - if (ssn->cookies.logged_in && ssn->cookies.access_token) + if (keystr(ssn->cookies.logged_in) && keystr(ssn->cookies.access_token)) { if (mastodont_verify_credentials(api, &acct, &storage) == 0) { diff --git a/src/cookie.c b/src/cookie.c index a135a70..1860bd5 100644 --- a/src/cookie.c +++ b/src/cookie.c @@ -20,7 +20,6 @@ #include #include #include "cookie.h" -#include "key.h" enum cookie_state { @@ -79,7 +78,10 @@ char* read_cookies_env(struct cookie_values* cookies) for (int i = 0; i < (sizeof(refs)/sizeof(refs[0])); ++i) { if (strcmp(info.key, refs[i].key) == 0) + { refs[i].func(info.val, NULL, refs[i].val); + refs[i].val->is_set = 1; + } } } while (cookies_read); diff --git a/src/cookie.h b/src/cookie.h index 0398e1a..8e42c66 100644 --- a/src/cookie.h +++ b/src/cookie.h @@ -19,28 +19,29 @@ #ifndef COOKIE_H #define COOKIE_H #include +#include "key.h" struct cookie_values { - char* access_token; - char* logged_in; - char* theme; - char* instance_url; - char* background_url; - char* client_id; - char* client_secret; - int themeclr; - int jsactions; - int jsreply; - int jslive; - int js; - int stat_attachments; - int stat_greentexts; - int stat_dope; - int stat_oneclicksoftware; - int stat_emoji_likes; - int instance_show_shoutbox; - int instance_panel; + struct key access_token; + struct key logged_in; + struct key theme; + struct key instance_url; + struct key background_url; + struct key client_id; + struct key client_secret; + struct key themeclr; + struct key jsactions; + struct key jsreply; + struct key jslive; + struct key js; + struct key stat_attachments; + struct key stat_greentexts; + struct key stat_dope; + struct key stat_oneclicksoftware; + struct key stat_emoji_likes; + struct key instance_show_shoutbox; + struct key instance_panel; }; struct http_cookie_info diff --git a/src/error.c b/src/error.c index 41c52d4..fb3dccd 100644 --- a/src/error.c +++ b/src/error.c @@ -25,7 +25,7 @@ #include "../static/error_404.chtml" #include "../static/error.chtml" -char* construct_error(char* error, enum error_type type, unsigned pad, size_t* size) +char* construct_error(const char* error, enum error_type type, unsigned pad, size_t* size) { char* error_html; char* class; diff --git a/src/error.h b/src/error.h index dfd8e2c..5e7a400 100644 --- a/src/error.h +++ b/src/error.h @@ -29,7 +29,7 @@ enum error_type E_NOTICE }; -char* construct_error(char* error, enum error_type type, unsigned pad, size_t* size); +char* construct_error(const char* error, enum error_type type, unsigned pad, size_t* size); void content_not_found(struct session* ssn, mastodont_t* api, char* path); #endif // ERROR_H diff --git a/src/key.c b/src/key.c index 9d4dec5..3a94cac 100644 --- a/src/key.c +++ b/src/key.c @@ -20,16 +20,14 @@ #include #include "key.h" -void key_string(char* val, struct form_props* props, void* _arg) +void key_string(char* val, struct file_content* props, struct key* arg) { - char** arg = _arg; - *arg = val; + arg->type.s = val; } -void key_int(char* val, struct form_props* form, void* _arg) +void key_int(char* val, struct file_content* form, struct key* arg) { char* err; - int* arg = _arg; // Convert long result = strtol(val, &err, 10); @@ -37,8 +35,31 @@ void key_int(char* val, struct form_props* form, void* _arg) // Overflow result == LONG_MIN || result == LONG_MAX) { - *arg = 0; + arg->type.i = 0; return; } - *arg = result; + arg->type.i = result; +} + +void key_files(char* val, struct file_content* form, struct key* arg) +{ + struct file_array* arr = &(arg->type.f); + char* content_cpy; + + arr->content = realloc(arr->content, + sizeof(struct file_content) * ++(arr->array_size)); + if (!(arr->content)) + return; + + // Make a copy so we can remember it later + if (!(content_cpy = malloc(form->content_size+1))) + return; + + memcpy(content_cpy, val, form->content_size+1); + + // Store + arr->content[arr->array_size-1].content = content_cpy; + arr->content[arr->array_size-1].content_size = form->content_size; + arr->content[arr->array_size-1].filename = form->filename; + arr->content[arr->array_size-1].filetype = form->filetype; } diff --git a/src/key.h b/src/key.h index a2333ff..e3144f0 100644 --- a/src/key.h +++ b/src/key.h @@ -18,23 +18,52 @@ #ifndef KEY_H #define KEY_H +#include #include -struct form_props +// Macros which make things a bit easier to read +#define keystr(key) key.type.s +#define keyint(key) key.type.i +#define keyfile(key) key.type.f +#define keypstr(key) key->type.s +#define keypint(key) key->type.i +#define keypfile(key) key->type.f + +struct file_content { - char* filename; + char* content; + size_t content_size; char* filetype; - size_t data_size; + char* filename; +}; + +struct file_array +{ + struct file_content* content; + size_t array_size; +}; + +/** Type used for each query */ +struct key +{ + union u_type + { + int i; + char* s; + struct file_array f; + } type; + int is_set; }; struct key_value_refs { char* key; - void* val; - void (*func)(char*, struct form_props*, void*); + struct key* val; + void (*func)(char*, struct file_content*, struct key*); }; -void key_string(char* val, struct form_props* form, void* arg); -void key_int(char* val, struct form_props* form, void* arg); +void key_string(char* val, struct file_content* props, struct key* arg); +void key_int(char* val, struct file_content* form, struct key* arg); +void key_files(char* val, struct file_content* form, struct key* arg); #endif // KEY_H diff --git a/src/local_config.h b/src/local_config.h index bd36a96..118b7c3 100644 --- a/src/local_config.h +++ b/src/local_config.h @@ -22,7 +22,6 @@ struct local_config { - int changed; char* logged_in; char* theme; char* background_url; diff --git a/src/local_config_set.c b/src/local_config_set.c index 6cdf867..3dcd704 100644 --- a/src/local_config_set.c +++ b/src/local_config_set.c @@ -20,62 +20,75 @@ #include #include "local_config_set.h" -int set_config_str(char** ssn, +#define post_bool_intp(post) (post->is_set ? keypint(post) : 0) + +int set_config_str(struct session* ssn, + char** v, char* cookie_name, - char* value) + struct key* post, + struct key* cookie) { - if (value && ssn) + if (ssn->post.set.is_set && post->is_set) { - *ssn = value; printf("Set-Cookie: %s=%s; HttpOnly; Path=/; SameSite=Strict;\r\n", - cookie_name, value); + cookie_name, keypstr(post)); } - // If ssn isn't passed but value is set, then that means - // something has changed - return value != NULL; + if ((ssn->post.set.is_set && post->is_set) || cookie->is_set) + *v = post->is_set ? keypstr(post) : keypstr(cookie); + + return 0; } -int set_config_int(int* ssn, +int set_config_int(struct session* ssn, + int* v, char* cookie_name, - int value) + struct key* post, + struct key* cookie) { - if (ssn) + if (ssn->post.set.is_set) { - *ssn = value; - printf("Set-Cookie: %s=%ld; HttpOnly; Path=/; Max-Age=31536000; SameSite=Strict;\r\n", - cookie_name, value); - } + printf("Set-Cookie: %s=%d; HttpOnly; Path=/; Max-Age=31536000; SameSite=Strict;\r\n", + cookie_name, post_bool_intp(post)); + } + + // Checks if boolean option + if (ssn->post.set.is_set || cookie->is_set) + *v = ssn->post.set.is_set ? post_bool_intp(post) + : keypint(cookie); - return 1; + return 0; } +// Shorthand for the arguments passed into functions below +#define LOAD_CFG_SIM(strcookie, varname) ssn, &(ssn->config.varname), (strcookie), &(ssn->post.varname), &(ssn->cookies.varname) + void load_config(struct session* ssn, mastodont_t* api) { - if (ssn->post.theme) - { - struct mstdnt_attachment* attachments = NULL; - struct mstdnt_storage* storage = NULL; - if (try_upload_media(&storage, ssn, api, &attachments, NULL) == 0) - { - set_config_str(&(ssn->config.background_url), "background_url", attachments[0].url); - } + // TODO update + /* if (ssn->post.theme) */ + /* { */ + /* struct mstdnt_attachment* attachments = NULL; */ + /* struct mstdnt_storage* storage = NULL; */ + /* if (try_upload_media(&storage, ssn, api, &attachments, NULL) == 0) */ + /* { */ + /* set_config_str(&(ssn->config.background_url), "background_url", attachments[0].url); */ + /* } */ - if (storage) - cleanup_media_storages(ssn, storage); - } - set_config_str(&(ssn->config.theme), "theme", ssn->post.theme, ssn->cookie.theme); - set_config_int(&(ssn->config.themeclr), "themeclr", ssn->post.themeclr, ssn->cookie.themeclr); - - set_config_int(&(ssn->config.jsactions), "jsactions", ssn->cookie.theme, ssn->post.jsactions); - set_config_int(&(ssn->config.jsreply), "jsreply", ssn->cookie.theme, ssn->post.jsreply); - set_config_int(&(ssn->config.jslive), "jslive", ssn->cookie.theme, ssn->post.jslive); - set_config_int(&(ssn->config.js), "js", ssn->cookie.theme, ssn->post.js); - set_config_int(&(ssn->config.stat_attachments), "statattachments", ssn->cookie.theme, ssn->post.stat_attachments); - set_config_int(&(ssn->config.stat_greentexts), "statgreentexts", ssn->cookie.theme, ssn->post.stat_greentexts); - set_config_int(&(ssn->config.stat_dope), "statdope", ssn->cookie.theme, ssn->post.stat_dope); - set_config_int(&(ssn->config.stat_oneclicksoftware), "statoneclicksoftware", ssn->cookie.theme, ssn->post.stat_oneclicksoftware); - set_config_int(&(ssn->config.stat_emoji_likes), "statemojilikes", ssn->cookie.theme, ssn->post.stat_emoji_likes); - set_config_int(&(ssn->config.instance_show_shoutbox), "instanceshowshoutbox", ssn->cookie.theme, ssn->post.instance_show_shoutbox); - set_config_int(&(ssn->config.instance_panel), "instancepanel", ssn->cookie.theme, ssn->post.instance_panel); + /* if (storage) */ + /* cleanup_media_storages(ssn, storage); */ + /* } */ + set_config_str(LOAD_CFG_SIM("theme", theme)); + set_config_int(LOAD_CFG_SIM("themeclr", themeclr)); + set_config_int(LOAD_CFG_SIM("jsactions", jsactions)); + set_config_int(LOAD_CFG_SIM("jsreply", jsreply)); + set_config_int(LOAD_CFG_SIM("jslive", jslive)); + set_config_int(LOAD_CFG_SIM("js", js)); + set_config_int(LOAD_CFG_SIM("statattachments", stat_attachments)); + set_config_int(LOAD_CFG_SIM("statgreentexts", stat_greentexts)); + set_config_int(LOAD_CFG_SIM("statdope", stat_dope)); + set_config_int(LOAD_CFG_SIM("statoneclicksoftware", stat_oneclicksoftware)); + set_config_int(LOAD_CFG_SIM("statemojilikes", stat_emoji_likes)); + set_config_int(LOAD_CFG_SIM("instanceshowshoutbox", instance_show_shoutbox)); + set_config_int(LOAD_CFG_SIM("instancepanel", instance_panel)); } diff --git a/src/local_config_set.h b/src/local_config_set.h index ee02389..8884fd7 100644 --- a/src/local_config_set.h +++ b/src/local_config_set.h @@ -22,16 +22,20 @@ #include "local_config.h" #include "session.h" #include "attachments.h" +#include "key.h" -int set_config_str(char** ssn, +int set_config_str(struct session* ssn, + char** v, char* cookie_name, - char* value); + struct key* post, + struct key* cookie); -int set_config_int(int* ssn, +int set_config_int(struct session* ssn, + int* v, char* cookie_name, - int value); + struct key* post, + struct key* cookie); void load_config(struct session* ssn, mastodont_t* api); -void read_config(struct session* ssn); #endif // LOCAL_CONFIG_SET_H diff --git a/src/login.c b/src/login.c index 5cd088e..a9081ef 100644 --- a/src/login.c +++ b/src/login.c @@ -55,15 +55,15 @@ void content_login_oauth(struct session* ssn, mastodont_t* api, char** data) config_host_url_insecure ? "" : "s", config_host_url ? config_host_url : redirect_url ); - if (ssn->query.code) + if (keystr(ssn->query.code)) { struct mstdnt_args args_token = { .grant_type = "authorization_code", - .client_id = ssn->cookies.client_id, - .client_secret = ssn->cookies.client_secret, + .client_id = keystr(ssn->cookies.client_id), + .client_secret = keystr(ssn->cookies.client_secret), .redirect_uri = urlify_redirect_url, .scope = LOGIN_SCOPE, - .code = ssn->query.code, + .code = keystr(ssn->query.code), }; if (mastodont_obtain_oauth_token(api, &args_token, &oauth_storage, @@ -72,16 +72,16 @@ void content_login_oauth(struct session* ssn, mastodont_t* api, char** data) apply_access_token(token.access_token); } } - else if (ssn->post.instance) + else if (keystr(ssn->post.instance)) { - decode_url = curl_easy_unescape(api->curl, ssn->post.instance, 0, NULL); + decode_url = curl_easy_unescape(api->curl, keystr(ssn->post.instance), 0, NULL); api->url = decode_url; struct mstdnt_args args_app = { .client_name = "Treebird", .redirect_uris = urlify_redirect_url, .scopes = "read+write+follow+push", - .website = ssn->post.instance + .website = keystr(ssn->post.instance) }; if (mastodont_register_app(api, &args_app, &storage, &app) == 0) @@ -121,7 +121,7 @@ void content_login(struct session* ssn, mastodont_t* api, char** data) char* error = NULL; char* page; - if (ssn->post.username && ssn->post.password) + if (keystr(ssn->post.username) && keystr(ssn->post.password)) { // Getting the client id/secret struct mstdnt_args args_app = { @@ -132,7 +132,7 @@ void content_login(struct session* ssn, mastodont_t* api, char** data) }; // Check if the username contains an @ symbol - char* address = strstr(ssn->post.username, "%40"); + char* address = strstr(keystr(ssn->post.username), "%40"); // If it fails, we need to restore char* orig_url = api->url; char* url_link = NULL; @@ -161,8 +161,8 @@ void content_login(struct session* ssn, mastodont_t* api, char** data) .redirect_uri = NULL, .scope = LOGIN_SCOPE, .code = NULL, - .username = ssn->post.username, - .password = ssn->post.password + .username = keystr(ssn->post.username), + .password = keystr(ssn->post.password) }; if (mastodont_obtain_oauth_token(api, &args_token, &oauth_store, diff --git a/src/main.c b/src/main.c index 9a91e34..098579f 100644 --- a/src/main.c +++ b/src/main.c @@ -36,6 +36,7 @@ #include "notifications.h" #include "test.h" #include "search.h" +#include "local_config_set.h" int main(void) { @@ -50,7 +51,6 @@ int main(void) // Default config struct session ssn = { .config = { - .changed = 0, .theme = "treebird20", .themeclr = 0, .jsactions = 1, @@ -66,23 +66,26 @@ int main(void) .instance_show_shoutbox = 1, .instance_panel = 1, }, - .cookies = { 0 }, - .post = { 0 }, - .query = { 0 } + .cookies = {{}}, + .post = {{}}, + .query = {{}} }; // Load cookies char* cookies_str = read_cookies_env(&(ssn.cookies)); char* post_str = read_post_data(&(ssn.post)); - char* get_str = read_query_data(&(ssn.query)); + char* get_str = read_get_data(&(ssn.query)); mastodont_t api; - if (ssn.cookies.instance_url) - api.url = ssn.cookies.instance_url; + if (keystr(ssn.cookies.instance_url)) + api.url = keystr(ssn.cookies.instance_url); else api.url = config_instance_url; mastodont_init(&api, MSTDNT_FLAG_NO_URI_SANITIZE | config_library_flags); - api.token = ssn.cookies.access_token; // Load token now + api.token = keystr(ssn.cookies.access_token); // Load token now + + // Read config options + load_config(&ssn, &api); /******************* * Path handling * @@ -129,7 +132,7 @@ int main(void) if (post_str) free(post_str); if (get_str) free(get_str); mastodont_free(&api); - free_files(&(ssn.post.files)); + free_files(&(keyfile(ssn.post.files))); ++run_count; } diff --git a/src/notifications.c b/src/notifications.c index a9b15cd..c2e42ac 100644 --- a/src/notifications.c +++ b/src/notifications.c @@ -183,7 +183,7 @@ void content_notifications(struct session* ssn, mastodont_t* api, char** data) char* start_id; char* navigation_box = NULL; - if (ssn->cookies.logged_in) + if (keystr(ssn->cookies.logged_in)) { struct mstdnt_get_notifications_args args = { .exclude_types = 0, @@ -191,8 +191,8 @@ void content_notifications(struct session* ssn, mastodont_t* api, char** data) .exclude_visibilities = 0, .include_types = 0, .with_muted = 1, - .max_id = ssn->post.max_id, - .min_id = ssn->post.min_id, + .max_id = keystr(ssn->post.max_id), + .min_id = keystr(ssn->post.min_id), .since_id = NULL, .offset = 0, .limit = 20, @@ -201,13 +201,13 @@ void content_notifications(struct session* ssn, mastodont_t* api, char** data) if (mastodont_get_notifications(api, &args, &storage, ¬ifs, ¬ifs_len) == 0) { notif_html = construct_notifications(ssn, api, notifs, notifs_len, NULL); - start_id = ssn->post.start_id ? ssn->post.start_id : notifs[0].id; + start_id = keystr(ssn->post.start_id) ? keystr(ssn->post.start_id) : notifs[0].id; navigation_box = construct_navigation_box(start_id, notifs[0].id, notifs[notifs_len-1].id, NULL); - mstdnt_cleanup_notifications(notifs, notifs_len); - } + mstdnt_cleanup_notifications(notifs, notifs_len);} + else notif_html = construct_error(storage.error, E_NOTICE, 1, NULL); diff --git a/src/query.c b/src/query.c index 335443b..5ffe9ce 100644 --- a/src/query.c +++ b/src/query.c @@ -24,7 +24,7 @@ #include "query.h" #include "mime.h" -char* read_query_data(struct get_values* query) +char* read_get_data(struct get_values* query) { struct http_query_info info; char* query_string = getenv("QUERY_STRING"); @@ -57,7 +57,12 @@ char* read_query_data(struct get_values* query) if (!(info.key && info.val)) break; for (size_t i = 0; i < (sizeof(refs)/sizeof(refs[0])); ++i) if (strcmp(info.key, refs[i].key) == 0) + { refs[i].func(info.val, NULL, refs[i].val); + refs[i].val->is_set = 1; + } + else + refs[i].val->is_set = 0; } while (g_query_read); } @@ -65,41 +70,22 @@ char* read_query_data(struct get_values* query) return get_query; } -void key_files(char* val, struct form_props* form, void* arg) -{ - struct file_array* arr = arg; - char* ptr; - arr->content = realloc(arr->content, - sizeof(struct file_content) * ++(arr->array_size)); - if (!(arr->content)) - return; - - ptr = malloc(form->data_size+1); - if (!ptr) - return; - - memcpy(ptr, val, form->data_size+1); - // Store - arr->content[arr->array_size-1].content = ptr; - arr->content[arr->array_size-1].content_size = form->data_size; - arr->content[arr->array_size-1].filename = form->filename; - arr->content[arr->array_size-1].filetype = form->filetype; -} -char* read_post_data(struct query_values* post) +char* read_post_data(struct post_values* post) { ptrdiff_t begin_curr_size; struct http_query_info query_info; struct http_form_info form_info; - struct form_props form_props; + struct file_content form_props; char* request_method = getenv("REQUEST_METHOD"); char* content_length = getenv("CONTENT_LENGTH"); char* post_query = NULL, *p_query_read; // BEGIN Query references struct key_value_refs refs[] = { + { "set", &(post->set), key_int }, { "content", &(post->content), key_string }, { "itype", &(post->itype), key_string }, { "id", &(post->id), key_string }, @@ -152,7 +138,6 @@ char* read_post_data(struct query_values* post) p_query_read = post_query; do - { if (mime_mem) { // Get size from here to the end @@ -164,21 +149,27 @@ char* read_post_data(struct query_values* post) len - begin_curr_size); form_props.filename = form_info.filename; form_props.filetype = form_info.content_type; - form_props.data_size = form_info.value_size; + form_props.content_size = form_info.value_size; if (!p_query_read) break; for (size_t i = 0; i < (sizeof(refs)/sizeof(refs[0])); ++i) if (strcmp(form_info.name, refs[i].key) == 0) + { refs[i].func(form_info.value, &form_props, refs[i].val); + refs[i].val->is_set = 1; + } } - else { + else + { // Mime value not set p_query_read = parse_query(p_query_read, &query_info); if (!(query_info.key && query_info.val)) break; for (size_t i = 0; i < (sizeof(refs)/sizeof(refs[0])); ++i) if (strcmp(query_info.key, refs[i].key) == 0) + { refs[i].func(query_info.val, NULL, refs[i].val); + refs[i].val->is_set = 1; + } } - } while (p_query_read); if (mime_mem) free(mime_mem); diff --git a/src/query.h b/src/query.h index a422d5e..fbcaf78 100644 --- a/src/query.h +++ b/src/query.h @@ -28,67 +28,52 @@ struct http_query_info char* val; }; -struct file_content -{ - char* content; - size_t content_size; - char* filetype; - char* filename; -}; - -struct file_array -{ - struct file_content* content; - size_t array_size; -}; - -struct query_values +struct post_values { // Config - char* theme; - int themeclr; - int jsactions; - int jsreply; - int jslive; - int js; - int stat_attachments; - int stat_greentexts; - int stat_dope; - int stat_oneclicksoftware; - int stat_emoji_likes; - int stat_hide_muted; - int instance_show_shoutbox; - int instance_panel; + struct key theme; // String + struct key themeclr; // Int + struct key jsactions; // Int + struct key jsreply; // Int + struct key jslive; // Int + struct key js; // Int + struct key stat_attachments; // Int + struct key stat_greentexts; // Int + struct key stat_dope; // Int + struct key stat_oneclicksoftware; // Int + struct key stat_emoji_likes; // Int + struct key stat_hide_muted; // Int + struct key instance_show_shoutbox; // Int + struct key instance_panel; // Int + struct key set; // Int - char* content; - char* itype; - char* id; - char* username; - char* password; - char* replyid; - char* visibility; - char* instance; - int emojoindex; + struct key content; // String + struct key itype; // String + struct key id; // String + struct key username; // String + struct key password; // String + struct key replyid; // String + struct key visibility; // String + struct key instance; // String + struct key emojoindex; // Int // Navigation - char* min_id; - char* max_id; - char* start_id; + struct key min_id; // String + struct key max_id; // String + struct key start_id; // String - struct file_array files; + struct key files; // Files }; struct get_values { - char* offset; - char* query; - char* code; + struct key offset; // String + struct key query; // String + struct key code; // String }; -void key_files(char* val, struct form_props* form, void* arg); - -char* read_query_data(struct get_values* query); -char* read_post_data(struct query_values* post); +char* read_get_data(struct get_values* query); +char* read_post_data(struct post_values* post); /* A stupidly quick query parser */ char* parse_query(char* begin, struct http_query_info* info); char* try_handle_post(void (*call)(struct http_query_info*, void*), void* arg); diff --git a/src/search.c b/src/search.c index 3a41034..e420024 100644 --- a/src/search.c +++ b/src/search.c @@ -36,15 +36,15 @@ void search_page(struct session* ssn, mastodont_t* api, enum search_tab tab, cha char* out_data; easprintf(&out_data, data_search_html, config_url_prefix, - ssn->query.query, + keystr(ssn->query.query), MAKE_FOCUSED_IF(tab, SEARCH_STATUSES), "Statuses", config_url_prefix, - ssn->query.query, + keystr(ssn->query.query), MAKE_FOCUSED_IF(tab, SEARCH_ACCOUNTS), "Accounts", config_url_prefix, - ssn->query.query, + keystr(ssn->query.query), MAKE_FOCUSED_IF(tab, SEARCH_HASHTAGS), "Hashtags", content); @@ -81,13 +81,13 @@ void content_search_statuses(struct session* ssn, mastodont_t* api, char** data) struct mstdnt_search_results results = { 0 }; if (mastodont_search(api, - ssn->query.query, + keystr(ssn->query.query), &storage, &args, &results) == 0) { struct construct_statuses_args statuses_args = { - .highlight_word = ssn->query.query, + .highlight_word = keystr(ssn->query.query), }; statuses_html = construct_statuses(ssn, api, results.statuses, results.statuses_len, &statuses_args, NULL); if (!statuses_html) @@ -120,7 +120,7 @@ void content_search_accounts(struct session* ssn, mastodont_t* api, char** data) struct mstdnt_search_results results = { 0 }; if (mastodont_search(api, - ssn->query.query, + keystr(ssn->query.query), &storage, &args, &results) == 0) @@ -159,7 +159,7 @@ void content_search_hashtags(struct session* ssn, mastodont_t* api, char** data) struct mstdnt_search_results results = { 0 }; if (mastodont_search(api, - ssn->query.query, + keystr(ssn->query.query), &storage, &args, &results) == 0) diff --git a/src/session.h b/src/session.h index f7fee27..c2b6200 100644 --- a/src/session.h +++ b/src/session.h @@ -24,7 +24,7 @@ struct session { - struct query_values post; + struct post_values post; struct get_values query; struct cookie_values cookies; struct local_config config; diff --git a/src/status.c b/src/status.c index 9f0213b..1efe2e5 100644 --- a/src/status.c +++ b/src/status.c @@ -56,7 +56,7 @@ struct status_args int try_post_status(struct session* ssn, mastodont_t* api) { - if (!(ssn->post.content)) return 1; + if (!(keystr(ssn->post.content))) return 1; struct mstdnt_storage storage = { 0 }, *att_storage = NULL; @@ -73,17 +73,17 @@ int try_post_status(struct session* ssn, mastodont_t* api) .content_type = "text/plain", .expires_in = 0, .in_reply_to_conversation_id = NULL, - .in_reply_to_id = ssn->post.replyid, + .in_reply_to_id = keystr(ssn->post.replyid), .language = NULL, .media_ids = media_ids, - .media_ids_len = media_ids ? ssn->post.files.array_size : 0, + .media_ids_len = media_ids ? keyfile(ssn->post.files).array_size : 0, .poll = NULL, .preview = 0, .scheduled_at = NULL, .sensitive = 0, .spoiler_text = NULL, - .status = ssn->post.content, - .visibility = ssn->post.visibility, + .status = keystr(ssn->post.content), + .visibility = keystr(ssn->post.visibility), }; mastodont_create_status(api, &args, &storage); @@ -130,31 +130,31 @@ void content_status_react(struct session* ssn, mastodont_t* api, char** data) int try_interact_status(struct session* ssn, mastodont_t* api, char* id) { struct mstdnt_storage storage = { 0 }; - if (!(ssn->post.itype && id)) return 1; + if (!(keystr(ssn->post.itype) && id)) return 1; // Pretty up the type - if (strcmp(ssn->post.itype, "like") == 0 || - strcmp(ssn->post.itype, "likeboost") == 0) + if (strcmp(keystr(ssn->post.itype), "like") == 0 || + strcmp(keystr(ssn->post.itype), "likeboost") == 0) mastodont_favourite_status(api, id, &storage, NULL); // Not else if because possibly a like-boost - if (strcmp(ssn->post.itype, "repeat") == 0 || - strcmp(ssn->post.itype, "likeboost") == 0) + if (strcmp(keystr(ssn->post.itype), "repeat") == 0 || + strcmp(keystr(ssn->post.itype), "likeboost") == 0) mastodont_reblog_status(api, id, &storage, NULL); - else if (strcmp(ssn->post.itype, "bookmark") == 0) + else if (strcmp(keystr(ssn->post.itype), "bookmark") == 0) mastodont_bookmark_status(api, id, &storage, NULL); - else if (strcmp(ssn->post.itype, "pin") == 0) + else if (strcmp(keystr(ssn->post.itype), "pin") == 0) mastodont_pin_status(api, id, &storage, NULL); - else if (strcmp(ssn->post.itype, "mute") == 0) + else if (strcmp(keystr(ssn->post.itype), "mute") == 0) mastodont_mute_conversation(api, id, &storage, NULL); - else if (strcmp(ssn->post.itype, "unlike") == 0) + else if (strcmp(keystr(ssn->post.itype), "unlike") == 0) mastodont_unfavourite_status(api, id, &storage, NULL); - else if (strcmp(ssn->post.itype, "unrepeat") == 0) + else if (strcmp(keystr(ssn->post.itype), "unrepeat") == 0) mastodont_unreblog_status(api, id, &storage, NULL); - else if (strcmp(ssn->post.itype, "unbookmark") == 0) + else if (strcmp(keystr(ssn->post.itype), "unbookmark") == 0) mastodont_unbookmark_status(api, id, &storage, NULL); - else if (strcmp(ssn->post.itype, "unpin") == 0) + else if (strcmp(keystr(ssn->post.itype), "unpin") == 0) mastodont_unpin_status(api, id, &storage, NULL); - else if (strcmp(ssn->post.itype, "unmute") == 0) + else if (strcmp(keystr(ssn->post.itype), "unmute") == 0) mastodont_unmute_conversation(api, id, &storage, NULL); mastodont_storage_cleanup(&storage); @@ -412,7 +412,7 @@ char* construct_status(struct session* ssn, // Emojo picker if ((flags & STATUS_EMOJI_PICKER) == STATUS_EMOJI_PICKER) { - emoji_picker_html = construct_emoji_picker(status->id, ssn->post.emojoindex, NULL); + emoji_picker_html = construct_emoji_picker(status->id, keyint(ssn->post.emojoindex), NULL); } // If focused, show status interactions diff --git a/src/timeline.c b/src/timeline.c index 8f949c1..deb4819 100644 --- a/src/timeline.c +++ b/src/timeline.c @@ -48,9 +48,9 @@ void tl_home(struct session* ssn, mastodont_t* api, int local) struct mstdnt_timeline_args args = { .local = local, - .max_id = ssn->post.max_id, + .max_id = keystr(ssn->post.max_id), .since_id = NULL, - .min_id = ssn->post.min_id, + .min_id = keystr(ssn->post.min_id), .limit = 20 }; @@ -72,7 +72,7 @@ void tl_home(struct session* ssn, mastodont_t* api, int local) if (statuses) { // If not set, set it - start_id = ssn->post.start_id ? ssn->post.start_id : statuses[0].id; + start_id = keystr(ssn->post.start_id) ? keystr(ssn->post.start_id) : statuses[0].id; navigation_box = construct_navigation_box(start_id, statuses[0].id, statuses[status_count-1].id, @@ -115,9 +115,9 @@ void tl_direct(struct session* ssn, mastodont_t* api) struct mstdnt_timeline_args args = { .with_muted = 0, - .max_id = ssn->post.max_id, + .max_id = keystr(ssn->post.max_id), .since_id = NULL, - .min_id = ssn->post.min_id, + .min_id = keystr(ssn->post.min_id), .limit = 20, }; @@ -136,7 +136,7 @@ void tl_direct(struct session* ssn, mastodont_t* api) if (statuses) { // If not set, set it - start_id = ssn->post.start_id ? ssn->post.start_id : statuses[0].id; + start_id = keystr(ssn->post.start_id) ? keystr(ssn->post.start_id) : statuses[0].id; navigation_box = construct_navigation_box(start_id, statuses[0].id, statuses[status_count-1].id, @@ -183,9 +183,9 @@ void tl_public(struct session* ssn, mastodont_t* api, int local, enum base_categ .local = local, .remote = 0, .only_media = 0, - .max_id = ssn->post.max_id, + .max_id = keystr(ssn->post.max_id), .since_id = NULL, - .min_id = ssn->post.min_id, + .min_id = keystr(ssn->post.min_id), .limit = 20 }; @@ -207,7 +207,7 @@ void tl_public(struct session* ssn, mastodont_t* api, int local, enum base_categ if (statuses) { // If not set, set it - start_id = ssn->post.start_id ? ssn->post.start_id : statuses[0].id; + start_id = keystr(ssn->post.start_id) ? keystr(ssn->post.start_id) : statuses[0].id; navigation_box = construct_navigation_box(start_id, statuses[0].id, statuses[status_count-1].id, @@ -246,9 +246,9 @@ void tl_list(struct session* ssn, mastodont_t* api, char* list_id) char* output = NULL; struct mstdnt_timeline_args args = { - .max_id = ssn->post.max_id, + .max_id = keystr(ssn->post.max_id), .since_id = NULL, - .min_id = ssn->post.min_id, + .min_id = keystr(ssn->post.min_id), .limit = 20, }; @@ -270,7 +270,7 @@ void tl_list(struct session* ssn, mastodont_t* api, char* list_id) if (statuses) { // If not set, set it - start_id = ssn->post.start_id ? ssn->post.start_id : statuses[0].id; + start_id = keystr(ssn->post.start_id) ? keystr(ssn->post.start_id) : statuses[0].id; navigation_box = construct_navigation_box(start_id, statuses[0].id, statuses[status_count-1].id, @@ -310,9 +310,9 @@ void tl_tag(struct session* ssn, mastodont_t* api, char* tag_id) char* output = NULL; struct mstdnt_timeline_args args = { - .max_id = ssn->post.max_id, + .max_id = keystr(ssn->post.max_id), .since_id = NULL, - .min_id = ssn->post.min_id, + .min_id = keystr(ssn->post.min_id), .limit = 20, }; @@ -329,7 +329,7 @@ void tl_tag(struct session* ssn, mastodont_t* api, char* tag_id) if (statuses) { // If not set, set it - start_id = ssn->post.start_id ? ssn->post.start_id : statuses[0].id; + start_id = keystr(ssn->post.start_id) ? keystr(ssn->post.start_id) : statuses[0].id; navigation_box = construct_navigation_box(start_id, statuses[0].id, statuses[status_count-1].id, @@ -361,7 +361,7 @@ void tl_tag(struct session* ssn, mastodont_t* api, char* tag_id) void content_tl_home(struct session* ssn, mastodont_t* api, char** data) { (void)data; - if (ssn->cookies.logged_in) + if (keystr(ssn->cookies.logged_in)) tl_home(ssn, api, 0); else content_tl_federated(ssn, api, data); diff --git a/static/config_appearance.html b/static/config_appearance.html index b1aec18..66666c6 100644 --- a/static/config_appearance.html +++ b/static/config_appearance.html @@ -1,6 +1,7 @@
- + +

Appearance

Theme variant

    diff --git a/static/config_general.html b/static/config_general.html index c975b13..cf1c6dc 100644 --- a/static/config_general.html +++ b/static/config_general.html @@ -1,5 +1,7 @@
    + +

    General

    JavaScript