X-Git-Url: http://git.bytex64.net/?a=blobdiff_plain;f=http%2Fhttp_blerg.c;h=8a5b9a506c49bf82bf3752634f296ae44276a2d2;hb=948ce5be6ef6bba36edfb544565ca22e316afb0a;hp=e6e04c52a38a855ad149acb2fb6594cd3148c5be;hpb=5d5ab897080ac64de19c7e02708a97c7d6d75825;p=blerg.git diff --git a/http/http_blerg.c b/http/http_blerg.c index e6e04c5..8a5b9a5 100644 --- a/http/http_blerg.c +++ b/http/http_blerg.c @@ -29,12 +29,6 @@ struct put_state { int data_size; }; -struct subscribe_state { - struct MHD_PostProcessor *pp; - char username[33]; - char to[33]; -}; - struct get_state { struct blerg *b; yajl_gen g; @@ -240,22 +234,6 @@ int process_and_check_put(struct MHD_Connection *connection, const char *method, return MHD_NO; } -int POST_subscribe_iterator(void *cls, enum MHD_ValueKind kind, const char *key, const char *filename, const char *content_type, const char *transfer_encoding, const char *data, uint64_t off, size_t size) { - struct subscribe_state *ss = cls; - - if (strncmp(key, "username", 9) == 0) { - if (size > 32) size = 32; - memcpy(ss->username, data, size); - ss->username[size] = 0; - } else if (strncmp(key, "to", 3) == 0) { - if (size > 32) size = 32; - memcpy(ss->to, data, size); - ss->to[size] = 0; - } - - return MHD_YES; -} - int POST_auth_iterator(void *cls, enum MHD_ValueKind kind, const char *key, const char *filename, const char *content_type, const char *transfer_encoding, const char *data, uint64_t off, size_t size) { struct auth_state *as = cls; @@ -316,7 +294,6 @@ struct MHD_Response *create_response_for_range(struct blerg *b, uint64_t from, u uint64_t record_count = blerg_get_record_count(b); if (from > to || from >= record_count || to >= record_count || to - from > 99) { - blerg_close(b); free(gs); return NULL; } @@ -543,12 +520,12 @@ ahc_derp (void *cls, struct MHD_Connection *connection, const char *url, const c if (as->username[0] == 0 || as->password[0] == 0) return respond_JSON_Failure(connection); - if (!auth_login(as->username, as->password)) + char *token = auth_login(as->username, as->password); + if (token == NULL) return respond_JSON_Failure(connection); response = MHD_create_response_from_data(strlen(JSON_SUCCESS), JSON_SUCCESS, MHD_NO, MHD_NO); - char *token = auth_get_token(as->username); data = malloc(512); snprintf(data, 512, "auth=%s", token); MHD_add_response_header(response, "Set-Cookie", data); @@ -570,39 +547,36 @@ ahc_derp (void *cls, struct MHD_Connection *connection, const char *url, const c struct auth_state *as = (struct auth_state *) *ptr; - auth_logout(as->username); + const char *given_token = MHD_lookup_connection_value(connection, MHD_COOKIE_KIND, "auth"); + auth_logout(as->username, given_token); return respond_JSON_Success(connection); - } else if (strncmp(url, "/subscribe", 11) == 0 || strncmp(url, "/unsubscribe", 13) == 0) { - struct subscribe_state *ss = (struct subscribe_state *) *ptr; + } else if (strncmp(url, "/subscribe", 10) == 0 || strncmp(url, "/unsubscribe", 12) == 0) { + ret = process_and_check_auth(connection, method, upload_data, upload_data_size, ptr); + if (ret == MHD_YES) + return MHD_YES; - if (ss == NULL) { - if (strcmp(method, MHD_HTTP_METHOD_POST) != 0) - return respond_405(connection); + struct auth_state *as = (struct auth_state *) *ptr; - struct subscribe_state *ss = malloc(sizeof(struct subscribe_state)); - ss->username[0] = ss->to[0] = 0; - ss->pp = MHD_create_post_processor(connection, 1024, &POST_subscribe_iterator, ss); - *ptr = ss; - return MHD_YES; - } + if (url[1] == 'u') { + if (url[12] != '/') + return respond_404(connection); - if (*upload_data_size) { - MHD_post_process(ss->pp, upload_data, *upload_data_size); - *upload_data_size = 0; - return MHD_YES; - } + ret = parse_url_info(url + 13, &info); + if ((ret & URL_INFO_NAME) == 0) + return respond_404(connection); - const char *given_token = MHD_lookup_connection_value(connection, MHD_COOKIE_KIND, "auth"); - if (auth_check_token(ss->username, given_token)) { - if (url[1] == 'u') { - subscription_remove(ss->username, ss->to); - } else { - subscription_add(ss->username, ss->to); - } - return respond_JSON_Success(connection); + subscription_remove(as->username, info.name); } else { - return respond_JSON_Failure(connection); + if (url[10] != '/') + return respond_404(connection); + + ret = parse_url_info(url + 11, &info); + if ((ret & URL_INFO_NAME) == 0) + return respond_404(connection); + + subscription_add(as->username, info.name); } + return respond_JSON_Success(connection); } else if (strncmp(url, "/feed", 6) == 0) { ret = process_and_check_auth(connection, method, upload_data, upload_data_size, ptr); if (ret == MHD_YES)