From 17de5c9d798109f55059190c886609ba377e4eb6 Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Sun, 30 Jun 2013 19:21:05 +0000 Subject: -towards implementing improved namestore API --- src/namestore/Makefile.am | 9 +- src/namestore/gnunet-namestore.c | 295 ++++---- src/namestore/gnunet-service-namestore.c | 571 ++-------------- src/namestore/namestore.h | 151 +---- src/namestore/namestore_api.c | 205 +----- src/namestore/namestore_api_common.c | 755 +++++++++++++++++++++ src/namestore/namestore_api_monitor.c | 79 +++ src/namestore/namestore_common.c | 755 --------------------- src/namestore/plugin_namestore_sqlite.c | 2 +- src/namestore/test_namestore_api_create.c | 14 +- src/namestore/test_namestore_api_create_update.c | 14 +- src/namestore/test_namestore_api_remove.c | 6 +- ...test_namestore_api_remove_not_existing_record.c | 13 +- src/namestore/test_namestore_api_zone_iteration.c | 8 +- ...st_namestore_api_zone_iteration_specific_zone.c | 15 +- .../test_namestore_api_zone_iteration_stop.c | 6 +- src/namestore/test_namestore_api_zone_to_name.c | 2 +- 17 files changed, 1137 insertions(+), 1763 deletions(-) create mode 100644 src/namestore/namestore_api_common.c create mode 100644 src/namestore/namestore_api_monitor.c delete mode 100644 src/namestore/namestore_common.c (limited to 'src/namestore') diff --git a/src/namestore/Makefile.am b/src/namestore/Makefile.am index df16e04bd..b920c43c4 100644 --- a/src/namestore/Makefile.am +++ b/src/namestore/Makefile.am @@ -64,7 +64,10 @@ lib_LTLIBRARIES = \ libgnunetnamestore.la libgnunetnamestore_la_SOURCES = \ - namestore_api.c namestore_common.c namestore.h + namestore_api.c \ + namestore_api_monitor.c \ + namestore_api_common.c \ + namestore.h libgnunetnamestore_la_LIBADD = \ $(top_builddir)/src/statistics/libgnunetstatistics.la \ $(top_builddir)/src/util/libgnunetutil.la \ @@ -111,7 +114,7 @@ plugin_LTLIBRARIES = \ $(POSTGRES_PLUGIN) libgnunet_plugin_namestore_sqlite_la_SOURCES = \ - plugin_namestore_sqlite.c namestore_common.c + plugin_namestore_sqlite.c libgnunet_plugin_namestore_sqlite_la_LIBADD = \ $(top_builddir)/src/namestore/libgnunetnamestore.la \ $(top_builddir)/src/statistics/libgnunetstatistics.la \ @@ -126,7 +129,7 @@ libgnunet_plugin_namestore_sqlite_la_DEPENDENCIES = \ libgnunet_plugin_namestore_postgres_la_SOURCES = \ - plugin_namestore_postgres.c namestore_common.c + plugin_namestore_postgres.c libgnunet_plugin_namestore_postgres_la_LIBADD = \ $(top_builddir)/src/namestore/libgnunetnamestore.la \ $(top_builddir)/src/postgres/libgnunetpostgres.la \ diff --git a/src/namestore/gnunet-namestore.c b/src/namestore/gnunet-namestore.c index 20452eb8c..c43b18593 100644 --- a/src/namestore/gnunet-namestore.c +++ b/src/namestore/gnunet-namestore.c @@ -133,6 +133,36 @@ static char *expirationstring; */ static int ret; +/** + * Type string converted to DNS type value. + */ +static uint32_t type; + +/** + * Value in binary format. + */ +static void *data; + +/** + * Number of bytes in 'data'. + */ +static size_t data_size; + +/** + * Expirationstring converted to relative time. + */ +static struct GNUNET_TIME_Relative etime_rel; + +/** + * Expirationstring converted to absolute time. + */ +static struct GNUNET_TIME_Absolute etime_abs; + +/** + * Is expiration time relative or absolute time? + */ +static int etime_is_rel = GNUNET_SYSERR; + /** * Task run on shutdown. Cleans up everything. @@ -327,6 +357,69 @@ display_record (void *cls, } +/** + * We're storing a record; this function is given the existing record + * so that we can merge the information. + * + * @param cls closure, unused + * @param zone_key public key of the zone + * @param freshness when does the corresponding block in the DHT expire (until + * when should we never do a DHT lookup for the same name again)?; + * GNUNET_TIME_UNIT_ZERO_ABS if there are no records of any type in the namestore, + * or the expiration time of the block in the namestore (even if there are zero + * records matching the desired record type) + * @param name name that is being mapped (at most 255 characters long) + * @param rd_count number of entries in 'rd' array + * @param rd array of records with data to store + * @param signature signature of the record block, NULL if signature is unavailable (i.e. + * because the user queried for a particular record type only) + */ +static void +get_existing_record (void *cls, + const struct GNUNET_CRYPTO_EccPublicKeyBinaryEncoded *zone_key, + struct GNUNET_TIME_Absolute freshness, + const char *name, + unsigned int rd_count, + const struct GNUNET_NAMESTORE_RecordData *rd, + const struct GNUNET_CRYPTO_EccSignature *signature) +{ + struct GNUNET_NAMESTORE_RecordData rdn[rd_count + 1]; + struct GNUNET_NAMESTORE_RecordData *rde; + + add_qe = NULL; + memset (rdn, 0, sizeof (struct GNUNET_NAMESTORE_RecordData)); + memcpy (&rdn[1], rd, rd_count * sizeof (struct GNUNET_NAMESTORE_RecordData)); + /* FIXME: should add some logic to overwrite records if there + can only be one record of a particular type, and to check + if the combination of records is valid to begin with... */ + rde = &rdn[0]; + rde->data = data; + rde->data_size = data_size; + rde->record_type = type; + if (GNUNET_YES == etime_is_rel) + { + rde->expiration_time = etime_rel.rel_value; + rde->flags |= GNUNET_NAMESTORE_RF_RELATIVE_EXPIRATION; + } + else if (GNUNET_NO == etime_is_rel) + { + rde->expiration_time = etime_abs.abs_value; + } + if (1 != nonauthority) + rde->flags |= GNUNET_NAMESTORE_RF_AUTHORITY; + if (1 != public) + rde->flags |= GNUNET_NAMESTORE_RF_PRIVATE; + + add_qe = GNUNET_NAMESTORE_record_put_by_authority (ns, + zone_pkey, + name, + rd_count + 1, + rde, + &add_continuation, + &add_qe); +} + + /** * Function called with the result of the ECC key generation. * @@ -341,12 +434,6 @@ key_generation_cb (void *cls, { const struct GNUNET_CONFIGURATION_Handle *cfg = cls; struct GNUNET_CRYPTO_EccPublicKeyBinaryEncoded pub; - uint32_t type; - void *data = NULL; - size_t data_size = 0; - struct GNUNET_TIME_Relative etime_rel; - struct GNUNET_TIME_Absolute etime_abs; - int etime_is_rel = GNUNET_SYSERR; struct GNUNET_NAMESTORE_RecordData rd; keygen = NULL; @@ -385,138 +472,97 @@ key_generation_cb (void *cls, } GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_FOREVER_REL, &do_shutdown, NULL); - if (NULL == typestring) - type = 0; - else - type = GNUNET_NAMESTORE_typename_to_number (typestring); - if (UINT32_MAX == type) - { - fprintf (stderr, _("Unsupported type `%s'\n"), typestring); - GNUNET_SCHEDULER_shutdown (); - ret = 1; - return; - } - if ((NULL == typestring) && (add | del)) - { - fprintf (stderr, - _("Missing option `%s' for operation `%s'\n"), - "-t", _("add/del")); - GNUNET_SCHEDULER_shutdown (); - ret = 1; - return; - } - if (NULL != value) - { - if (GNUNET_OK != - GNUNET_NAMESTORE_string_to_value (type, - value, - &data, - &data_size)) - { - fprintf (stderr, _("Value `%s' invalid for record type `%s'\n"), - value, - typestring); - GNUNET_SCHEDULER_shutdown (); - ret = 1; - return; - } - } else if (add | del) - { - fprintf (stderr, - _("Missing option `%s' for operation `%s'\n"), - "-V", _("add/del")); - ret = 1; - GNUNET_SCHEDULER_shutdown (); - return; - } - if (NULL != expirationstring) + if (add) { - if (0 == strcmp (expirationstring, "never")) + if (NULL == name) { - etime_abs = GNUNET_TIME_UNIT_FOREVER_ABS; - etime_is_rel = GNUNET_NO; + fprintf (stderr, + _("Missing option `%s' for operation `%s'\n"), + "-n", _("add")); + GNUNET_SCHEDULER_shutdown (); + ret = 1; + return; } - else if (GNUNET_OK == - GNUNET_STRINGS_fancy_time_to_relative (expirationstring, - &etime_rel)) + if (NULL == typestring) { - etime_is_rel = GNUNET_YES; + fprintf (stderr, + _("Missing option `%s' for operation `%s'\n"), + "-t", _("add")); + GNUNET_SCHEDULER_shutdown (); + ret = 1; + return; } - else if (GNUNET_OK == - GNUNET_STRINGS_fancy_time_to_absolute (expirationstring, - &etime_abs)) + type = GNUNET_NAMESTORE_typename_to_number (typestring); + if (UINT32_MAX == type) { - etime_is_rel = GNUNET_NO; + fprintf (stderr, _("Unsupported type `%s'\n"), typestring); + GNUNET_SCHEDULER_shutdown (); + ret = 1; + return; } - else + if (NULL == value) { fprintf (stderr, - _("Invalid time format `%s'\n"), - expirationstring); + _("Missing option `%s' for operation `%s'\n"), + "-V", _("add")); + ret = 1; GNUNET_SCHEDULER_shutdown (); - ret = 1; return; } - if (etime_is_rel && del) + if (GNUNET_OK != + GNUNET_NAMESTORE_string_to_value (type, + value, + &data, + &data_size)) { - fprintf (stderr, - _("Deletion requires either absolute time, or no time at all. Got relative time `%s' instead.\n"), - expirationstring); + fprintf (stderr, _("Value `%s' invalid for record type `%s'\n"), + value, + typestring); GNUNET_SCHEDULER_shutdown (); ret = 1; return; } - } - else if (add) - { - fprintf (stderr, - _("Missing option `%s' for operation `%s'\n"), - "-e", _("add")); - GNUNET_SCHEDULER_shutdown (); - ret = 1; - return; - } - memset (&rd, 0, sizeof (rd)); - if (add) - { - if (NULL == name) + if (NULL == expirationstring) { fprintf (stderr, - _("Missing option `%s' for operation `%s'\n"), - "-n", _("add")); + _("Missing option `%s' for operation `%s'\n"), + "-e", _("add")); GNUNET_SCHEDULER_shutdown (); ret = 1; return; } - rd.data = data; - rd.data_size = data_size; - rd.record_type = type; - if (GNUNET_YES == etime_is_rel) + if (0 == strcmp (expirationstring, "never")) { - rd.expiration_time = etime_rel.rel_value; - rd.flags |= GNUNET_NAMESTORE_RF_RELATIVE_EXPIRATION; + etime_abs = GNUNET_TIME_UNIT_FOREVER_ABS; + etime_is_rel = GNUNET_NO; + } + else if (GNUNET_OK == + GNUNET_STRINGS_fancy_time_to_relative (expirationstring, + &etime_rel)) + { + etime_is_rel = GNUNET_YES; + } + else if (GNUNET_OK == + GNUNET_STRINGS_fancy_time_to_absolute (expirationstring, + &etime_abs)) + { + etime_is_rel = GNUNET_NO; } - else if (GNUNET_NO == etime_is_rel) - rd.expiration_time = etime_abs.abs_value; else { fprintf (stderr, - _("No valid expiration time for operation `%s'\n"), - _("add")); + _("Invalid time format `%s'\n"), + expirationstring); GNUNET_SCHEDULER_shutdown (); ret = 1; - return; + return; } - if (1 != nonauthority) - rd.flags |= GNUNET_NAMESTORE_RF_AUTHORITY; - if (1 != public) - rd.flags |= GNUNET_NAMESTORE_RF_PRIVATE; - add_qe = GNUNET_NAMESTORE_record_create (ns, - zone_pkey, - name, - &rd, - &add_continuation, - &add_qe); + add_qe = GNUNET_NAMESTORE_lookup_record (ns, + &zone, + name, + 0, + &get_existing_record, + NULL); } if (del) { @@ -529,19 +575,12 @@ key_generation_cb (void *cls, ret = 1; return; } - rd.data = data; - rd.data_size = data_size; - rd.record_type = type; - rd.expiration_time = 0; - if (!etime_is_rel) - rd.expiration_time = etime_abs.abs_value; - rd.flags = GNUNET_NAMESTORE_RF_AUTHORITY; - del_qe = GNUNET_NAMESTORE_record_remove (ns, - zone_pkey, - name, - &rd, - &del_continuation, - NULL); + del_qe = GNUNET_NAMESTORE_record_put_by_authority (ns, + zone_pkey, + name, + 0, NULL, + &del_continuation, + NULL); } if (list) { @@ -580,6 +619,7 @@ key_generation_cb (void *cls, ret = 1; return; } + memset (&rd, 0, sizeof (rd)); rd.data = ≻ rd.data_size = sizeof (struct GNUNET_CRYPTO_ShortHashCode); rd.record_type = GNUNET_NAMESTORE_TYPE_PKEY; @@ -594,16 +634,15 @@ key_generation_cb (void *cls, rd.expiration_time = GNUNET_TIME_UNIT_FOREVER_ABS.abs_value; if (1 != nonauthority) rd.flags |= GNUNET_NAMESTORE_RF_AUTHORITY; - - add_qe_uri = GNUNET_NAMESTORE_record_create (ns, - zone_pkey, - name, - &rd, - &add_continuation, - &add_qe_uri); + add_qe_uri = GNUNET_NAMESTORE_record_put_by_authority (ns, + zone_pkey, + name, + 1, + &rd, + &add_continuation, + &add_qe_uri); } GNUNET_free_non_null (data); - } diff --git a/src/namestore/gnunet-service-namestore.c b/src/namestore/gnunet-service-namestore.c index 9c8fbae7b..b71893d5d 100644 --- a/src/namestore/gnunet-service-namestore.c +++ b/src/namestore/gnunet-service-namestore.c @@ -1,6 +1,6 @@ /* This file is part of GNUnet. - (C) 2012 Christian Grothoff (and other contributing authors) + (C) 2012, 2013 Christian Grothoff (and other contributing authors) GNUnet is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published @@ -22,6 +22,7 @@ * @file namestore/gnunet-service-namestore.c * @brief namestore for the GNUnet naming system * @author Matthias Wachs + * @author Christian Grothoff */ #include "platform.h" #include "gnunet_util_lib.h" @@ -250,7 +251,7 @@ write_key_to_file (const char *filename, { GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "File zone `%s' containing this key already exists\n", - GNUNET_short_h2s (&zone)); + GNUNET_NAMESTORE_short_h2s (&zone)); return GNUNET_OK; } GNUNET_log (GNUNET_ERROR_TYPE_ERROR, @@ -279,7 +280,7 @@ write_key_to_file (const char *filename, GNUNET_assert (GNUNET_YES == GNUNET_DISK_file_close (fd)); GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Stored zonekey for zone `%s' in file `%s'\n", - GNUNET_short_h2s(&c->zone), c->filename); + GNUNET_NAMESTORE_short_h2s(&c->zone), c->filename); return GNUNET_OK; } @@ -305,7 +306,7 @@ zone_to_disk_it (void *cls, GNUNET_asprintf(&c->filename, "%s/%s.zkey", zonefile_directory, - GNUNET_short_h2s (&c->zone)); + GNUNET_NAMESTORE_short_h2s (&c->zone)); (void) write_key_to_file(c->filename, c); GNUNET_assert (GNUNET_OK == GNUNET_CONTAINER_multihashmap_remove (zonekeys, key, value)); GNUNET_CRYPTO_ecc_key_free (c->privkey); @@ -343,7 +344,7 @@ learn_private_key (struct GNUNET_CRYPTO_EccPrivateKey *pkey) } GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Received new private key for zone `%s'\n", - GNUNET_short_h2s(&pubkey_hash)); + GNUNET_NAMESTORE_short_h2s(&pubkey_hash)); cc = GNUNET_malloc (sizeof (struct GNUNET_NAMESTORE_CryptoContainer)); cc->privkey = pkey; cc->zone = pubkey_hash; @@ -611,7 +612,7 @@ handle_lookup_name_it (void *cls, { GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Am authoritative for zone `%s'\n", - GNUNET_short_h2s (&zone_key_hash)); + GNUNET_NAMESTORE_short_h2s (&zone_key_hash)); authoritative = GNUNET_YES; } } @@ -645,7 +646,7 @@ handle_lookup_name_it (void *cls, copied_elements, lnc->record_type, lnc->name, - GNUNET_short_h2s(lnc->zone)); + GNUNET_NAMESTORE_short_h2s(lnc->zone)); if (copied_elements > 0) { rd_selected = GNUNET_malloc (copied_elements * sizeof (struct GNUNET_NAMESTORE_RecordData)); @@ -695,7 +696,7 @@ handle_lookup_name_it (void *cls, "Found %u matching records for name `%s' in zone `%s'\n", copied_elements, lnc->name, - GNUNET_short_h2s (lnc->zone)); + GNUNET_NAMESTORE_short_h2s (lnc->zone)); contains_signature = GNUNET_NO; if (copied_elements > 0) { @@ -709,7 +710,7 @@ handle_lookup_name_it (void *cls, "Creating signature for name `%s' with %u records in zone `%s'\n", name, copied_elements, - GNUNET_short_h2s(&zone_key_hash)); + GNUNET_NAMESTORE_short_h2s(&zone_key_hash)); } else { @@ -828,12 +829,12 @@ handle_lookup_name (void *cls, GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Looking up all records for name `%s' in zone `%s'\n", name, - GNUNET_short_h2s(&ln_msg->zone)); + GNUNET_NAMESTORE_short_h2s(&ln_msg->zone)); else GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Looking up records with type %u for name `%s' in zone `%s'\n", type, name, - GNUNET_short_h2s(&ln_msg->zone)); + GNUNET_NAMESTORE_short_h2s(&ln_msg->zone)); conv_name = GNUNET_NAMESTORE_normalize_string (name); if (NULL == conv_name) @@ -964,7 +965,7 @@ handle_record_put (void *cls, GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Putting %u records under name `%s' in zone `%s'\n", rd_count, conv_name, - GNUNET_short_h2s (&zone_hash)); + GNUNET_NAMESTORE_short_h2s (&zone_hash)); res = GSN_database->put_records(GSN_database->cls, &rp_msg->public_key, expire, @@ -991,156 +992,6 @@ handle_record_put (void *cls, } -/** - * Context for record create operations passed from 'handle_record_create' to - * 'handle_create_record_it' as closure - */ -struct CreateRecordContext -{ - /** - * Record data - */ - const struct GNUNET_NAMESTORE_RecordData *rd; - - /** - * Zone's public key - */ - struct GNUNET_CRYPTO_EccPublicKeyBinaryEncoded pubkey; - - /** - * Name for the record to create - */ - const char *name; - - /** - * Record expiration time - */ - struct GNUNET_TIME_Absolute expire; - - /** - * result returned from 'handle_create_record_it' - * GNUNET_SYSERR: failed to create the record - * GNUNET_NO: we updated an existing record or identical entry existed - * GNUNET_YES : we created a new record - */ - int res; -}; - - -/** - * A 'GNUNET_NAMESTORE_RecordIterator' for record create operations - * in handle_record_create - * - * @param cls a 'struct CreateRecordContext *' with information about the request - * @param pubkey zone key of the zone - * @param expire expiration time - * @param name name - * @param rd_count number of records - * @param rd array of records - * @param signature signature - */ -static void -handle_create_record_it (void *cls, - const struct GNUNET_CRYPTO_EccPublicKeyBinaryEncoded *pubkey, - struct GNUNET_TIME_Absolute expire, - const char *name, - unsigned int rd_count, - const struct GNUNET_NAMESTORE_RecordData *rd, - const struct GNUNET_CRYPTO_EccSignature *signature) -{ - static struct GNUNET_CRYPTO_EccSignature dummy_signature; - struct CreateRecordContext *crc = cls; - struct GNUNET_NAMESTORE_RecordData *rd_new; - struct GNUNET_TIME_Absolute block_expiration; - int exist; - int update; - unsigned int c; - unsigned int rd_count_new; - - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Found %u existing records for `%s'\n", - rd_count, crc->name); - exist = -1; - update = GNUNET_NO; - for (c = 0; c < rd_count; c++) - { - if ( (crc->rd->record_type != rd[c].record_type) || - ((crc->rd->flags & GNUNET_NAMESTORE_RF_RELATIVE_EXPIRATION) - != (rd[c].flags & GNUNET_NAMESTORE_RF_RELATIVE_EXPIRATION)) ) - continue; /* no match */ - if ( (GNUNET_NAMESTORE_TYPE_PKEY == crc->rd->record_type) || - (GNUNET_NAMESTORE_TYPE_PSEU == crc->rd->record_type) || - (GNUNET_DNSPARSER_TYPE_CNAME == crc->rd->record_type) ) - { - /* Update unique PKEY, PSEU or CNAME record; for these - record types, only one can be active at any time */ - exist = c; - if ( (crc->rd->data_size != rd[c].data_size) || - (0 != memcmp (crc->rd->data, rd[c].data, rd[c].data_size)) || - (crc->rd->expiration_time != rd[c].expiration_time) ) - update = GNUNET_YES; - break; - } - if ( (crc->rd->data_size == rd[c].data_size) && - (0 == memcmp (crc->rd->data, rd[c].data, rd[c].data_size))) - { - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Found matching existing record for `%s'; only updating expiration date!\n", - crc->name); - exist = c; - if (crc->rd->expiration_time != rd[c].expiration_time) - update = GNUNET_YES; - break; - } - } - - if ( (-1 != exist) && - (GNUNET_NO == update) ) - { - /* Exact same record already exists */ - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Matching record for %s' exists, no change required!\n", - crc->name); - crc->res = GNUNET_NO; /* identical record existed */ - return; - } - if (-1 == exist) - { - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "No existing record for name `%s'!\n", - crc->name); - rd_count_new = rd_count + 1; - rd_new = GNUNET_malloc (rd_count_new * sizeof (struct GNUNET_NAMESTORE_RecordData)); - memcpy (rd_new, rd, rd_count * sizeof (struct GNUNET_NAMESTORE_RecordData)); - rd_new[rd_count] = *(crc->rd); - } - else - { - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Updating existing records for `%s'!\n", - crc->name); - rd_count_new = rd_count; - rd_new = GNUNET_malloc (rd_count_new * sizeof (struct GNUNET_NAMESTORE_RecordData)); - memcpy (rd_new, rd, rd_count * sizeof (struct GNUNET_NAMESTORE_RecordData)); - rd_new[exist] = *(crc->rd); - } - block_expiration = GNUNET_TIME_absolute_max (crc->expire, expire); - if (GNUNET_OK != - GSN_database->put_records (GSN_database->cls, - &crc->pubkey, - block_expiration, - crc->name, - rd_count_new, rd_new, - &dummy_signature)) - crc->res = GNUNET_SYSERR; /* error */ - else if (GNUNET_YES == update) - crc->res = GNUNET_NO; /* update */ - else - crc->res = GNUNET_YES; /* created new record */ - GNUNET_free (rd_new); -} - - /** * Handles a 'GNUNET_MESSAGE_TYPE_NAMESTORE_RECORD_CREATE' message * @@ -1153,9 +1004,9 @@ handle_record_create (void *cls, struct GNUNET_SERVER_Client *client, const struct GNUNET_MessageHeader *message) { + static struct GNUNET_CRYPTO_EccSignature dummy_signature; struct GNUNET_NAMESTORE_Client *nc; const struct RecordCreateMessage *rp_msg; - struct CreateRecordContext crc; struct GNUNET_CRYPTO_EccPrivateKey *pkey; struct RecordCreateResponseMessage rcr_msg; size_t name_len; @@ -1170,8 +1021,8 @@ handle_record_create (void *cls, const char *rd_ser; unsigned int rd_count; int res; - struct GNUNET_NAMESTORE_RecordData rd; struct GNUNET_CRYPTO_ShortHashCode pubkey_hash; + struct GNUNET_CRYPTO_EccPublicKeyBinaryEncoded pubkey; GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Received `%s' message\n", "NAMESTORE_RECORD_CREATE"); @@ -1195,7 +1046,7 @@ handle_record_create (void *cls, rd_ser_len = ntohs (rp_msg->rd_len); key_len = ntohs (rp_msg->pkey_len); msg_size_exp = sizeof (struct RecordCreateMessage) + key_len + name_len + rd_ser_len; - if ( (msg_size != msg_size_exp) || (1 != rd_count) ) + if (msg_size != msg_size_exp) { GNUNET_break (0); GNUNET_SERVER_receive_done (client, GNUNET_SYSERR); @@ -1223,56 +1074,59 @@ handle_record_create (void *cls, GNUNET_SERVER_receive_done (client, GNUNET_SYSERR); return; } - if (GNUNET_OK != - GNUNET_NAMESTORE_records_deserialize (rd_ser_len, rd_ser, rd_count, &rd)) { - GNUNET_break (0); - GNUNET_CRYPTO_ecc_key_free (pkey); - GNUNET_SERVER_receive_done (client, GNUNET_SYSERR); - return; - } + struct GNUNET_NAMESTORE_RecordData rd[rd_count]; - /* Extracting and converting private key */ - GNUNET_CRYPTO_ecc_key_get_public (pkey, &crc.pubkey); - GNUNET_CRYPTO_short_hash (&crc.pubkey, - sizeof (struct GNUNET_CRYPTO_EccPublicKeyBinaryEncoded), - &pubkey_hash); - learn_private_key (pkey); + if (GNUNET_OK != + GNUNET_NAMESTORE_records_deserialize (rd_ser_len, rd_ser, rd_count, rd)) + { + GNUNET_break (0); + GNUNET_CRYPTO_ecc_key_free (pkey); + GNUNET_SERVER_receive_done (client, GNUNET_SYSERR); + return; + } - conv_name = GNUNET_NAMESTORE_normalize_string(name_tmp); - if (NULL == conv_name) - { + /* Extracting and converting private key */ + GNUNET_CRYPTO_ecc_key_get_public (pkey, &pubkey); + GNUNET_CRYPTO_short_hash (&pubkey, + sizeof (struct GNUNET_CRYPTO_EccPublicKeyBinaryEncoded), + &pubkey_hash); + learn_private_key (pkey); + conv_name = GNUNET_NAMESTORE_normalize_string (name_tmp); + if (NULL == conv_name) + { GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Error converting name `%s'\n", name_tmp); + GNUNET_CRYPTO_ecc_key_free (pkey); + GNUNET_SERVER_receive_done (client, GNUNET_SYSERR); return; + } + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "Creating %u records for name `%s' in zone `%s'\n", + (unsigned int) rd_count, + conv_name, + GNUNET_NAMESTORE_short_h2s (&pubkey_hash)); + if (0 == rd_count) + res = GSN_database->remove_records (GSN_database->cls, + &pubkey_hash, + conv_name); + else + res = GSN_database->put_records (GSN_database->cls, + &pubkey, + GNUNET_TIME_absolute_ntoh(rp_msg->expire), + conv_name, + rd_count, rd, + &dummy_signature); + GNUNET_free (conv_name); } - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Creating record for name `%s' in zone `%s'\n", - conv_name, GNUNET_short_h2s(&pubkey_hash)); - crc.expire = GNUNET_TIME_absolute_ntoh(rp_msg->expire); - crc.res = GNUNET_SYSERR; - crc.rd = &rd; - crc.name = conv_name; - - /* Get existing records for name */ - res = GSN_database->iterate_records (GSN_database->cls, &pubkey_hash, conv_name, 0, - &handle_create_record_it, &crc); - GNUNET_free (conv_name); - if (res != GNUNET_SYSERR) - res = GNUNET_OK; - + /* Send response */ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Sending `%s' message\n", "RECORD_CREATE_RESPONSE"); rcr_msg.gns_header.header.type = htons (GNUNET_MESSAGE_TYPE_NAMESTORE_RECORD_CREATE_RESPONSE); rcr_msg.gns_header.header.size = htons (sizeof (struct RecordCreateResponseMessage)); rcr_msg.gns_header.r_id = htonl (rid); - if ((GNUNET_OK == res) && (crc.res == GNUNET_YES)) - rcr_msg.op_result = htonl (GNUNET_YES); - else if ((GNUNET_OK == res) && (crc.res == GNUNET_NO)) - rcr_msg.op_result = htonl (GNUNET_NO); - else - rcr_msg.op_result = htonl (GNUNET_SYSERR); + rcr_msg.op_result = htonl (res); GNUNET_SERVER_notification_context_unicast (snc, nc->client, &rcr_msg.gns_header.header, GNUNET_NO); @@ -1280,305 +1134,6 @@ handle_record_create (void *cls, } -/** - * Context for record remove operations passed from 'handle_record_remove' to - * 'handle_record_remove_it' as closure - */ -struct RemoveRecordContext -{ - /** - * Record to remove - */ - const struct GNUNET_NAMESTORE_RecordData *rd; - - /** - * See RECORD_REMOVE_RESULT_*-codes. Set by 'handle_record_remove_it' - * to the result of the operation. - */ - int32_t op_res; -}; - - -/** - * We are to remove a record (or all records for a given name). This function - * will be called with the existing records (if there are any) and is to then - * compute what to keep and trigger the necessary changes. - * - * @param cls the 'struct RecordRemoveContext' with information about what to remove - * @param zone_key public key of the zone - * @param expire when does the corresponding block in the DHT expire (until - * when should we never do a DHT lookup for the same name again)? - * @param name name that is being mapped (at most 255 characters long) - * @param rd_count number of entries in 'rd' array - * @param rd array of records with data to store - * @param signature signature of the record block, NULL if signature is unavailable (i.e. - * because the user queried for a particular record type only) - */ -static void -handle_record_remove_it (void *cls, - const struct GNUNET_CRYPTO_EccPublicKeyBinaryEncoded *zone_key, - struct GNUNET_TIME_Absolute expire, - const char *name, - unsigned int rd_count, - const struct GNUNET_NAMESTORE_RecordData *rd, - const struct GNUNET_CRYPTO_EccSignature *signature) -{ - static struct GNUNET_CRYPTO_EccSignature dummy_signature; - struct RemoveRecordContext *rrc = cls; - unsigned int c; - int found; - struct GNUNET_CRYPTO_ShortHashCode pubkey_hash; - - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Name `%s 'currently has %u records\n", - name, rd_count); - if (0 == rd_count) - { - /* Could not find record to remove */ - rrc->op_res = RECORD_REMOVE_RESULT_NO_RECORDS; - return; - } - /* Find record to remove */ - found = -1; - for (c = 0; c < rd_count; c++) - { - if (GNUNET_YES != - GNUNET_NAMESTORE_records_cmp (&rd[c], - rrc->rd)) - continue; - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Found record to remove!\n", rd_count); - found = c; - break; - } - if (-1 == found) - { - /* Could not find record to remove */ - rrc->op_res = RECORD_REMOVE_RESULT_RECORD_NOT_FOUND; - return; - } - if (1 == rd_count) - { - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "No records left for name `%s', removing name\n", - name); - GNUNET_CRYPTO_short_hash (zone_key, - sizeof (struct GNUNET_CRYPTO_EccPublicKeyBinaryEncoded), - &pubkey_hash); - if (GNUNET_OK != - GSN_database->remove_records (GSN_database->cls, - &pubkey_hash, - name)) - { - /* Could not remove records from database */ - rrc->op_res = RECORD_REMOVE_RESULT_FAILED_TO_REMOVE; - return; - } - rrc->op_res = RECORD_REMOVE_RESULT_SUCCESS; - return; - } - - { - struct GNUNET_NAMESTORE_RecordData rd_new[rd_count - 1]; - unsigned int c2 = 0; - - for (c = 0; c < rd_count; c++) - { - if (c == found) - continue; - rd_new[c2++] = rd[c]; - } - if (GNUNET_OK != - GSN_database->put_records(GSN_database->cls, - zone_key, - expire, - name, - rd_count - 1, rd_new, - &dummy_signature)) - { - /* Could not put records into database */ - rrc->op_res = RECORD_REMOVE_RESULT_FAILED_TO_PUT_UPDATE; - return; - } - } - rrc->op_res = RECORD_REMOVE_RESULT_SUCCESS; -} - - -/** - * Handles a 'GNUNET_MESSAGE_TYPE_NAMESTORE_RECORD_REMOVE' message - * - * @param cls unused - * @param client GNUNET_SERVER_Client sending the message - * @param message message of type 'struct RecordRemoveMessage' - */ -static void -handle_record_remove (void *cls, - struct GNUNET_SERVER_Client *client, - const struct GNUNET_MessageHeader *message) -{ - struct GNUNET_NAMESTORE_Client *nc; - const struct RecordRemoveMessage *rr_msg; - struct RecordRemoveResponseMessage rrr_msg; - struct GNUNET_CRYPTO_EccPrivateKey *pkey; - struct GNUNET_CRYPTO_EccPublicKeyBinaryEncoded pub; - struct GNUNET_CRYPTO_ShortHashCode pubkey_hash; - struct GNUNET_NAMESTORE_RecordData rd; - const char *pkey_tmp; - const char *name_tmp; - const char *rd_ser; - char * conv_name; - size_t key_len; - size_t name_len; - size_t rd_ser_len; - size_t msg_size; - size_t msg_size_exp; - uint32_t rd_count; - uint32_t rid; - struct RemoveRecordContext rrc; - int res; - uint64_t off; - - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Received `%s' message\n", - "NAMESTORE_RECORD_REMOVE"); - if (ntohs (message->size) < sizeof (struct RecordRemoveMessage)) - { - GNUNET_break (0); - GNUNET_SERVER_receive_done (client, GNUNET_SYSERR); - return; - } - if (NULL == (nc = client_lookup(client))) - { - GNUNET_break (0); - GNUNET_SERVER_receive_done (client, GNUNET_SYSERR); - return; - } - rr_msg = (const struct RecordRemoveMessage *) message; - rid = ntohl (rr_msg->gns_header.r_id); - name_len = ntohs (rr_msg->name_len); - rd_ser_len = ntohs (rr_msg->rd_len); - rd_count = ntohs (rr_msg->rd_count); - key_len = ntohs (rr_msg->pkey_len); - msg_size = ntohs (message->size); - if ((name_len >= MAX_NAME_LEN) || (0 == name_len) || (1 < rd_count) ) - { - GNUNET_break (0); - GNUNET_SERVER_receive_done (client, GNUNET_SYSERR); - return; - } - msg_size_exp = sizeof (struct RecordRemoveMessage) + key_len + name_len + rd_ser_len; - if (msg_size != msg_size_exp) - { - GNUNET_break (0); - GNUNET_SERVER_receive_done (client, GNUNET_SYSERR); - return; - } - pkey_tmp = (const char *) &rr_msg[1]; - name_tmp = &pkey_tmp[key_len]; - rd_ser = &name_tmp[name_len]; - if ('\0' != name_tmp[name_len -1]) - { - GNUNET_break (0); - GNUNET_SERVER_receive_done (client, GNUNET_SYSERR); - return; - } - if (NULL == (pkey = GNUNET_CRYPTO_ecc_decode_key (pkey_tmp, key_len, - GNUNET_NO))) - { - GNUNET_break (0); - GNUNET_SERVER_receive_done (client, GNUNET_SYSERR); - return; - } - GNUNET_CRYPTO_ecc_key_get_public (pkey, &pub); - GNUNET_CRYPTO_short_hash (&pub, - sizeof (struct GNUNET_CRYPTO_EccPublicKeyBinaryEncoded), - &pubkey_hash); - learn_private_key (pkey); - if (GNUNET_OK != - GNUNET_NAMESTORE_records_deserialize (rd_ser_len, rd_ser, rd_count, &rd)) - { - GNUNET_break (0); - GNUNET_SERVER_receive_done (client, GNUNET_SYSERR); - return; - } - - conv_name = GNUNET_NAMESTORE_normalize_string(name_tmp); - if (NULL == conv_name) - { - GNUNET_log (GNUNET_ERROR_TYPE_ERROR, - "Error converting name `%s'\n", name_tmp); - return; - } - - if (0 == rd_count) - { - /* remove the whole name and all records */ - res = GSN_database->remove_records (GSN_database->cls, - &pubkey_hash, - conv_name); - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Removing name `%s': %s\n", - conv_name, (GNUNET_OK == res) ? "OK" : "FAILED"); - if (GNUNET_OK != res) - /* Could not remove entry from database */ - res = RECORD_REMOVE_RESULT_FAILED_TO_PUT_UPDATE; - else - res = RECORD_REMOVE_RESULT_SUCCESS; - } - else - { - /* remove a single record */ - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Removing record for name `%s' in zone `%s'\n", conv_name, - GNUNET_short_h2s (&pubkey_hash)); - rrc.rd = &rd; - rrc.op_res = RECORD_REMOVE_RESULT_RECORD_NOT_FOUND; - off = 0; - res = GNUNET_OK; - while ( (RECORD_REMOVE_RESULT_RECORD_NOT_FOUND == rrc.op_res) && - (GNUNET_OK == res) ) - { - res = GSN_database->iterate_records (GSN_database->cls, - &pubkey_hash, - conv_name, - off++, - &handle_record_remove_it, &rrc); - } - switch (res) - { - case GNUNET_OK: - res = rrc.op_res; - break; - case GNUNET_NO: - GNUNET_break (RECORD_REMOVE_RESULT_NO_RECORDS == rrc.op_res); - res = RECORD_REMOVE_RESULT_NO_RECORDS; - GNUNET_log (GNUNET_ERROR_TYPE_WARNING, - _("Failed to find record to remove\n")); - break; - case GNUNET_SYSERR: - res = RECORD_REMOVE_RESULT_FAILED_ACCESS_DATABASE; - break; - default: - GNUNET_break (0); - res = RECORD_REMOVE_RESULT_FAILED_INTERNAL_ERROR; - break; - } - } - GNUNET_free (conv_name); - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Sending `%s' message\n", - "RECORD_REMOVE_RESPONSE"); - rrr_msg.gns_header.header.type = htons (GNUNET_MESSAGE_TYPE_NAMESTORE_RECORD_REMOVE_RESPONSE); - rrr_msg.gns_header.header.size = htons (sizeof (struct RecordRemoveResponseMessage)); - rrr_msg.gns_header.r_id = htonl (rid); - rrr_msg.op_result = htonl (res); - GNUNET_SERVER_notification_context_unicast (snc, nc->client, - &rrr_msg.gns_header.header, - GNUNET_NO); - GNUNET_SERVER_receive_done (client, GNUNET_OK); -} - - /** * Context for record remove operations passed from 'handle_zone_to_name' to * 'handle_zone_to_name_it' as closure @@ -1891,7 +1446,7 @@ zone_iteraterate_proc (void *cls, expire = get_block_expiration_time (rd_count_filtered, rd_filtered); GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Creating signature for `%s' in zone `%s' with %u records and expiration %llu\n", - name, GNUNET_short_h2s(&zone_hash), + name, GNUNET_NAMESTORE_short_h2s(&zone_hash), rd_count_filtered, (unsigned long long) expire.abs_value); new_signature = GNUNET_NAMESTORE_create_signature (cc->privkey, expire, name, @@ -1905,7 +1460,7 @@ zone_iteraterate_proc (void *cls, { GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Using provided signature for `%s' in zone `%s' with %u records and expiration %llu\n", - name, GNUNET_short_h2s (&zone_hash), rd_count_filtered, + name, GNUNET_NAMESTORE_short_h2s (&zone_hash), rd_count_filtered, (unsigned long long) expire.abs_value); return; } @@ -1922,7 +1477,7 @@ zone_iteraterate_proc (void *cls, if (GNUNET_YES == proc->zi->has_zone) GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Sending name `%s' for iteration over zone `%s'\n", - name, GNUNET_short_h2s(&proc->zi->zone)); + name, GNUNET_NAMESTORE_short_h2s(&proc->zi->zone)); else GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Sending name `%s' for iteration over all zones\n", @@ -2000,7 +1555,7 @@ run_zone_iteration_round (struct GNUNET_NAMESTORE_ZoneIteration *zi) if (GNUNET_YES == zi->has_zone) GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "No more results for zone `%s'\n", - GNUNET_short_h2s(&zi->zone)); + GNUNET_NAMESTORE_short_h2s(&zi->zone)); else GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "No more results for all zones\n"); @@ -2058,7 +1613,7 @@ handle_iteration_start (void *cls, else { GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Starting to iterate over zone `%s'\n", GNUNET_short_h2s (&zis_msg->zone)); + "Starting to iterate over zone `%s'\n", GNUNET_NAMESTORE_short_h2s (&zis_msg->zone)); zi->zone = zis_msg->zone; zi->has_zone = GNUNET_YES; } @@ -2109,7 +1664,7 @@ handle_iteration_stop (void *cls, if (GNUNET_YES == zi->has_zone) GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Stopped zone iteration for zone `%s'\n", - GNUNET_short_h2s (&zi->zone)); + GNUNET_NAMESTORE_short_h2s (&zi->zone)); else GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Stopped zone iteration over all zones\n"); @@ -2233,8 +1788,6 @@ run (void *cls, struct GNUNET_SERVER_Handle *server, GNUNET_MESSAGE_TYPE_NAMESTORE_RECORD_PUT, 0}, {&handle_record_create, NULL, GNUNET_MESSAGE_TYPE_NAMESTORE_RECORD_CREATE, 0}, - {&handle_record_remove, NULL, - GNUNET_MESSAGE_TYPE_NAMESTORE_RECORD_REMOVE, 0}, {&handle_zone_to_name, NULL, GNUNET_MESSAGE_TYPE_NAMESTORE_ZONE_TO_NAME, sizeof (struct ZoneToNameMessage) }, {&handle_iteration_start, NULL, diff --git a/src/namestore/namestore.h b/src/namestore/namestore.h index b0d3ffad0..0c1ec9be3 100644 --- a/src/namestore/namestore.h +++ b/src/namestore/namestore.h @@ -31,59 +31,9 @@ */ #define MAX_NAME_LEN 256 -/** - * Convert a UTF-8 string to UTF-8 lowercase - * @param src source string - * @return converted result - */ -char * -GNUNET_NAMESTORE_normalize_string (const char *src); - -/** - * Convert a short hash to a string (for printing debug messages). - * This is one of the very few calls in the entire API that is - * NOT reentrant! - * - * @param hc the short hash code - * @return string form; will be overwritten by next call to GNUNET_h2s. - */ -const char * -GNUNET_short_h2s (const struct GNUNET_CRYPTO_ShortHashCode * hc); - - -/** - * Sign name and records - * - * @param key the private key - * @param expire block expiration - * @param name the name - * @param rd record data - * @param rd_count number of records - * - * @return the signature - */ -struct GNUNET_CRYPTO_EccSignature * -GNUNET_NAMESTORE_create_signature (const struct GNUNET_CRYPTO_EccPrivateKey *key, - struct GNUNET_TIME_Absolute expire, - const char *name, - const struct GNUNET_NAMESTORE_RecordData *rd, - unsigned int rd_count); - - -/** - * Compares if two records are equal - * - * @param a Record a - * @param b Record b - * - * @return GNUNET_YES or GNUNET_NO - */ -int -GNUNET_NAMESTORE_records_cmp (const struct GNUNET_NAMESTORE_RecordData *a, - const struct GNUNET_NAMESTORE_RecordData *b); +GNUNET_NETWORK_STRUCT_BEGIN -GNUNET_NETWORK_STRUCT_BEGIN /** * A GNS record serialized for network transmission. * @@ -351,105 +301,6 @@ struct RecordCreateResponseMessage }; -/** - * Remove a record from the namestore - * Memory layout: - */ -struct RecordRemoveMessage -{ - /** - * Type will be GNUNET_MESSAGE_TYPE_NAMESTORE_RECORD_REMOVE - */ - struct GNUNET_NAMESTORE_Header gns_header; - - /** - * Name length - */ - uint16_t name_len; - - /** - * Length of serialized rd data - */ - uint16_t rd_len; - - /** - * Number of records contained - */ - uint16_t rd_count; - - /** - * Length of private key - */ - uint16_t pkey_len; - - /* followed by: - * GNUNET_CRYPTO_EccPrivateKeyBinaryEncoded private key with length pkey_len - * name with length name_len - * serialized record data with length rd_len - * */ -}; - - -/** - * Removal of the record succeeded. - */ -#define RECORD_REMOVE_RESULT_SUCCESS 0 - -/** - * There are NO records for the given name. - */ -#define RECORD_REMOVE_RESULT_NO_RECORDS 1 - -/** - * The specific record that was to be removed was - * not found. - */ -#define RECORD_REMOVE_RESULT_RECORD_NOT_FOUND 2 - -/** - * Internal error, failed to sign the remaining records. - * (Note: not used?) - */ -#define RECORD_REMOVE_RESULT_FAILED_TO_SIGN 3 - -/** - * Internal error, failed to store the updated record set - */ -#define RECORD_REMOVE_RESULT_FAILED_TO_PUT_UPDATE 4 - -/** - * Internal error, failed to remove records from database - */ -#define RECORD_REMOVE_RESULT_FAILED_TO_REMOVE 5 - -/** - * Internal error, failed to access database - */ -#define RECORD_REMOVE_RESULT_FAILED_ACCESS_DATABASE 6 - -/** - * Internal error, failed to access database - */ -#define RECORD_REMOVE_RESULT_FAILED_INTERNAL_ERROR 7 - - -/** - * Remove a record from the namestore response - */ -struct RecordRemoveResponseMessage -{ - /** - * Type will be GNUNET_MESSAGE_TYPE_NAMESTORE_RECORD_REMOVE_RESPONSE - */ - struct GNUNET_NAMESTORE_Header gns_header; - - /** - * Result code (see RECORD_REMOVE_RESULT_*). In network byte order. - */ - int32_t op_result; -}; - - /** * Lookup a name for a zone hash */ diff --git a/src/namestore/namestore_api.c b/src/namestore/namestore_api.c index 7a7c3eabb..97d34aa24 100644 --- a/src/namestore/namestore_api.c +++ b/src/namestore/namestore_api.c @@ -1,6 +1,6 @@ /* This file is part of GNUnet. - (C) 2010, 2011, 2012 Christian Grothoff (and other contributing authors) + (C) 2010-2013 Christian Grothoff (and other contributing authors) GNUnet is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published @@ -377,71 +377,6 @@ handle_record_create_response (struct GNUNET_NAMESTORE_QueueEntry *qe, } -/** - * Handle an incoming message of type 'GNUNET_MESSAGE_TYPE_NAMESTORE_RECORD_REMOVE_RESPONSE' - * - * @param qe the respective entry in the message queue - * @param msg the message we received - * @param size the message size - * @return GNUNET_OK on success, GNUNET_SYSERR on error and we did NOT notify the client - */ -static int -handle_record_remove_response (struct GNUNET_NAMESTORE_QueueEntry *qe, - const struct RecordRemoveResponseMessage* msg, - size_t size) -{ - int ret; - const char *emsg; - - /* Operation done, remove */ - LOG (GNUNET_ERROR_TYPE_DEBUG, "Received `%s'\n", - "RECORD_REMOVE_RESPONSE"); - switch (ntohl (msg->op_result)) - { - case RECORD_REMOVE_RESULT_SUCCESS: - ret = GNUNET_OK; - emsg = NULL; - break; - case RECORD_REMOVE_RESULT_NO_RECORDS: - ret = GNUNET_NO; - emsg = NULL; - break; - case RECORD_REMOVE_RESULT_RECORD_NOT_FOUND: - ret = GNUNET_NO; - emsg = NULL; - break; - case RECORD_REMOVE_RESULT_FAILED_TO_SIGN: - ret = GNUNET_SYSERR; - emsg = _("Failed to create new signature"); - break; - case RECORD_REMOVE_RESULT_FAILED_TO_PUT_UPDATE: - ret = GNUNET_SYSERR; - emsg = _("Failed to put new set of records in database"); - break; - case RECORD_REMOVE_RESULT_FAILED_TO_REMOVE: - ret = GNUNET_SYSERR; - emsg = _("Failed to remove records from database"); - break; - case RECORD_REMOVE_RESULT_FAILED_ACCESS_DATABASE: - ret = GNUNET_SYSERR; - emsg = _("Failed to access database"); - break; - case RECORD_REMOVE_RESULT_FAILED_INTERNAL_ERROR: - ret = GNUNET_SYSERR; - emsg = _("unknown internal error in namestore"); - break; - default: - GNUNET_break (0); - if (NULL != qe->cont) - qe->cont (qe->cont_cls, GNUNET_SYSERR, _("Protocol error")); - return GNUNET_NO; - } - if (NULL != qe->cont) - qe->cont (qe->cont_cls, ret, emsg); - return GNUNET_OK; -} - - /** * Handle an incoming message of type 'GNUNET_MESSAGE_TYPE_NAMESTORE_ZONE_TO_NAME_RESPONSE' * @@ -554,13 +489,6 @@ manage_record_operations (struct GNUNET_NAMESTORE_QueueEntry *qe, return GNUNET_SYSERR; } return handle_record_create_response (qe, (const struct RecordCreateResponseMessage *) msg, size); - case GNUNET_MESSAGE_TYPE_NAMESTORE_RECORD_REMOVE_RESPONSE: - if (size != sizeof (struct RecordRemoveResponseMessage)) - { - GNUNET_break (0); - return GNUNET_SYSERR; - } - return handle_record_remove_response (qe, (const struct RecordRemoveResponseMessage *) msg, size); case GNUNET_MESSAGE_TYPE_NAMESTORE_ZONE_TO_NAME_RESPONSE: if (size < sizeof (struct ZoneToNameResponseMessage)) { @@ -1142,18 +1070,20 @@ GNUNET_NAMESTORE_verify_signature (const struct GNUNET_CRYPTO_EccPublicKeyBinary * @param h handle to the namestore * @param pkey private key of the zone * @param name name that is being mapped (at most 255 characters long) + * @param rd_count number of records in 'rd' array * @param rd record data to store * @param cont continuation to call when done * @param cont_cls closure for cont * @return handle to abort the request */ struct GNUNET_NAMESTORE_QueueEntry * -GNUNET_NAMESTORE_record_create (struct GNUNET_NAMESTORE_Handle *h, - const struct GNUNET_CRYPTO_EccPrivateKey *pkey, - const char *name, - const struct GNUNET_NAMESTORE_RecordData *rd, - GNUNET_NAMESTORE_ContinuationWithStatus cont, - void *cont_cls) +GNUNET_NAMESTORE_record_put_by_authority (struct GNUNET_NAMESTORE_Handle *h, + const struct GNUNET_CRYPTO_EccPrivateKey *pkey, + const char *name, + unsigned int rd_count, + const struct GNUNET_NAMESTORE_RecordData *rd, + GNUNET_NAMESTORE_ContinuationWithStatus cont, + void *cont_cls) { struct GNUNET_NAMESTORE_QueueEntry *qe; struct PendingMessage *pe; @@ -1171,19 +1101,14 @@ GNUNET_NAMESTORE_record_create (struct GNUNET_NAMESTORE_Handle *h, GNUNET_assert (NULL != h); GNUNET_assert (NULL != pkey); GNUNET_assert (NULL != name); - GNUNET_assert (NULL != rd); - LOG (GNUNET_ERROR_TYPE_DEBUG, - "Creating record of type %u under name `%s'\n", - rd->record_type, - name); name_len = strlen(name) + 1; if (name_len > MAX_NAME_LEN) { GNUNET_break (0); return NULL; } - rid = get_op_id(h); - qe = GNUNET_malloc(sizeof (struct GNUNET_NAMESTORE_QueueEntry)); + rid = get_op_id (h); + qe = GNUNET_malloc (sizeof (struct GNUNET_NAMESTORE_QueueEntry)); qe->nsh = h; qe->cont = cont; qe->cont_cls = cont_cls; @@ -1195,9 +1120,9 @@ GNUNET_NAMESTORE_record_create (struct GNUNET_NAMESTORE_Handle *h, /* setup msg */ key_len = ntohs (pkey_enc->size); - rd_ser_len = GNUNET_NAMESTORE_records_get_size(1, rd); + rd_ser_len = GNUNET_NAMESTORE_records_get_size (rd_count, rd); msg_size = sizeof (struct RecordCreateMessage) + key_len + name_len + rd_ser_len; - pe = GNUNET_malloc(sizeof (struct PendingMessage) + msg_size); + pe = GNUNET_malloc (sizeof (struct PendingMessage) + msg_size); pe->size = msg_size; pe->is_init = GNUNET_NO; msg = (struct RecordCreateMessage *) &pe[1]; @@ -1205,114 +1130,21 @@ GNUNET_NAMESTORE_record_create (struct GNUNET_NAMESTORE_Handle *h, msg->gns_header.header.size = htons (msg_size); msg->gns_header.r_id = htonl (rid); msg->name_len = htons (name_len); - msg->rd_count = htons (1); - msg->rd_len = htons (rd_ser_len); - msg->pkey_len = htons (key_len); - msg->expire = GNUNET_TIME_absolute_hton(GNUNET_TIME_UNIT_FOREVER_ABS); - pkey_tmp = (char *) &msg[1]; - memcpy (pkey_tmp, pkey_enc, key_len); - name_tmp = &pkey_tmp[key_len]; - memcpy (name_tmp, name, name_len); - rd_ser = &name_tmp[name_len]; - GNUNET_NAMESTORE_records_serialize(1, rd, rd_ser_len, rd_ser); - - GNUNET_free (pkey_enc); - - LOG (GNUNET_ERROR_TYPE_DEBUG, - "Sending `%s' message for name `%s' with size %u\n", - "NAMESTORE_RECORD_CREATE", name, msg_size); - GNUNET_CONTAINER_DLL_insert_tail (h->pending_head, h->pending_tail, pe); - do_transmit(h); - return qe; -} - - -/** - * Explicitly remove some content from the database. The - * "cont"inuation will be called with status "GNUNET_OK" if content - * was removed, "GNUNET_NO" if no matching entry was found and - * "GNUNET_SYSERR" on all other types of errors. - * This API is used by the authority of a zone. - * - * @param h handle to the namestore - * @param pkey private key of the zone - * @param name name that is being mapped (at most 255 characters long) - * @param rd record data, remove specific record, NULL to remove the name and all records - * @param cont continuation to call when done - * @param cont_cls closure for cont - * @return handle to abort the request - */ -struct GNUNET_NAMESTORE_QueueEntry * -GNUNET_NAMESTORE_record_remove (struct GNUNET_NAMESTORE_Handle *h, - const struct GNUNET_CRYPTO_EccPrivateKey *pkey, - const char *name, - const struct GNUNET_NAMESTORE_RecordData *rd, - GNUNET_NAMESTORE_ContinuationWithStatus cont, - void *cont_cls) -{ - struct GNUNET_NAMESTORE_QueueEntry *qe; - struct GNUNET_CRYPTO_EccPrivateKeyBinaryEncoded *pkey_enc; - struct PendingMessage *pe; - struct RecordRemoveMessage * msg; - char *pkey_tmp; - char *rd_ser; - char *name_tmp; - size_t rd_ser_len; - size_t msg_size; - size_t name_len; - size_t key_len; - uint32_t rid; - uint16_t rd_count; - - GNUNET_assert (NULL != h); - if (NULL != rd) - LOG (GNUNET_ERROR_TYPE_DEBUG, - "Removing record of type %u under name `%s'\n", - rd->record_type, - name); - else - LOG (GNUNET_ERROR_TYPE_DEBUG, - "Removing all records under name `%s'\n", - name); - rid = get_op_id(h); - qe = GNUNET_malloc(sizeof (struct GNUNET_NAMESTORE_QueueEntry)); - qe->nsh = h; - qe->cont = cont; - qe->cont_cls = cont_cls; - qe->op_id = rid; - GNUNET_CONTAINER_DLL_insert_tail (h->op_head, h->op_tail, qe); - - pkey_enc = GNUNET_CRYPTO_ecc_encode_key (pkey); - GNUNET_assert (NULL != pkey_enc); - key_len = ntohs (pkey_enc->size); - - rd_count = (NULL == rd) ? 0 : 1; - rd_ser_len = GNUNET_NAMESTORE_records_get_size (rd_count, rd); - name_len = strlen (name) + 1; - msg_size = sizeof (struct RecordRemoveMessage) + key_len + name_len + rd_ser_len; - pe = GNUNET_malloc (sizeof (struct PendingMessage) + msg_size); - pe->size = msg_size; - pe->is_init = GNUNET_NO; - msg = (struct RecordRemoveMessage *) &pe[1]; - msg->gns_header.header.type = htons (GNUNET_MESSAGE_TYPE_NAMESTORE_RECORD_REMOVE); - msg->gns_header.header.size = htons (msg_size); - msg->gns_header.r_id = htonl (rid); - msg->name_len = htons (name_len); - msg->rd_len = htons (rd_ser_len); msg->rd_count = htons (rd_count); + msg->rd_len = htons (rd_ser_len); msg->pkey_len = htons (key_len); + msg->expire = GNUNET_TIME_absolute_hton (GNUNET_TIME_UNIT_FOREVER_ABS); pkey_tmp = (char *) &msg[1]; memcpy (pkey_tmp, pkey_enc, key_len); name_tmp = &pkey_tmp[key_len]; memcpy (name_tmp, name, name_len); rd_ser = &name_tmp[name_len]; GNUNET_NAMESTORE_records_serialize (rd_count, rd, rd_ser_len, rd_ser); - GNUNET_free (pkey_enc); LOG (GNUNET_ERROR_TYPE_DEBUG, "Sending `%s' message for name `%s' with size %u\n", - "NAMESTORE_RECORD_REMOVE", name, msg_size); + "NAMESTORE_RECORD_CREATE", name, msg_size); GNUNET_CONTAINER_DLL_insert_tail (h->pending_head, h->pending_tail, pe); do_transmit(h); return qe; @@ -1507,7 +1339,7 @@ GNUNET_NAMESTORE_zone_iteration_start (struct GNUNET_NAMESTORE_Handle *h, { LOG (GNUNET_ERROR_TYPE_DEBUG, "Sending `%s' message for zone `%s'\n", - "ZONE_ITERATION_START", GNUNET_short_h2s(zone)); + "ZONE_ITERATION_START", GNUNET_NAMESTORE_short_h2s(zone)); msg->zone = *zone; } else @@ -1582,7 +1414,7 @@ GNUNET_NAMESTORE_zone_iteration_stop (struct GNUNET_NAMESTORE_ZoneIterator *it) msg->gns_header.r_id = htonl (it->op_id); if (GNUNET_YES == it->has_zone) GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Sending `%s' message for zone `%s'\n", "ZONE_ITERATION_STOP", GNUNET_short_h2s(&it->zone)); + "Sending `%s' message for zone `%s'\n", "ZONE_ITERATION_STOP", GNUNET_NAMESTORE_short_h2s(&it->zone)); else GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Sending `%s' message for all zones\n", "ZONE_ITERATION_STOP"); @@ -1608,4 +1440,5 @@ GNUNET_NAMESTORE_cancel (struct GNUNET_NAMESTORE_QueueEntry *qe) GNUNET_free(qe); } + /* end of namestore_api.c */ diff --git a/src/namestore/namestore_api_common.c b/src/namestore/namestore_api_common.c new file mode 100644 index 000000000..ab2506611 --- /dev/null +++ b/src/namestore/namestore_api_common.c @@ -0,0 +1,755 @@ +/* + This file is part of GNUnet. + (C) 2009, 2010, 2012 Christian Grothoff (and other contributing authors) + + GNUnet is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published + by the Free Software Foundation; either version 3, or (at your + option) any later version. + + GNUnet is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNUnet; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. +*/ + +/** + * @file namestore/namestore_common.c + * @brief API to access the NAMESTORE service + * @author Martin Schanzenbach + * @author Matthias Wachs + */ + +#include "platform.h" +#include "gnunet_util_lib.h" +#include "gnunet_constants.h" +#include "gnunet_signatures.h" +#include "gnunet_arm_service.h" +#include "gnunet_namestore_service.h" +#include "gnunet_dnsparser_lib.h" +#include "gns_protocol.h" +#include "namestore.h" + + +#define LOG(kind,...) GNUNET_log_from (kind, "gns-api",__VA_ARGS__) + +GNUNET_NETWORK_STRUCT_BEGIN + +/** + * Internal format of a record in the serialized form. + */ +struct NetworkRecord +{ + + /** + * Expiration time for the DNS record; relative or absolute depends + * on 'flags', network byte order. + */ + uint64_t expiration_time GNUNET_PACKED; + + /** + * Number of bytes in 'data', network byte order. + */ + uint32_t data_size GNUNET_PACKED; + + /** + * Type of the GNS/DNS record, network byte order. + */ + uint32_t record_type GNUNET_PACKED; + + /** + * Flags for the record, network byte order. + */ + uint32_t flags GNUNET_PACKED; + +}; + +GNUNET_NETWORK_STRUCT_END + +/** + * Convert a UTF-8 string to UTF-8 lowercase + * @param src source string + * @return converted result + */ +char * +GNUNET_NAMESTORE_normalize_string (const char *src) +{ + GNUNET_assert (NULL != src); + char *res = strdup (src); + /* normalize */ + GNUNET_STRINGS_utf8_tolower(src, &res); + return res; +} + + +/** + * Convert a short hash to a string (for printing debug messages). + * This is one of the very few calls in the entire API that is + * NOT reentrant! + * + * @param hc the short hash code + * @return string form; will be overwritten by next call to GNUNET_h2s. + */ +const char * +GNUNET_NAMESTORE_short_h2s (const struct GNUNET_CRYPTO_ShortHashCode * hc) +{ + static struct GNUNET_CRYPTO_ShortHashAsciiEncoded ret; + + GNUNET_CRYPTO_short_hash_to_enc (hc, &ret); + return (const char *) &ret; +} + + +/** + * Calculate how many bytes we will need to serialize the given + * records. + * + * @param rd_count number of records in the rd array + * @param rd array of GNUNET_NAMESTORE_RecordData with rd_count elements + * + * @return the required size to serialize + * + */ +size_t +GNUNET_NAMESTORE_records_get_size (unsigned int rd_count, + const struct GNUNET_NAMESTORE_RecordData *rd) +{ + unsigned int i; + size_t ret; + + ret = sizeof (struct NetworkRecord) * rd_count; + for (i=0;i= ret); + ret += rd[i].data_size; + } + return ret; +} + + +/** + * Serialize the given records to the given destination buffer. + * + * @param rd_count number of records in the rd array + * @param rd array of GNUNET_NAMESTORE_RecordData with rd_count elements + * @param dest_size size of the destination array + * @param dest where to write the result + * + * @return the size of serialized records, -1 if records do not fit + */ +ssize_t +GNUNET_NAMESTORE_records_serialize (unsigned int rd_count, + const struct GNUNET_NAMESTORE_RecordData *rd, + size_t dest_size, + char *dest) +{ + struct NetworkRecord rec; + unsigned int i; + size_t off; + + off = 0; + for (i=0;i dest_size) + return -1; + memcpy (&dest[off], &rec, sizeof (rec)); + off += sizeof (rec); + if (off + rd[i].data_size > dest_size) + return -1; + memcpy (&dest[off], rd[i].data, rd[i].data_size); + off += rd[i].data_size; + } + return off; +} + + +/** + * Compares if two records are equal (ignoring flags such + * as authority, private and pending, but not relative vs. + * absolute expiration time). + * + * @param a record + * @param b record + * @return GNUNET_YES if the records are equal or GNUNET_NO if they are not + */ +int +GNUNET_NAMESTORE_records_cmp (const struct GNUNET_NAMESTORE_RecordData *a, + const struct GNUNET_NAMESTORE_RecordData *b) +{ + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "Comparing records\n"); + if (a->record_type != b->record_type) + { + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "Record type %lu != %lu\n", a->record_type, b->record_type); + return GNUNET_NO; + } + if ((a->expiration_time != b->expiration_time) && + ((a->expiration_time != 0) && (b->expiration_time != 0))) + { + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "Expiration time %llu != %llu\n", a->expiration_time, b->expiration_time); + return GNUNET_NO; + } + if ((a->flags & GNUNET_NAMESTORE_RF_RCMP_FLAGS) + != (b->flags & GNUNET_NAMESTORE_RF_RCMP_FLAGS)) + { + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "Flags %lu (%lu) != %lu (%lu)\n", a->flags, + a->flags & GNUNET_NAMESTORE_RF_RCMP_FLAGS, b->flags, + b->flags & GNUNET_NAMESTORE_RF_RCMP_FLAGS); + return GNUNET_NO; + } + if (a->data_size != b->data_size) + { + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "Data size %lu != %lu\n", a->data_size, b->data_size); + return GNUNET_NO; + } + if (0 != memcmp (a->data, b->data, a->data_size)) + { + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "Data contents do not match\n"); + return GNUNET_NO; + } + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "Records are equal\n"); + return GNUNET_YES; +} + + +/** + * Deserialize the given records to the given destination. + * + * @param len size of the serialized record data + * @param src the serialized record data + * @param rd_count number of records in the rd array + * @param dest where to put the data + * + * @return GNUNET_OK on success, GNUNET_SYSERR on error + */ +int +GNUNET_NAMESTORE_records_deserialize (size_t len, + const char *src, + unsigned int rd_count, + struct GNUNET_NAMESTORE_RecordData *dest) +{ + struct NetworkRecord rec; + unsigned int i; + size_t off; + + off = 0; + for (i=0;i len) + return GNUNET_SYSERR; + memcpy (&rec, &src[off], sizeof (rec)); + dest[i].expiration_time = GNUNET_ntohll (rec.expiration_time); + dest[i].data_size = ntohl ((uint32_t) rec.data_size); + dest[i].record_type = ntohl (rec.record_type); + dest[i].flags = ntohl (rec.flags); + off += sizeof (rec); + + if (off + dest[i].data_size > len) + return GNUNET_SYSERR; + dest[i].data = &src[off]; + off += dest[i].data_size; + } + return GNUNET_OK; +} + + +/** + * Sign name and records + * + * @param key the private key + * @param expire block expiration + * @param name the name + * @param rd record data + * @param rd_count number of records + * + * @return the signature + */ +struct GNUNET_CRYPTO_EccSignature * +GNUNET_NAMESTORE_create_signature (const struct GNUNET_CRYPTO_EccPrivateKey *key, + struct GNUNET_TIME_Absolute expire, + const char *name, + const struct GNUNET_NAMESTORE_RecordData *rd, + unsigned int rd_count) +{ + struct GNUNET_CRYPTO_EccSignature *sig; + struct GNUNET_CRYPTO_EccSignaturePurpose *sig_purpose; + struct GNUNET_TIME_AbsoluteNBO expire_nbo; + size_t rd_ser_len; + size_t name_len; + struct GNUNET_TIME_AbsoluteNBO *expire_tmp; + char * name_tmp; + char * rd_tmp; + int res; + uint32_t sig_len; + + if (NULL == name) + { + GNUNET_break (0); + return NULL; + } + sig = GNUNET_malloc (sizeof (struct GNUNET_CRYPTO_EccSignature)); + name_len = strlen (name) + 1; + expire_nbo = GNUNET_TIME_absolute_hton (expire); + rd_ser_len = GNUNET_NAMESTORE_records_get_size (rd_count, rd); + { + char rd_ser[rd_ser_len]; + + GNUNET_assert (rd_ser_len == + GNUNET_NAMESTORE_records_serialize (rd_count, rd, rd_ser_len, rd_ser)); + sig_len = sizeof (struct GNUNET_CRYPTO_EccSignaturePurpose) + sizeof (struct GNUNET_TIME_AbsoluteNBO) + rd_ser_len + name_len; + sig_purpose = GNUNET_malloc (sig_len); + sig_purpose->size = htonl (sig_len); + sig_purpose->purpose = htonl (GNUNET_SIGNATURE_PURPOSE_GNS_RECORD_SIGN); + expire_tmp = (struct GNUNET_TIME_AbsoluteNBO *) &sig_purpose[1]; + memcpy (expire_tmp, &expire_nbo, sizeof (struct GNUNET_TIME_AbsoluteNBO)); + name_tmp = (char *) &expire_tmp[1]; + memcpy (name_tmp, name, name_len); + rd_tmp = &name_tmp[name_len]; + memcpy (rd_tmp, rd_ser, rd_ser_len); + res = GNUNET_CRYPTO_ecc_sign (key, sig_purpose, sig); + GNUNET_free (sig_purpose); + } + if (GNUNET_OK != res) + { + GNUNET_break (0); + GNUNET_free (sig); + return NULL; + } + return sig; +} + + +/** + * Convert the 'value' of a record to a string. + * + * @param type type of the record + * @param data value in binary encoding + * @param data_size number of bytes in data + * @return NULL on error, otherwise human-readable representation of the value + */ +char * +GNUNET_NAMESTORE_value_to_string (uint32_t type, + const void *data, + size_t data_size) +{ + uint16_t mx_pref; + const struct soa_data *soa; + const struct vpn_data *vpn; + const struct srv_data *srv; + const struct tlsa_data *tlsa; + struct GNUNET_CRYPTO_ShortHashAsciiEncoded enc; + struct GNUNET_CRYPTO_HashAsciiEncoded s_peer; + const char *cdata; + char* vpn_str; + char* srv_str; + char* tlsa_str; + char* result; + const char* soa_rname; + const char* soa_mname; + char tmp[INET6_ADDRSTRLEN]; + + switch (type) + { + case 0: + return NULL; + case GNUNET_DNSPARSER_TYPE_A: + if (data_size != sizeof (struct in_addr)) + return NULL; + if (NULL == inet_ntop (AF_INET, data, tmp, sizeof (tmp))) + return NULL; + return GNUNET_strdup (tmp); + case GNUNET_DNSPARSER_TYPE_NS: + return GNUNET_strndup (data, data_size); + case GNUNET_DNSPARSER_TYPE_CNAME: + return GNUNET_strndup (data, data_size); + case GNUNET_DNSPARSER_TYPE_SOA: + if (data_size <= sizeof (struct soa_data)) + return NULL; + soa = data; + soa_rname = (const char*) &soa[1]; + soa_mname = memchr (soa_rname, 0, data_size - sizeof (struct soa_data) - 1); + if (NULL == soa_mname) + return NULL; + soa_mname++; + if (NULL == memchr (soa_mname, 0, + data_size - (sizeof (struct soa_data) + strlen (soa_rname) + 1))) + return NULL; + GNUNET_asprintf (&result, + "rname=%s mname=%s %lu,%lu,%lu,%lu,%lu", + soa_rname, soa_mname, + ntohl (soa->serial), + ntohl (soa->refresh), + ntohl (soa->retry), + ntohl (soa->expire), + ntohl (soa->minimum)); + return result; + case GNUNET_DNSPARSER_TYPE_PTR: + return GNUNET_strndup (data, data_size); + case GNUNET_DNSPARSER_TYPE_MX: + mx_pref = ntohs(*((uint16_t*)data)); + if (GNUNET_asprintf(&result, "%hu,%s", mx_pref, data+sizeof(uint16_t)) + != 0) + return result; + else + { + GNUNET_free (result); + return NULL; + } + case GNUNET_DNSPARSER_TYPE_TXT: + return GNUNET_strndup (data, data_size); + case GNUNET_DNSPARSER_TYPE_AAAA: + if (data_size != sizeof (struct in6_addr)) + return NULL; + if (NULL == inet_ntop (AF_INET6, data, tmp, sizeof (tmp))) + return NULL; + return GNUNET_strdup (tmp); + case GNUNET_NAMESTORE_TYPE_PKEY: + if (data_size != sizeof (struct GNUNET_CRYPTO_ShortHashCode)) + return NULL; + GNUNET_CRYPTO_short_hash_to_enc (data, + &enc); + return GNUNET_strdup ((const char*) enc.short_encoding); + case GNUNET_NAMESTORE_TYPE_PSEU: + return GNUNET_strndup (data, data_size); + case GNUNET_NAMESTORE_TYPE_LEHO: + return GNUNET_strndup (data, data_size); + case GNUNET_NAMESTORE_TYPE_VPN: + cdata = data; + if ( (data_size <= sizeof (struct vpn_data)) || + ('\0' != cdata[data_size - 1]) ) + return NULL; /* malformed */ + vpn = data; + GNUNET_CRYPTO_hash_to_enc (&vpn->peer, &s_peer); + if (0 == GNUNET_asprintf (&vpn_str, "%u %s %s", + (unsigned int) ntohs (vpn->proto), + (const char*) &s_peer, + (const char*) &vpn[1])) + { + GNUNET_free (vpn_str); + return NULL; + } + return vpn_str; + case GNUNET_DNSPARSER_TYPE_SRV: + cdata = data; + if ( (data_size <= sizeof (struct srv_data)) || + ('\0' != cdata[data_size - 1]) ) + return NULL; /* malformed */ + srv = data; + + if (0 == GNUNET_asprintf (&srv_str, + "%d %d %d %s", + ntohs (srv->prio), + ntohs (srv->weight), + ntohs (srv->port), + (const char *)&srv[1])) + { + GNUNET_free (srv_str); + return NULL; + } + return srv_str; + case GNUNET_DNSPARSER_TYPE_TLSA: + cdata = data; + if ( (data_size <= sizeof (struct tlsa_data)) || + ('\0' != cdata[data_size - 1]) ) + return NULL; /* malformed */ + tlsa = data; + if (0 == GNUNET_asprintf (&tlsa_str, + "%c %c %c %s", + tlsa->usage, + tlsa->selector, + tlsa->matching_type, + (const char *) &tlsa[1])) + { + GNUNET_free (tlsa_str); + return NULL; + } + return tlsa_str; + default: + GNUNET_break (0); + } + GNUNET_break (0); // not implemented + return NULL; +} + + +/** + * Convert human-readable version of a 'value' of a record to the binary + * representation. + * + * @param type type of the record + * @param s human-readable string + * @param data set to value in binary encoding (will be allocated) + * @param data_size set to number of bytes in data + * @return GNUNET_OK on success + */ +int +GNUNET_NAMESTORE_string_to_value (uint32_t type, + const char *s, + void **data, + size_t *data_size) +{ + struct in_addr value_a; + struct in6_addr value_aaaa; + struct GNUNET_CRYPTO_ShortHashCode pkey; + struct soa_data *soa; + struct vpn_data *vpn; + struct tlsa_data *tlsa; + char result[253 + 1]; + char soa_rname[253 + 1]; + char soa_mname[253 + 1]; + char s_peer[103 + 1]; + char s_serv[253 + 1]; + unsigned int soa_serial; + unsigned int soa_refresh; + unsigned int soa_retry; + unsigned int soa_expire; + unsigned int soa_min; + uint16_t mx_pref; + uint16_t mx_pref_n; + unsigned int proto; + + if (NULL == s) + return GNUNET_SYSERR; + switch (type) + { + case 0: + GNUNET_log (GNUNET_ERROR_TYPE_ERROR, + _("Unsupported record type %d\n"), + (int) type); + return GNUNET_SYSERR; + case GNUNET_DNSPARSER_TYPE_A: + if (1 != inet_pton (AF_INET, s, &value_a)) + { + GNUNET_log (GNUNET_ERROR_TYPE_ERROR, + _("Unable to parse IPv4 address `%s'\n"), + s); + return GNUNET_SYSERR; + } + *data = GNUNET_malloc (sizeof (struct in_addr)); + memcpy (*data, &value_a, sizeof (value_a)); + *data_size = sizeof (value_a); + return GNUNET_OK; + case GNUNET_DNSPARSER_TYPE_NS: + *data = GNUNET_strdup (s); + *data_size = strlen (s) + 1; + return GNUNET_OK; + case GNUNET_DNSPARSER_TYPE_CNAME: + *data = GNUNET_strdup (s); + *data_size = strlen (s) + 1; + return GNUNET_OK; + case GNUNET_DNSPARSER_TYPE_SOA: + if (7 != SSCANF (s, + "rname=%253s mname=%253s %u,%u,%u,%u,%u", + soa_rname, soa_mname, + &soa_serial, &soa_refresh, &soa_retry, &soa_expire, &soa_min)) + { + GNUNET_log (GNUNET_ERROR_TYPE_ERROR, + _("Unable to parse SOA record `%s'\n"), + s); + return GNUNET_SYSERR; + } + *data_size = sizeof (struct soa_data)+strlen(soa_rname)+strlen(soa_mname)+2; + *data = GNUNET_malloc (*data_size); + soa = (struct soa_data*)*data; + soa->serial = htonl(soa_serial); + soa->refresh = htonl(soa_refresh); + soa->retry = htonl(soa_retry); + soa->expire = htonl(soa_expire); + soa->minimum = htonl(soa_min); + strcpy((char*)&soa[1], soa_rname); + strcpy((char*)&soa[1]+strlen(*data)+1, soa_mname); + return GNUNET_OK; + case GNUNET_DNSPARSER_TYPE_PTR: + *data = GNUNET_strdup (s); + *data_size = strlen (s); + return GNUNET_OK; + case GNUNET_DNSPARSER_TYPE_MX: + if (2 != SSCANF(s, "%hu,%253s", &mx_pref, result)) + { + GNUNET_log (GNUNET_ERROR_TYPE_ERROR, + _("Unable to parse MX record `%s'\n"), + s); + return GNUNET_SYSERR; + } + *data_size = sizeof (uint16_t)+strlen(result)+1; + *data = GNUNET_malloc (*data_size); + mx_pref_n = htons(mx_pref); + memcpy(*data, &mx_pref_n, sizeof (uint16_t)); + strcpy((*data)+sizeof (uint16_t), result); + return GNUNET_OK; + case GNUNET_DNSPARSER_TYPE_TXT: + *data = GNUNET_strdup (s); + *data_size = strlen (s); + return GNUNET_OK; + case GNUNET_DNSPARSER_TYPE_AAAA: + if (1 != inet_pton (AF_INET6, s, &value_aaaa)) + { + GNUNET_log (GNUNET_ERROR_TYPE_ERROR, + _("Unable to parse IPv6 address `%s'\n"), + s); + return GNUNET_SYSERR; + } + *data = GNUNET_malloc (sizeof (struct in6_addr)); + *data_size = sizeof (struct in6_addr); + memcpy (*data, &value_aaaa, sizeof (value_aaaa)); + return GNUNET_OK; + case GNUNET_NAMESTORE_TYPE_PKEY: + if (GNUNET_OK != + GNUNET_CRYPTO_short_hash_from_string (s, &pkey)) + { + GNUNET_log (GNUNET_ERROR_TYPE_ERROR, + _("Unable to parse PKEY record `%s'\n"), + s); + return GNUNET_SYSERR; + } + *data = GNUNET_malloc (sizeof (struct GNUNET_CRYPTO_ShortHashCode)); + memcpy (*data, &pkey, sizeof (pkey)); + *data_size = sizeof (struct GNUNET_CRYPTO_ShortHashCode); + return GNUNET_OK; + case GNUNET_NAMESTORE_TYPE_PSEU: + *data = GNUNET_strdup (s); + *data_size = strlen (s); + return GNUNET_OK; + case GNUNET_NAMESTORE_TYPE_LEHO: + *data = GNUNET_strdup (s); + *data_size = strlen (s); + return GNUNET_OK; + case GNUNET_NAMESTORE_TYPE_VPN: + if (3 != SSCANF (s,"%u %103s %253s", + &proto, s_peer, s_serv)) + { + GNUNET_log (GNUNET_ERROR_TYPE_ERROR, + _("Unable to parse VPN record string `%s'\n"), + s); + return GNUNET_SYSERR; + } + *data_size = sizeof (struct vpn_data) + strlen (s_serv) + 1; + *data = vpn = GNUNET_malloc (*data_size); + if (GNUNET_OK != GNUNET_CRYPTO_hash_from_string ((char*)&s_peer, + &vpn->peer)) + { + GNUNET_free (vpn); + *data_size = 0; + return GNUNET_SYSERR; + } + vpn->proto = htons ((uint16_t) proto); + strcpy ((char*)&vpn[1], s_serv); + return GNUNET_OK; + case GNUNET_DNSPARSER_TYPE_TLSA: + *data_size = sizeof (struct tlsa_data) + strlen (s) - 6; + *data = tlsa = GNUNET_malloc (*data_size); + if (4 != SSCANF (s, "%c %c %c %s", + &tlsa->usage, + &tlsa->selector, + &tlsa->matching_type, + (char*)&tlsa[1])) + { + GNUNET_log (GNUNET_ERROR_TYPE_ERROR, + _("Unable to parse TLSA record string `%s'\n"), + s); + *data_size = 0; + GNUNET_free (tlsa); + return GNUNET_SYSERR; + } + return GNUNET_OK; + default: + GNUNET_log (GNUNET_ERROR_TYPE_ERROR, + _("Unsupported record type %d\n"), + (int) type); + return GNUNET_SYSERR; + } +} + + +static struct { + const char *name; + uint32_t number; +} name_map[] = { + { "A", GNUNET_DNSPARSER_TYPE_A }, + { "NS", GNUNET_DNSPARSER_TYPE_NS }, + { "CNAME", GNUNET_DNSPARSER_TYPE_CNAME }, + { "SOA", GNUNET_DNSPARSER_TYPE_SOA }, + { "PTR", GNUNET_DNSPARSER_TYPE_PTR }, + { "MX", GNUNET_DNSPARSER_TYPE_MX }, + { "TXT", GNUNET_DNSPARSER_TYPE_TXT }, + { "AAAA", GNUNET_DNSPARSER_TYPE_AAAA }, + { "PKEY", GNUNET_NAMESTORE_TYPE_PKEY }, + { "PSEU", GNUNET_NAMESTORE_TYPE_PSEU }, + { "LEHO", GNUNET_NAMESTORE_TYPE_LEHO }, + { "VPN", GNUNET_NAMESTORE_TYPE_VPN }, + { "TLSA", GNUNET_DNSPARSER_TYPE_TLSA }, + { NULL, UINT32_MAX } +}; + + +/** + * Convert a type name (i.e. "AAAA") to the corresponding number. + * + * @param typename name to convert + * @return corresponding number, UINT32_MAX on error + */ +uint32_t +GNUNET_NAMESTORE_typename_to_number (const char *typename) +{ + unsigned int i; + + i=0; + while ( (name_map[i].name != NULL) && + (0 != strcasecmp (typename, name_map[i].name)) ) + i++; + return name_map[i].number; +} + + +/** + * Convert a type number (i.e. 1) to the corresponding type string (i.e. "A") + * + * @param type number of a type to convert + * @return corresponding typestring, NULL on error + */ +const char * +GNUNET_NAMESTORE_number_to_typename (uint32_t type) +{ + unsigned int i; + + i=0; + while ( (name_map[i].name != NULL) && + (type != name_map[i].number) ) + i++; + return name_map[i].name; +} + +/** + * Test if a given record is expired. + * + * @return GNUNET_YES if the record is expired, + * GNUNET_NO if not + */ +int +GNUNET_NAMESTORE_is_expired (const struct GNUNET_NAMESTORE_RecordData *rd) +{ + struct GNUNET_TIME_Absolute at; + + if (0 != (rd->flags & GNUNET_NAMESTORE_RF_RELATIVE_EXPIRATION)) + return GNUNET_NO; + at.abs_value = rd->expiration_time; + return (0 == GNUNET_TIME_absolute_get_remaining (at).rel_value) ? GNUNET_YES : GNUNET_NO; +} + + +/* end of namestore_common.c */ diff --git a/src/namestore/namestore_api_monitor.c b/src/namestore/namestore_api_monitor.c new file mode 100644 index 000000000..4c242d17d --- /dev/null +++ b/src/namestore/namestore_api_monitor.c @@ -0,0 +1,79 @@ +/* + This file is part of GNUnet. + (C) 2013 Christian Grothoff (and other contributing authors) + + GNUnet is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published + by the Free Software Foundation; either version 3, or (at your + option) any later version. + + GNUnet is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNUnet; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. +*/ + +/** + * @file namestore/namestore_api_monitor.c + * @brief API to monitor changes in the NAMESTORE + * @author Christian Grothoff + */ + +#include "platform.h" +#include "gnunet_util_lib.h" +#include "gnunet_crypto_lib.h" +#include "gnunet_constants.h" +#include "gnunet_dnsparser_lib.h" +#include "gnunet_arm_service.h" +#include "gnunet_signatures.h" +#include "gnunet_namestore_service.h" +#include "namestore.h" + + + +/** + * Handle for a monitoring activity. + */ +struct GNUNET_NAMESTORE_ZoneMonitor +{ +}; + + +/** + * Begin monitoring a zone for changes. Will first call the 'monitor' function + * on all existing records in the selected zone(s) and then call it whenever + * a record changes. + * + * @param cfg configuration to use to connect to namestore + * @param zone zone to monitor, NULL for all zones + * @param monitor function to call on zone changes + * @param monitor_cls closure for 'monitor' + * @return handle to stop monitoring + */ +struct GNUNET_NAMESTORE_ZoneMonitor * +GNUNET_NAMESTORE_zone_monitor_start (const struct GNUNET_CONFIGURATION_Handle *cfg, + const struct GNUNET_CRYPTO_ShortHashCode *zone, + GNUNET_NAMESTORE_RecordMonitor monitor, + void *monitor_cls) +{ + GNUNET_break (0); + return NULL; +} + + +/** + * Stop monitoring a zone for changes. + * + * @param zm handle to the monitor activity to stop + */ +void +GNUNET_NAMESTORE_zone_monitor_stop (struct GNUNET_NAMESTORE_ZoneMonitor *zm) +{ +} + +/* end of namestore_api_monitor.c */ diff --git a/src/namestore/namestore_common.c b/src/namestore/namestore_common.c deleted file mode 100644 index 826eae504..000000000 --- a/src/namestore/namestore_common.c +++ /dev/null @@ -1,755 +0,0 @@ -/* - This file is part of GNUnet. - (C) 2009, 2010, 2012 Christian Grothoff (and other contributing authors) - - GNUnet is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published - by the Free Software Foundation; either version 3, or (at your - option) any later version. - - GNUnet is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License - along with GNUnet; see the file COPYING. If not, write to the - Free Software Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. -*/ - -/** - * @file namestore/namestore_common.c - * @brief API to access the NAMESTORE service - * @author Martin Schanzenbach - * @author Matthias Wachs - */ - -#include "platform.h" -#include "gnunet_util_lib.h" -#include "gnunet_constants.h" -#include "gnunet_signatures.h" -#include "gnunet_arm_service.h" -#include "gnunet_namestore_service.h" -#include "gnunet_dnsparser_lib.h" -#include "gns_protocol.h" -#include "namestore.h" - - -#define LOG(kind,...) GNUNET_log_from (kind, "gns-api",__VA_ARGS__) - -GNUNET_NETWORK_STRUCT_BEGIN - -/** - * Internal format of a record in the serialized form. - */ -struct NetworkRecord -{ - - /** - * Expiration time for the DNS record; relative or absolute depends - * on 'flags', network byte order. - */ - uint64_t expiration_time GNUNET_PACKED; - - /** - * Number of bytes in 'data', network byte order. - */ - uint32_t data_size GNUNET_PACKED; - - /** - * Type of the GNS/DNS record, network byte order. - */ - uint32_t record_type GNUNET_PACKED; - - /** - * Flags for the record, network byte order. - */ - uint32_t flags GNUNET_PACKED; - -}; - -GNUNET_NETWORK_STRUCT_END - -/** - * Convert a UTF-8 string to UTF-8 lowercase - * @param src source string - * @return converted result - */ -char * -GNUNET_NAMESTORE_normalize_string (const char *src) -{ - GNUNET_assert (NULL != src); - char *res = strdup (src); - /* normalize */ - GNUNET_STRINGS_utf8_tolower(src, &res); - return res; -} - - -/** - * Convert a short hash to a string (for printing debug messages). - * This is one of the very few calls in the entire API that is - * NOT reentrant! - * - * @param hc the short hash code - * @return string form; will be overwritten by next call to GNUNET_h2s. - */ -const char * -GNUNET_short_h2s (const struct GNUNET_CRYPTO_ShortHashCode * hc) -{ - static struct GNUNET_CRYPTO_ShortHashAsciiEncoded ret; - - GNUNET_CRYPTO_short_hash_to_enc (hc, &ret); - return (const char *) &ret; -} - - -/** - * Calculate how many bytes we will need to serialize the given - * records. - * - * @param rd_count number of records in the rd array - * @param rd array of GNUNET_NAMESTORE_RecordData with rd_count elements - * - * @return the required size to serialize - * - */ -size_t -GNUNET_NAMESTORE_records_get_size (unsigned int rd_count, - const struct GNUNET_NAMESTORE_RecordData *rd) -{ - unsigned int i; - size_t ret; - - ret = sizeof (struct NetworkRecord) * rd_count; - for (i=0;i= ret); - ret += rd[i].data_size; - } - return ret; -} - - -/** - * Serialize the given records to the given destination buffer. - * - * @param rd_count number of records in the rd array - * @param rd array of GNUNET_NAMESTORE_RecordData with rd_count elements - * @param dest_size size of the destination array - * @param dest where to write the result - * - * @return the size of serialized records, -1 if records do not fit - */ -ssize_t -GNUNET_NAMESTORE_records_serialize (unsigned int rd_count, - const struct GNUNET_NAMESTORE_RecordData *rd, - size_t dest_size, - char *dest) -{ - struct NetworkRecord rec; - unsigned int i; - size_t off; - - off = 0; - for (i=0;i dest_size) - return -1; - memcpy (&dest[off], &rec, sizeof (rec)); - off += sizeof (rec); - if (off + rd[i].data_size > dest_size) - return -1; - memcpy (&dest[off], rd[i].data, rd[i].data_size); - off += rd[i].data_size; - } - return off; -} - - -/** - * Compares if two records are equal (ignoring flags such - * as authority, private and pending, but not relative vs. - * absolute expiration time). - * - * @param a record - * @param b record - * @return GNUNET_YES if the records are equal or GNUNET_NO if they are not - */ -int -GNUNET_NAMESTORE_records_cmp (const struct GNUNET_NAMESTORE_RecordData *a, - const struct GNUNET_NAMESTORE_RecordData *b) -{ - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Comparing records\n"); - if (a->record_type != b->record_type) - { - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Record type %lu != %lu\n", a->record_type, b->record_type); - return GNUNET_NO; - } - if ((a->expiration_time != b->expiration_time) && - ((a->expiration_time != 0) && (b->expiration_time != 0))) - { - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Expiration time %llu != %llu\n", a->expiration_time, b->expiration_time); - return GNUNET_NO; - } - if ((a->flags & GNUNET_NAMESTORE_RF_RCMP_FLAGS) - != (b->flags & GNUNET_NAMESTORE_RF_RCMP_FLAGS)) - { - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Flags %lu (%lu) != %lu (%lu)\n", a->flags, - a->flags & GNUNET_NAMESTORE_RF_RCMP_FLAGS, b->flags, - b->flags & GNUNET_NAMESTORE_RF_RCMP_FLAGS); - return GNUNET_NO; - } - if (a->data_size != b->data_size) - { - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Data size %lu != %lu\n", a->data_size, b->data_size); - return GNUNET_NO; - } - if (0 != memcmp (a->data, b->data, a->data_size)) - { - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Data contents do not match\n"); - return GNUNET_NO; - } - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Records are equal\n"); - return GNUNET_YES; -} - - -/** - * Deserialize the given records to the given destination. - * - * @param len size of the serialized record data - * @param src the serialized record data - * @param rd_count number of records in the rd array - * @param dest where to put the data - * - * @return GNUNET_OK on success, GNUNET_SYSERR on error - */ -int -GNUNET_NAMESTORE_records_deserialize (size_t len, - const char *src, - unsigned int rd_count, - struct GNUNET_NAMESTORE_RecordData *dest) -{ - struct NetworkRecord rec; - unsigned int i; - size_t off; - - off = 0; - for (i=0;i len) - return GNUNET_SYSERR; - memcpy (&rec, &src[off], sizeof (rec)); - dest[i].expiration_time = GNUNET_ntohll (rec.expiration_time); - dest[i].data_size = ntohl ((uint32_t) rec.data_size); - dest[i].record_type = ntohl (rec.record_type); - dest[i].flags = ntohl (rec.flags); - off += sizeof (rec); - - if (off + dest[i].data_size > len) - return GNUNET_SYSERR; - dest[i].data = &src[off]; - off += dest[i].data_size; - } - return GNUNET_OK; -} - - -/** - * Sign name and records - * - * @param key the private key - * @param expire block expiration - * @param name the name - * @param rd record data - * @param rd_count number of records - * - * @return the signature - */ -struct GNUNET_CRYPTO_EccSignature * -GNUNET_NAMESTORE_create_signature (const struct GNUNET_CRYPTO_EccPrivateKey *key, - struct GNUNET_TIME_Absolute expire, - const char *name, - const struct GNUNET_NAMESTORE_RecordData *rd, - unsigned int rd_count) -{ - struct GNUNET_CRYPTO_EccSignature *sig; - struct GNUNET_CRYPTO_EccSignaturePurpose *sig_purpose; - struct GNUNET_TIME_AbsoluteNBO expire_nbo; - size_t rd_ser_len; - size_t name_len; - struct GNUNET_TIME_AbsoluteNBO *expire_tmp; - char * name_tmp; - char * rd_tmp; - int res; - uint32_t sig_len; - - if (NULL == name) - { - GNUNET_break (0); - return NULL; - } - sig = GNUNET_malloc (sizeof (struct GNUNET_CRYPTO_EccSignature)); - name_len = strlen (name) + 1; - expire_nbo = GNUNET_TIME_absolute_hton (expire); - rd_ser_len = GNUNET_NAMESTORE_records_get_size (rd_count, rd); - { - char rd_ser[rd_ser_len]; - - GNUNET_assert (rd_ser_len == - GNUNET_NAMESTORE_records_serialize (rd_count, rd, rd_ser_len, rd_ser)); - sig_len = sizeof (struct GNUNET_CRYPTO_EccSignaturePurpose) + sizeof (struct GNUNET_TIME_AbsoluteNBO) + rd_ser_len + name_len; - sig_purpose = GNUNET_malloc (sig_len); - sig_purpose->size = htonl (sig_len); - sig_purpose->purpose = htonl (GNUNET_SIGNATURE_PURPOSE_GNS_RECORD_SIGN); - expire_tmp = (struct GNUNET_TIME_AbsoluteNBO *) &sig_purpose[1]; - memcpy (expire_tmp, &expire_nbo, sizeof (struct GNUNET_TIME_AbsoluteNBO)); - name_tmp = (char *) &expire_tmp[1]; - memcpy (name_tmp, name, name_len); - rd_tmp = &name_tmp[name_len]; - memcpy (rd_tmp, rd_ser, rd_ser_len); - res = GNUNET_CRYPTO_ecc_sign (key, sig_purpose, sig); - GNUNET_free (sig_purpose); - } - if (GNUNET_OK != res) - { - GNUNET_break (0); - GNUNET_free (sig); - return NULL; - } - return sig; -} - - -/** - * Convert the 'value' of a record to a string. - * - * @param type type of the record - * @param data value in binary encoding - * @param data_size number of bytes in data - * @return NULL on error, otherwise human-readable representation of the value - */ -char * -GNUNET_NAMESTORE_value_to_string (uint32_t type, - const void *data, - size_t data_size) -{ - uint16_t mx_pref; - const struct soa_data *soa; - const struct vpn_data *vpn; - const struct srv_data *srv; - const struct tlsa_data *tlsa; - struct GNUNET_CRYPTO_ShortHashAsciiEncoded enc; - struct GNUNET_CRYPTO_HashAsciiEncoded s_peer; - const char *cdata; - char* vpn_str; - char* srv_str; - char* tlsa_str; - char* result; - const char* soa_rname; - const char* soa_mname; - char tmp[INET6_ADDRSTRLEN]; - - switch (type) - { - case 0: - return NULL; - case GNUNET_DNSPARSER_TYPE_A: - if (data_size != sizeof (struct in_addr)) - return NULL; - if (NULL == inet_ntop (AF_INET, data, tmp, sizeof (tmp))) - return NULL; - return GNUNET_strdup (tmp); - case GNUNET_DNSPARSER_TYPE_NS: - return GNUNET_strndup (data, data_size); - case GNUNET_DNSPARSER_TYPE_CNAME: - return GNUNET_strndup (data, data_size); - case GNUNET_DNSPARSER_TYPE_SOA: - if (data_size <= sizeof (struct soa_data)) - return NULL; - soa = data; - soa_rname = (const char*) &soa[1]; - soa_mname = memchr (soa_rname, 0, data_size - sizeof (struct soa_data) - 1); - if (NULL == soa_mname) - return NULL; - soa_mname++; - if (NULL == memchr (soa_mname, 0, - data_size - (sizeof (struct soa_data) + strlen (soa_rname) + 1))) - return NULL; - GNUNET_asprintf (&result, - "rname=%s mname=%s %lu,%lu,%lu,%lu,%lu", - soa_rname, soa_mname, - ntohl (soa->serial), - ntohl (soa->refresh), - ntohl (soa->retry), - ntohl (soa->expire), - ntohl (soa->minimum)); - return result; - case GNUNET_DNSPARSER_TYPE_PTR: - return GNUNET_strndup (data, data_size); - case GNUNET_DNSPARSER_TYPE_MX: - mx_pref = ntohs(*((uint16_t*)data)); - if (GNUNET_asprintf(&result, "%hu,%s", mx_pref, data+sizeof(uint16_t)) - != 0) - return result; - else - { - GNUNET_free (result); - return NULL; - } - case GNUNET_DNSPARSER_TYPE_TXT: - return GNUNET_strndup (data, data_size); - case GNUNET_DNSPARSER_TYPE_AAAA: - if (data_size != sizeof (struct in6_addr)) - return NULL; - if (NULL == inet_ntop (AF_INET6, data, tmp, sizeof (tmp))) - return NULL; - return GNUNET_strdup (tmp); - case GNUNET_NAMESTORE_TYPE_PKEY: - if (data_size != sizeof (struct GNUNET_CRYPTO_ShortHashCode)) - return NULL; - GNUNET_CRYPTO_short_hash_to_enc (data, - &enc); - return GNUNET_strdup ((const char*) enc.short_encoding); - case GNUNET_NAMESTORE_TYPE_PSEU: - return GNUNET_strndup (data, data_size); - case GNUNET_NAMESTORE_TYPE_LEHO: - return GNUNET_strndup (data, data_size); - case GNUNET_NAMESTORE_TYPE_VPN: - cdata = data; - if ( (data_size <= sizeof (struct vpn_data)) || - ('\0' != cdata[data_size - 1]) ) - return NULL; /* malformed */ - vpn = data; - GNUNET_CRYPTO_hash_to_enc (&vpn->peer, &s_peer); - if (0 == GNUNET_asprintf (&vpn_str, "%u %s %s", - (unsigned int) ntohs (vpn->proto), - (const char*) &s_peer, - (const char*) &vpn[1])) - { - GNUNET_free (vpn_str); - return NULL; - } - return vpn_str; - case GNUNET_DNSPARSER_TYPE_SRV: - cdata = data; - if ( (data_size <= sizeof (struct srv_data)) || - ('\0' != cdata[data_size - 1]) ) - return NULL; /* malformed */ - srv = data; - - if (0 == GNUNET_asprintf (&srv_str, - "%d %d %d %s", - ntohs (srv->prio), - ntohs (srv->weight), - ntohs (srv->port), - (const char *)&srv[1])) - { - GNUNET_free (srv_str); - return NULL; - } - return srv_str; - case GNUNET_DNSPARSER_TYPE_TLSA: - cdata = data; - if ( (data_size <= sizeof (struct tlsa_data)) || - ('\0' != cdata[data_size - 1]) ) - return NULL; /* malformed */ - tlsa = data; - if (0 == GNUNET_asprintf (&tlsa_str, - "%c %c %c %s", - tlsa->usage, - tlsa->selector, - tlsa->matching_type, - (const char *) &tlsa[1])) - { - GNUNET_free (tlsa_str); - return NULL; - } - return tlsa_str; - default: - GNUNET_break (0); - } - GNUNET_break (0); // not implemented - return NULL; -} - - -/** - * Convert human-readable version of a 'value' of a record to the binary - * representation. - * - * @param type type of the record - * @param s human-readable string - * @param data set to value in binary encoding (will be allocated) - * @param data_size set to number of bytes in data - * @return GNUNET_OK on success - */ -int -GNUNET_NAMESTORE_string_to_value (uint32_t type, - const char *s, - void **data, - size_t *data_size) -{ - struct in_addr value_a; - struct in6_addr value_aaaa; - struct GNUNET_CRYPTO_ShortHashCode pkey; - struct soa_data *soa; - struct vpn_data *vpn; - struct tlsa_data *tlsa; - char result[253 + 1]; - char soa_rname[253 + 1]; - char soa_mname[253 + 1]; - char s_peer[103 + 1]; - char s_serv[253 + 1]; - unsigned int soa_serial; - unsigned int soa_refresh; - unsigned int soa_retry; - unsigned int soa_expire; - unsigned int soa_min; - uint16_t mx_pref; - uint16_t mx_pref_n; - unsigned int proto; - - if (NULL == s) - return GNUNET_SYSERR; - switch (type) - { - case 0: - GNUNET_log (GNUNET_ERROR_TYPE_ERROR, - _("Unsupported record type %d\n"), - (int) type); - return GNUNET_SYSERR; - case GNUNET_DNSPARSER_TYPE_A: - if (1 != inet_pton (AF_INET, s, &value_a)) - { - GNUNET_log (GNUNET_ERROR_TYPE_ERROR, - _("Unable to parse IPv4 address `%s'\n"), - s); - return GNUNET_SYSERR; - } - *data = GNUNET_malloc (sizeof (struct in_addr)); - memcpy (*data, &value_a, sizeof (value_a)); - *data_size = sizeof (value_a); - return GNUNET_OK; - case GNUNET_DNSPARSER_TYPE_NS: - *data = GNUNET_strdup (s); - *data_size = strlen (s) + 1; - return GNUNET_OK; - case GNUNET_DNSPARSER_TYPE_CNAME: - *data = GNUNET_strdup (s); - *data_size = strlen (s) + 1; - return GNUNET_OK; - case GNUNET_DNSPARSER_TYPE_SOA: - if (7 != SSCANF (s, - "rname=%253s mname=%253s %u,%u,%u,%u,%u", - soa_rname, soa_mname, - &soa_serial, &soa_refresh, &soa_retry, &soa_expire, &soa_min)) - { - GNUNET_log (GNUNET_ERROR_TYPE_ERROR, - _("Unable to parse SOA record `%s'\n"), - s); - return GNUNET_SYSERR; - } - *data_size = sizeof (struct soa_data)+strlen(soa_rname)+strlen(soa_mname)+2; - *data = GNUNET_malloc (*data_size); - soa = (struct soa_data*)*data; - soa->serial = htonl(soa_serial); - soa->refresh = htonl(soa_refresh); - soa->retry = htonl(soa_retry); - soa->expire = htonl(soa_expire); - soa->minimum = htonl(soa_min); - strcpy((char*)&soa[1], soa_rname); - strcpy((char*)&soa[1]+strlen(*data)+1, soa_mname); - return GNUNET_OK; - case GNUNET_DNSPARSER_TYPE_PTR: - *data = GNUNET_strdup (s); - *data_size = strlen (s); - return GNUNET_OK; - case GNUNET_DNSPARSER_TYPE_MX: - if (2 != SSCANF(s, "%hu,%253s", &mx_pref, result)) - { - GNUNET_log (GNUNET_ERROR_TYPE_ERROR, - _("Unable to parse MX record `%s'\n"), - s); - return GNUNET_SYSERR; - } - *data_size = sizeof (uint16_t)+strlen(result)+1; - *data = GNUNET_malloc (*data_size); - mx_pref_n = htons(mx_pref); - memcpy(*data, &mx_pref_n, sizeof (uint16_t)); - strcpy((*data)+sizeof (uint16_t), result); - return GNUNET_OK; - case GNUNET_DNSPARSER_TYPE_TXT: - *data = GNUNET_strdup (s); - *data_size = strlen (s); - return GNUNET_OK; - case GNUNET_DNSPARSER_TYPE_AAAA: - if (1 != inet_pton (AF_INET6, s, &value_aaaa)) - { - GNUNET_log (GNUNET_ERROR_TYPE_ERROR, - _("Unable to parse IPv6 address `%s'\n"), - s); - return GNUNET_SYSERR; - } - *data = GNUNET_malloc (sizeof (struct in6_addr)); - *data_size = sizeof (struct in6_addr); - memcpy (*data, &value_aaaa, sizeof (value_aaaa)); - return GNUNET_OK; - case GNUNET_NAMESTORE_TYPE_PKEY: - if (GNUNET_OK != - GNUNET_CRYPTO_short_hash_from_string (s, &pkey)) - { - GNUNET_log (GNUNET_ERROR_TYPE_ERROR, - _("Unable to parse PKEY record `%s'\n"), - s); - return GNUNET_SYSERR; - } - *data = GNUNET_malloc (sizeof (struct GNUNET_CRYPTO_ShortHashCode)); - memcpy (*data, &pkey, sizeof (pkey)); - *data_size = sizeof (struct GNUNET_CRYPTO_ShortHashCode); - return GNUNET_OK; - case GNUNET_NAMESTORE_TYPE_PSEU: - *data = GNUNET_strdup (s); - *data_size = strlen (s); - return GNUNET_OK; - case GNUNET_NAMESTORE_TYPE_LEHO: - *data = GNUNET_strdup (s); - *data_size = strlen (s); - return GNUNET_OK; - case GNUNET_NAMESTORE_TYPE_VPN: - if (3 != SSCANF (s,"%u %103s %253s", - &proto, s_peer, s_serv)) - { - GNUNET_log (GNUNET_ERROR_TYPE_ERROR, - _("Unable to parse VPN record string `%s'\n"), - s); - return GNUNET_SYSERR; - } - *data_size = sizeof (struct vpn_data) + strlen (s_serv) + 1; - *data = vpn = GNUNET_malloc (*data_size); - if (GNUNET_OK != GNUNET_CRYPTO_hash_from_string ((char*)&s_peer, - &vpn->peer)) - { - GNUNET_free (vpn); - *data_size = 0; - return GNUNET_SYSERR; - } - vpn->proto = htons ((uint16_t) proto); - strcpy ((char*)&vpn[1], s_serv); - return GNUNET_OK; - case GNUNET_DNSPARSER_TYPE_TLSA: - *data_size = sizeof (struct tlsa_data) + strlen (s) - 6; - *data = tlsa = GNUNET_malloc (*data_size); - if (4 != SSCANF (s, "%c %c %c %s", - &tlsa->usage, - &tlsa->selector, - &tlsa->matching_type, - (char*)&tlsa[1])) - { - GNUNET_log (GNUNET_ERROR_TYPE_ERROR, - _("Unable to parse TLSA record string `%s'\n"), - s); - *data_size = 0; - GNUNET_free (tlsa); - return GNUNET_SYSERR; - } - return GNUNET_OK; - default: - GNUNET_log (GNUNET_ERROR_TYPE_ERROR, - _("Unsupported record type %d\n"), - (int) type); - return GNUNET_SYSERR; - } -} - - -static struct { - const char *name; - uint32_t number; -} name_map[] = { - { "A", GNUNET_DNSPARSER_TYPE_A }, - { "NS", GNUNET_DNSPARSER_TYPE_NS }, - { "CNAME", GNUNET_DNSPARSER_TYPE_CNAME }, - { "SOA", GNUNET_DNSPARSER_TYPE_SOA }, - { "PTR", GNUNET_DNSPARSER_TYPE_PTR }, - { "MX", GNUNET_DNSPARSER_TYPE_MX }, - { "TXT", GNUNET_DNSPARSER_TYPE_TXT }, - { "AAAA", GNUNET_DNSPARSER_TYPE_AAAA }, - { "PKEY", GNUNET_NAMESTORE_TYPE_PKEY }, - { "PSEU", GNUNET_NAMESTORE_TYPE_PSEU }, - { "LEHO", GNUNET_NAMESTORE_TYPE_LEHO }, - { "VPN", GNUNET_NAMESTORE_TYPE_VPN }, - { "TLSA", GNUNET_DNSPARSER_TYPE_TLSA }, - { NULL, UINT32_MAX } -}; - - -/** - * Convert a type name (i.e. "AAAA") to the corresponding number. - * - * @param typename name to convert - * @return corresponding number, UINT32_MAX on error - */ -uint32_t -GNUNET_NAMESTORE_typename_to_number (const char *typename) -{ - unsigned int i; - - i=0; - while ( (name_map[i].name != NULL) && - (0 != strcasecmp (typename, name_map[i].name)) ) - i++; - return name_map[i].number; -} - - -/** - * Convert a type number (i.e. 1) to the corresponding type string (i.e. "A") - * - * @param type number of a type to convert - * @return corresponding typestring, NULL on error - */ -const char * -GNUNET_NAMESTORE_number_to_typename (uint32_t type) -{ - unsigned int i; - - i=0; - while ( (name_map[i].name != NULL) && - (type != name_map[i].number) ) - i++; - return name_map[i].name; -} - -/** - * Test if a given record is expired. - * - * @return GNUNET_YES if the record is expired, - * GNUNET_NO if not - */ -int -GNUNET_NAMESTORE_is_expired (const struct GNUNET_NAMESTORE_RecordData *rd) -{ - struct GNUNET_TIME_Absolute at; - - if (0 != (rd->flags & GNUNET_NAMESTORE_RF_RELATIVE_EXPIRATION)) - return GNUNET_NO; - at.abs_value = rd->expiration_time; - return (0 == GNUNET_TIME_absolute_get_remaining (at).rel_value) ? GNUNET_YES : GNUNET_NO; -} - - -/* end of namestore_common.c */ diff --git a/src/namestore/plugin_namestore_sqlite.c b/src/namestore/plugin_namestore_sqlite.c index f0b801d1e..806debae4 100644 --- a/src/namestore/plugin_namestore_sqlite.c +++ b/src/namestore/plugin_namestore_sqlite.c @@ -683,7 +683,7 @@ namestore_sqlite_iterate_records (void *cls, &name_hase, sizeof (struct GNUNET_CRYPTO_ShortHashCode), SQLITE_STATIC)) ) { - GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "ITERATE NAME HASH: `%8s'", GNUNET_short_h2s(&name_hase)); + GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "ITERATE NAME HASH: `%8s'", GNUNET_NAMESTORE_short_h2s(&name_hase)); LOG_SQLITE (plugin, GNUNET_ERROR_TYPE_ERROR | GNUNET_ERROR_TYPE_BULK, "sqlite3_bind_XXXX"); if (SQLITE_OK != sqlite3_reset (stmt)) diff --git a/src/namestore/test_namestore_api_create.c b/src/namestore/test_namestore_api_create.c index 6db832149..0510a6c4b 100644 --- a/src/namestore/test_namestore_api_create.c +++ b/src/namestore/test_namestore_api_create.c @@ -254,7 +254,7 @@ name_lookup_initial_proc (void *cls, for (c = 0; c < RECORDS; c++) { - if (GNUNET_NO == GNUNET_NAMESTORE_records_cmp(&rd[c], &s_first_record[c])) + if (GNUNET_NO == GNUNET_NAMESTORE_records_cmp (&rd[c], &s_first_record[c])) { GNUNET_break (0); failed = GNUNET_YES; @@ -280,7 +280,7 @@ name_lookup_initial_proc (void *cls, res = 1; /* create a second record */ - s_second_record = GNUNET_malloc(sizeof (struct GNUNET_NAMESTORE_RecordData) + TEST_CREATE_RECORD_DATALEN); + s_second_record = GNUNET_malloc (sizeof (struct GNUNET_NAMESTORE_RecordData) + TEST_CREATE_RECORD_DATALEN); s_second_record->expiration_time = UINT64_MAX; s_second_record->record_type = TEST_CREATE_RECORD_TYPE; s_second_record->flags = GNUNET_NAMESTORE_RF_AUTHORITY; @@ -288,7 +288,9 @@ name_lookup_initial_proc (void *cls, s_second_record->data_size = TEST_CREATE_RECORD_DATALEN; memset ((char *) s_second_record->data, TEST_CREATE_RECORD_DATA, TEST_CREATE_RECORD_DATALEN); - GNUNET_NAMESTORE_record_create (nsh, privkey, name, s_second_record, &create_second_cont, name); + GNUNET_NAMESTORE_record_put_by_authority (nsh, privkey, name, + 1, s_second_record, + &create_second_cont, name); } else @@ -375,7 +377,7 @@ run (void *cls, /* create random zone hash */ GNUNET_CRYPTO_short_hash (&pubkey, sizeof (struct GNUNET_CRYPTO_EccPublicKeyBinaryEncoded), &s_zone); - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Name: `%s' Zone: `%s' \n", s_name, GNUNET_short_h2s (&s_zone)); + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Name: `%s' Zone: `%s' \n", s_name, GNUNET_NAMESTORE_short_h2s (&s_zone)); nsh = GNUNET_NAMESTORE_connect (cfg); GNUNET_break (NULL != nsh); @@ -383,7 +385,9 @@ run (void *cls, GNUNET_break (s_name != NULL); /* create initial record */ - GNUNET_NAMESTORE_record_create (nsh, privkey, s_name, s_first_record, &create_first_cont, s_name); + GNUNET_NAMESTORE_record_put_by_authority (nsh, privkey, s_name, + 1, s_first_record, + &create_first_cont, s_name); } diff --git a/src/namestore/test_namestore_api_create_update.c b/src/namestore/test_namestore_api_create_update.c index 5df7c4934..2d18af89e 100644 --- a/src/namestore/test_namestore_api_create_update.c +++ b/src/namestore/test_namestore_api_create_update.c @@ -141,7 +141,9 @@ create_identical_cont (void *cls, int32_t success, const char *emsg) { res = 0; s_first_record->expiration_time = GNUNET_TIME_absolute_get ().abs_value; - GNUNET_NAMESTORE_record_create (nsh, privkey, s_name, s_first_record, &create_updated_cont, s_name); + GNUNET_NAMESTORE_record_put_by_authority (nsh, privkey, s_name, + 1, s_first_record, + &create_updated_cont, s_name); } else { @@ -162,7 +164,9 @@ create_first_cont (void *cls, int32_t success, const char *emsg) { res = 0; /* check if record was created correct */ - GNUNET_NAMESTORE_record_create (nsh, privkey, s_name, s_first_record, &create_identical_cont, s_name); + GNUNET_NAMESTORE_record_put_by_authority (nsh, privkey, s_name, + 1, s_first_record, + &create_identical_cont, s_name); } else { @@ -228,7 +232,7 @@ run (void *cls, /* create random zone hash */ GNUNET_CRYPTO_short_hash (&pubkey, sizeof (struct GNUNET_CRYPTO_EccPublicKeyBinaryEncoded), &s_zone); - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Name: `%s' Zone: `%s' \n", s_name, GNUNET_short_h2s (&s_zone)); + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Name: `%s' Zone: `%s' \n", s_name, GNUNET_NAMESTORE_short_h2s (&s_zone)); nsh = GNUNET_NAMESTORE_connect (cfg); GNUNET_break (NULL != nsh); @@ -236,7 +240,9 @@ run (void *cls, GNUNET_break (s_name != NULL); /* create initial record */ - GNUNET_NAMESTORE_record_create (nsh, privkey, s_name, s_first_record, &create_first_cont, s_name); + GNUNET_NAMESTORE_record_put_by_authority (nsh, privkey, s_name, + 1, s_first_record, + &create_first_cont, s_name); } diff --git a/src/namestore/test_namestore_api_remove.c b/src/namestore/test_namestore_api_remove.c index 265a93b81..b40a935fd 100644 --- a/src/namestore/test_namestore_api_remove.c +++ b/src/namestore/test_namestore_api_remove.c @@ -204,7 +204,9 @@ put_cont (void *cls, int32_t success, const char *emsg) res = 0; GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Removing record for `%s'\n", name); - GNUNET_NAMESTORE_record_remove (nsh, privkey, name, &s_rd[0], &remove_cont, name); + GNUNET_NAMESTORE_record_put_by_authority (nsh, privkey, name, + 0, NULL, + &remove_cont, name); } else { @@ -275,7 +277,7 @@ run (void *cls, /* create random zone hash */ GNUNET_CRYPTO_short_hash (&pubkey, sizeof (struct GNUNET_CRYPTO_EccPublicKeyBinaryEncoded), &s_zone); - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Name: `%s' Zone: `%s' \n", s_name, GNUNET_short_h2s (&s_zone)); + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Name: `%s' Zone: `%s' \n", s_name, GNUNET_NAMESTORE_short_h2s (&s_zone)); nsh = GNUNET_NAMESTORE_connect (cfg); GNUNET_break (NULL != nsh); GNUNET_break (s_rd != NULL); diff --git a/src/namestore/test_namestore_api_remove_not_existing_record.c b/src/namestore/test_namestore_api_remove_not_existing_record.c index 16586240a..c31ea8d0b 100644 --- a/src/namestore/test_namestore_api_remove_not_existing_record.c +++ b/src/namestore/test_namestore_api_remove_not_existing_record.c @@ -136,16 +136,9 @@ put_cont (void *cls, int32_t success, const char *emsg) { res = 0; GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Removing non existing record for `%s'\n", name); - - struct GNUNET_NAMESTORE_RecordData rd; - char data[TEST_REMOVE_RECORD_DATALEN]; - - rd.expiration_time = GNUNET_TIME_absolute_get().abs_value; - rd.record_type = TEST_REMOVE_RECORD_TYPE; - rd.data_size = TEST_REMOVE_RECORD_DATALEN; - rd.data = &data; - - GNUNET_NAMESTORE_record_remove (nsh, privkey, name, &rd, &remove_cont, name); + GNUNET_NAMESTORE_record_put_by_authority (nsh, privkey, name, + 0, NULL, + &remove_cont, name); } else { diff --git a/src/namestore/test_namestore_api_zone_iteration.c b/src/namestore/test_namestore_api_zone_iteration.c index 48ac35f71..71afc359c 100644 --- a/src/namestore/test_namestore_api_zone_iteration.c +++ b/src/namestore/test_namestore_api_zone_iteration.c @@ -410,7 +410,9 @@ empty_zone_proc (void *cls, s_rd_1 = create_record(1); et.abs_value = s_rd_1->expiration_time; sig_1 = GNUNET_NAMESTORE_create_signature(privkey, et, s_name_1, s_rd_1, 1); - GNUNET_NAMESTORE_record_create(nsh, privkey, s_name_1, s_rd_1, &put_cont, NULL); + GNUNET_NAMESTORE_record_put_by_authority (nsh, privkey, s_name_1, + 1, s_rd_1, + &put_cont, NULL); GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Created record 2 \n"); @@ -419,7 +421,9 @@ empty_zone_proc (void *cls, et.abs_value = s_rd_2->expiration_time; sig_2 = GNUNET_NAMESTORE_create_signature(privkey, et, s_name_2, s_rd_2, 1); - GNUNET_NAMESTORE_record_create(nsh, privkey, s_name_2, s_rd_2, &put_cont, NULL); + GNUNET_NAMESTORE_record_put_by_authority (nsh, privkey, s_name_2, + 1, s_rd_2, + &put_cont, NULL); GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Created record 3\n"); /* name in different zone */ diff --git a/src/namestore/test_namestore_api_zone_iteration_specific_zone.c b/src/namestore/test_namestore_api_zone_iteration_specific_zone.c index 53457cdaa..86871120c 100644 --- a/src/namestore/test_namestore_api_zone_iteration_specific_zone.c +++ b/src/namestore/test_namestore_api_zone_iteration_specific_zone.c @@ -182,7 +182,7 @@ zone_proc (void *cls, const struct GNUNET_CRYPTO_EccSignature *signature) { int failed = GNUNET_NO; - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Callback for zone `%s'\n", GNUNET_short_h2s (&zone)); + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Callback for zone `%s'\n", GNUNET_NAMESTORE_short_h2s (&zone)); if ((zone_key == NULL) && (name == NULL)) { GNUNET_break (2 == returned_records); @@ -285,7 +285,7 @@ put_cont (void *cls, int32_t success, const char *emsg) res = 1; returned_records = 0; GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "All records created, starting iteration over zone `%s'\n", - GNUNET_short_h2s(&zone)); + GNUNET_NAMESTORE_short_h2s(&zone)); zi = GNUNET_NAMESTORE_zone_iteration_start(nsh, &zone, GNUNET_NAMESTORE_RF_NONE, @@ -356,14 +356,18 @@ run (void *cls, s_rd_1 = create_record(1); et.abs_value = s_rd_1[0].expiration_time; sig_1 = GNUNET_NAMESTORE_create_signature(privkey, et, s_name_1, s_rd_1, 1); - GNUNET_NAMESTORE_record_create(nsh, privkey, s_name_1, s_rd_1, &put_cont, NULL); + GNUNET_NAMESTORE_record_put_by_authority (nsh, privkey, s_name_1, + 1, s_rd_1, + &put_cont, NULL); GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Created record 2 \n"); GNUNET_asprintf(&s_name_2, "dummy2"); s_rd_2 = create_record(1); et.abs_value = s_rd_2[0].expiration_time; sig_2 = GNUNET_NAMESTORE_create_signature(privkey, et, s_name_2, s_rd_2, 1); - GNUNET_NAMESTORE_record_create(nsh, privkey, s_name_2, s_rd_2, &put_cont, NULL); + GNUNET_NAMESTORE_record_put_by_authority (nsh, privkey, s_name_2, + 1, s_rd_2, + &put_cont, NULL); GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Created record 3\n"); /* name in different zone */ @@ -371,7 +375,8 @@ run (void *cls, s_rd_3 = create_record(1); et.abs_value = s_rd_3[0].expiration_time; sig_3 = GNUNET_NAMESTORE_create_signature(privkey, et, s_name_3, s_rd_3, 1); - GNUNET_NAMESTORE_record_put (nsh, &pubkey2, s_name_3, GNUNET_TIME_UNIT_FOREVER_ABS, 1, s_rd_3, sig_3, &put_cont, NULL); + GNUNET_NAMESTORE_record_put (nsh, &pubkey2, s_name_3, + GNUNET_TIME_UNIT_FOREVER_ABS, 1, s_rd_3, sig_3, &put_cont, NULL); } diff --git a/src/namestore/test_namestore_api_zone_iteration_stop.c b/src/namestore/test_namestore_api_zone_iteration_stop.c index 666e09ee8..9c1829e91 100644 --- a/src/namestore/test_namestore_api_zone_iteration_stop.c +++ b/src/namestore/test_namestore_api_zone_iteration_stop.c @@ -407,7 +407,8 @@ run (void *cls, s_rd_1 = create_record(1); et.abs_value = s_rd_1[0].expiration_time; sig_1 = GNUNET_NAMESTORE_create_signature(privkey, et, s_name_1, s_rd_1, 1); - GNUNET_NAMESTORE_record_create(nsh, privkey, s_name_1, s_rd_1, &put_cont, NULL); + GNUNET_NAMESTORE_record_put_by_authority (nsh, privkey, s_name_1, + 1, s_rd_1, &put_cont, NULL); GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Created record 2 \n"); @@ -416,7 +417,8 @@ run (void *cls, et.abs_value = s_rd_2[0].expiration_time; sig_2 = GNUNET_NAMESTORE_create_signature(privkey, et, s_name_2, s_rd_2, 1); - GNUNET_NAMESTORE_record_create(nsh, privkey, s_name_2, s_rd_2, &put_cont, NULL); + GNUNET_NAMESTORE_record_put_by_authority (nsh, privkey, s_name_2, + 1, s_rd_2, &put_cont, NULL); GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Created record 3\n"); /* name in different zone */ diff --git a/src/namestore/test_namestore_api_zone_to_name.c b/src/namestore/test_namestore_api_zone_to_name.c index 2734ebae8..f0b712eb9 100644 --- a/src/namestore/test_namestore_api_zone_to_name.c +++ b/src/namestore/test_namestore_api_zone_to_name.c @@ -184,7 +184,7 @@ run (void *cls, /* zone hash */ GNUNET_CRYPTO_short_hash (&pubkey, sizeof (struct GNUNET_CRYPTO_EccPublicKeyBinaryEncoded), &s_zone); GNUNET_CRYPTO_short_hash (s_name, strlen (s_name) + 1, &s_zone_value); - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Using PKEY `%s' \n", GNUNET_short_h2s (&s_zone_value)); + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Using PKEY `%s' \n", GNUNET_NAMESTORE_short_h2s (&s_zone_value)); struct GNUNET_NAMESTORE_RecordData rd; rd.expiration_time = GNUNET_TIME_absolute_get().abs_value; -- cgit v1.2.3