aboutsummaryrefslogtreecommitdiff
path: root/src/service
diff options
context:
space:
mode:
Diffstat (limited to 'src/service')
-rw-r--r--src/service/namestore/gnunet-service-namestore.c123
-rw-r--r--src/service/namestore/namestore_api.c9
-rw-r--r--src/service/namestore/test_namestore_api_edit_records.c22
3 files changed, 142 insertions, 12 deletions
diff --git a/src/service/namestore/gnunet-service-namestore.c b/src/service/namestore/gnunet-service-namestore.c
index 230583936..f375828dc 100644
--- a/src/service/namestore/gnunet-service-namestore.c
+++ b/src/service/namestore/gnunet-service-namestore.c
@@ -1275,7 +1275,7 @@ check_edit_record_set (void *cls, const struct EditRecordSetMessage *er_msg)
1275 key_len = ntohs (er_msg->key_len); 1275 key_len = ntohs (er_msg->key_len);
1276 src_size = ntohs (er_msg->gns_header.header.size); 1276 src_size = ntohs (er_msg->gns_header.header.size);
1277 if (name_len + editor_hint_len + key_len != src_size - sizeof(struct 1277 if (name_len + editor_hint_len + key_len != src_size - sizeof(struct
1278 LabelLookupMessage)) 1278 EditRecordSetMessage))
1279 { 1279 {
1280 GNUNET_break (0); 1280 GNUNET_break (0);
1281 return GNUNET_SYSERR; 1281 return GNUNET_SYSERR;
@@ -1285,10 +1285,10 @@ check_edit_record_set (void *cls, const struct EditRecordSetMessage *er_msg)
1285 1285
1286 1286
1287/** 1287/**
1288 * Handles a #GNUNET_MESSAGE_TYPE_NAMESTORE_RECORD_LOOKUP message 1288 * Handles a #GNUNET_MESSAGE_TYPE_NAMESTORE_RECORD_SET_EDIT message
1289 * 1289 *
1290 * @param cls client sending the message 1290 * @param cls client sending the message
1291 * @param ll_msg message of type `struct LabelLookupMessage` 1291 * @param ll_msg message of type `struct EditRecordSetMessage`
1292 */ 1292 */
1293static void 1293static void
1294handle_edit_record_set (void *cls, const struct EditRecordSetMessage *er_msg) 1294handle_edit_record_set (void *cls, const struct EditRecordSetMessage *er_msg)
@@ -1381,6 +1381,119 @@ handle_edit_record_set (void *cls, const struct EditRecordSetMessage *er_msg)
1381 1381
1382 1382
1383/** 1383/**
1384 * Handles a #GNUNET_MESSAGE_TYPE_NAMESTORE_RECORD_SET_EDIT_CANCEL message
1385 *
1386 * @param cls client sending the message
1387 * @param er_msg message of type `struct EditRecordSetMessage`
1388 * @return #GNUNET_OK if @a er_msg is well-formed
1389 */
1390static int
1391check_edit_record_set_cancel (void *cls, const struct
1392 EditRecordSetCancelMessage *er_msg)
1393{
1394 uint16_t name_len;
1395 uint16_t editor_hint_len;
1396 uint16_t editor_hint_repl_len;
1397 size_t src_size;
1398 size_t key_len;
1399
1400 (void) cls;
1401 name_len = ntohs (er_msg->label_len);
1402 editor_hint_len = ntohs (er_msg->editor_hint_len);
1403 editor_hint_repl_len = ntohs (er_msg->editor_hint_len);
1404 key_len = ntohs (er_msg->key_len);
1405 src_size = ntohs (er_msg->gns_header.header.size);
1406 if (name_len + editor_hint_len + editor_hint_repl_len + key_len != src_size
1407 - sizeof(struct
1408 EditRecordSetCancelMessage))
1409 {
1410 GNUNET_break (0);
1411 return GNUNET_SYSERR;
1412 }
1413 return GNUNET_OK;
1414}
1415
1416
1417/**
1418 * Handles a #GNUNET_MESSAGE_TYPE_NAMESTORE_RECORD_SET_EDIT_CANCEL message
1419 *
1420 * @param cls client sending the message
1421 * @param ll_msg message of type `struct EditRecordSetCancelMessage`
1422 */
1423static void
1424handle_edit_record_set_cancel (void *cls, const struct
1425 EditRecordSetCancelMessage *er_msg)
1426{
1427 struct GNUNET_CRYPTO_PrivateKey zone;
1428 struct NamestoreClient *nc = cls;
1429 struct GNUNET_MQ_Envelope *env;
1430 struct NamestoreResponseMessage *rer_msg;
1431 const char *name_tmp;
1432 const char *editor_hint;
1433 const char *editor_hint_repl;
1434 char *conv_name;
1435 uint16_t name_len;
1436 uint16_t editor_hint_len;
1437 int res;
1438 size_t key_len;
1439 size_t kb_read;
1440
1441 key_len = ntohs (er_msg->key_len);
1442 name_len = ntohs (er_msg->label_len);
1443 editor_hint_len = ntohs (er_msg->editor_hint_len);
1444 if ((GNUNET_SYSERR ==
1445 GNUNET_CRYPTO_read_private_key_from_buffer (&er_msg[1],
1446 key_len,
1447 &zone,
1448 &kb_read)) ||
1449 (kb_read != key_len))
1450 {
1451 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
1452 "Error reading private key\n");
1453 GNUNET_SERVICE_client_drop (nc->client);
1454 return;
1455 }
1456 name_tmp = (const char *) &er_msg[1] + key_len;
1457 editor_hint = (const char *) name_tmp + name_len;
1458 editor_hint_repl = (const char *) name_tmp + name_len + editor_hint_len;
1459 GNUNET_SERVICE_client_continue (nc->client);
1460 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
1461 "Received NAMESTORE_RECORD_SET_EDIT message for name `%s'\n",
1462 name_tmp);
1463
1464 conv_name = GNUNET_GNSRECORD_string_normalize (name_tmp);
1465 if (NULL == conv_name)
1466 {
1467 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
1468 "Error converting name `%s'\n",
1469 name_tmp);
1470 GNUNET_SERVICE_client_drop (nc->client);
1471 return;
1472 }
1473 name_len = strlen (conv_name) + 1;
1474 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
1475 "Clearing editor hint\n");
1476 res = nc->GSN_database->clear_editor_hint (nc->GSN_database->cls,
1477 editor_hint,
1478 editor_hint_repl,
1479 &zone,
1480 conv_name);
1481 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
1482 "Clearing editor hint %s\n", (GNUNET_SYSERR == res) ? "failed." :
1483 "successful.");
1484
1485 env =
1486 GNUNET_MQ_msg (rer_msg,
1487 GNUNET_MESSAGE_TYPE_NAMESTORE_GENERIC_RESPONSE);
1488 rer_msg->gns_header.r_id = er_msg->gns_header.r_id;
1489 rer_msg->ec = htons ((GNUNET_OK == res) ? GNUNET_EC_NONE :
1490 GNUNET_EC_NAMESTORE_BACKEND_FAILED);
1491 GNUNET_MQ_send (nc->mq, env);
1492 GNUNET_free (conv_name);
1493}
1494
1495
1496/**
1384 * Handles a #GNUNET_MESSAGE_TYPE_NAMESTORE_RECORD_LOOKUP message 1497 * Handles a #GNUNET_MESSAGE_TYPE_NAMESTORE_RECORD_LOOKUP message
1385 * 1498 *
1386 * @param cls client sending the message 1499 * @param cls client sending the message
@@ -2674,6 +2787,10 @@ GNUNET_SERVICE_MAIN (
2674 GNUNET_MESSAGE_TYPE_NAMESTORE_RECORD_SET_EDIT, 2787 GNUNET_MESSAGE_TYPE_NAMESTORE_RECORD_SET_EDIT,
2675 struct EditRecordSetMessage, 2788 struct EditRecordSetMessage,
2676 NULL), 2789 NULL),
2790 GNUNET_MQ_hd_var_size (edit_record_set_cancel,
2791 GNUNET_MESSAGE_TYPE_NAMESTORE_RECORD_SET_EDIT_CANCEL,
2792 struct EditRecordSetCancelMessage,
2793 NULL),
2677 GNUNET_MQ_hd_var_size (record_lookup, 2794 GNUNET_MQ_hd_var_size (record_lookup,
2678 GNUNET_MESSAGE_TYPE_NAMESTORE_RECORD_LOOKUP, 2795 GNUNET_MESSAGE_TYPE_NAMESTORE_RECORD_LOOKUP,
2679 struct LabelLookupMessage, 2796 struct LabelLookupMessage,
diff --git a/src/service/namestore/namestore_api.c b/src/service/namestore/namestore_api.c
index 435c1622d..45a15c39a 100644
--- a/src/service/namestore/namestore_api.c
+++ b/src/service/namestore/namestore_api.c
@@ -375,8 +375,8 @@ handle_generic_response (void *cls,
375 qe = find_qe (h, ntohl (msg->gns_header.r_id)); 375 qe = find_qe (h, ntohl (msg->gns_header.r_id));
376 res = ntohl (msg->ec); 376 res = ntohl (msg->ec);
377 LOG (GNUNET_ERROR_TYPE_DEBUG, 377 LOG (GNUNET_ERROR_TYPE_DEBUG,
378 "Received RECORD_STORE_RESPONSE with result %d\n", 378 "Received GENERIC_RESPONSE with result %s\n",
379 res); 379 GNUNET_ErrorCode_get_hint(res));
380 if (NULL == qe) 380 if (NULL == qe)
381 return; 381 return;
382 if (NULL != qe->cont) 382 if (NULL != qe->cont)
@@ -1617,8 +1617,7 @@ GNUNET_NAMESTORE_record_set_edit_cancel (struct GNUNET_NAMESTORE_Handle *h,
1617 const char *label, 1617 const char *label,
1618 const char *editor_hint, 1618 const char *editor_hint,
1619 const char *editor_hint_replacement, 1619 const char *editor_hint_replacement,
1620 GNUNET_SCHEDULER_TaskCallback 1620 GNUNET_NAMESTORE_ContinuationWithStatus finished_cb,
1621 finished_cb,
1622 void *finished_cls) 1621 void *finished_cls)
1623{ 1622{
1624 struct GNUNET_NAMESTORE_QueueEntry *qe; 1623 struct GNUNET_NAMESTORE_QueueEntry *qe;
@@ -1641,6 +1640,8 @@ GNUNET_NAMESTORE_record_set_edit_cancel (struct GNUNET_NAMESTORE_Handle *h,
1641 qe = GNUNET_new (struct GNUNET_NAMESTORE_QueueEntry); 1640 qe = GNUNET_new (struct GNUNET_NAMESTORE_QueueEntry);
1642 qe->h = h; 1641 qe->h = h;
1643 qe->op_id = get_op_id (h); 1642 qe->op_id = get_op_id (h);
1643 qe->cont = finished_cb;
1644 qe->cont_cls = finished_cls;
1644 GNUNET_CONTAINER_DLL_insert_tail (h->op_head, h->op_tail, qe); 1645 GNUNET_CONTAINER_DLL_insert_tail (h->op_head, h->op_tail, qe);
1645 1646
1646 key_len = GNUNET_CRYPTO_private_key_get_length (pkey); 1647 key_len = GNUNET_CRYPTO_private_key_get_length (pkey);
diff --git a/src/service/namestore/test_namestore_api_edit_records.c b/src/service/namestore/test_namestore_api_edit_records.c
index 9dce13e33..02e821377 100644
--- a/src/service/namestore/test_namestore_api_edit_records.c
+++ b/src/service/namestore/test_namestore_api_edit_records.c
@@ -21,7 +21,9 @@
21 * @file namestore/test_namestore_api_edit_records.c 21 * @file namestore/test_namestore_api_edit_records.c
22 * @brief testcase for namestore_api.c: Multiple clients work with record set. 22 * @brief testcase for namestore_api.c: Multiple clients work with record set.
23 */ 23 */
24#include "gnunet_error_codes.h"
24#include "gnunet_namestore_service.h" 25#include "gnunet_namestore_service.h"
26#include "gnunet_scheduler_lib.h"
25#include "gnunet_testing_lib.h" 27#include "gnunet_testing_lib.h"
26 28
27#define TEST_RECORD_TYPE GNUNET_DNSPARSER_TYPE_TXT 29#define TEST_RECORD_TYPE GNUNET_DNSPARSER_TYPE_TXT
@@ -91,6 +93,15 @@ end (void *cls)
91 GNUNET_SCHEDULER_cancel (endbadly_task); 93 GNUNET_SCHEDULER_cancel (endbadly_task);
92 cleanup (); 94 cleanup ();
93 res = 0; 95 res = 0;
96 GNUNET_SCHEDULER_shutdown ();
97}
98
99
100static void
101cancel_done (void *cls, enum GNUNET_ErrorCode ec)
102{
103 GNUNET_assert (GNUNET_EC_NONE == ec);
104 GNUNET_SCHEDULER_add_now (&end, NULL);
94} 105}
95 106
96 107
@@ -102,11 +113,12 @@ begin_cont_b (void *cls,
102 GNUNET_GNSRECORD_Data *rd, 113 GNUNET_GNSRECORD_Data *rd,
103 const char *editor_hint) 114 const char *editor_hint)
104{ 115{
105 const char *name = cls; 116 char *name = cls;
106 117
107 GNUNET_assert (GNUNET_EC_NONE == ec); 118 GNUNET_assert (GNUNET_EC_NONE == ec);
108 GNUNET_assert (0 != strcmp (editor_hint, "B")); 119 GNUNET_assert (0 != strcmp (editor_hint, "B"));
109 GNUNET_SCHEDULER_add_now (&end, NULL); 120 nsqe = GNUNET_NAMESTORE_record_set_edit_cancel (nsh2, &privkey, name, "A",
121 "B", &cancel_done, name);
110} 122}
111 123
112 124
@@ -118,7 +130,7 @@ begin_cont (void *cls,
118 GNUNET_GNSRECORD_Data *rd, 130 GNUNET_GNSRECORD_Data *rd,
119 const char *editor_hint) 131 const char *editor_hint)
120{ 132{
121 const char *name = cls; 133 char *name = cls;
122 134
123 GNUNET_assert (GNUNET_EC_NONE == ec); 135 GNUNET_assert (GNUNET_EC_NONE == ec);
124 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, 136 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
@@ -135,7 +147,7 @@ static void
135preload_cont (void *cls, 147preload_cont (void *cls,
136 enum GNUNET_ErrorCode ec) 148 enum GNUNET_ErrorCode ec)
137{ 149{
138 const char *name = cls; 150 char *name = cls;
139 151
140 GNUNET_assert (NULL != cls); 152 GNUNET_assert (NULL != cls);
141 nsqe = NULL; 153 nsqe = NULL;
@@ -168,7 +180,7 @@ run (void *cls,
168 struct GNUNET_TESTING_Peer *peer) 180 struct GNUNET_TESTING_Peer *peer)
169{ 181{
170 struct GNUNET_GNSRECORD_Data rd; 182 struct GNUNET_GNSRECORD_Data rd;
171 const char *name = "dummy"; 183 char *name = "dummy";
172 184
173 endbadly_task = GNUNET_SCHEDULER_add_delayed (TIMEOUT, 185 endbadly_task = GNUNET_SCHEDULER_add_delayed (TIMEOUT,
174 &endbadly, 186 &endbadly,