GNUnet  0.11.x
Data Structures | Macros | Functions | Variables
plugin_rest_namestore.c File Reference

GNUnet Namestore REST plugin. More...

#include "platform.h"
#include "gnunet_rest_plugin.h"
#include "gnunet_gns_service.h"
#include "gnunet_namestore_service.h"
#include "gnunet_identity_service.h"
#include "gnunet_rest_lib.h"
#include "gnunet_json_lib.h"
#include "microhttpd.h"
#include <jansson.h>
Include dependency graph for plugin_rest_namestore.c:

Go to the source code of this file.

Data Structures

struct  Plugin
 Handle for a plugin. More...
 
struct  EgoEntry
 The ego list. More...
 
struct  RequestHandle
 The request handle. More...
 

Macros

#define GNUNET_REST_API_NS_NAMESTORE   "/namestore"
 Namestore Namespace. More...
 
#define GNUNET_REST_NAMESTORE_ERROR_UNKNOWN   "Unknown Error"
 Error message Unknown Error. More...
 
#define GNUNET_REST_IDENTITY_NOT_FOUND   "No identity found"
 Error message No identity found. More...
 
#define GNUNET_REST_NAMESTORE_FAILED   "Namestore action failed"
 Error message Failed request. More...
 
#define GNUNET_REST_NAMESTORE_INVALID_DATA   "Data invalid"
 Error message invalid data. More...
 
#define GNUNET_REST_NAMESTORE_NO_DATA   "No data"
 Error message No data. More...
 
#define ID_REST_STATE_INIT   0
 State while collecting all egos. More...
 
#define ID_REST_STATE_POST_INIT   1
 Done collecting egos. More...
 

Functions

static void cleanup_handle (void *cls)
 Cleanup lookup handle. More...
 
static void do_error (void *cls)
 Task run on errors. More...
 
struct EgoEntryget_egoentry_namestore (struct RequestHandle *handle, char *name)
 Get EgoEntry from list with either a public key or a name If public key and name are not NULL, it returns the public key result first. More...
 
static void namestore_iteration_error (void *cls)
 Does internal server error when iteration failed. More...
 
static void create_finished (void *cls, int32_t success, const char *emsg)
 Create finished callback. More...
 
static void del_finished (void *cls, int32_t success, const char *emsg)
 Delete finished callback. More...
 
static void namestore_list_finished (void *cls)
 Iteration over all results finished, build final response. More...
 
static void namestore_list_iteration (void *cls, const struct GNUNET_CRYPTO_EcdsaPrivateKey *zone_key, const char *rname, unsigned int rd_len, const struct GNUNET_GNSRECORD_Data *rd)
 Create a response with requested records. More...
 
void namestore_get (struct GNUNET_REST_RequestHandle *con_handle, const char *url, void *cls)
 Handle namestore GET request. More...
 
static void ns_lookup_error_cb (void *cls)
 
static void ns_lookup_cb (void *cls, const struct GNUNET_CRYPTO_EcdsaPrivateKey *zone, const char *label, unsigned int rd_count, const struct GNUNET_GNSRECORD_Data *rd)
 
void namestore_add (struct GNUNET_REST_RequestHandle *con_handle, const char *url, void *cls)
 Handle namestore POST request. More...
 
void namestore_delete (struct GNUNET_REST_RequestHandle *con_handle, const char *url, void *cls)
 Handle namestore DELETE request. More...
 
static void options_cont (struct GNUNET_REST_RequestHandle *con_handle, const char *url, void *cls)
 Respond to OPTIONS request. More...
 
static void init_cont (struct RequestHandle *handle)
 Handle rest request. More...
 
static void id_connect_cb (void *cls, struct GNUNET_IDENTITY_Ego *ego, void **ctx, const char *name)
 This function is initially called for all egos and then again whenever a ego's identifier changes or if it is deleted. More...
 
static void rest_process_request (struct GNUNET_REST_RequestHandle *rest_handle, GNUNET_REST_ResultProcessor proc, void *proc_cls)
 Function processing the REST call. More...
 
void * libgnunet_plugin_rest_namestore_init (void *cls)
 Entry point for the plugin. More...
 
void * libgnunet_plugin_rest_namestore_done (void *cls)
 Exit point from the plugin. More...
 

Variables

const struct GNUNET_CONFIGURATION_Handlecfg
 The configuration handle. More...
 
static char * allow_methods
 HTTP methods allows for this plugin. More...
 

Detailed Description

GNUnet Namestore REST plugin.

Author
Martin Schanzenbach
Philippe Buschmann

Definition in file plugin_rest_namestore.c.

Macro Definition Documentation

◆ GNUNET_REST_API_NS_NAMESTORE

#define GNUNET_REST_API_NS_NAMESTORE   "/namestore"

◆ GNUNET_REST_NAMESTORE_ERROR_UNKNOWN

#define GNUNET_REST_NAMESTORE_ERROR_UNKNOWN   "Unknown Error"

Error message Unknown Error.

Definition at line 45 of file plugin_rest_namestore.c.

Referenced by do_error().

◆ GNUNET_REST_IDENTITY_NOT_FOUND

#define GNUNET_REST_IDENTITY_NOT_FOUND   "No identity found"

Error message No identity found.

Definition at line 50 of file plugin_rest_namestore.c.

Referenced by namestore_add(), namestore_delete(), and namestore_get().

◆ GNUNET_REST_NAMESTORE_FAILED

#define GNUNET_REST_NAMESTORE_FAILED   "Namestore action failed"

Error message Failed request.

Definition at line 56 of file plugin_rest_namestore.c.

Referenced by namestore_add(), namestore_delete(), namestore_get(), namestore_iteration_error(), ns_lookup_cb(), and ns_lookup_error_cb().

◆ GNUNET_REST_NAMESTORE_INVALID_DATA

#define GNUNET_REST_NAMESTORE_INVALID_DATA   "Data invalid"

Error message invalid data.

Definition at line 61 of file plugin_rest_namestore.c.

Referenced by namestore_add(), and namestore_delete().

◆ GNUNET_REST_NAMESTORE_NO_DATA

#define GNUNET_REST_NAMESTORE_NO_DATA   "No data"

Error message No data.

Definition at line 66 of file plugin_rest_namestore.c.

Referenced by namestore_add().

◆ ID_REST_STATE_INIT

#define ID_REST_STATE_INIT   0

State while collecting all egos.

Definition at line 71 of file plugin_rest_namestore.c.

Referenced by id_connect_cb().

◆ ID_REST_STATE_POST_INIT

#define ID_REST_STATE_POST_INIT   1

Done collecting egos.

Definition at line 76 of file plugin_rest_namestore.c.

Referenced by id_connect_cb().

Function Documentation

◆ cleanup_handle()

static void cleanup_handle ( void *  cls)
static

Cleanup lookup handle.

Parameters
handleHandle to clean up

Definition at line 247 of file plugin_rest_namestore.c.

References RequestHandle::add_qe, GNUNET_GNSRECORD_Data::data, RequestHandle::ego_head, RequestHandle::emsg, GNUNET_ERROR_TYPE_DEBUG, GNUNET_free, GNUNET_IDENTITY_disconnect(), GNUNET_log, GNUNET_NAMESTORE_cancel(), GNUNET_NAMESTORE_disconnect(), GNUNET_NAMESTORE_zone_iteration_stop(), GNUNET_SCHEDULER_cancel(), handle, EgoEntry::identifier, RequestHandle::identity_handle, EgoEntry::keystring, RequestHandle::list_it, EgoEntry::next, RequestHandle::ns_handle, RequestHandle::rd, RequestHandle::rd_count, RequestHandle::record_name, RequestHandle::resp_object, RequestHandle::timeout_task, and RequestHandle::url.

Referenced by create_finished(), del_finished(), do_error(), namestore_list_finished(), and options_cont().

248 {
249  struct RequestHandle *handle = cls;
250  struct EgoEntry *ego_entry;
251  struct EgoEntry *ego_tmp;
252 
253  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Cleaning up\n");
254  if (NULL != handle->timeout_task)
255  {
257  handle->timeout_task = NULL;
258  }
259  if (NULL != handle->record_name)
260  GNUNET_free (handle->record_name);
261  if (NULL != handle->url)
262  GNUNET_free (handle->url);
263  if (NULL != handle->emsg)
264  GNUNET_free (handle->emsg);
265  if (NULL != handle->rd)
266  {
267  for (int i = 0; i < handle->rd_count; i++)
268  {
269  if (NULL != handle->rd[i].data)
270  GNUNET_free ((void *) handle->rd[i].data);
271  }
272  GNUNET_free (handle->rd);
273  }
274  if (NULL != handle->timeout_task)
276  if (NULL != handle->list_it)
278  if (NULL != handle->add_qe)
280  if (NULL != handle->identity_handle)
282  if (NULL != handle->ns_handle)
283  {
285  }
286 
287  for (ego_entry = handle->ego_head; NULL != ego_entry;)
288  {
289  ego_tmp = ego_entry;
290  ego_entry = ego_entry->next;
291  GNUNET_free (ego_tmp->identifier);
292  GNUNET_free (ego_tmp->keystring);
293  GNUNET_free (ego_tmp);
294  }
295 
296  if (NULL != handle->resp_object)
297  {
298  json_decref (handle->resp_object);
299  }
300 
301  GNUNET_free (handle);
302 }
struct GNUNET_NAMESTORE_QueueEntry * add_qe
NAMESTORE Operation.
The request handle.
void GNUNET_NAMESTORE_cancel(struct GNUNET_NAMESTORE_QueueEntry *qe)
Cancel a namestore operation.
The ego list.
void GNUNET_NAMESTORE_disconnect(struct GNUNET_NAMESTORE_Handle *h)
Disconnect from the namestore service (and free associated resources).
struct GNUNET_NAMESTORE_ZoneIterator * list_it
Handle to NAMESTORE it.
char * record_name
Records to store.
json_t * resp_object
Response object.
const void * data
Binary value stored in the DNS record.
char * emsg
Error response message.
unsigned int rd_count
Number of records in rd.
static struct GNUNET_DNS_Handle * handle
Handle to transport service.
void GNUNET_IDENTITY_disconnect(struct GNUNET_IDENTITY_Handle *h)
Disconnect from identity service.
Definition: identity_api.c:837
void GNUNET_NAMESTORE_zone_iteration_stop(struct GNUNET_NAMESTORE_ZoneIterator *it)
Stops iteration and releases the namestore handle for further calls.
char * keystring
Public key string.
char * identifier
Ego Identifier.
struct GNUNET_NAMESTORE_Handle * ns_handle
Handle to NAMESTORE.
struct EgoEntry * ego_head
Ego list.
struct GNUNET_SCHEDULER_Task * timeout_task
ID of a task associated with the resolution process.
#define GNUNET_log(kind,...)
struct GNUNET_GNSRECORD_Data * rd
Records to store.
struct EgoEntry * next
DLL.
struct GNUNET_IDENTITY_Handle * identity_handle
Handle to Identity service.
#define GNUNET_free(ptr)
Wrapper around free.
void * GNUNET_SCHEDULER_cancel(struct GNUNET_SCHEDULER_Task *task)
Cancel the task with the specified identifier.
Definition: scheduler.c:966
char * url
The url.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ do_error()

static void do_error ( void *  cls)
static

Task run on errors.

Reports an error and cleans up everything.

Parameters
clsthe struct RequestHandle

Definition at line 311 of file plugin_rest_namestore.c.

References cleanup_handle(), RequestHandle::emsg, GNUNET_free, GNUNET_REST_create_response(), GNUNET_REST_NAMESTORE_ERROR_UNKNOWN, GNUNET_SCHEDULER_add_now(), GNUNET_strdup, handle, RequestHandle::proc, RequestHandle::proc_cls, response, and RequestHandle::response_code.

Referenced by create_finished(), del_finished(), init_cont(), namestore_add(), namestore_delete(), namestore_get(), namestore_iteration_error(), ns_lookup_cb(), ns_lookup_error_cb(), and rest_process_request().

312 {
313  struct RequestHandle *handle = cls;
314  struct MHD_Response *resp;
315  json_t *json_error = json_object ();
316  char *response;
317 
318  if (NULL == handle->emsg)
320 
321  json_object_set_new (json_error, "error", json_string (handle->emsg));
322 
323  if (0 == handle->response_code)
324  handle->response_code = MHD_HTTP_INTERNAL_SERVER_ERROR;
325  response = json_dumps (json_error, 0);
326  resp = GNUNET_REST_create_response (response);
327  handle->proc (handle->proc_cls, resp, handle->response_code);
328  json_decref (json_error);
329  GNUNET_free (response);
331 }
#define GNUNET_REST_NAMESTORE_ERROR_UNKNOWN
Error message Unknown Error.
GNUNET_REST_ResultProcessor proc
The plugin result processor.
#define GNUNET_strdup(a)
Wrapper around GNUNET_xstrdup_.
void * proc_cls
The closure of the result processor.
The request handle.
char * emsg
Error response message.
struct GNUNET_SCHEDULER_Task * GNUNET_SCHEDULER_add_now(GNUNET_SCHEDULER_TaskCallback task, void *task_cls)
Schedule a new task to be run as soon as possible.
Definition: scheduler.c:1280
static struct GNUNET_DNS_Handle * handle
Handle to transport service.
int response_code
Response code.
static void cleanup_handle(void *cls)
Cleanup lookup handle.
struct MHD_Response * GNUNET_REST_create_response(const char *data)
Create REST MHD response.
Definition: rest.c:57
static struct MHD_Response * response
Our canonical response.
#define GNUNET_free(ptr)
Wrapper around free.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ get_egoentry_namestore()

struct EgoEntry* get_egoentry_namestore ( struct RequestHandle handle,
char *  name 
)

Get EgoEntry from list with either a public key or a name If public key and name are not NULL, it returns the public key result first.

Parameters
handlethe RequestHandle
pubkeythe public key of an identity (only one can be NULL)
namethe name of an identity (only one can be NULL)
Returns
EgoEntry or NULL if not found

Definition at line 344 of file plugin_rest_namestore.c.

References RequestHandle::ego_head, EgoEntry::identifier, and EgoEntry::next.

Referenced by namestore_add(), namestore_delete(), and namestore_get().

345 {
346  struct EgoEntry *ego_entry;
347 
348  if (NULL != name)
349  {
350  for (ego_entry = handle->ego_head; NULL != ego_entry;
351  ego_entry = ego_entry->next)
352  {
353  if (0 != strcasecmp (name, ego_entry->identifier))
354  continue;
355  return ego_entry;
356  }
357  }
358  return NULL;
359 }
The ego list.
char * identifier
Ego Identifier.
struct EgoEntry * ego_head
Ego list.
const char * name
struct EgoEntry * next
DLL.
Here is the caller graph for this function:

◆ namestore_iteration_error()

static void namestore_iteration_error ( void *  cls)
static

Does internal server error when iteration failed.

Parameters
clsthe struct RequestHandle

Definition at line 368 of file plugin_rest_namestore.c.

References do_error(), RequestHandle::emsg, GNUNET_REST_NAMESTORE_FAILED, GNUNET_SCHEDULER_add_now(), GNUNET_strdup, and handle.

Referenced by namestore_get().

369 {
370  struct RequestHandle *handle = cls;
371 
374  return;
375 }
#define GNUNET_REST_NAMESTORE_FAILED
Error message Failed request.
#define GNUNET_strdup(a)
Wrapper around GNUNET_xstrdup_.
The request handle.
char * emsg
Error response message.
struct GNUNET_SCHEDULER_Task * GNUNET_SCHEDULER_add_now(GNUNET_SCHEDULER_TaskCallback task, void *task_cls)
Schedule a new task to be run as soon as possible.
Definition: scheduler.c:1280
static struct GNUNET_DNS_Handle * handle
Handle to transport service.
static void do_error(void *cls)
Task run on errors.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ create_finished()

static void create_finished ( void *  cls,
int32_t  success,
const char *  emsg 
)
static

Create finished callback.

Parameters
clsthe struct RequestHandle
successthe success indicating integer, GNUNET_OK on success
emsgthe error message (can be NULL)

Definition at line 386 of file plugin_rest_namestore.c.

References RequestHandle::add_qe, cleanup_handle(), do_error(), RequestHandle::emsg, GNUNET_REST_create_response(), GNUNET_SCHEDULER_add_now(), GNUNET_strdup, GNUNET_YES, handle, RequestHandle::proc, and RequestHandle::proc_cls.

Referenced by ns_lookup_cb().

387 {
388  struct RequestHandle *handle = cls;
389  struct MHD_Response *resp;
390 
391  handle->add_qe = NULL;
392  if (GNUNET_YES != success)
393  {
394  if (NULL != emsg)
395  {
396  handle->emsg = GNUNET_strdup (emsg);
398  return;
399  }
400  handle->emsg = GNUNET_strdup ("Error storing records");
402  return;
403  }
404  resp = GNUNET_REST_create_response (NULL);
405  handle->proc (handle->proc_cls, resp, MHD_HTTP_NO_CONTENT);
407 }
GNUNET_REST_ResultProcessor proc
The plugin result processor.
struct GNUNET_NAMESTORE_QueueEntry * add_qe
NAMESTORE Operation.
#define GNUNET_strdup(a)
Wrapper around GNUNET_xstrdup_.
void * proc_cls
The closure of the result processor.
The request handle.
char * emsg
Error response message.
struct GNUNET_SCHEDULER_Task * GNUNET_SCHEDULER_add_now(GNUNET_SCHEDULER_TaskCallback task, void *task_cls)
Schedule a new task to be run as soon as possible.
Definition: scheduler.c:1280
static struct GNUNET_DNS_Handle * handle
Handle to transport service.
static void cleanup_handle(void *cls)
Cleanup lookup handle.
static void do_error(void *cls)
Task run on errors.
struct MHD_Response * GNUNET_REST_create_response(const char *data)
Create REST MHD response.
Definition: rest.c:57
#define GNUNET_YES
Definition: gnunet_common.h:77
Here is the call graph for this function:
Here is the caller graph for this function:

◆ del_finished()

static void del_finished ( void *  cls,
int32_t  success,
const char *  emsg 
)
static

Delete finished callback.

Parameters
clsthe struct RequestHandle
successthe success indicating integer, GNUNET_OK on success
emsgthe error message (can be NULL)

Definition at line 418 of file plugin_rest_namestore.c.

References RequestHandle::add_qe, cleanup_handle(), do_error(), RequestHandle::emsg, GNUNET_NO, GNUNET_REST_create_response(), GNUNET_SCHEDULER_add_now(), GNUNET_strdup, GNUNET_SYSERR, handle, RequestHandle::proc, RequestHandle::proc_cls, and RequestHandle::response_code.

Referenced by namestore_delete().

419 {
420  struct RequestHandle *handle = cls;
421 
422  handle->add_qe = NULL;
423  if (GNUNET_NO == success)
424  {
425  handle->response_code = MHD_HTTP_NOT_FOUND;
426  handle->emsg = GNUNET_strdup ("No record found");
428  return;
429  }
430  if (GNUNET_SYSERR == success)
431  {
432  if (NULL != emsg)
433  {
434  handle->emsg = GNUNET_strdup (emsg);
436  return;
437  }
438  handle->emsg = GNUNET_strdup ("Deleting record failed");
440  return;
441  }
442  handle->proc (handle->proc_cls,
444  MHD_HTTP_NO_CONTENT);
446 }
GNUNET_REST_ResultProcessor proc
The plugin result processor.
#define GNUNET_NO
Definition: gnunet_common.h:78
struct GNUNET_NAMESTORE_QueueEntry * add_qe
NAMESTORE Operation.
#define GNUNET_strdup(a)
Wrapper around GNUNET_xstrdup_.
void * proc_cls
The closure of the result processor.
The request handle.
char * emsg
Error response message.
struct GNUNET_SCHEDULER_Task * GNUNET_SCHEDULER_add_now(GNUNET_SCHEDULER_TaskCallback task, void *task_cls)
Schedule a new task to be run as soon as possible.
Definition: scheduler.c:1280
static struct GNUNET_DNS_Handle * handle
Handle to transport service.
int response_code
Response code.
#define GNUNET_SYSERR
Definition: gnunet_common.h:76
static void cleanup_handle(void *cls)
Cleanup lookup handle.
static void do_error(void *cls)
Task run on errors.
struct MHD_Response * GNUNET_REST_create_response(const char *data)
Create REST MHD response.
Definition: rest.c:57
Here is the call graph for this function:
Here is the caller graph for this function:

◆ namestore_list_finished()

static void namestore_list_finished ( void *  cls)
static

Iteration over all results finished, build final response.

Parameters
clsthe struct RequestHandle

Definition at line 456 of file plugin_rest_namestore.c.

References cleanup_handle(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_free_non_null, GNUNET_log, GNUNET_REST_create_response(), GNUNET_SCHEDULER_add_now(), handle, RequestHandle::list_it, RequestHandle::proc, RequestHandle::proc_cls, and RequestHandle::resp_object.

Referenced by namestore_get().

457 {
458  struct RequestHandle *handle = cls;
459  char *result_str;
460  struct MHD_Response *resp;
461 
462  handle->list_it = NULL;
463 
464  if (NULL == handle->resp_object)
465  handle->resp_object = json_array ();
466 
467  result_str = json_dumps (handle->resp_object, 0);
468  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Result %s\n", result_str);
469  resp = GNUNET_REST_create_response (result_str);
470  handle->proc (handle->proc_cls, resp, MHD_HTTP_OK);
471  GNUNET_free_non_null (result_str);
473 }
GNUNET_REST_ResultProcessor proc
The plugin result processor.
#define GNUNET_free_non_null(ptr)
Free the memory pointed to by ptr if ptr is not NULL.
void * proc_cls
The closure of the result processor.
The request handle.
struct GNUNET_NAMESTORE_ZoneIterator * list_it
Handle to NAMESTORE it.
json_t * resp_object
Response object.
struct GNUNET_SCHEDULER_Task * GNUNET_SCHEDULER_add_now(GNUNET_SCHEDULER_TaskCallback task, void *task_cls)
Schedule a new task to be run as soon as possible.
Definition: scheduler.c:1280
static struct GNUNET_DNS_Handle * handle
Handle to transport service.
static void cleanup_handle(void *cls)
Cleanup lookup handle.
struct MHD_Response * GNUNET_REST_create_response(const char *data)
Create REST MHD response.
Definition: rest.c:57
#define GNUNET_log(kind,...)
Here is the call graph for this function:
Here is the caller graph for this function:

◆ namestore_list_iteration()

static void namestore_list_iteration ( void *  cls,
const struct GNUNET_CRYPTO_EcdsaPrivateKey zone_key,
const char *  rname,
unsigned int  rd_len,
const struct GNUNET_GNSRECORD_Data rd 
)
static

Create a response with requested records.

Parameters
handlethe RequestHandle

Definition at line 482 of file plugin_rest_namestore.c.

References GNUNET_JSON_from_gnsrecord(), GNUNET_NAMESTORE_zone_iterator_next(), handle, RequestHandle::list_it, and RequestHandle::resp_object.

Referenced by namestore_get().

487 {
488  struct RequestHandle *handle = cls;
489  json_t *record_obj;
490 
491  if (NULL == handle->resp_object)
492  handle->resp_object = json_array ();
493  record_obj = GNUNET_JSON_from_gnsrecord (rname,
494  rd,
495  rd_len);
496  json_array_append_new (handle->resp_object, record_obj);
498 }
void GNUNET_NAMESTORE_zone_iterator_next(struct GNUNET_NAMESTORE_ZoneIterator *it, uint64_t limit)
Calls the record processor specified in GNUNET_NAMESTORE_zone_iteration_start for the next record...
The request handle.
struct GNUNET_NAMESTORE_ZoneIterator * list_it
Handle to NAMESTORE it.
json_t * resp_object
Response object.
static struct GNUNET_DNS_Handle * handle
Handle to transport service.
json_t * GNUNET_JSON_from_gnsrecord(const char *rname, const struct GNUNET_GNSRECORD_Data *rd, unsigned int rd_count)
Convert Gns record to JSON.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ namestore_get()

void namestore_get ( struct GNUNET_REST_RequestHandle con_handle,
const char *  url,
void *  cls 
)

Handle namestore GET request.

Parameters
con_handlethe connection handle
urlthe url
clsthe RequestHandle

Definition at line 509 of file plugin_rest_namestore.c.

References do_error(), EgoEntry::ego, RequestHandle::emsg, get_egoentry_namestore(), GNUNET_IDENTITY_ego_get_private_key(), GNUNET_NAMESTORE_zone_iteration_start(), GNUNET_REST_API_NS_NAMESTORE, GNUNET_REST_IDENTITY_NOT_FOUND, GNUNET_REST_NAMESTORE_FAILED, GNUNET_SCHEDULER_add_now(), GNUNET_strdup, handle, RequestHandle::list_it, namestore_iteration_error(), namestore_list_finished(), namestore_list_iteration(), RequestHandle::ns_handle, RequestHandle::response_code, RequestHandle::url, and RequestHandle::zone_pkey.

Referenced by init_cont().

512 {
513  struct RequestHandle *handle = cls;
514  struct EgoEntry *ego_entry;
515  char *egoname;
516 
517  egoname = NULL;
518  ego_entry = NULL;
519 
520  // set zone to name if given
521  if (strlen (GNUNET_REST_API_NS_NAMESTORE) < strlen (handle->url))
522  {
523  egoname = &handle->url[strlen (GNUNET_REST_API_NS_NAMESTORE) + 1];
524  ego_entry = get_egoentry_namestore (handle, egoname);
525 
526  if (NULL == ego_entry)
527  {
528  handle->response_code = MHD_HTTP_NOT_FOUND;
531  return;
532  }
533  }
534  if (NULL != ego_entry)
535  handle->zone_pkey = GNUNET_IDENTITY_ego_get_private_key (ego_entry->ego);
536 
537  handle->list_it =
539  handle->zone_pkey,
541  handle,
543  handle,
545  handle);
546  if (NULL == handle->list_it)
547  {
550  return;
551  }
552 }
#define GNUNET_REST_NAMESTORE_FAILED
Error message Failed request.
static void namestore_iteration_error(void *cls)
Does internal server error when iteration failed.
struct GNUNET_NAMESTORE_ZoneIterator * GNUNET_NAMESTORE_zone_iteration_start(struct GNUNET_NAMESTORE_Handle *h, const struct GNUNET_CRYPTO_EcdsaPrivateKey *zone, GNUNET_SCHEDULER_TaskCallback error_cb, void *error_cb_cls, GNUNET_NAMESTORE_RecordMonitor proc, void *proc_cls, GNUNET_SCHEDULER_TaskCallback finish_cb, void *finish_cb_cls)
Starts a new zone iteration (used to periodically PUT all of our records into our DHT)...
struct EgoEntry * get_egoentry_namestore(struct RequestHandle *handle, char *name)
Get EgoEntry from list with either a public key or a name If public key and name are not NULL...
const struct GNUNET_CRYPTO_EcdsaPrivateKey * GNUNET_IDENTITY_ego_get_private_key(const struct GNUNET_IDENTITY_Ego *ego)
Obtain the ECC key associated with a ego.
Definition: identity_api.c:555
#define GNUNET_strdup(a)
Wrapper around GNUNET_xstrdup_.
static void namestore_list_iteration(void *cls, const struct GNUNET_CRYPTO_EcdsaPrivateKey *zone_key, const char *rname, unsigned int rd_len, const struct GNUNET_GNSRECORD_Data *rd)
Create a response with requested records.
The request handle.
The ego list.
struct GNUNET_IDENTITY_Ego * ego
The Ego.
struct GNUNET_NAMESTORE_ZoneIterator * list_it
Handle to NAMESTORE it.
char * emsg
Error response message.
#define GNUNET_REST_IDENTITY_NOT_FOUND
Error message No identity found.
struct GNUNET_SCHEDULER_Task * GNUNET_SCHEDULER_add_now(GNUNET_SCHEDULER_TaskCallback task, void *task_cls)
Schedule a new task to be run as soon as possible.
Definition: scheduler.c:1280
static struct GNUNET_DNS_Handle * handle
Handle to transport service.
static void namestore_list_finished(void *cls)
Iteration over all results finished, build final response.
int response_code
Response code.
const struct GNUNET_CRYPTO_EcdsaPrivateKey * zone_pkey
Private key for the zone.
static void do_error(void *cls)
Task run on errors.
struct GNUNET_NAMESTORE_Handle * ns_handle
Handle to NAMESTORE.
#define GNUNET_REST_API_NS_NAMESTORE
Namestore Namespace.
char * url
The url.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ ns_lookup_error_cb()

static void ns_lookup_error_cb ( void *  cls)
static

Definition at line 556 of file plugin_rest_namestore.c.

References do_error(), RequestHandle::emsg, GNUNET_REST_NAMESTORE_FAILED, GNUNET_SCHEDULER_add_now(), GNUNET_strdup, and handle.

Referenced by namestore_add().

557 {
558  struct RequestHandle *handle = cls;
559 
562 }
#define GNUNET_REST_NAMESTORE_FAILED
Error message Failed request.
#define GNUNET_strdup(a)
Wrapper around GNUNET_xstrdup_.
The request handle.
char * emsg
Error response message.
struct GNUNET_SCHEDULER_Task * GNUNET_SCHEDULER_add_now(GNUNET_SCHEDULER_TaskCallback task, void *task_cls)
Schedule a new task to be run as soon as possible.
Definition: scheduler.c:1280
static struct GNUNET_DNS_Handle * handle
Handle to transport service.
static void do_error(void *cls)
Task run on errors.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ ns_lookup_cb()

static void ns_lookup_cb ( void *  cls,
const struct GNUNET_CRYPTO_EcdsaPrivateKey zone,
const char *  label,
unsigned int  rd_count,
const struct GNUNET_GNSRECORD_Data rd 
)
static

Definition at line 566 of file plugin_rest_namestore.c.

References create_finished(), do_error(), GNUNET_NAMESTORE_records_store(), GNUNET_REST_NAMESTORE_FAILED, GNUNET_SCHEDULER_add_now(), GNUNET_strdup, and handle.

Referenced by namestore_add().

571 {
572  struct RequestHandle *handle = cls;
573  struct GNUNET_GNSRECORD_Data rd_new[rd_count + handle->rd_count];
574 
575  for (int i = 0; i < rd_count; i++)
576  rd_new[i] = rd[i];
577  for (int j = 0; j < handle->rd_count; j++)
578  rd_new[rd_count + j] = handle->rd[j];
580  handle->zone_pkey,
581  handle->record_name,
582  rd_count + handle->rd_count,
583  rd_new,
585  handle);
586  if (NULL == handle->add_qe)
587  {
590  return;
591  }
592 }
#define GNUNET_REST_NAMESTORE_FAILED
Error message Failed request.
static void create_finished(void *cls, int32_t success, const char *emsg)
Create finished callback.
struct GNUNET_NAMESTORE_QueueEntry * add_qe
NAMESTORE Operation.
#define GNUNET_strdup(a)
Wrapper around GNUNET_xstrdup_.
The request handle.
struct GNUNET_NAMESTORE_QueueEntry * GNUNET_NAMESTORE_records_store(struct GNUNET_NAMESTORE_Handle *h, const struct GNUNET_CRYPTO_EcdsaPrivateKey *pkey, const char *label, unsigned int rd_count, const struct GNUNET_GNSRECORD_Data *rd, GNUNET_NAMESTORE_ContinuationWithStatus cont, void *cont_cls)
Store an item in the namestore.
char * record_name
Records to store.
char * emsg
Error response message.
struct GNUNET_SCHEDULER_Task * GNUNET_SCHEDULER_add_now(GNUNET_SCHEDULER_TaskCallback task, void *task_cls)
Schedule a new task to be run as soon as possible.
Definition: scheduler.c:1280
unsigned int rd_count
Number of records in rd.
static struct GNUNET_DNS_Handle * handle
Handle to transport service.
const struct GNUNET_CRYPTO_EcdsaPrivateKey * zone_pkey
Private key for the zone.
static void do_error(void *cls)
Task run on errors.
struct GNUNET_NAMESTORE_Handle * ns_handle
Handle to NAMESTORE.
struct GNUNET_GNSRECORD_Data * rd
Records to store.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ namestore_add()

void namestore_add ( struct GNUNET_REST_RequestHandle con_handle,
const char *  url,
void *  cls 
)

Handle namestore POST request.

Parameters
con_handlethe connection handle
urlthe url
clsthe RequestHandle

Definition at line 603 of file plugin_rest_namestore.c.

References RequestHandle::add_qe, GNUNET_REST_RequestHandle::data, GNUNET_REST_RequestHandle::data_size, do_error(), EgoEntry::ego, RequestHandle::emsg, get_egoentry_namestore(), GNUNET_IDENTITY_ego_get_private_key(), GNUNET_JSON_parse(), GNUNET_JSON_parse_free(), GNUNET_JSON_spec_end(), GNUNET_JSON_spec_gnsrecord(), GNUNET_memcpy, GNUNET_NAMESTORE_records_lookup(), GNUNET_OK, GNUNET_REST_API_NS_NAMESTORE, GNUNET_REST_IDENTITY_NOT_FOUND, GNUNET_REST_NAMESTORE_FAILED, GNUNET_REST_NAMESTORE_INVALID_DATA, GNUNET_REST_NAMESTORE_NO_DATA, GNUNET_SCHEDULER_add_now(), GNUNET_strdup, handle, RequestHandle::ns_handle, ns_lookup_cb(), ns_lookup_error_cb(), RequestHandle::rd, RequestHandle::rd_count, RequestHandle::record_name, RequestHandle::response_code, RequestHandle::rest_handle, RequestHandle::url, and RequestHandle::zone_pkey.

Referenced by init_cont().

606 {
607  struct RequestHandle *handle = cls;
608  struct EgoEntry *ego_entry;
609  char *egoname;
610  json_t *data_js;
611  json_error_t err;
612 
613  char term_data[handle->rest_handle->data_size + 1];
614 
615  if (0 >= handle->rest_handle->data_size)
616  {
619  return;
620  }
621  term_data[handle->rest_handle->data_size] = '\0';
622  GNUNET_memcpy (term_data,
623  handle->rest_handle->data,
624  handle->rest_handle->data_size);
625  data_js = json_loads (term_data, JSON_DECODE_ANY, &err);
626  struct GNUNET_JSON_Specification gnsspec[] =
627  { GNUNET_JSON_spec_gnsrecord (&handle->rd, &handle->rd_count,
628  &handle->record_name),
630  if (GNUNET_OK != GNUNET_JSON_parse (data_js, gnsspec, NULL, NULL))
631  {
634  json_decref (data_js);
635  return;
636  }
637  GNUNET_JSON_parse_free (gnsspec);
638  if (0 >= strlen (handle->record_name))
639  {
642  json_decref (data_js);
643  return;
644  }
645  json_decref (data_js);
646 
647  egoname = NULL;
648  ego_entry = NULL;
649 
650  // set zone to name if given
651  if (strlen (GNUNET_REST_API_NS_NAMESTORE) < strlen (handle->url))
652  {
653  egoname = &handle->url[strlen (GNUNET_REST_API_NS_NAMESTORE) + 1];
654  ego_entry = get_egoentry_namestore (handle, egoname);
655 
656  if (NULL == ego_entry)
657  {
658  handle->response_code = MHD_HTTP_NOT_FOUND;
661  return;
662  }
663  }
664  if (NULL != ego_entry)
665  handle->zone_pkey = GNUNET_IDENTITY_ego_get_private_key (ego_entry->ego);
667  handle->zone_pkey,
668  handle->record_name,
670  handle,
671  &ns_lookup_cb,
672  handle);
673  if (NULL == handle->add_qe)
674  {
677  return;
678  }
679 }
#define GNUNET_REST_NAMESTORE_FAILED
Error message Failed request.
size_t data_size
The POST data size.
struct GNUNET_NAMESTORE_QueueEntry * GNUNET_NAMESTORE_records_lookup(struct GNUNET_NAMESTORE_Handle *h, const struct GNUNET_CRYPTO_EcdsaPrivateKey *pkey, const char *label, GNUNET_SCHEDULER_TaskCallback error_cb, void *error_cb_cls, GNUNET_NAMESTORE_RecordMonitor rm, void *rm_cls)
Lookup an item in the namestore.
struct EgoEntry * get_egoentry_namestore(struct RequestHandle *handle, char *name)
Get EgoEntry from list with either a public key or a name If public key and name are not NULL...
void GNUNET_JSON_parse_free(struct GNUNET_JSON_Specification *spec)
Frees all elements allocated during a GNUNET_JSON_parse() operation.
Definition: json.c:100
const struct GNUNET_CRYPTO_EcdsaPrivateKey * GNUNET_IDENTITY_ego_get_private_key(const struct GNUNET_IDENTITY_Ego *ego)
Obtain the ECC key associated with a ego.
Definition: identity_api.c:555
#define GNUNET_memcpy(dst, src, n)
Call memcpy() but check for n being 0 first.
Entry in parser specification for GNUNET_JSON_parse().
#define GNUNET_OK
Named constants for return values.
Definition: gnunet_common.h:75
static void ns_lookup_error_cb(void *cls)
struct GNUNET_NAMESTORE_QueueEntry * add_qe
NAMESTORE Operation.
#define GNUNET_strdup(a)
Wrapper around GNUNET_xstrdup_.
The request handle.
The ego list.
struct GNUNET_IDENTITY_Ego * ego
The Ego.
char * record_name
Records to store.
static void ns_lookup_cb(void *cls, const struct GNUNET_CRYPTO_EcdsaPrivateKey *zone, const char *label, unsigned int rd_count, const struct GNUNET_GNSRECORD_Data *rd)
char * emsg
Error response message.
int GNUNET_JSON_parse(const json_t *root, struct GNUNET_JSON_Specification *spec, const char **error_json_name, unsigned int *error_line)
Navigate and parse data in a JSON tree.
Definition: json.c:45
#define GNUNET_REST_IDENTITY_NOT_FOUND
Error message No identity found.
struct GNUNET_SCHEDULER_Task * GNUNET_SCHEDULER_add_now(GNUNET_SCHEDULER_TaskCallback task, void *task_cls)
Schedule a new task to be run as soon as possible.
Definition: scheduler.c:1280
unsigned int rd_count
Number of records in rd.
static struct GNUNET_DNS_Handle * handle
Handle to transport service.
struct GNUNET_REST_RequestHandle * rest_handle
Rest connection.
int response_code
Response code.
#define GNUNET_REST_NAMESTORE_NO_DATA
Error message No data.
const char * data
The POST data.
const struct GNUNET_CRYPTO_EcdsaPrivateKey * zone_pkey
Private key for the zone.
struct GNUNET_JSON_Specification GNUNET_JSON_spec_gnsrecord(struct GNUNET_GNSRECORD_Data **rd, unsigned int *rd_count, char **name)
JSON Specification for GNS Records.
static void do_error(void *cls)
Task run on errors.
#define GNUNET_REST_NAMESTORE_INVALID_DATA
Error message invalid data.
struct GNUNET_NAMESTORE_Handle * ns_handle
Handle to NAMESTORE.
#define GNUNET_REST_API_NS_NAMESTORE
Namestore Namespace.
struct GNUNET_GNSRECORD_Data * rd
Records to store.
struct GNUNET_JSON_Specification GNUNET_JSON_spec_end(void)
End of a parser specification.
Definition: json_helper.c:35
char * url
The url.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ namestore_delete()

void namestore_delete ( struct GNUNET_REST_RequestHandle con_handle,
const char *  url,
void *  cls 
)

Handle namestore DELETE request.

Parameters
con_handlethe connection handle
urlthe url
clsthe RequestHandle

Definition at line 690 of file plugin_rest_namestore.c.

References RequestHandle::add_qe, del_finished(), do_error(), EgoEntry::ego, RequestHandle::emsg, get_egoentry_namestore(), GNUNET_CONTAINER_multihashmap_contains(), GNUNET_CONTAINER_multihashmap_get(), GNUNET_CRYPTO_hash(), GNUNET_IDENTITY_ego_get_private_key(), GNUNET_NAMESTORE_records_store(), GNUNET_NO, GNUNET_REST_API_NS_NAMESTORE, GNUNET_REST_IDENTITY_NOT_FOUND, GNUNET_REST_NAMESTORE_FAILED, GNUNET_REST_NAMESTORE_INVALID_DATA, GNUNET_SCHEDULER_add_now(), GNUNET_strdup, handle, RequestHandle::ns_handle, RequestHandle::record_name, RequestHandle::response_code, RequestHandle::url, GNUNET_REST_RequestHandle::url_param_map, and RequestHandle::zone_pkey.

Referenced by init_cont().

693 {
694  struct RequestHandle *handle = cls;
695  struct GNUNET_HashCode key;
696  struct EgoEntry *ego_entry;
697  char *egoname;
698 
699  egoname = NULL;
700  ego_entry = NULL;
701 
702  // set zone to name if given
703  if (strlen (GNUNET_REST_API_NS_NAMESTORE) < strlen (handle->url))
704  {
705  egoname = &handle->url[strlen (GNUNET_REST_API_NS_NAMESTORE) + 1];
706  ego_entry = get_egoentry_namestore (handle, egoname);
707 
708  if (NULL == ego_entry)
709  {
710  handle->response_code = MHD_HTTP_NOT_FOUND;
713  return;
714  }
715  }
716  if (NULL != ego_entry)
717  handle->zone_pkey = GNUNET_IDENTITY_ego_get_private_key (ego_entry->ego);
718 
719  GNUNET_CRYPTO_hash ("record_name", strlen ("record_name"), &key);
720  if (GNUNET_NO ==
722  {
725  return;
726  }
727  handle->record_name = GNUNET_strdup (
729 
731  handle->zone_pkey,
732  handle->record_name,
733  0,
734  NULL,
735  &del_finished,
736  handle);
737  if (NULL == handle->add_qe)
738  {
741  return;
742  }
743 }
#define GNUNET_REST_NAMESTORE_FAILED
Error message Failed request.
struct EgoEntry * get_egoentry_namestore(struct RequestHandle *handle, char *name)
Get EgoEntry from list with either a public key or a name If public key and name are not NULL...
const struct GNUNET_CRYPTO_EcdsaPrivateKey * GNUNET_IDENTITY_ego_get_private_key(const struct GNUNET_IDENTITY_Ego *ego)
Obtain the ECC key associated with a ego.
Definition: identity_api.c:555
#define GNUNET_NO
Definition: gnunet_common.h:78
struct GNUNET_NAMESTORE_QueueEntry * add_qe
NAMESTORE Operation.
int GNUNET_CONTAINER_multihashmap_contains(const struct GNUNET_CONTAINER_MultiHashMap *map, const struct GNUNET_HashCode *key)
Check if the map contains any value under the given key (including values that are NULL)...
#define GNUNET_strdup(a)
Wrapper around GNUNET_xstrdup_.
The request handle.
void * GNUNET_CONTAINER_multihashmap_get(const struct GNUNET_CONTAINER_MultiHashMap *map, const struct GNUNET_HashCode *key)
Given a key find a value in the map matching the key.
struct GNUNET_NAMESTORE_QueueEntry * GNUNET_NAMESTORE_records_store(struct GNUNET_NAMESTORE_Handle *h, const struct GNUNET_CRYPTO_EcdsaPrivateKey *pkey, const char *label, unsigned int rd_count, const struct GNUNET_GNSRECORD_Data *rd, GNUNET_NAMESTORE_ContinuationWithStatus cont, void *cont_cls)
Store an item in the namestore.
The ego list.
struct GNUNET_IDENTITY_Ego * ego
The Ego.
char * record_name
Records to store.
char * emsg
Error response message.
struct GNUNET_CONTAINER_MultiHashMap * url_param_map
Map of url parameters.
#define GNUNET_REST_IDENTITY_NOT_FOUND
Error message No identity found.
void GNUNET_CRYPTO_hash(const void *block, size_t size, struct GNUNET_HashCode *ret)
Compute hash of a given block.
Definition: crypto_hash.c:48
struct GNUNET_SCHEDULER_Task * GNUNET_SCHEDULER_add_now(GNUNET_SCHEDULER_TaskCallback task, void *task_cls)
Schedule a new task to be run as soon as possible.
Definition: scheduler.c:1280
static struct GNUNET_DNS_Handle * handle
Handle to transport service.
A 512-bit hashcode.
int response_code
Response code.
struct GNUNET_HashCode key
The key used in the DHT.
const struct GNUNET_CRYPTO_EcdsaPrivateKey * zone_pkey
Private key for the zone.
static void do_error(void *cls)
Task run on errors.
#define GNUNET_REST_NAMESTORE_INVALID_DATA
Error message invalid data.
struct GNUNET_NAMESTORE_Handle * ns_handle
Handle to NAMESTORE.
#define GNUNET_REST_API_NS_NAMESTORE
Namestore Namespace.
static void del_finished(void *cls, int32_t success, const char *emsg)
Delete finished callback.
char * url
The url.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ options_cont()

static void options_cont ( struct GNUNET_REST_RequestHandle con_handle,
const char *  url,
void *  cls 
)
static

Respond to OPTIONS request.

Parameters
con_handlethe connection handle
urlthe url
clsthe RequestHandle

Definition at line 754 of file plugin_rest_namestore.c.

References allow_methods, cleanup_handle(), GNUNET_REST_create_response(), GNUNET_SCHEDULER_add_now(), handle, RequestHandle::proc, and RequestHandle::proc_cls.

Referenced by init_cont().

757 {
758  struct MHD_Response *resp;
759  struct RequestHandle *handle = cls;
760 
761  // independent of path return all options
762  resp = GNUNET_REST_create_response (NULL);
763  MHD_add_response_header (resp, "Access-Control-Allow-Methods", allow_methods);
764  handle->proc (handle->proc_cls, resp, MHD_HTTP_OK);
766  return;
767 }
GNUNET_REST_ResultProcessor proc
The plugin result processor.
void * proc_cls
The closure of the result processor.
The request handle.
struct GNUNET_SCHEDULER_Task * GNUNET_SCHEDULER_add_now(GNUNET_SCHEDULER_TaskCallback task, void *task_cls)
Schedule a new task to be run as soon as possible.
Definition: scheduler.c:1280
static struct GNUNET_DNS_Handle * handle
Handle to transport service.
static char * allow_methods
HTTP methods allows for this plugin.
static void cleanup_handle(void *cls)
Cleanup lookup handle.
struct MHD_Response * GNUNET_REST_create_response(const char *data)
Create REST MHD response.
Definition: rest.c:57
Here is the call graph for this function:
Here is the caller graph for this function:

◆ init_cont()

static void init_cont ( struct RequestHandle handle)
static

Handle rest request.

Parameters
handlethe request handle

Definition at line 776 of file plugin_rest_namestore.c.

References do_error(), GNUNET_REST_RequestHandlerError::error_code, GNUNET_NO, GNUNET_REST_API_NS_NAMESTORE, GNUNET_REST_handle_request(), GNUNET_REST_HANDLER_END, GNUNET_SCHEDULER_add_now(), namestore_add(), namestore_delete(), namestore_get(), options_cont(), RequestHandle::response_code, and RequestHandle::rest_handle.

Referenced by id_connect_cb().

777 {
779  static const struct GNUNET_REST_RequestHandler handlers[] =
780  { { MHD_HTTP_METHOD_GET, GNUNET_REST_API_NS_NAMESTORE, &namestore_get },
781  { MHD_HTTP_METHOD_POST, GNUNET_REST_API_NS_NAMESTORE, &namestore_add },
782  { MHD_HTTP_METHOD_DELETE, GNUNET_REST_API_NS_NAMESTORE, &namestore_delete },
783  { MHD_HTTP_METHOD_OPTIONS, GNUNET_REST_API_NS_NAMESTORE, &options_cont },
785 
786  if (GNUNET_NO ==
787  GNUNET_REST_handle_request (handle->rest_handle, handlers, &err, handle))
788  {
789  handle->response_code = err.error_code;
791  }
792 }
void namestore_delete(struct GNUNET_REST_RequestHandle *con_handle, const char *url, void *cls)
Handle namestore DELETE request.
#define GNUNET_NO
Definition: gnunet_common.h:78
#define GNUNET_REST_HANDLER_END
void namestore_add(struct GNUNET_REST_RequestHandle *con_handle, const char *url, void *cls)
Handle namestore POST request.
static struct GNUNET_CADET_MessageHandler handlers[]
Handlers, for diverse services.
struct GNUNET_SCHEDULER_Task * GNUNET_SCHEDULER_add_now(GNUNET_SCHEDULER_TaskCallback task, void *task_cls)
Schedule a new task to be run as soon as possible.
Definition: scheduler.c:1280
static void options_cont(struct GNUNET_REST_RequestHandle *con_handle, const char *url, void *cls)
Respond to OPTIONS request.
int GNUNET_REST_handle_request(struct GNUNET_REST_RequestHandle *conn, const struct GNUNET_REST_RequestHandler *handlers, struct GNUNET_REST_RequestHandlerError *err, void *cls)
Definition: rest.c:77
struct GNUNET_REST_RequestHandle * rest_handle
Rest connection.
int response_code
Response code.
static void do_error(void *cls)
Task run on errors.
void namestore_get(struct GNUNET_REST_RequestHandle *con_handle, const char *url, void *cls)
Handle namestore GET request.
#define GNUNET_REST_API_NS_NAMESTORE
Namestore Namespace.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ id_connect_cb()

static void id_connect_cb ( void *  cls,
struct GNUNET_IDENTITY_Ego ego,
void **  ctx,
const char *  name 
)
static

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).

Parameters
clsclosure
egoego handle
ctxcontext for application to store data for this ego (during the lifetime of this process, initially NULL)
nameidentifier assigned by the user for this ego, NULL if the user just deleted the ego and it must thus no longer be used

Definition at line 827 of file plugin_rest_namestore.c.

References EgoEntry::ego, RequestHandle::ego_head, RequestHandle::ego_tail, GNUNET_asprintf(), GNUNET_CONTAINER_DLL_insert_tail, GNUNET_CRYPTO_ecdsa_public_key_to_string(), GNUNET_IDENTITY_ego_get_public_key(), GNUNET_new, handle, ID_REST_STATE_INIT, ID_REST_STATE_POST_INIT, EgoEntry::identifier, init_cont(), EgoEntry::keystring, and RequestHandle::state.

Referenced by rest_process_request().

831 {
832  struct RequestHandle *handle = cls;
833  struct EgoEntry *ego_entry;
835 
836  if ((NULL == ego) && (ID_REST_STATE_INIT == handle->state))
837  {
838  handle->state = ID_REST_STATE_POST_INIT;
839  init_cont (handle);
840  return;
841  }
842  if (ID_REST_STATE_INIT == handle->state)
843  {
844  ego_entry = GNUNET_new (struct EgoEntry);
847  ego_entry->ego = ego;
848  GNUNET_asprintf (&ego_entry->identifier, "%s", name);
850  handle->ego_tail,
851  ego_entry);
852  }
853 }
static struct GNUNET_CRYPTO_EddsaPrivateKey * pk
Private key of this peer.
struct EgoEntry * ego_tail
Ego list.
#define GNUNET_new(type)
Allocate a struct or union of the given type.
The request handle.
The ego list.
struct GNUNET_IDENTITY_Ego * ego
The Ego.
int GNUNET_asprintf(char **buf, const char *format,...)
Like asprintf, just portable.
static struct GNUNET_DNS_Handle * handle
Handle to transport service.
int state
The processing state.
char * GNUNET_CRYPTO_ecdsa_public_key_to_string(const struct GNUNET_CRYPTO_EcdsaPublicKey *pub)
Convert a public key to a string.
Definition: crypto_ecc.c:332
char * keystring
Public key string.
#define ID_REST_STATE_INIT
State while collecting all egos.
#define GNUNET_CONTAINER_DLL_insert_tail(head, tail, element)
Insert an element at the tail of a DLL.
void GNUNET_IDENTITY_ego_get_public_key(const struct GNUNET_IDENTITY_Ego *ego, struct GNUNET_CRYPTO_EcdsaPublicKey *pk)
Get the identifier (public key) of an ego.
Definition: identity_api.c:568
char * identifier
Ego Identifier.
#define ID_REST_STATE_POST_INIT
Done collecting egos.
struct EgoEntry * ego_head
Ego list.
const char * name
Public ECC key (always for Curve25519) encoded in a format suitable for network transmission and ECDS...
static void init_cont(struct RequestHandle *handle)
Handle rest request.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ rest_process_request()

static void rest_process_request ( struct GNUNET_REST_RequestHandle rest_handle,
GNUNET_REST_ResultProcessor  proc,
void *  proc_cls 
)
static

Function processing the REST call.

Parameters
methodHTTP method
urlURL of the HTTP request
databody of the HTTP request (optional)
data_sizelength of the body
proccallback function for the result
proc_clsclosure for callback function
Returns
GNUNET_OK if request accepted

Definition at line 868 of file plugin_rest_namestore.c.

References do_error(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_IDENTITY_connect(), GNUNET_log, GNUNET_NAMESTORE_connect(), GNUNET_new, GNUNET_SCHEDULER_add_delayed(), GNUNET_strdup, GNUNET_TIME_UNIT_FOREVER_REL, handle, id_connect_cb(), RequestHandle::identity_handle, RequestHandle::ns_handle, RequestHandle::proc, RequestHandle::proc_cls, RequestHandle::response_code, RequestHandle::rest_handle, RequestHandle::timeout, RequestHandle::timeout_task, GNUNET_REST_RequestHandle::url, RequestHandle::url, and RequestHandle::zone_pkey.

Referenced by libgnunet_plugin_rest_namestore_init().

871 {
872  struct RequestHandle *handle = GNUNET_new (struct RequestHandle);
873 
874  handle->response_code = 0;
876  handle->proc_cls = proc_cls;
877  handle->proc = proc;
878  handle->rest_handle = rest_handle;
879  handle->zone_pkey = NULL;
880 
881  handle->url = GNUNET_strdup (rest_handle->url);
882  if (handle->url[strlen (handle->url) - 1] == '/')
883  handle->url[strlen (handle->url) - 1] = '\0';
884  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Connecting...\n");
885 
887  handle->identity_handle =
889  handle->timeout_task =
890  GNUNET_SCHEDULER_add_delayed (handle->timeout, &do_error, handle);
891 
892  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Connected\n");
893 }
struct GNUNET_IDENTITY_Handle * GNUNET_IDENTITY_connect(const struct GNUNET_CONFIGURATION_Handle *cfg, GNUNET_IDENTITY_Callback cb, void *cb_cls)
Connect to the identity service.
Definition: identity_api.c:527
const struct GNUNET_CONFIGURATION_Handle * cfg
The configuration handle.
GNUNET_REST_ResultProcessor proc
The plugin result processor.
static void id_connect_cb(void *cls, struct GNUNET_IDENTITY_Ego *ego, void **ctx, const char *name)
This function is initially called for all egos and then again whenever a ego&#39;s identifier changes or ...
#define GNUNET_new(type)
Allocate a struct or union of the given type.
#define GNUNET_strdup(a)
Wrapper around GNUNET_xstrdup_.
void * proc_cls
The closure of the result processor.
The request handle.
struct GNUNET_SCHEDULER_Task * GNUNET_SCHEDULER_add_delayed(struct GNUNET_TIME_Relative delay, GNUNET_SCHEDULER_TaskCallback task, void *task_cls)
Schedule a new task to be run with a specified delay.
Definition: scheduler.c:1253
const char * url
The url as string.
struct GNUNET_TIME_Relative timeout
Desired timeout for the lookup (default is no timeout).
static struct GNUNET_DNS_Handle * handle
Handle to transport service.
#define GNUNET_TIME_UNIT_FOREVER_REL
Constant used to specify "forever".
struct GNUNET_REST_RequestHandle * rest_handle
Rest connection.
int response_code
Response code.
const struct GNUNET_CRYPTO_EcdsaPrivateKey * zone_pkey
Private key for the zone.
static void do_error(void *cls)
Task run on errors.
struct GNUNET_NAMESTORE_Handle * GNUNET_NAMESTORE_connect(const struct GNUNET_CONFIGURATION_Handle *cfg)
Connect to the namestore service.
struct GNUNET_NAMESTORE_Handle * ns_handle
Handle to NAMESTORE.
struct GNUNET_SCHEDULER_Task * timeout_task
ID of a task associated with the resolution process.
#define GNUNET_log(kind,...)
struct GNUNET_IDENTITY_Handle * identity_handle
Handle to Identity service.
char * url
The url.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ libgnunet_plugin_rest_namestore_init()

void* libgnunet_plugin_rest_namestore_init ( void *  cls)

Entry point for the plugin.

Parameters
clsConfig info
Returns
NULL on error, otherwise the plugin context

Definition at line 903 of file plugin_rest_namestore.c.

References _, allow_methods, Plugin::api, Plugin::cfg, GNUNET_REST_Plugin::cls, GNUNET_asprintf(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_log, GNUNET_new, GNUNET_REST_API_NS_NAMESTORE, GNUNET_REST_Plugin::name, plugin, GNUNET_REST_Plugin::process_request, and rest_process_request().

904 {
905  static struct Plugin plugin;
906  struct GNUNET_REST_Plugin *api;
907 
908  cfg = cls;
909  if (NULL != plugin.cfg)
910  return NULL; /* can only initialize once! */
911  memset (&plugin, 0, sizeof(struct Plugin));
912  plugin.cfg = cfg;
913  api = GNUNET_new (struct GNUNET_REST_Plugin);
914  api->cls = &plugin;
918  "%s, %s, %s, %s, %s",
919  MHD_HTTP_METHOD_GET,
920  MHD_HTTP_METHOD_POST,
921  MHD_HTTP_METHOD_PUT,
922  MHD_HTTP_METHOD_DELETE,
923  MHD_HTTP_METHOD_OPTIONS);
924 
925  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, _ ("Namestore REST API initialized\n"));
926  return api;
927 }
const struct GNUNET_CONFIGURATION_Handle * cfg
The configuration handle.
void * cls
The closure of the plugin.
struct returned by the initialization function of the plugin
#define GNUNET_new(type)
Allocate a struct or union of the given type.
void(* process_request)(struct GNUNET_REST_RequestHandle *handle, GNUNET_REST_ResultProcessor proc, void *proc_cls)
Function to process a REST call.
static void rest_process_request(struct GNUNET_REST_RequestHandle *rest_handle, GNUNET_REST_ResultProcessor proc, void *proc_cls)
Function processing the REST call.
#define _(String)
GNU gettext support macro.
Definition: platform.h:181
int GNUNET_asprintf(char **buf, const char *format,...)
Like asprintf, just portable.
char * name
Plugin name.
static char * plugin
Solver plugin name as string.
static char * allow_methods
HTTP methods allows for this plugin.
Handle for a plugin.
Definition: block.c:37
#define GNUNET_REST_API_NS_NAMESTORE
Namestore Namespace.
#define GNUNET_log(kind,...)
Here is the call graph for this function:

◆ libgnunet_plugin_rest_namestore_done()

void* libgnunet_plugin_rest_namestore_done ( void *  cls)

Exit point from the plugin.

Parameters
clsthe plugin context (as returned by "init")
Returns
always NULL

Definition at line 937 of file plugin_rest_namestore.c.

References allow_methods, Plugin::api, Plugin::cfg, GNUNET_REST_Plugin::cls, GNUNET_ERROR_TYPE_DEBUG, GNUNET_free, GNUNET_free_non_null, GNUNET_log, and plugin.

938 {
939  struct GNUNET_REST_Plugin *api = cls;
940  struct Plugin *plugin = api->cls;
941 
942  plugin->cfg = NULL;
943 
945  GNUNET_free (api);
946  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Namestore REST plugin is finished\n");
947  return NULL;
948 }
void * cls
The closure of the plugin.
const struct GNUNET_CONFIGURATION_Handle * cfg
Our configuration.
struct returned by the initialization function of the plugin
#define GNUNET_free_non_null(ptr)
Free the memory pointed to by ptr if ptr is not NULL.
static char * plugin
Solver plugin name as string.
static char * allow_methods
HTTP methods allows for this plugin.
Handle for a plugin.
Definition: block.c:37
#define GNUNET_log(kind,...)
#define GNUNET_free(ptr)
Wrapper around free.

Variable Documentation

◆ cfg

const struct GNUNET_CONFIGURATION_Handle* cfg

The configuration handle.

Handle to our configuration.

Definition at line 80 of file plugin_rest_namestore.c.

◆ allow_methods

char* allow_methods
static

HTTP methods allows for this plugin.

Definition at line 85 of file plugin_rest_namestore.c.

Referenced by libgnunet_plugin_rest_namestore_done(), libgnunet_plugin_rest_namestore_init(), and options_cont().