From 77a2a00a1fc6da3e35f566e4ee6d1405c7caa473 Mon Sep 17 00:00:00 2001 From: "me@ow.nekobit.net" Date: Fri, 8 Apr 2022 23:47:10 +0000 Subject: [PATCH] Query and form data FossilOrigin-Name: fc63a8d3009e508ab4901749aa103bf99edc80867fdb33fc45f8f409a62141c4 --- src/base_page.c | 2 +- src/key.c | 25 +++++++++++++++++++ src/key.h | 12 ++++++++- src/query.c | 66 ++++++++++++++++++++++++++++++++----------------- 4 files changed, 80 insertions(+), 25 deletions(-) create mode 100644 src/key.c diff --git a/src/base_page.c b/src/base_page.c index a7b169e..5f750b6 100644 --- a/src/base_page.c +++ b/src/base_page.c @@ -61,7 +61,7 @@ void render_base_page(struct base_page* page, struct session* ssn, mastodont_t* .min_id = NULL, .since_id = NULL, .offset = 0, - .limit = 20, + .limit = 8, }; if (mastodont_get_notifications(api, &args, &storage, ¬ifs, ¬ifs_len) == 0) diff --git a/src/key.c b/src/key.c new file mode 100644 index 0000000..29331ea --- /dev/null +++ b/src/key.c @@ -0,0 +1,25 @@ +/* + * Treebird - Lightweight frontend for Pleroma + * Copyright (C) 2022 Nekobit + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +#include "key.h" + +void key_string(char* val, struct form_props* props, void* _arg) +{ + char** arg = _arg; + *arg = val; +} diff --git a/src/key.h b/src/key.h index be53cf0..ba18bdb 100644 --- a/src/key.h +++ b/src/key.h @@ -19,10 +19,20 @@ #ifndef KEY_H #define KEY_H +struct form_props +{ + char* filename; + char* filetype; +}; + struct key_value_refs { char* key; - char** val; + void* val; + struct form_props form; + void (*func)(char*, struct form_props*, void*); }; +void key_string(char* val, struct form_props* form, void* arg); + #endif // KEY_H diff --git a/src/query.c b/src/query.c index 4e24899..4ce5e36 100644 --- a/src/query.c +++ b/src/query.c @@ -22,6 +22,7 @@ #include #include "query.h" #include "key.h" +#include "mime.h" struct query_values post = { 0 }; struct get_values query = { 0 }; @@ -34,8 +35,8 @@ char* read_query_data(struct get_values* query) // BEGIN Query references struct key_value_refs refs[] = { - { "offset", &(query->offset) }, - { "q", &(query->q) }, + { "offset", &(query->offset), { 0 }, key_string }, + { "q", &(query->q), { 0 }, key_string }, }; // END Query references @@ -58,7 +59,7 @@ 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].val) = info.val; + refs[i].func(info.val, NULL, info.key); } while (g_query_read); } @@ -68,31 +69,34 @@ char* read_query_data(struct get_values* query) char* read_post_data(struct query_values* post) { - struct http_query_info info; + struct http_query_info query_info; + struct http_form_info form_info; char* request_method = getenv("REQUEST_METHOD"); char* post_query = NULL, *p_query_read; // BEGIN Query references struct key_value_refs refs[] = { - { "content", &(post->content) }, - { "itype", &(post->itype) }, - { "id", &(post->id) }, - { "theme", &(post->theme) }, - { "themeclr", &(post->themeclr) }, - { "jsactions", &(post->jsactions) }, - { "jsreply", &(post->jsreply) }, - { "jslive", &(post->jslive) }, - { "username", &(post->username) }, - { "password", &(post->password) }, - { "replyid", &(post->replyid) }, - { "min_id", &(post->min_id) }, - { "max_id", &(post->max_id) }, - { "start_id", &(post->start_id) } + { "content", &(post->content), { 0 }, key_string }, + { "itype", &(post->itype), { 0 }, key_string }, + { "id", &(post->id), { 0 }, key_string }, + { "theme", &(post->theme), { 0 }, key_string }, + { "themeclr", &(post->themeclr), { 0 }, key_string }, + { "jsactions", &(post->jsactions), { 0 }, key_string }, + { "jsreply", &(post->jsreply), { 0 }, key_string }, + { "jslive", &(post->jslive), { 0 }, key_string }, + { "username", &(post->username), { 0 }, key_string }, + { "password", &(post->password), { 0 }, key_string }, + { "replyid", &(post->replyid), { 0 }, key_string }, + { "min_id", &(post->min_id), { 0 }, key_string }, + { "max_id", &(post->max_id), { 0 }, key_string }, + { "start_id", &(post->start_id), { 0 }, key_string } }; // END Query references if (request_method && strcmp("POST", request_method) == 0) { + char* mime_boundary; + char* mime_mem = get_mime_boundary(NULL, &mime_boundary); int content_length = atoi(getenv("CONTENT_LENGTH")); post_query = malloc(content_length + 1); if (!post_query) @@ -110,13 +114,29 @@ char* read_post_data(struct query_values* post) do { - p_query_read = parse_query(p_query_read, &info); - 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].val) = info.val; + if (mime_mem) + { + // Mime value + p_query_read = read_form_data(mime_boundary, + p_query_read, + &form_info); + 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, &(refs[i].form), refs[i].val); + } + 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); + } } while (p_query_read); + + if (mime_mem) free(mime_mem); } // Free me afterwards!