From e2f8c8f83b67abb62b8858beb684b0b7f43c3ed7 Mon Sep 17 00:00:00 2001 From: Matthias Wachs Date: Fri, 2 Mar 2012 10:12:57 +0000 Subject: [PATCH] - fixes --- src/namestore/gnunet-service-namestore.c | 56 +++++++++++----- src/namestore/test_namestore_api.conf | 2 +- src/namestore/test_namestore_api_create.c | 81 +++++++++-------------- 3 files changed, 73 insertions(+), 66 deletions(-) diff --git a/src/namestore/gnunet-service-namestore.c b/src/namestore/gnunet-service-namestore.c index c64ad3195..286512dca 100644 --- a/src/namestore/gnunet-service-namestore.c +++ b/src/namestore/gnunet-service-namestore.c @@ -191,6 +191,8 @@ struct LookupNameContext struct GNUNET_NAMESTORE_Client *nc; uint32_t request_id; uint32_t record_type; + GNUNET_HashCode *zone; + char * name; }; @@ -216,7 +218,7 @@ handle_lookup_name_it (void *cls, size_t rd_ser_len; struct GNUNET_CRYPTO_RsaSignature *signature_tmp; - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Sending `%s' message\n", "NAMESTORE_LOOKUP_NAME_RESPONSE"); + size_t r_size = 0; @@ -269,6 +271,8 @@ handle_lookup_name_it (void *cls, char rd_ser[rd_ser_len]; GNUNET_NAMESTORE_records_serialize(copied_elements, rd_selected, rd_ser_len, rd_ser); + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Found %u records for name `%s' in zone `%s'\n", + copied_elements, lnc->name, GNUNET_h2s(lnc->zone)); if ((copied_elements == rd_count) && (signature != NULL)) contains_signature = GNUNET_YES; @@ -282,6 +286,8 @@ handle_lookup_name_it (void *cls, rd_ser_len + contains_signature * sizeof (struct GNUNET_CRYPTO_RsaSignature); + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Sending `%s' message\n", "NAMESTORE_LOOKUP_NAME_RESPONSE"); + lnr_msg = GNUNET_malloc (r_size); lnr_msg->gns_header.header.type = ntohs (GNUNET_MESSAGE_TYPE_NAMESTORE_LOOKUP_NAME_RESPONSE); @@ -370,6 +376,8 @@ static void handle_lookup_name (void *cls, lnc.request_id = rid; lnc.nc = nc; lnc.record_type = type; + lnc.name = name; + lnc.zone = &ln_msg->zone; res = GSN_database->iterate_records(GSN_database->cls, &ln_msg->zone, name, 0, &handle_lookup_name_it, &lnc); GNUNET_SERVER_receive_done (client, GNUNET_OK); @@ -507,13 +515,16 @@ struct CreateRecordContext { struct GNUNET_NAMESTORE_RecordData *rd; struct GNUNET_CRYPTO_RsaPrivateKey *pkey; + struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded *pubkey; struct GNUNET_TIME_Absolute expire; + char *name; + int res; }; static void handle_create_record_it (void *cls, - const struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded *zone_key, + const struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded *pubkey, struct GNUNET_TIME_Absolute expire, const char *name, unsigned int rd_count, @@ -524,26 +535,33 @@ handle_create_record_it (void *cls, struct GNUNET_CRYPTO_RsaSignature *signature_new; int res; - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Found %u existing records for `%s'\n", rd_count, name); + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Found %u existing records for `%s'\n", rd_count, crc->name); struct GNUNET_NAMESTORE_RecordData *rd_new = GNUNET_malloc ((rd_count+1) * sizeof (struct GNUNET_NAMESTORE_RecordData)); memcpy (rd_new, rd, rd_count * sizeof (struct GNUNET_NAMESTORE_RecordData)); rd_new[rd_count] = *(crc->rd); - signature_new = GNUNET_NAMESTORE_create_signature (crc->pkey, name, rd_new, rd_count+1); + signature_new = GNUNET_NAMESTORE_create_signature (crc->pkey, crc->name, rd_new, rd_count+1); + if (NULL == signature_new) + { + GNUNET_break (0); + res = GNUNET_SYSERR; + } /* Database operation */ res = GSN_database->put_records(GSN_database->cls, - zone_key, - expire, - name, + (const struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded *) crc->pubkey, + crc->expire, + crc->name, rd_count +1, rd_new, signature_new); + GNUNET_break (GNUNET_OK == res); GNUNET_free (rd_new); GNUNET_free (signature_new); - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Update result for name %u\n", res); + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Update result for name `%s' %s\n", crc->name, (res == GNUNET_OK) ? "SUCCESS" : "FAIL"); + crc->res = res; } static void handle_record_create (void *cls, @@ -622,12 +640,11 @@ static void handle_record_create (void *cls, struct GNUNET_NAMESTORE_RecordData rd[rd_count]; res = GNUNET_NAMESTORE_records_deserialize(rd_ser_len, rd_ser, rd_count, rd); - if (res != GNUNET_OK) + if ((res != GNUNET_OK) || (rd_count != 1)) { GNUNET_break_op (0); goto send; } - GNUNET_assert (rd_count == 1); /* Extracting and converting private key */ pkey = GNUNET_CRYPTO_rsa_decode_key((char *) pkey_tmp, key_len); @@ -636,13 +653,16 @@ static void handle_record_create (void *cls, GNUNET_CRYPTO_hash (&pub, sizeof (struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded), &pubkey_hash); crc.pkey = pkey; + crc.pubkey = &pub; crc.rd = rd; + crc.name = name_tmp; GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Creating record for name `%s' in zone `%s'\n", name_tmp, GNUNET_h2s(&pubkey_hash)); /* Get existing records for name */ res = GSN_database->iterate_records(GSN_database->cls, &pubkey_hash, name_tmp, 0, &handle_create_record_it, &crc); - + if (res != GNUNET_SYSERR) + res = GNUNET_OK; GNUNET_CRYPTO_rsa_key_free(pkey); /* Send response */ @@ -651,7 +671,7 @@ send: rcr_msg.gns_header.header.type = htons (GNUNET_MESSAGE_TYPE_NAMESTORE_RECORD_CREATE_RESPONSE); rcr_msg.gns_header.r_id = htonl (rid); rcr_msg.gns_header.header.size = htons (sizeof (struct RecordCreateResponseMessage)); - if (GNUNET_OK == res) + if ((GNUNET_OK == res) && (crc.res == GNUNET_OK)) rcr_msg.op_result = htons (GNUNET_OK); else rcr_msg.op_result = htons (GNUNET_NO); @@ -853,8 +873,12 @@ static void handle_record_remove (void *cls, GNUNET_CRYPTO_hash (&pub, sizeof (struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded), &pubkey_hash); struct GNUNET_NAMESTORE_RecordData rd[rd_count]; - GNUNET_NAMESTORE_records_deserialize(rd_ser_len, rd_ser, rd_count, rd); - GNUNET_assert (rd_count == 1); + res = GNUNET_NAMESTORE_records_deserialize(rd_ser_len, rd_ser, rd_count, rd); + if ((res != GNUNET_OK) || (rd_count != 1)) + { + GNUNET_break_op (0); + goto send; + } struct RemoveRecordContext rrc; rrc.rd = rd; @@ -871,13 +895,15 @@ static void handle_record_remove (void *cls, GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Removing record for name `%s': %s\n", name_tmp, (rrc.op_res == 0) ? "OK" : "FAIL"); + res = rrc.op_res; /* Send response */ +send: 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.r_id = rr_msg->gns_header.r_id; rrr_msg.gns_header.header.size = htons (sizeof (struct RecordRemoveResponseMessage)); - rrr_msg.op_result = htons (rrc.op_res); + rrr_msg.op_result = htons (res); GNUNET_SERVER_notification_context_unicast (snc, nc->client, (const struct GNUNET_MessageHeader *) &rrr_msg, GNUNET_NO); GNUNET_CRYPTO_rsa_key_free (pkey); diff --git a/src/namestore/test_namestore_api.conf b/src/namestore/test_namestore_api.conf index 1b83e8f13..dfb09da96 100644 --- a/src/namestore/test_namestore_api.conf +++ b/src/namestore/test_namestore_api.conf @@ -19,7 +19,7 @@ ACCEPT_FROM6 = ::1; DATABASE = sqlite [namestore-sqlite] -FILENAME = $SERVICEHOME/namestore/sqlite.db +FILENAME = $SERVICEHOME/namestore/sqlite_test.db [namestore-postgres] CONFIG = connect_timeout=10; dbname=gnunet diff --git a/src/namestore/test_namestore_api_create.c b/src/namestore/test_namestore_api_create.c index b0b3c3bf9..93c3dba2d 100644 --- a/src/namestore/test_namestore_api_create.c +++ b/src/namestore/test_namestore_api_create.c @@ -29,7 +29,7 @@ #define VERBOSE GNUNET_NO -#define RECORDS 5 +#define RECORDS 1 #define TEST_RECORD_TYPE 1234 #define TEST_RECORD_DATALEN 123 #define TEST_RECORD_DATA 'a' @@ -121,7 +121,7 @@ end (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) for (c = 0; c < RECORDS; c++) GNUNET_free_non_null((void *) s_rd[c].data); GNUNET_free (s_rd); - GNUNET_free (s_create_rd); + //GNUNET_free (s_create_rd); if (privkey != NULL) GNUNET_CRYPTO_rsa_key_free (privkey); @@ -162,7 +162,7 @@ void name_lookup_proc (void *cls, failed = GNUNET_YES; } - if (RECORDS+1 != rd_count) + if (RECORDS != rd_count) { GNUNET_break (0); failed = GNUNET_YES; @@ -176,48 +176,17 @@ void name_lookup_proc (void *cls, GNUNET_break (0 == memcmp (rd[c].data, s_rd[c].data, TEST_RECORD_DATALEN)); } - if (rd[c].record_type != TEST_CREATE_RECORD_TYPE) - { - GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "record_type %u %u\n", rd[c].record_type , TEST_CREATE_RECORD_TYPE); - GNUNET_break (0); - failed = GNUNET_YES; - } - if (rd[c].data_size != TEST_CREATE_RECORD_DATALEN) - { - GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "data_size %u %u\n", rd[c].data_size , TEST_CREATE_RECORD_DATALEN); - GNUNET_break (0); - failed = GNUNET_YES; - } - else - { - char *dummy[TEST_CREATE_RECORD_DATALEN]; - memset (&dummy, TEST_CREATE_RECORD_DATA, TEST_CREATE_RECORD_DATALEN); - if (0 != memcmp (&dummy, s_create_rd->data, TEST_CREATE_RECORD_DATALEN)) - { - GNUNET_break (0); - failed = GNUNET_YES; - } - } - if (GNUNET_OK != GNUNET_NAMESTORE_verify_signature(&pubkey, n, rd_count, rd, signature)) { GNUNET_break (0); failed = GNUNET_YES; } - struct GNUNET_NAMESTORE_RecordData rd_new[RECORDS +1]; - int c2; - for (c2 = 0; c2 < RECORDS; c2++) - rd_new[c2] = s_rd[c2]; - rd_new[c2] = *s_create_rd; - s_signature_updated = GNUNET_NAMESTORE_create_signature(privkey, n, rd_new, RECORDS +1); - - if (0 != memcmp (s_signature_updated, signature, sizeof (struct GNUNET_CRYPTO_RsaSignature))) + if (0 != memcmp (s_signature, signature, sizeof (struct GNUNET_CRYPTO_RsaSignature))) { GNUNET_break (0); failed = GNUNET_YES; } - GNUNET_free (s_signature_updated); found = GNUNET_YES; if (failed == GNUNET_NO) @@ -245,7 +214,6 @@ create_cont (void *cls, int32_t success, const char *emsg) if (success == GNUNET_OK) { res = 0; - GNUNET_NAMESTORE_lookup_record (nsh, &s_zone, name, 0, &name_lookup_proc, name); } else @@ -290,7 +258,7 @@ create_record (int count) struct GNUNET_NAMESTORE_RecordData * rd; rd = GNUNET_malloc (count * sizeof (struct GNUNET_NAMESTORE_RecordData)); - for (c = 0; c < RECORDS; c++) + for (c = 0; c < count; c++) { rd[c].expiration = GNUNET_TIME_absolute_get(); rd[c].record_type = TEST_RECORD_TYPE; @@ -302,10 +270,30 @@ create_record (int count) return rd; } +void +delete_existing_db (const struct GNUNET_CONFIGURATION_Handle *cfg) +{ + char *afsdir; + + if (GNUNET_OK == + GNUNET_CONFIGURATION_get_value_filename (cfg, "namestore-sqlite", + "FILENAME", &afsdir)) + { + if (GNUNET_OK == GNUNET_DISK_file_test (afsdir)) + if (GNUNET_OK == GNUNET_DISK_file_test (afsdir)) + if (GNUNET_OK == GNUNET_DISK_directory_remove(afsdir)) + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Deleted existing database `%s' \n", afsdir); + GNUNET_free (afsdir); + } + +} + static void run (void *cls, char *const *args, const char *cfgfile, const struct GNUNET_CONFIGURATION_Handle *cfg) { + delete_existing_db(cfg); + endbadly_task = GNUNET_SCHEDULER_add_delayed(TIMEOUT,endbadly, NULL); size_t rd_ser_len; @@ -317,37 +305,30 @@ run (void *cls, char *const *args, const char *cfgfile, /* create record */ s_name = "dummy.dummy.gnunet"; - s_rd = create_record (RECORDS); + s_rd = create_record (1); - rd_ser_len = GNUNET_NAMESTORE_records_get_size(RECORDS, s_rd); + rd_ser_len = GNUNET_NAMESTORE_records_get_size(1, s_rd); char rd_ser[rd_ser_len]; - GNUNET_NAMESTORE_records_serialize(RECORDS, s_rd, rd_ser_len, rd_ser); + GNUNET_NAMESTORE_records_serialize(1, s_rd, rd_ser_len, rd_ser); - s_signature = GNUNET_NAMESTORE_create_signature(privkey, s_name, s_rd, RECORDS); + s_signature = GNUNET_NAMESTORE_create_signature(privkey, s_name, s_rd, 1); /* create random zone hash */ GNUNET_CRYPTO_hash (&pubkey, sizeof (struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded), &s_zone); GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Name: `%s' Zone: `%s' \n", s_name, GNUNET_h2s_full(&s_zone)); - start_arm (cfgfile); GNUNET_assert (arm != NULL); nsh = GNUNET_NAMESTORE_connect (cfg); GNUNET_break (NULL != nsh); - - GNUNET_break (s_rd != NULL); GNUNET_break (s_name != NULL); - GNUNET_NAMESTORE_record_put (nsh, &pubkey, s_name, - GNUNET_TIME_absolute_get_forever(), - RECORDS, s_rd, s_signature, put_cont, s_name); - - - + /* create initial record */ + GNUNET_NAMESTORE_record_create (nsh, privkey, s_name, s_rd, &create_cont, s_name); } static int -- 2.25.1