Add /feedinfo endpoint
[blerg.git] / http / http_blerg.c
index e205749..65a63d2 100644 (file)
@@ -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);
        }