diff options
Diffstat (limited to 'src/service/namestore/gnunet-service-namestore.c')
-rw-r--r-- | src/service/namestore/gnunet-service-namestore.c | 123 |
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 | */ |
1293 | static void | 1293 | static void |
1294 | handle_edit_record_set (void *cls, const struct EditRecordSetMessage *er_msg) | 1294 | handle_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 | */ | ||
1390 | static int | ||
1391 | check_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 | */ | ||
1423 | static void | ||
1424 | handle_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, |