From 4df7069dcd17ac39c786ee6f21455c96e6a6dbf4 Mon Sep 17 00:00:00 2001 From: Phil Date: Sun, 12 Aug 2018 23:11:10 +0200 Subject: [PATCH] Changed Namestore API, changed error handling, changed gns record json --- src/gns/plugin_rest_gns.c | 62 +-- src/gns/test_plugin_rest_gns.sh | 22 +- src/json/json_generator.c | 32 +- src/json/json_gnsrecord.c | 8 +- src/namestore/plugin_rest_namestore.c | 407 +++++++++----------- src/namestore/test_plugin_rest_namestore.sh | 137 ++----- src/peerinfo/plugin_rest_peerinfo.c | 55 ++- 7 files changed, 329 insertions(+), 394 deletions(-) diff --git a/src/gns/plugin_rest_gns.c b/src/gns/plugin_rest_gns.c index fd2469577..0bf4198fc 100644 --- a/src/gns/plugin_rest_gns.c +++ b/src/gns/plugin_rest_gns.c @@ -30,14 +30,26 @@ #include "microhttpd.h" #include +/** + * Rest API GNS Namespace + */ #define GNUNET_REST_API_NS_GNS "/gns" - -#define GNUNET_REST_GNS_PARAM_NAME "name" - +/** + * Rest API GNS Parameter record_type + */ #define GNUNET_REST_GNS_PARAM_RECORD_TYPE "record_type" + +/** + * Rest API GNS ERROR Unknown Error + */ #define GNUNET_REST_GNS_ERROR_UNKNOWN "Unknown Error" +/** + * Rest API GNS ERROR Record not found + */ +#define GNUNET_REST_GNS_NOT_FOUND "Record not found" + /** * The configuration handle */ @@ -56,7 +68,9 @@ struct Plugin const struct GNUNET_CONFIGURATION_Handle *cfg; }; - +/** + * The request handle + */ struct RequestHandle { @@ -116,7 +130,7 @@ struct RequestHandle char *emsg; /** - * Reponse code + * Response code */ int response_code; @@ -214,7 +228,8 @@ handle_gns_response (void *cls, if (GNUNET_NO == was_gns) { - handle->emsg = GNUNET_strdup("Name not found in GNS"); + handle->response_code = MHD_HTTP_NOT_FOUND; + handle->emsg = GNUNET_strdup(GNUNET_REST_GNS_NOT_FOUND); GNUNET_SCHEDULER_add_now (&do_error, handle); return; } @@ -260,21 +275,24 @@ get_gns_cont (struct GNUNET_REST_RequestHandle *con_handle, char *record_type; char *name; - GNUNET_CRYPTO_hash (GNUNET_REST_GNS_PARAM_NAME, - strlen (GNUNET_REST_GNS_PARAM_NAME), - &key); - if ( GNUNET_NO - == GNUNET_CONTAINER_multihashmap_contains (con_handle->url_param_map, - &key)) + name = NULL; + handle->name = NULL; + if (strlen (GNUNET_REST_API_NS_GNS) < strlen (handle->url)) + { + name = &handle->url[strlen (GNUNET_REST_API_NS_GNS) + 1]; + } + + if (NULL == name) { - handle->emsg = GNUNET_strdup("Parameter name is missing"); + handle->response_code = MHD_HTTP_NOT_FOUND; + handle->emsg = GNUNET_strdup(GNUNET_REST_GNS_NOT_FOUND); GNUNET_SCHEDULER_add_now (&do_error, handle); return; } - name = GNUNET_CONTAINER_multihashmap_get (con_handle->url_param_map,&key); - if(0 >= strlen (name)) + if (0 >= strlen (name)) { - handle->emsg = GNUNET_strdup("Length of parameter name is zero"); + handle->response_code = MHD_HTTP_NOT_FOUND; + handle->emsg = GNUNET_strdup(GNUNET_REST_GNS_NOT_FOUND); GNUNET_SCHEDULER_add_now (&do_error, handle); return; } @@ -292,27 +310,17 @@ get_gns_cont (struct GNUNET_REST_RequestHandle *con_handle, handle->record_type = GNUNET_GNSRECORD_typename_to_number(record_type); } - if(UINT32_MAX == handle->record_type) { handle->record_type = GNUNET_GNSRECORD_TYPE_ANY; } - handle->gns = GNUNET_GNS_connect (cfg); - if (NULL == handle->gns) - { - handle->emsg = GNUNET_strdup ("GNS not available"); - GNUNET_SCHEDULER_add_now (&do_error, handle); - return; - } - handle->gns_lookup = GNUNET_GNS_lookup_with_tld (handle->gns, handle->name, handle->record_type, GNUNET_NO, &handle_gns_response, handle); - return; } @@ -397,7 +405,7 @@ rest_process_request(struct GNUNET_REST_RequestHandle *rest_handle, if (handle->url[strlen (handle->url)-1] == '/') handle->url[strlen (handle->url)-1] = '\0'; GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Connecting...\n"); - + handle->gns = GNUNET_GNS_connect (cfg); init_cont(handle); handle->timeout_task = diff --git a/src/gns/test_plugin_rest_gns.sh b/src/gns/test_plugin_rest_gns.sh index 7ede44501..ec495a04b 100755 --- a/src/gns/test_plugin_rest_gns.sh +++ b/src/gns/test_plugin_rest_gns.sh @@ -19,32 +19,32 @@ curl_get () { gnunet-identity -D "test_plugin_rest_gns" > /dev/null 2>&1 -curl_get "$gns_link?name=www.test_plugin_rest_gns" "error" +curl_get "$gns_link/www.test_plugin_rest_gns" "error" gnunet-identity -C "test_plugin_rest_gns" -curl_get "$gns_link?name=www.test_plugin_rest_gns" "\[\]" +curl_get "$gns_link/www.test_plugin_rest_gns" "\[\]" gnunet-namestore -z "test_plugin_rest_gns" -p -a -n www -e 1d -V 1.1.1.1 -t A -curl_get "$gns_link?name=www.test_plugin_rest_gns" "1.1.1.1" +curl_get "$gns_link/www.test_plugin_rest_gns" "1.1.1.1" gnunet-namestore -z "test_plugin_rest_gns" -p -a -n www -e 1d -V 1::1 -t AAAA -curl_get "$gns_link?name=www.test_plugin_rest_gns" "1::1.*1.1.1.1" +curl_get "$gns_link/www.test_plugin_rest_gns" "1::1.*1.1.1.1" gnunet-namestore -z "test_plugin_rest_gns" -p -a -n www -e 1d -V 1.1.1.2 -t A -curl_get "$gns_link?name=www.test_plugin_rest_gns" "1.1.1.2.*1::1.*1.1.1.1" -curl_get "$gns_link?name=www.test_plugin_rest_gns&record_type=A" "1.1.1.2.*1.1.1.1" -curl_get "$gns_link?name=www.test_plugin_rest_gns&record_type=AAAA" "1::1" -curl_get "$gns_link?name=www.test_plugin_rest_gns&record_type=WRONG_TYPE" "1.1.1.2.*1::1.*1.1.1.1" +curl_get "$gns_link/www.test_plugin_rest_gns" "1.1.1.2.*1::1.*1.1.1.1" +curl_get "$gns_link/www.test_plugin_rest_gns?record_type=A" "1.1.1.2.*1.1.1.1" +curl_get "$gns_link/www.test_plugin_rest_gns?record_type=AAAA" "1::1" +curl_get "$gns_link/www.test_plugin_rest_gns?record_type=WRONG_TYPE" "1.1.1.2.*1::1.*1.1.1.1" gnunet-namestore -z "test_plugin_rest_gns" -p -a -n www1 -e 1d -V 1.1.1.1 -t A -curl_get "$gns_link?name=www1.test_plugin_rest_gns" "1.1.1.1" +curl_get "$gns_link/www1.test_plugin_rest_gns" "1.1.1.1" -gnunet-identity -D "test_plugin_rest_gns" +gnunet-identity -D "test_plugin_rest_gns" > /dev/null 2>&1 -curl_get "$gns_link?name=www1.test_plugin_rest_gns" "error" +curl_get "$gns_link/www1.test_plugin_rest_gns" "error" exit 0 diff --git a/src/json/json_generator.c b/src/json/json_generator.c index d8c82bc86..0ffe5c643 100644 --- a/src/json/json_generator.c +++ b/src/json/json_generator.c @@ -182,12 +182,32 @@ GNUNET_JSON_from_gns_record (const char* rname, record_type_str = GNUNET_GNSRECORD_number_to_typename(rd->record_type); // ? for possible NULL values - ret = json_pack("{s:s?,s:s?,s:s?,s:i,s:s?}", - "value", value_str, - "type", record_type_str, - "expiration_time", expiration_time_str, - "flag", flags, - "label", rname); + if (NULL != rname) + { + ret = json_pack ("{s:s?,s:s?,s:s?,s:i,s:s?}", + "value", + value_str, + "record_type", + record_type_str, + "expiration_time", + expiration_time_str, + "flag", + flags, + "label", + rname); + } + else + { + ret = json_pack ("{s:s?,s:s?,s:s?,s:i}", + "value", + value_str, + "record_type", + record_type_str, + "expiration_time", + expiration_time_str, + "flag", + flags); + } GNUNET_free_non_null(value_str); return ret; } diff --git a/src/json/json_gnsrecord.c b/src/json/json_gnsrecord.c index 7bdf97f06..fe51119b1 100644 --- a/src/json/json_gnsrecord.c +++ b/src/json/json_gnsrecord.c @@ -26,10 +26,10 @@ #include "gnunet_json_lib.h" #define GNUNET_JSON_GNSRECORD_VALUE "value" -#define GNUNET_JSON_GNSRECORD_TYPE "type" +#define GNUNET_JSON_GNSRECORD_TYPE "record_type" #define GNUNET_JSON_GNSRECORD_EXPIRATION_TIME "expiration_time" #define GNUNET_JSON_GNSRECORD_FLAG "flag" -#define GNUNET_JSON_GNSRECORD_LABEL "label" +#define GNUNET_JSON_GNSRECORD_RECORD_NAME "record_name" #define GNUNET_JSON_GNSRECORD_NEVER "never" @@ -52,7 +52,7 @@ parse_gnsrecordobject (void *cls, const char *value; const char *expiration_time; const char *record_type; - const char *label; + const char *name; int flag; void *rdata = NULL; size_t rdata_size; @@ -71,7 +71,7 @@ parse_gnsrecordobject (void *cls, GNUNET_JSON_GNSRECORD_TYPE, &record_type, GNUNET_JSON_GNSRECORD_EXPIRATION_TIME, &expiration_time, GNUNET_JSON_GNSRECORD_FLAG, &flag, - GNUNET_JSON_GNSRECORD_LABEL, &label); + GNUNET_JSON_GNSRECORD_RECORD_NAME, &name); if (0 != unpack_state) { GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, diff --git a/src/namestore/plugin_rest_namestore.c b/src/namestore/plugin_rest_namestore.c index f14707cce..1d72d13ff 100644 --- a/src/namestore/plugin_rest_namestore.c +++ b/src/namestore/plugin_rest_namestore.c @@ -32,22 +32,40 @@ #include "microhttpd.h" #include - +/** + * Namestore Namespace + */ #define GNUNET_REST_API_NS_NAMESTORE "/namestore" -#define GNUNET_REST_SUBSYSTEM_NAMESTORE "namestore" /** - * Parameter names + * Error message Unknown Error */ -#define GNUNET_REST_API_PARAM_PUBKEY "pubkey" -#define GNUNET_REST_API_PARAM_NAME "name" +#define GNUNET_REST_NAMESTORE_ERROR_UNKNOWN "Unknown Error" /** - * Error messages + * Error message No identity found */ -#define GNUNET_REST_NAMESTORE_ERROR_UNKNOWN "Unknown Error" +#define GNUNET_REST_IDENTITY_NOT_FOUND "No identity found" -#define GNUNET_REST_NAMESTORE_RD_COUNT 1 +/** + * Error message No default zone specified + */ +#define GNUNET_REST_NAMESTORE_NO_DEFAULT_ZONE "No default zone specified" + +/** + * Error message Failed request + */ +#define GNUNET_REST_NAMESTORE_FAILED "Namestore action failed" + +/** + * Error message invalid data + */ +#define GNUNET_REST_NAMESTORE_INVALID_DATA "Data invalid" + +/** + * Error message No data + */ +#define GNUNET_REST_NAMESTORE_NO_DATA "No data" /** * State while collecting all egos @@ -107,13 +125,15 @@ struct EgoEntry struct GNUNET_IDENTITY_Ego *ego; }; - +/** + * The request handle + */ struct RequestHandle { /** * Records to store */ - char *label_name; + char *record_name; /** * Records to store @@ -211,7 +231,7 @@ struct RequestHandle char *emsg; /** - * Reponse code + * Response code */ int response_code; @@ -235,8 +255,8 @@ cleanup_handle (void *cls) GNUNET_SCHEDULER_cancel (handle->timeout_task); handle->timeout_task = NULL; } - if (NULL != handle->label_name) - GNUNET_free(handle->label_name); + if (NULL != handle->record_name) + GNUNET_free(handle->record_name); if (NULL != handle->url) GNUNET_free(handle->url); if (NULL != handle->emsg) @@ -318,20 +338,9 @@ do_error (void *cls) * @return EgoEntry or NULL if not found */ struct EgoEntry* -get_egoentry(struct RequestHandle *handle, char* pubkey, char *name) +get_egoentry_namestore(struct RequestHandle *handle, char *name) { struct EgoEntry *ego_entry; - if (NULL != pubkey) - { - for (ego_entry = handle->ego_head; - NULL != ego_entry; - ego_entry = ego_entry->next) - { - if (0 != strcasecmp (pubkey, ego_entry->keystring)) - continue; - return ego_entry; - } - } if (NULL != name) { for (ego_entry = handle->ego_head; @@ -349,17 +358,26 @@ get_egoentry(struct RequestHandle *handle, char* pubkey, char *name) /** * Does internal server error when iteration failed. + * + * @param cls the `struct RequestHandle` */ static void namestore_iteration_error (void *cls) { struct RequestHandle *handle = cls; - struct MHD_Response *resp = GNUNET_REST_create_response (NULL); - handle->proc (handle->proc_cls, resp, MHD_HTTP_INTERNAL_SERVER_ERROR); - GNUNET_SCHEDULER_add_now (&cleanup_handle, handle); + handle->emsg = GNUNET_strdup(GNUNET_REST_NAMESTORE_FAILED); + GNUNET_SCHEDULER_add_now (&do_error, handle); + return; } +/** + * Create finished callback + * + * @param cls the `struct RequestHandle` + * @param success the success indicating integer, GNUNET_OK on success + * @param emsg the error message (can be NULL) + */ static void create_finished (void *cls, int32_t success, const char *emsg) { @@ -369,6 +387,12 @@ create_finished (void *cls, int32_t success, const char *emsg) handle->add_qe = NULL; if (GNUNET_YES != success) { + if (NULL != emsg) + { + handle->emsg = GNUNET_strdup(emsg); + GNUNET_SCHEDULER_add_now (&do_error, handle); + return; + } handle->emsg = GNUNET_strdup("Error storing records"); GNUNET_SCHEDULER_add_now (&do_error, handle); return; @@ -379,6 +403,13 @@ create_finished (void *cls, int32_t success, const char *emsg) } +/** + * Delete finished callback + * + * @param cls the `struct RequestHandle` + * @param success the success indicating integer, GNUNET_OK on success + * @param emsg the error message (can be NULL) + */ static void del_finished (void *cls, int32_t success, const char *emsg) { @@ -387,12 +418,19 @@ del_finished (void *cls, int32_t success, const char *emsg) handle->add_qe = NULL; if (GNUNET_NO == success) { - handle->emsg = GNUNET_strdup("Deleting record failed. Record does not exist"); + handle->response_code = MHD_HTTP_NOT_FOUND; + handle->emsg = GNUNET_strdup("No record found"); GNUNET_SCHEDULER_add_now (&do_error, handle); return; } if (GNUNET_SYSERR == success) { + if (NULL != emsg) + { + handle->emsg = GNUNET_strdup(emsg); + GNUNET_SCHEDULER_add_now (&do_error, handle); + return; + } handle->emsg = GNUNET_strdup("Deleting record failed"); GNUNET_SCHEDULER_add_now (&do_error, handle); return; @@ -452,17 +490,6 @@ namestore_list_iteration (void *cls, if (NULL == handle->resp_object) handle->resp_object = json_array(); - /*if ( (NULL != handle->ego_entry->identifier) && - (0 != strcmp (handle->ego_entry->identifier, - rname)) ) - { - GNUNET_log (GNUNET_ERROR_TYPE_ERROR, - "%s does not match %s\n", rname, - handle->ego_entry->identifier); - GNUNET_NAMESTORE_zone_iterator_next (handle->list_it, 1); - return; - }*/ - for (unsigned int i = 0; i < rd_len; i++) { if ( (GNUNET_GNSRECORD_TYPE_NICK == rd[i].record_type) && @@ -495,40 +522,22 @@ namestore_get (struct GNUNET_REST_RequestHandle *con_handle, void *cls) { struct RequestHandle *handle = cls; - struct EgoEntry *ego_entry = NULL; - struct GNUNET_HashCode key; - char *pubkey = NULL; - char *name = NULL; - - //change zone if pubkey or name specified - GNUNET_CRYPTO_hash (GNUNET_REST_API_PARAM_PUBKEY, - strlen (GNUNET_REST_API_PARAM_PUBKEY), - &key); - if ( GNUNET_YES - == GNUNET_CONTAINER_multihashmap_contains (con_handle->url_param_map, - &key)) - { - pubkey = GNUNET_CONTAINER_multihashmap_get (con_handle->url_param_map, - &key); - } - GNUNET_CRYPTO_hash (GNUNET_REST_API_PARAM_NAME, - strlen (GNUNET_REST_API_PARAM_NAME), - &key); - if ( GNUNET_YES - == GNUNET_CONTAINER_multihashmap_contains (con_handle->url_param_map, - &key)) - { - name = GNUNET_CONTAINER_multihashmap_get (con_handle->url_param_map, - &key); - } + struct EgoEntry *ego_entry; + char *egoname; + + egoname = NULL; + ego_entry = NULL; - ego_entry = get_egoentry(handle,pubkey,name); - if (NULL == ego_entry) + //set zone to name if given + if (strlen (GNUNET_REST_API_NS_NAMESTORE) < strlen (handle->url)) { - if (NULL != pubkey || NULL != name) + egoname = &handle->url[strlen (GNUNET_REST_API_NS_NAMESTORE)+1]; + ego_entry = get_egoentry_namestore(handle, egoname); + + if (NULL == ego_entry) { - handle->emsg = GNUNET_strdup("Invalid identity"); handle->response_code = MHD_HTTP_NOT_FOUND; + handle->emsg = GNUNET_strdup(GNUNET_REST_IDENTITY_NOT_FOUND); GNUNET_SCHEDULER_add_now (&do_error, handle); return; } @@ -537,6 +546,12 @@ namestore_get (struct GNUNET_REST_RequestHandle *con_handle, { handle->zone_pkey = GNUNET_IDENTITY_ego_get_private_key(ego_entry->ego); } + if (NULL == handle->zone_pkey) + { + handle->emsg = GNUNET_strdup(GNUNET_REST_NAMESTORE_NO_DEFAULT_ZONE); + GNUNET_SCHEDULER_add_now (&do_error, handle); + return; + } handle->list_it = GNUNET_NAMESTORE_zone_iteration_start (handle->ns_handle, handle->zone_pkey, &namestore_iteration_error, @@ -545,53 +560,15 @@ namestore_get (struct GNUNET_REST_RequestHandle *con_handle, handle, &namestore_list_finished, handle); -} - - -/** - * We're storing a new record; this requires - * that no record already exists - * - * @param cls closure, unused - * @param zone_key private key of the zone - * @param rec_name name that is being mapped (at most 255 characters long) - * @param rd_count number of entries in @a rd array - * @param rd array of records with data to store - */ -static void -create_new_record_cont (void *cls, - const struct GNUNET_CRYPTO_EcdsaPrivateKey *zone_key, - const char *rec_name, - unsigned int rd_count, - const struct GNUNET_GNSRECORD_Data *rd) -{ - struct RequestHandle *handle = cls; - - handle->add_qe = NULL; - if (0 != strcmp (rec_name, handle->label_name)) + if (NULL == handle->list_it) { - GNUNET_break (0); + handle->emsg = GNUNET_strdup(GNUNET_REST_NAMESTORE_FAILED); GNUNET_SCHEDULER_add_now (&do_error, handle); return; } - - if (0 != rd_count) - { - handle->proc (handle->proc_cls, - GNUNET_REST_create_response (NULL), - MHD_HTTP_CONFLICT); - GNUNET_SCHEDULER_add_now (&cleanup_handle, handle); - return; - } - handle->add_qe = GNUNET_NAMESTORE_records_store (handle->ns_handle, - handle->zone_pkey, - handle->label_name, - GNUNET_REST_NAMESTORE_RD_COUNT, - handle->rd, - &create_finished, - handle); } + /** * Handle namestore POST request * @@ -606,30 +583,21 @@ namestore_add (struct GNUNET_REST_RequestHandle *con_handle, { struct RequestHandle *handle = cls; struct GNUNET_GNSRECORD_Data *gns_record; + struct EgoEntry *ego_entry; + char *egoname; json_t *data_js; json_t *name_json; json_error_t err; - - struct EgoEntry *ego_entry = NULL; - struct GNUNET_HashCode key; - char *pubkey = NULL; - char *name = NULL; - char term_data[handle->rest_handle->data_size + 1]; + struct GNUNET_JSON_Specification gnsspec[] = { GNUNET_JSON_spec_gnsrecord_data(&gns_record), GNUNET_JSON_spec_end () }; - if (strlen (GNUNET_REST_API_NS_NAMESTORE) != strlen (handle->url)) - { - handle->emsg = GNUNET_strdup("Wrong URL"); - GNUNET_SCHEDULER_add_now (&do_error, handle); - return; - } if (0 >= handle->rest_handle->data_size) { - handle->emsg = GNUNET_strdup("No data"); + handle->emsg = GNUNET_strdup(GNUNET_REST_NAMESTORE_NO_DATA); GNUNET_SCHEDULER_add_now (&do_error, handle); return; } @@ -639,7 +607,7 @@ namestore_add (struct GNUNET_REST_RequestHandle *con_handle, data_js = json_loads (term_data, JSON_DECODE_ANY, &err); if (GNUNET_OK != GNUNET_JSON_parse (data_js, gnsspec, NULL, NULL)) { - handle->emsg = GNUNET_strdup("Invalid data"); + handle->emsg = GNUNET_strdup(GNUNET_REST_NAMESTORE_INVALID_DATA); GNUNET_SCHEDULER_add_now (&do_error, handle); GNUNET_JSON_parse_free(gnsspec); json_decref (data_js); @@ -647,109 +615,74 @@ namestore_add (struct GNUNET_REST_RequestHandle *con_handle, } handle->rd = gns_record; - name_json = json_object_get(data_js, "label"); + name_json = json_object_get(data_js, "record_name"); if (!json_is_string(name_json)) { - handle->emsg = GNUNET_strdup("Missing name"); + handle->emsg = GNUNET_strdup(GNUNET_REST_NAMESTORE_INVALID_DATA); GNUNET_SCHEDULER_add_now (&do_error, handle); json_decref (data_js); return; } - handle->label_name = GNUNET_strdup(json_string_value(name_json)); - if(NULL == handle->label_name) + handle->record_name = GNUNET_strdup(json_string_value(name_json)); + if(NULL == handle->record_name) { - handle->emsg = GNUNET_strdup("Missing name"); + handle->emsg = GNUNET_strdup(GNUNET_REST_NAMESTORE_INVALID_DATA); GNUNET_SCHEDULER_add_now (&do_error, handle); json_decref (data_js); return; } - if (0 >= strlen(handle->label_name)) + if (0 >= strlen(handle->record_name)) { - handle->emsg = GNUNET_strdup("Missing name"); + handle->emsg = GNUNET_strdup(GNUNET_REST_NAMESTORE_INVALID_DATA); GNUNET_SCHEDULER_add_now (&do_error, handle); json_decref (data_js); return; } json_decref (data_js); - //change zone if pubkey or name specified - GNUNET_CRYPTO_hash (GNUNET_REST_API_PARAM_PUBKEY, - strlen (GNUNET_REST_API_PARAM_PUBKEY), - &key); - if ( GNUNET_YES - == GNUNET_CONTAINER_multihashmap_contains (con_handle->url_param_map, - &key)) - { - pubkey = GNUNET_CONTAINER_multihashmap_get (con_handle->url_param_map, - &key); - } - GNUNET_CRYPTO_hash (GNUNET_REST_API_PARAM_NAME, - strlen (GNUNET_REST_API_PARAM_NAME), - &key); - if ( GNUNET_YES - == GNUNET_CONTAINER_multihashmap_contains (con_handle->url_param_map, - &key)) - { - name = GNUNET_CONTAINER_multihashmap_get (con_handle->url_param_map, - &key); - } + egoname = NULL; + ego_entry = NULL; - ego_entry = get_egoentry(handle,pubkey,name); - if (NULL == ego_entry) + //set zone to name if given + if (strlen (GNUNET_REST_API_NS_NAMESTORE) < strlen (handle->url)) { - if (NULL != pubkey || NULL != name) + egoname = &handle->url[strlen (GNUNET_REST_API_NS_NAMESTORE)+1]; + ego_entry = get_egoentry_namestore(handle, egoname); + + if (NULL == ego_entry) { - handle->emsg = GNUNET_strdup("Invalid identity"); handle->response_code = MHD_HTTP_NOT_FOUND; + handle->emsg = GNUNET_strdup(GNUNET_REST_IDENTITY_NOT_FOUND); GNUNET_SCHEDULER_add_now (&do_error, handle); return; } } - if ( NULL != ego_entry ) + if (NULL != ego_entry) { handle->zone_pkey = GNUNET_IDENTITY_ego_get_private_key(ego_entry->ego); } if (NULL == handle->zone_pkey) { - handle->emsg = GNUNET_strdup("No default identity for namestore"); + handle->emsg = GNUNET_strdup(GNUNET_REST_NAMESTORE_NO_DEFAULT_ZONE); GNUNET_SCHEDULER_add_now (&do_error, handle); return; } - handle->add_qe = GNUNET_NAMESTORE_records_lookup (handle->ns_handle, + handle->add_qe = GNUNET_NAMESTORE_records_store (handle->ns_handle, handle->zone_pkey, - handle->label_name, - &do_error, - handle, - &create_new_record_cont, + handle->record_name, + 1, + handle->rd, + &create_finished, handle); -} - - -static void -del_cont (void *cls, - const struct GNUNET_CRYPTO_EcdsaPrivateKey *zone, - const char *label, - unsigned int rd_count, - const struct GNUNET_GNSRECORD_Data *rd) -{ - struct RequestHandle *handle = cls; - - handle->add_qe = NULL; - if (0 == rd_count) + if (NULL == handle->add_qe) { - handle->emsg = GNUNET_strdup("Record not found"); + handle->emsg = GNUNET_strdup(GNUNET_REST_NAMESTORE_FAILED); GNUNET_SCHEDULER_add_now (&do_error, handle); return; } - - handle->add_qe = GNUNET_NAMESTORE_records_store (handle->ns_handle, - handle->zone_pkey, - handle->label_name, - 0, NULL, - &del_finished, - handle); } + /** * Handle namestore DELETE request * @@ -764,39 +697,22 @@ namestore_delete (struct GNUNET_REST_RequestHandle *con_handle, { struct RequestHandle *handle = cls; struct GNUNET_HashCode key; - struct EgoEntry *ego_entry = NULL; - char *pubkey = NULL; - char *name = NULL; - - //change zone if pubkey or name specified - GNUNET_CRYPTO_hash (GNUNET_REST_API_PARAM_PUBKEY, - strlen (GNUNET_REST_API_PARAM_PUBKEY), - &key); - if ( GNUNET_YES - == GNUNET_CONTAINER_multihashmap_contains (con_handle->url_param_map, - &key)) - { - pubkey = GNUNET_CONTAINER_multihashmap_get (con_handle->url_param_map, - &key); - } - GNUNET_CRYPTO_hash (GNUNET_REST_API_PARAM_NAME, - strlen (GNUNET_REST_API_PARAM_NAME), - &key); - if ( GNUNET_YES - == GNUNET_CONTAINER_multihashmap_contains (con_handle->url_param_map, - &key)) - { - name = GNUNET_CONTAINER_multihashmap_get (con_handle->url_param_map, - &key); - } + struct EgoEntry *ego_entry; + char *egoname; + + egoname = NULL; + ego_entry = NULL; - ego_entry = get_egoentry(handle,pubkey,name); - if (NULL == ego_entry) + //set zone to name if given + if (strlen (GNUNET_REST_API_NS_NAMESTORE) < strlen (handle->url)) { - if (NULL != pubkey || NULL != name) + egoname = &handle->url[strlen (GNUNET_REST_API_NS_NAMESTORE)+1]; + ego_entry = get_egoentry_namestore(handle, egoname); + + if (NULL == ego_entry) { - handle->emsg = GNUNET_strdup("Invalid identity"); handle->response_code = MHD_HTTP_NOT_FOUND; + handle->emsg = GNUNET_strdup(GNUNET_REST_IDENTITY_NOT_FOUND); GNUNET_SCHEDULER_add_now (&do_error, handle); return; } @@ -806,33 +722,38 @@ namestore_delete (struct GNUNET_REST_RequestHandle *con_handle, handle->zone_pkey = GNUNET_IDENTITY_ego_get_private_key(ego_entry->ego); } - GNUNET_CRYPTO_hash ("label", strlen ("label"), &key); + GNUNET_CRYPTO_hash ("record_name", strlen ("record_name"), &key); if ( GNUNET_NO == GNUNET_CONTAINER_multihashmap_contains (con_handle->url_param_map, &key)) { - handle->emsg = GNUNET_strdup("Missing name"); + handle->emsg = GNUNET_strdup(GNUNET_REST_NAMESTORE_INVALID_DATA); GNUNET_SCHEDULER_add_now (&do_error, handle); return; } - handle->label_name = GNUNET_strdup( + handle->record_name = GNUNET_strdup( GNUNET_CONTAINER_multihashmap_get (con_handle->url_param_map, &key)); if (NULL == handle->zone_pkey) { - handle->emsg = GNUNET_strdup("No default identity for namestore"); + handle->emsg = GNUNET_strdup(GNUNET_REST_NAMESTORE_NO_DEFAULT_ZONE); GNUNET_SCHEDULER_add_now (&do_error, handle); return; } - handle->add_qe = GNUNET_NAMESTORE_records_lookup (handle->ns_handle, - handle->zone_pkey, - handle->label_name, - &do_error, - handle, - &del_cont, - handle); - + handle->add_qe = GNUNET_NAMESTORE_records_store (handle->ns_handle, + handle->zone_pkey, + handle->record_name, + 0, + NULL, + &del_finished, + handle); + if (NULL == handle->add_qe) + { + handle->emsg = GNUNET_strdup(GNUNET_REST_NAMESTORE_FAILED); + GNUNET_SCHEDULER_add_now (&do_error, handle); + return; + } } @@ -916,7 +837,35 @@ default_ego_cb (void *cls, /** - * Connect to identity callback + * This function is initially called for all egos and then again + * whenever a ego's identifier changes or if it is deleted. At the + * end of the initial pass over all egos, the function is once called + * with 'NULL' for 'ego'. That does NOT mean that the callback won't + * be invoked in the future or that there was an error. + * + * When used with 'GNUNET_IDENTITY_create' or 'GNUNET_IDENTITY_get', + * this function is only called ONCE, and 'NULL' being passed in + * 'ego' does indicate an error (i.e. name is taken or no default + * value is known). If 'ego' is non-NULL and if '*ctx' + * is set in those callbacks, the value WILL be passed to a subsequent + * call to the identity callback of 'GNUNET_IDENTITY_connect' (if + * that one was not NULL). + * + * When an identity is renamed, this function is called with the + * (known) ego but the NEW identifier. + * + * When an identity is deleted, this function is called with the + * (known) ego and "NULL" for the 'identifier'. In this case, + * the 'ego' is henceforth invalid (and the 'ctx' should also be + * cleaned up). + * + * @param cls closure + * @param ego ego handle + * @param ctx context for application to store data for this ego + * (during the lifetime of this process, initially NULL) + * @param name identifier assigned by the user for this ego, + * NULL if the user just deleted the ego and it + * must thus no longer be used */ static void id_connect_cb (void *cls, @@ -931,7 +880,7 @@ id_connect_cb (void *cls, if ((NULL == ego) && (NULL == handle->zone_pkey)) { handle->op = GNUNET_IDENTITY_get (handle->identity_handle, - GNUNET_REST_SUBSYSTEM_NAMESTORE, + "namestore", &default_ego_cb, handle); } diff --git a/src/namestore/test_plugin_rest_namestore.sh b/src/namestore/test_plugin_rest_namestore.sh index de02dfafc..532c7caae 100755 --- a/src/namestore/test_plugin_rest_namestore.sh +++ b/src/namestore/test_plugin_rest_namestore.sh @@ -11,7 +11,7 @@ curl_get () { #$1 is link #$2 is grep cache="$(curl -v "$1" 2>&1 | grep "$2")" - #echo $cache + echo $cache if [ "" == "$cache" ] then exit 1 @@ -23,7 +23,7 @@ curl_post () { #$2 is data #$3 is grep cache="$(curl -v -X "POST" "$1" --data "$2" 2>&1 | grep "$3")" - #echo $cache + echo $cache if [ "" == "$cache" ] then exit 1 @@ -34,7 +34,7 @@ curl_delete () { #$1 is link #$2 is grep cache="$(curl -v -X "DELETE" "$1" 2>&1 | grep "$2")" - #echo $cache + echo $cache if [ "" == "$cache" ] then exit 1 @@ -64,141 +64,80 @@ public="$(gnunet-identity -d | grep "test_plugin_rest_namestore" | awk 'NR==1{pr if [ "" == "$test" ] then #if no entries for test_plugin_rest_namestore - curl_get "${namestore_link}?name=$name" "error" - curl_get "${namestore_link}?name=" "error" - curl_get "${namestore_link}?name=$public" "error" - - curl_get "${namestore_link}?pubkey=$public" "error" - curl_get "${namestore_link}?pubkey=$name" "error" - curl_get "${namestore_link}?pubkey=" "error" + curl_get "${namestore_link}/$name" "error" + curl_get "${namestore_link}/" "error" + curl_get "${namestore_link}/$public" "error" else #if entries exists (that should not be possible) curl_get "${namestore_link}" "HTTP/1.1 200 OK" - curl_get "${namestore_link}?name=$name" "HTTP/1.1 200 OK" - curl_get "${namestore_link}?name=" "error" - curl_get "${namestore_link}?name=$public" "error" - - curl_get "${namestore_link}?pubkey=$public" "HTTP/1.1 200 OK" - curl_get "${namestore_link}?pubkey=$name" "error" - curl_get "${namestore_link}?pubkey=" "error" + curl_get "${namestore_link}/$name" "HTTP/1.1 200 OK" + curl_get "${namestore_link}/" "error" + curl_get "${namestore_link}/$public" "error" fi gnunet-namestore -z $name -p -a -n "test_entry" -e "1d" -V "HVX38H2CB7WJM0WCPWT9CFX6GASMYJVR65RN75SJSSKAYVYXHMRG" -t "PKEY" curl_get "${namestore_link}" "HTTP/1.1 200 OK" -curl_get "${namestore_link}?name=$name" "HTTP/1.1 200 OK" -curl_get "${namestore_link}?name=" "error" -curl_get "${namestore_link}?name=$public" "error" -curl_get "${namestore_link}?pubkey=$public" "HTTP/1.1 200 OK" -curl_get "${namestore_link}?pubkey=$name" "error" -curl_get "${namestore_link}?pubkey=" "error" +curl_get "${namestore_link}/$name" "HTTP/1.1 200 OK" +curl_get "${namestore_link}/" "error" +curl_get "${namestore_link}/$public" "error" gnunet-namestore -z $name -d -n "test_entry" #Test POST with NAME -curl_post "${namestore_link}?name=$name" '{"value":"HVX38H2CB7WJM0WCPWT9CFX6GASMYJVR65RN75SJSSKAYVYXHMRG", "type":"PKEY", "expiration_time":"1d","flag":0,"label":"test_entry"}' "HTTP/1.1 204 No Content" +curl_post "${namestore_link}/$name" '{"value":"HVX38H2CB7WJM0WCPWT9CFX6GASMYJVR65RN75SJSSKAYVYXHMRG", "record_type":"PKEY", "expiration_time":"1d","flag":0,"record_name":"test_entry"}' "HTTP/1.1 204 No Content" gnunet-namestore -z $name -d -n "test_entry" > /dev/null 2>&1 #value -curl_post "${namestore_link}?name=$name" '{"value":"HVX38H2CB7WJM0WCPWT9CFX6GASMYJVR65RN75SJSSKAYVYXHMRGxxx", "type":"PKEY", "expiration_time":"1d","flag":0,"label":"test_entry"}' "error" +curl_post "${namestore_link}/$name" '{"value":"HVX38H2CB7WJM0WCPWT9CFX6GASMYJVR65RN75SJSSKAYVYXHMRGxxx", "record_type":"PKEY", "expiration_time":"1d","flag":0,"record_name":"test_entry"}' "error" gnunet-namestore -z $name -d -n "test_entry" > /dev/null 2>&1 -curl_post "${namestore_link}?name=$name" '{"value":"", "type":"PKEY", "expiration_time":"1d","flag":0,"label":"test_entry"}' "error" +curl_post "${namestore_link}/$name" '{"value":"", "record_type":"PKEY", "expiration_time":"1d","flag":0,"record_name":"test_entry"}' "error" gnunet-namestore -z $name -d -n "test_entry" > /dev/null 2>&1 -curl_post "${namestore_link}?name=$name" '{"value_missing":"HVX38H2CB7WJM0WCPWT9CFX6GASMYJVR65RN75SJSSKAYVYXHMRGxxx", "type":"PKEY", "expiration_time":"1d","flag":0,"label":"test_entry"}' "error" +curl_post "${namestore_link}/$name" '{"value_missing":"HVX38H2CB7WJM0WCPWT9CFX6GASMYJVR65RN75SJSSKAYVYXHMRGxxx", "record_type":"PKEY", "expiration_time":"1d","flag":0,"record_name":"test_entry"}' "error" gnunet-namestore -z $name -d -n "test_entry" > /dev/null 2>&1 #time -curl_post "${namestore_link}?name=$name" '{"value":"HVX38H2CB7WJM0WCPWT9CFX6GASMYJVR65RN75SJSSKAYVYXHMRG", "type":"PKEY", "expiration_time":"0d","flag":0,"label":"test_entry"}' "HTTP/1.1 204" +curl_post "${namestore_link}/$name" '{"value":"HVX38H2CB7WJM0WCPWT9CFX6GASMYJVR65RN75SJSSKAYVYXHMRG", "record_type":"PKEY", "expiration_time":"0d","flag":0,"record_name":"test_entry"}' "HTTP/1.1 204" gnunet-namestore -z $name -d -n "test_entry" > /dev/null 2>&1 -curl_post "${namestore_link}?name=$name" '{"value":"HVX38H2CB7WJM0WCPWT9CFX6GASMYJVR65RN75SJSSKAYVYXHMRG", "type":"PKEY", "expiration_time":"10000d","flag":0,"label":"test_entry"}' "HTTP/1.1 204" +curl_post "${namestore_link}/$name" '{"value":"HVX38H2CB7WJM0WCPWT9CFX6GASMYJVR65RN75SJSSKAYVYXHMRG", "record_type":"PKEY", "expiration_time":"10000d","flag":0,"record_name":"test_entry"}' "HTTP/1.1 204" gnunet-namestore -z $name -d -n "test_entry" > /dev/null 2>&1 -curl_post "${namestore_link}?name=$name" '{"value":"HVX38H2CB7WJM0WCPWT9CFX6GASMYJVR65RN75SJSSKAYVYXHMRG", "type":"PKEY", "expiration_time":"now","flag":0,"label":"test_entry"}' "error" +curl_post "${namestore_link}/$name" '{"value":"HVX38H2CB7WJM0WCPWT9CFX6GASMYJVR65RN75SJSSKAYVYXHMRG", "record_type":"PKEY", "expiration_time":"now","flag":0,"record_name":"test_entry"}' "error" gnunet-namestore -z $name -d -n "test_entry" > /dev/null 2>&1 -curl_post "${namestore_link}?name=$name" '{"value":"HVX38H2CB7WJM0WCPWT9CFX6GASMYJVR65RN75SJSSKAYVYXHMRG", "type":"PKEY", "expiration_time":"","flag":0,"label":"test_entry"}' "error" +curl_post "${namestore_link}/$name" '{"value":"HVX38H2CB7WJM0WCPWT9CFX6GASMYJVR65RN75SJSSKAYVYXHMRG", "record_type":"PKEY", "expiration_time":"","flag":0,"record_name":"test_entry"}' "error" gnunet-namestore -z $name -d -n "test_entry" > /dev/null 2>&1 -curl_post "${namestore_link}?name=$name" '{"value":"HVX38H2CB7WJM0WCPWT9CFX6GASMYJVR65RN75SJSSKAYVYXHMRG", "type":"PKEY", "expiration_time_missing":"1d","flag":0,"label":"test_entry"}' "error" +curl_post "${namestore_link}/$name" '{"value":"HVX38H2CB7WJM0WCPWT9CFX6GASMYJVR65RN75SJSSKAYVYXHMRG", "record_type":"PKEY", "expiration_time_missing":"1d","flag":0,"record_name":"test_entry"}' "error" gnunet-namestore -z $name -d -n "test_entry" > /dev/null 2>&1 #flag -curl_post "${namestore_link}?name=$name" '{"value":"HVX38H2CB7WJM0WCPWT9CFX6GASMYJVR65RN75SJSSKAYVYXHMRG", "type":"PKEY", "expiration_time":"1d","flag":0,"label":"test_entry"}' "HTTP/1.1 204 No Content" +curl_post "${namestore_link}/$name" '{"value":"HVX38H2CB7WJM0WCPWT9CFX6GASMYJVR65RN75SJSSKAYVYXHMRG", "record_type":"PKEY", "expiration_time":"1d","flag":0,"record_name":"test_entry"}' "HTTP/1.1 204 No Content" gnunet-namestore -z $name -d -n "test_entry" > /dev/null 2>&1 -curl_post "${namestore_link}?name=$name" '{"value":"HVX38H2CB7WJM0WCPWT9CFX6GASMYJVR65RN75SJSSKAYVYXHMRG", "type":"PKEY", "expiration_time":"1d","flag":2,"label":"test_entry"}' "HTTP/1.1 204 No Content" +curl_post "${namestore_link}/$name" '{"value":"HVX38H2CB7WJM0WCPWT9CFX6GASMYJVR65RN75SJSSKAYVYXHMRG", "record_type":"PKEY", "expiration_time":"1d","flag":2,"record_name":"test_entry"}' "HTTP/1.1 204 No Content" gnunet-namestore -z $name -d -n "test_entry" > /dev/null 2>&1 -curl_post "${namestore_link}?name=$name" '{"value":"HVX38H2CB7WJM0WCPWT9CFX6GASMYJVR65RN75SJSSKAYVYXHMRG", "type":"PKEY", "expiration_time":"1d","flag":8,"label":"test_entry"}' "HTTP/1.1 204 No Content" +curl_post "${namestore_link}/$name" '{"value":"HVX38H2CB7WJM0WCPWT9CFX6GASMYJVR65RN75SJSSKAYVYXHMRG", "record_type":"PKEY", "expiration_time":"1d","flag":8,"record_name":"test_entry"}' "HTTP/1.1 204 No Content" gnunet-namestore -z $name -d -n "test_entry" > /dev/null 2>&1 -curl_post "${namestore_link}?name=$name" '{"value":"HVX38H2CB7WJM0WCPWT9CFX6GASMYJVR65RN75SJSSKAYVYXHMRG", "type":"PKEY", "expiration_time":"1d","flag":16,"label":"test_entry"}' "HTTP/1.1 204 No Content" +curl_post "${namestore_link}/$name" '{"value":"HVX38H2CB7WJM0WCPWT9CFX6GASMYJVR65RN75SJSSKAYVYXHMRG", "record_type":"PKEY", "expiration_time":"1d","flag":16,"record_name":"test_entry"}' "HTTP/1.1 204 No Content" gnunet-namestore -z $name -d -n "test_entry" > /dev/null 2>&1 -curl_post "${namestore_link}?name=$name" '{"value":"HVX38H2CB7WJM0WCPWT9CFX6GASMYJVR65RN75SJSSKAYVYXHMRG", "type":"PKEY", "expiration_time":"1d","flag":-1,"label":"test_entry"}' "error" +curl_post "${namestore_link}/$name" '{"value":"HVX38H2CB7WJM0WCPWT9CFX6GASMYJVR65RN75SJSSKAYVYXHMRG", "record_type":"PKEY", "expiration_time":"1d","flag":-1,"record_name":"test_entry"}' "error" gnunet-namestore -z $name -d -n "test_entry" > /dev/null 2>&1 -curl_post "${namestore_link}?name=$name" '{"value":"HVX38H2CB7WJM0WCPWT9CFX6GASMYJVR65RN75SJSSKAYVYXHMRG", "type":"PKEY", "expiration_time":"1d","flag":"Test","label":"test_entry"}' "error" +curl_post "${namestore_link}/$name" '{"value":"HVX38H2CB7WJM0WCPWT9CFX6GASMYJVR65RN75SJSSKAYVYXHMRG", "record_type":"PKEY", "expiration_time":"1d","flag":"Test","record_name":"test_entry"}' "error" gnunet-namestore -z $name -d -n "test_entry" > /dev/null 2>&1 -curl_post "${namestore_link}?name=$name" '{"value":"HVX38H2CB7WJM0WCPWT9CFX6GASMYJVR65RN75SJSSKAYVYXHMRG", "type":"PKEY", "expiration_time":"1d","flag":,"label":"test_entry"}' "error" +curl_post "${namestore_link}/$name" '{"value":"HVX38H2CB7WJM0WCPWT9CFX6GASMYJVR65RN75SJSSKAYVYXHMRG", "record_type":"PKEY", "expiration_time":"1d","flag":,"record_name":"test_entry"}' "error" gnunet-namestore -z $name -d -n "test_entry" > /dev/null 2>&1 -curl_post "${namestore_link}?name=$name" '{"value":"HVX38H2CB7WJM0WCPWT9CFX6GASMYJVR65RN75SJSSKAYVYXHMRG", "type":"PKEY", "expiration_time":"1d","flag_missing":0,"label":"test_entry"}' "error" +curl_post "${namestore_link}/$name" '{"value":"HVX38H2CB7WJM0WCPWT9CFX6GASMYJVR65RN75SJSSKAYVYXHMRG", "record_type":"PKEY", "expiration_time":"1d","flag_missing":0,"record_name":"test_entry"}' "error" gnunet-namestore -z $name -d -n "test_entry" > /dev/null 2>&1 -#label -curl_post "${namestore_link}?name=$name" '{"value":"HVX38H2CB7WJM0WCPWT9CFX6GASMYJVR65RN75SJSSKAYVYXHMRG", "type":"PKEY", "expiration_time":"1d","flag":0,"label":"test_entry"}' "HTTP/1.1 204 No Content" -curl_post "${namestore_link}?name=$name" '{"value":"HVX38H2CB7WJM0WCPWT9CFX6GASMYJVR65RN75SJSSKAYVYXHMRG", "type":"PKEY", "expiration_time":"1d","flag":0,"label":"test_entry"}' "HTTP/1.1 409" +#record_name +curl_post "${namestore_link}/$name" '{"value":"HVX38H2CB7WJM0WCPWT9CFX6GASMYJVR65RN75SJSSKAYVYXHMRG", "record_type":"PKEY", "expiration_time":"1d","flag":0,"record_name":"test_entry"}' "HTTP/1.1 204 No Content" +curl_post "${namestore_link}/$name" '{"value":"HVX38H2CB7WJM0WCPWT9CFX6GASMYJVR65RN75SJSSKAYVYXHMRG", "record_type":"PKEY", "expiration_time":"1d","flag":0,"record_name":"test_entry"}' "HTTP/1.1 204 No Content" gnunet-namestore -z $name -d -n "test_entry" > /dev/null 2>&1 -curl_post "${namestore_link}?name=$name" '{"value":"HVX38H2CB7WJM0WCPWT9CFX6GASMYJVR65RN75SJSSKAYVYXHMRG", "type":"PKEY", "expiration_time":"1d","flag":0,"label":""}' "error" +curl_post "${namestore_link}/$name" '{"value":"HVX38H2CB7WJM0WCPWT9CFX6GASMYJVR65RN75SJSSKAYVYXHMRG", "record_type":"PKEY", "expiration_time":"1d","flag":0,"record_name":""}' "error" gnunet-namestore -z $name -d -n "test_entry" > /dev/null 2>&1 -curl_post "${namestore_link}?name=$name" '{"value":"HVX38H2CB7WJM0WCPWT9CFX6GASMYJVR65RN75SJSSKAYVYXHMRG", "type":"PKEY", "expiration_time":"1d","flag":0,"label_missing":"test_entry"}' "error" -gnunet-namestore -z $name -d -n "test_entry" > /dev/null 2>&1 - -#Test POST with PUBKEY -curl_post "${namestore_link}?pubkey=$public" '{"value":"HVX38H2CB7WJM0WCPWT9CFX6GASMYJVR65RN75SJSSKAYVYXHMRG", "type":"PKEY", "expiration_time":"1d","flag":0,"label":"test_entry"}' "HTTP/1.1 204 No Content" -gnunet-namestore -z $name -d -n "test_entry" > /dev/null 2>&1 -#value -curl_post "${namestore_link}?pubkey=$public" '{"value":"HVX38H2CB7WJM0WCPWT9CFX6GASMYJVR65RN75SJSSKAYVYXHMRGxxx", "type":"PKEY", "expiration_time":"1d","flag":0,"label":"test_entry"}' "error" -gnunet-namestore -z $name -d -n "test_entry" > /dev/null 2>&1 -curl_post "${namestore_link}?pubkey=$public" '{"value":"", "type":"PKEY", "expiration_time":"1d","flag":0,"label":"test_entry"}' "error" -gnunet-namestore -z $name -d -n "test_entry" > /dev/null 2>&1 -curl_post "${namestore_link}?pubkey=$public" '{"value_missing":"HVX38H2CB7WJM0WCPWT9CFX6GASMYJVR65RN75SJSSKAYVYXHMRGxxx", "type":"PKEY", "expiration_time":"1d","flag":0,"label":"test_entry"}' "error" -gnunet-namestore -z $name -d -n "test_entry" > /dev/null 2>&1 -#time -curl_post "${namestore_link}?pubkey=$public" '{"value":"HVX38H2CB7WJM0WCPWT9CFX6GASMYJVR65RN75SJSSKAYVYXHMRG", "type":"PKEY", "expiration_time":"0d","flag":0,"label":"test_entry"}' "HTTP/1.1 204" -gnunet-namestore -z $name -d -n "test_entry" > /dev/null 2>&1 -curl_post "${namestore_link}?pubkey=$public" '{"value":"HVX38H2CB7WJM0WCPWT9CFX6GASMYJVR65RN75SJSSKAYVYXHMRG", "type":"PKEY", "expiration_time":"10000d","flag":0,"label":"test_entry"}' "HTTP/1.1 204" -gnunet-namestore -z $name -d -n "test_entry" > /dev/null 2>&1 -curl_post "${namestore_link}?pubkey=$public" '{"value":"HVX38H2CB7WJM0WCPWT9CFX6GASMYJVR65RN75SJSSKAYVYXHMRG", "type":"PKEY", "expiration_time":"now","flag":0,"label":"test_entry"}' "error" -gnunet-namestore -z $name -d -n "test_entry" > /dev/null 2>&1 -curl_post "${namestore_link}?pubkey=$public" '{"value":"HVX38H2CB7WJM0WCPWT9CFX6GASMYJVR65RN75SJSSKAYVYXHMRG", "type":"PKEY", "expiration_time":"","flag":0,"label":"test_entry"}' "error" -gnunet-namestore -z $name -d -n "test_entry" > /dev/null 2>&1 -curl_post "${namestore_link}?pubkey=$public" '{"value":"HVX38H2CB7WJM0WCPWT9CFX6GASMYJVR65RN75SJSSKAYVYXHMRG", "type":"PKEY", "expiration_time_missing":"1d","flag":0,"label":"test_entry"}' "error" -gnunet-namestore -z $name -d -n "test_entry" > /dev/null 2>&1 -#flag -curl_post "${namestore_link}?pubkey=$public" '{"value":"HVX38H2CB7WJM0WCPWT9CFX6GASMYJVR65RN75SJSSKAYVYXHMRG", "type":"PKEY", "expiration_time":"1d","flag":0,"label":"test_entry"}' "HTTP/1.1 204 No Content" -gnunet-namestore -z $name -d -n "test_entry" > /dev/null 2>&1 -curl_post "${namestore_link}?pubkey=$public" '{"value":"HVX38H2CB7WJM0WCPWT9CFX6GASMYJVR65RN75SJSSKAYVYXHMRG", "type":"PKEY", "expiration_time":"1d","flag":2,"label":"test_entry"}' "HTTP/1.1 204 No Content" -gnunet-namestore -z $name -d -n "test_entry" > /dev/null 2>&1 -curl_post "${namestore_link}?pubkey=$public" '{"value":"HVX38H2CB7WJM0WCPWT9CFX6GASMYJVR65RN75SJSSKAYVYXHMRG", "type":"PKEY", "expiration_time":"1d","flag":8,"label":"test_entry"}' "HTTP/1.1 204 No Content" -gnunet-namestore -z $name -d -n "test_entry" > /dev/null 2>&1 -curl_post "${namestore_link}?pubkey=$public" '{"value":"HVX38H2CB7WJM0WCPWT9CFX6GASMYJVR65RN75SJSSKAYVYXHMRG", "type":"PKEY", "expiration_time":"1d","flag":16,"label":"test_entry"}' "HTTP/1.1 204 No Content" -gnunet-namestore -z $name -d -n "test_entry" > /dev/null 2>&1 -curl_post "${namestore_link}?pubkey=$public" '{"value":"HVX38H2CB7WJM0WCPWT9CFX6GASMYJVR65RN75SJSSKAYVYXHMRG", "type":"PKEY", "expiration_time":"1d","flag":-1,"label":"test_entry"}' "error" -gnunet-namestore -z $name -d -n "test_entry" > /dev/null 2>&1 -curl_post "${namestore_link}?pubkey=$public" '{"value":"HVX38H2CB7WJM0WCPWT9CFX6GASMYJVR65RN75SJSSKAYVYXHMRG", "type":"PKEY", "expiration_time":"1d","flag":"Test","label":"test_entry"}' "error" -gnunet-namestore -z $name -d -n "test_entry" > /dev/null 2>&1 -curl_post "${namestore_link}?pubkey=$public" '{"value":"HVX38H2CB7WJM0WCPWT9CFX6GASMYJVR65RN75SJSSKAYVYXHMRG", "type":"PKEY", "expiration_time":"1d","flag":,"label":"test_entry"}' "error" -gnunet-namestore -z $name -d -n "test_entry" > /dev/null 2>&1 -curl_post "${namestore_link}?pubkey=$public" '{"value":"HVX38H2CB7WJM0WCPWT9CFX6GASMYJVR65RN75SJSSKAYVYXHMRG", "type":"PKEY", "expiration_time":"1d","flag_missing":0,"label":"test_entry"}' "error" -gnunet-namestore -z $name -d -n "test_entry" > /dev/null 2>&1 -#label -curl_post "${namestore_link}?pubkey=$public" '{"value":"HVX38H2CB7WJM0WCPWT9CFX6GASMYJVR65RN75SJSSKAYVYXHMRG", "type":"PKEY", "expiration_time":"1d","flag":0,"label":"test_entry"}' "HTTP/1.1 204 No Content" -curl_post "${namestore_link}?pubkey=$public" '{"value":"HVX38H2CB7WJM0WCPWT9CFX6GASMYJVR65RN75SJSSKAYVYXHMRG", "type":"PKEY", "expiration_time":"1d","flag":0,"label":"test_entry"}' "HTTP/1.1 409" -gnunet-namestore -z $name -d -n "test_entry" > /dev/null 2>&1 -curl_post "${namestore_link}?pubkey=$public" '{"value":"HVX38H2CB7WJM0WCPWT9CFX6GASMYJVR65RN75SJSSKAYVYXHMRG", "type":"PKEY", "expiration_time":"1d","flag":0,"label":""}' "error" -gnunet-namestore -z $name -d -n "test_entry" > /dev/null 2>&1 -curl_post "${namestore_link}?pubkey=$public" '{"value":"HVX38H2CB7WJM0WCPWT9CFX6GASMYJVR65RN75SJSSKAYVYXHMRG", "type":"PKEY", "expiration_time":"1d","flag":0,"label_missing":"test_entry"}' "error" +curl_post "${namestore_link}/$name" '{"value":"HVX38H2CB7WJM0WCPWT9CFX6GASMYJVR65RN75SJSSKAYVYXHMRG", "record_type":"PKEY", "expiration_time":"1d","flag":0,"record_name_missing":"test_entry"}' "error" gnunet-namestore -z $name -d -n "test_entry" > /dev/null 2>&1 #wrong zone -curl_post "${namestore_link}?name=$public" '{"value":"HVX38H2CB7WJM0WCPWT9CFX6GASMYJVR65RN75SJSSKAYVYXHMRG", "type":"PKEY", "expiration_time":"1d","flag":0,"label":"test_entry"}' "error" -gnunet-namestore -z $name -d -n "test_entry" > /dev/null 2>&1 -curl_post "${namestore_link}?pubkey=$name" '{"value":"HVX38H2CB7WJM0WCPWT9CFX6GASMYJVR65RN75SJSSKAYVYXHMRG", "type":"PKEY", "expiration_time":"1d","flag":0,"label":"test_entry"}' "error" +curl_post "${namestore_link}/$public" '{"value":"HVX38H2CB7WJM0WCPWT9CFX6GASMYJVR65RN75SJSSKAYVYXHMRG", "record_type":"PKEY", "expiration_time":"1d","flag":0,"record_name":"test_entry"}' "error" gnunet-namestore -z $name -d -n "test_entry" > /dev/null 2>&1 #Test DELETE gnunet-namestore -z $name -p -a -n "test_entry" -e "1d" -V "HVX38H2CB7WJM0WCPWT9CFX6GASMYJVR65RN75SJSSKAYVYXHMRG" -t "PKEY" -curl_delete "${namestore_link}?label=test_entry&name=$name" "HTTP/1.1 204" -gnunet-namestore -z $name -p -a -n "test_entry" -e "1d" -V "HVX38H2CB7WJM0WCPWT9CFX6GASMYJVR65RN75SJSSKAYVYXHMRG" -t "PKEY" -curl_delete "${namestore_link}?label=test_entry&pubkey=$public" "HTTP/1.1 204" +curl_delete "${namestore_link}/$name?record_name=test_entry" "HTTP/1.1 204" +curl_delete "${namestore_link}/$name?record_name=test_entry" "error" gnunet-namestore -z $name -p -a -n "test_entry" -e "1d" -V "HVX38H2CB7WJM0WCPWT9CFX6GASMYJVR65RN75SJSSKAYVYXHMRG" -t "PKEY" -curl_delete "${namestore_link}?label=test_entry&pubkey=$name" "HTTP/1.1 404" +curl_delete "${namestore_link}/$public?record_name=test_entry" "error" #Test default identity diff --git a/src/peerinfo/plugin_rest_peerinfo.c b/src/peerinfo/plugin_rest_peerinfo.c index 97c473e36..e34bde9f5 100644 --- a/src/peerinfo/plugin_rest_peerinfo.c +++ b/src/peerinfo/plugin_rest_peerinfo.c @@ -31,13 +31,30 @@ #include "microhttpd.h" #include +/** + * Peerinfo Namespace + */ #define GNUNET_REST_API_NS_PEERINFO "/peerinfo" -#define GNUNET_REST_API_PEERINFO_PEER "peer" -#define GNUNET_REST_API_PEERINFO_FRIEND "friend" -#define GNUNET_REST_API_PEERINFO_ARRAY "array" +/** + * Peerinfo parameter peer + */ +#define GNUNET_REST_PEERINFO_PEER "peer" -#define GNUNET_REST_ERROR_UNKNOWN "Unkown Error" +/** + * Peerinfo parameter friend + */ +#define GNUNET_REST_PEERINFO_FRIEND "friend" + +/** + * Peerinfo parameter array + */ +#define GNUNET_REST_PEERINFO_ARRAY "array" + +/** + * Error message Unknown Error + */ +#define GNUNET_REST_PEERINFO_ERROR_UNKNOWN "Unknown Error" /** * How long until we time out during address lookup? @@ -94,7 +111,6 @@ struct AddressRecord */ struct PrintContext { - /** * Kept in DLL. */ @@ -152,6 +168,9 @@ static struct PrintContext *pc_head; */ static struct PrintContext *pc_tail; +/** + * The request handle + */ struct RequestHandle { /** @@ -299,7 +318,7 @@ do_error (void *cls) char *response; if (NULL == handle->emsg) - handle->emsg = GNUNET_strdup(GNUNET_REST_ERROR_UNKNOWN); + handle->emsg = GNUNET_strdup(GNUNET_REST_PEERINFO_ERROR_UNKNOWN); json_object_set_new(json_error,"error", json_string(handle->emsg)); @@ -315,7 +334,9 @@ do_error (void *cls) /** - * Function that assembles our response. + * Function that assembles the response. + * + * @param cls the `struct RequestHandle` */ static void peerinfo_list_finished (void *cls) @@ -326,6 +347,7 @@ peerinfo_list_finished (void *cls) if (NULL == handle->response) { + handle->response_code = MHD_HTTP_NOT_FOUND; handle->emsg = GNUNET_strdup ("No peers found"); GNUNET_SCHEDULER_add_now (&do_error, handle); return; @@ -386,9 +408,6 @@ dump_pc (struct PrintContext *pc) temp_array = json_array(); response_entry = json_object(); -// printf (_("%sPeer `%s'\n"), -// (GNUNET_YES == pc->friend_only) ? "F2F: " : "", -// GNUNET_i2s_full (&pc->peer)); for (i = 0; i < pc->num_addresses; i++) { if (NULL != pc->address_list[i].result) @@ -417,10 +436,10 @@ dump_pc (struct PrintContext *pc) GNUNET_i2s_full (&pc->peer)); friend_and_peer_json = json_string(friend_and_peer); json_object_set(response_entry, - GNUNET_REST_API_PEERINFO_PEER, + GNUNET_REST_PEERINFO_PEER, friend_and_peer_json); json_object_set(response_entry, - GNUNET_REST_API_PEERINFO_ARRAY, + GNUNET_REST_PEERINFO_ARRAY, temp_array); json_array_append(pc->handle->response, response_entry); json_decref(friend_and_peer_json); @@ -615,8 +634,8 @@ peerinfo_get (struct GNUNET_REST_RequestHandle *con_handle, char* include_friend_only_str; include_friend_only = GNUNET_NO; - GNUNET_CRYPTO_hash (GNUNET_REST_API_PEERINFO_FRIEND, - strlen (GNUNET_REST_API_PEERINFO_FRIEND), + GNUNET_CRYPTO_hash (GNUNET_REST_PEERINFO_FRIEND, + strlen (GNUNET_REST_PEERINFO_FRIEND), &key); if ( GNUNET_YES == GNUNET_CONTAINER_multihashmap_contains (con_handle->url_param_map, @@ -631,15 +650,15 @@ peerinfo_get (struct GNUNET_REST_RequestHandle *con_handle, } specific_peer = NULL; - GNUNET_CRYPTO_hash (GNUNET_REST_API_PEERINFO_PEER, - strlen (GNUNET_REST_API_PEERINFO_PEER), + GNUNET_CRYPTO_hash (GNUNET_REST_PEERINFO_PEER, + strlen (GNUNET_REST_PEERINFO_PEER), &key); if ( GNUNET_YES == GNUNET_CONTAINER_multihashmap_contains (con_handle->url_param_map, &key)) { - peer_id = *(unsigned int*)GNUNET_CONTAINER_multihashmap_get (con_handle->url_param_map, &key); - specific_peer = GNUNET_PEER_resolve2(peer_id); + //peer_id = *(unsigned int*)GNUNET_CONTAINER_multihashmap_get (con_handle->url_param_map, &key); + //specific_peer = GNUNET_PEER_resolve2(peer_id); } handle->list_it = GNUNET_PEERINFO_iterate(handle->peerinfo_handle, -- 2.25.1