X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Fgns%2Fplugin_rest_gns.c;h=1d215b6a495bf81adef75d4d82ec4953e3b0083e;hb=620bdac536dff4b17317d9d20b8a6840836d6490;hp=3ebbfb9256aa31d65b75c3b808fb0d5e6a6930a3;hpb=f27338992f0a5915ee974faea05f764c2df6f584;p=oweals%2Fgnunet.git diff --git a/src/gns/plugin_rest_gns.c b/src/gns/plugin_rest_gns.c index 3ebbfb925..1d215b6a4 100644 --- a/src/gns/plugin_rest_gns.c +++ b/src/gns/plugin_rest_gns.c @@ -1,6 +1,6 @@ /* This file is part of GNUnet. - Copyright (C) 2012-2015 Christian Grothoff (and other contributing authors) + Copyright (C) 2012-2015 GNUnet e.V. GNUnet is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published @@ -32,6 +32,8 @@ #include #include #include +#include +#include #include #define GNUNET_REST_API_NS_GNS "/gns" @@ -75,6 +77,11 @@ struct LookupHandle */ struct GNUNET_GNS_LookupRequest *lookup_request; + /** + * Handle to rest request + */ + struct GNUNET_REST_RequestHandle *rest_handle; + /** * Lookup an ego with the identity service. */ @@ -152,6 +159,11 @@ struct LookupHandle */ struct GNUNET_CRYPTO_EcdsaPrivateKey shorten_key; + /** + * HTTP response code + */ + int response_code; + }; @@ -211,12 +223,13 @@ cleanup_handle (struct LookupHandle *handle) * @param tc scheduler context */ static void -do_error (void *cls, - const struct GNUNET_SCHEDULER_TaskContext *tc) +do_error (void *cls) { struct LookupHandle *handle = cls; - struct MHD_Response *resp = GNUNET_REST_create_json_response (NULL); - handle->proc (handle->proc_cls, resp, MHD_HTTP_BAD_REQUEST); + struct MHD_Response *resp; + + resp = GNUNET_REST_create_response (NULL); + handle->proc (handle->proc_cls, resp, handle->response_code); cleanup_handle (handle); } @@ -246,7 +259,7 @@ gnsrecord_to_json (const struct GNUNET_GNSRECORD_Data *rd) (int) rd->record_type); return NULL; } - record_obj = json_object(); + record_obj = json_object (); json_object_set_new (record_obj, "type", json_string (typename)); json_object_set_new (record_obj, "value", json_string (string_val)); GNUNET_free (string_val); @@ -283,16 +296,16 @@ process_lookup_result (void *cls, uint32_t rd_count, { struct LookupHandle *handle = cls; struct MHD_Response *resp; - struct JsonApiObject *json_object; - struct JsonApiResource *json_resource; + struct GNUNET_JSONAPI_Document *json_document; + struct GNUNET_JSONAPI_Resource *json_resource; uint32_t i; char *result; json_t *result_array; json_t *record_obj; result_array = json_array(); - json_object = GNUNET_REST_jsonapi_object_new (); - json_resource = GNUNET_REST_jsonapi_resource_new (GNUNET_REST_JSONAPI_GNS_TYPEINFO, handle->name); + json_document = GNUNET_JSONAPI_document_new (); + json_resource = GNUNET_JSONAPI_resource_new (GNUNET_REST_JSONAPI_GNS_TYPEINFO, handle->name); handle->lookup_request = NULL; for (i=0; iproc (handle->proc_cls, resp, MHD_HTTP_OK); GNUNET_free (result); cleanup_handle (handle); @@ -323,10 +336,9 @@ process_lookup_result (void *cls, uint32_t rd_count, * identified by the given public key and the shorten zone. * * @param pkey public key to use for the zone, can be NULL - * @param shorten_key private key used for shortening, can be NULL */ static void -lookup_with_keys (struct LookupHandle *handle, const struct GNUNET_CRYPTO_EcdsaPrivateKey *shorten_key) +lookup_with_public_key (struct LookupHandle *handle) { if (UINT32_MAX == handle->type) { @@ -341,7 +353,6 @@ lookup_with_keys (struct LookupHandle *handle, const struct GNUNET_CRYPTO_EcdsaP &handle->pkey, handle->type, handle->options, - shorten_key, &process_lookup_result, handle); } @@ -352,55 +363,6 @@ lookup_with_keys (struct LookupHandle *handle, const struct GNUNET_CRYPTO_EcdsaP } } -/** - * Method called to with the ego we are to use for shortening - * during the lookup. - * - * @param cls closure contains the public key to use - * @param ego ego handle, NULL if not found - * @param ctx context for application to store data for this ego - * (during the lifetime of this process, initially NULL) - * @param name name 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 -identity_shorten_cb (void *cls, - struct GNUNET_IDENTITY_Ego *ego, - void **ctx, - const char *name) -{ - struct LookupHandle *handle = cls; - - handle->id_op = NULL; - if (NULL == ego) - lookup_with_keys (handle, NULL); - else - lookup_with_keys (handle, - GNUNET_IDENTITY_ego_get_private_key (ego)); -} - -/** - * Perform the actual resolution, starting with the zone - * identified by the given public key. - * - * @param pkey public key to use for the zone - */ -static void -lookup_with_public_key (struct LookupHandle *handle) -{ - handle->pkeym = handle->pkey; - GNUNET_break (NULL == handle->id_op); - handle->id_op = GNUNET_IDENTITY_get (handle->identity, - "gns-short", - &identity_shorten_cb, - handle); - if (NULL == handle->id_op) - { - GNUNET_break (0); - lookup_with_keys (handle, NULL); - } -} /** * Method called to with the ego we are to use for the lookup, @@ -431,6 +393,7 @@ identity_zone_cb (void *cls, json_decref(handle->json_root); } + /** * Method called to with the ego we are to use for the lookup, * when the ego is the one for the default master zone. @@ -460,7 +423,8 @@ identity_master_cb (void *cls, GNUNET_SCHEDULER_add_now (&do_error, handle); return; } - GNUNET_IDENTITY_ego_get_public_key (ego, &handle->pkey); + GNUNET_IDENTITY_ego_get_public_key (ego, + &handle->pkey); /* main name is our own master zone, do no look for that in the DHT */ handle->options = GNUNET_GNS_LO_LOCAL_MASTER; /* if the name is of the form 'label.gnu', never go to the DHT */ @@ -502,8 +466,9 @@ parse_url (const char *url, struct LookupHandle *handle) return GNUNET_OK; } + static void -get_gns_cont (struct RestConnectionDataHandle *conndata_handle, +get_gns_cont (struct GNUNET_REST_RequestHandle *conndata_handle, const char* url, void *cls) { @@ -550,7 +515,7 @@ get_gns_cont (struct RestConnectionDataHandle *conndata_handle, GNUNET_CONTAINER_multihashmap_contains (conndata_handle->url_param_map, &key) ) { - handle->type = GNUNET_GNSRECORD_typename_to_number + handle->type = GNUNET_GNSRECORD_typename_to_number (GNUNET_CONTAINER_multihashmap_get (conndata_handle->url_param_map, &key)); } @@ -566,6 +531,7 @@ get_gns_cont (struct RestConnectionDataHandle *conndata_handle, { handle->pkey_str = GNUNET_CONTAINER_multihashmap_get (conndata_handle->url_param_map, &key); + GNUNET_assert (NULL != handle->pkey_str); if (GNUNET_OK != GNUNET_CRYPTO_ecdsa_public_key_from_string (handle->pkey_str, strlen(handle->pkey_str), @@ -619,7 +585,7 @@ get_gns_cont (struct RestConnectionDataHandle *conndata_handle, * @param handle the lookup handle */ static void -options_cont (struct RestConnectionDataHandle *con_handle, +options_cont (struct GNUNET_REST_RequestHandle *con_handle, const char* url, void *cls) { @@ -627,13 +593,14 @@ options_cont (struct RestConnectionDataHandle *con_handle, struct LookupHandle *handle = cls; //For GNS, independent of path return all options - resp = GNUNET_REST_create_json_response (NULL); + resp = GNUNET_REST_create_response (NULL); MHD_add_response_header (resp, "Access-Control-Allow-Methods", MHD_HTTP_METHOD_GET); - handle->proc (handle->proc_cls, resp, MHD_HTTP_OK); + handle->proc (handle->proc_cls, + resp, + MHD_HTTP_OK); cleanup_handle (handle); - return; } @@ -645,32 +612,38 @@ options_cont (struct RestConnectionDataHandle *con_handle, * @param data body of the HTTP request (optional) * @param data_size length of the body * @param proc callback function for the result - * @param proc_cls closure for callback function - * @return GNUNET_OK if request accepted + * @param proc_cls closure for @a proc + * @return #GNUNET_OK if request accepted */ static void -rest_gns_process_request(struct RestConnectionDataHandle *conndata_handle, - GNUNET_REST_ResultProcessor proc, - void *proc_cls) +rest_gns_process_request (struct GNUNET_REST_RequestHandle *conndata_handle, + GNUNET_REST_ResultProcessor proc, + void *proc_cls) { + static const struct GNUNET_REST_RequestHandler handlers[] = { + {MHD_HTTP_METHOD_GET, GNUNET_REST_API_NS_GNS, &get_gns_cont}, + {MHD_HTTP_METHOD_OPTIONS, GNUNET_REST_API_NS_GNS, &options_cont}, + GNUNET_REST_HANDLER_END + }; struct LookupHandle *handle = GNUNET_new (struct LookupHandle); + struct GNUNET_REST_RequestHandlerError err; handle->timeout = GNUNET_TIME_UNIT_FOREVER_REL; handle->proc_cls = proc_cls; handle->proc = proc; + handle->rest_handle = conndata_handle; - static const struct GNUNET_REST_RestConnectionHandler handlers[] = { - {MHD_HTTP_METHOD_GET, GNUNET_REST_API_NS_GNS, &get_gns_cont}, - {MHD_HTTP_METHOD_OPTIONS, GNUNET_REST_API_NS_GNS, &options_cont}, - GNUNET_REST_HANDLER_END - }; - - if (GNUNET_NO == GNUNET_REST_handle_request (conndata_handle, handlers, handle)) + if (GNUNET_NO == GNUNET_JSONAPI_handle_request (conndata_handle, + handlers, + &err, + handle)) + { + handle->response_code = err.error_code; GNUNET_SCHEDULER_add_now (&do_error, handle); + } } - /** * Entry point for the plugin. *