X-Git-Url: http://git.bytex64.net/?a=blobdiff_plain;f=http%2Fhttp_blerg.c;fp=http%2Fhttp_blerg.c;h=65a63d2d6eaeb664525c4976e579e6741907387f;hb=28a7ca12adefd4a4db25ad0534638e085a9f0e12;hp=e2057491ff5a899a0a801ceba0d5b95f19916466;hpb=ec8746b44dc85fd3e3b42835f779890684a9e90a;p=blerg.git diff --git a/http/http_blerg.c b/http/http_blerg.c index e205749..65a63d2 100644 --- a/http/http_blerg.c +++ b/http/http_blerg.c @@ -266,6 +266,32 @@ struct MHD_Response *create_blergref_response(struct blergref *results, uint64_t return MHD_create_response_from_callback(-1, 262144, &GET_generate_blergref_list, bs, &GET_generate_blergref_list_free); } +int check_auth(struct MHD_Connection *connection, const char *method, const char *upload_data, size_t *upload_data_size, void **ptr) { + struct auth_state *as = (struct auth_state *) *ptr; + if (as == NULL) { + if (strcmp(method, MHD_HTTP_METHOD_POST) != 0) + return respond_405(connection); + + as = malloc(sizeof(struct auth_state)); + as->username[0] = as->password[0] = 0; + as->pp = MHD_create_post_processor(connection, 1024, &POST_auth_iterator, as); + *ptr = as; + return MHD_YES; + } + + if (*upload_data_size) { + MHD_post_process(as->pp, upload_data, *upload_data_size); + *upload_data_size = 0; + return MHD_YES; + } + + const char *given_token = MHD_lookup_connection_value(connection, MHD_COOKIE_KIND, "auth"); + if (!auth_check_token(as->username, given_token)) + return respond_403(connection); + + return MHD_NO; +} + static int ahc_derp (void *cls, struct MHD_Connection *connection, const char *url, const char *method, const char *version, const char *upload_data, size_t *upload_data_size, void **ptr) { @@ -632,6 +658,37 @@ ahc_derp (void *cls, struct MHD_Connection *connection, const char *url, const c } else { return respond_JSON_Failure(connection); } + } else if (strncmp(url, "/feedinfo", 9) == 0) { + ret = check_auth(connection, method, upload_data, upload_data_size, ptr); + if (ret == MHD_YES) + return MHD_YES; + + struct auth_state *as = (struct auth_state *) *ptr; + + if (url[9] != '/') + return respond_404(connection); + + ret = parse_url_info(url + 10, &info); + if ((ret & URL_INFO_NAME) == 0) + return respond_404(connection); + + yajl_gen g = yajl_gen_alloc(&yajl_c, NULL); + yajl_gen_map_open(g); + yajl_gen_string(g, "subscribed", 10); + yajl_gen_bool(g, is_subscribed(as->username, info.name)); + yajl_gen_map_close(g); + + const unsigned char *ybuf; + yajl_gen_get_buf(g, &ybuf, &len); + + response = MHD_create_response_from_data(len, (void *)ybuf, MHD_NO, MHD_YES); + ret = MHD_queue_response(connection, MHD_HTTP_OK, response); + MHD_destroy_response(response); + + yajl_gen_free(g); + free(as); + + return ret; } else { return respond_404(connection); }