aboutsummaryrefslogtreecommitdiff
path: root/src/service/namestore/gnunet-service-namestore.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/service/namestore/gnunet-service-namestore.c')
-rw-r--r--src/service/namestore/gnunet-service-namestore.c123
1 files changed, 120 insertions, 3 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,