GNUnet 0.22.2
gnunet-namestore.c
Go to the documentation of this file.
1/*
2 This file is part of GNUnet.
3 Copyright (C) 2012, 2013, 2014, 2019 GNUnet e.V.
4
5 GNUnet is free software: you can redistribute it and/or modify it
6 under the terms of the GNU Affero General Public License as published
7 by the Free Software Foundation, either version 3 of the License,
8 or (at your option) any later version.
9
10 GNUnet is distributed in the hope that it will be useful, but
11 WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Affero General Public License for more details.
14
15 You should have received a copy of the GNU Affero General Public License
16 along with this program. If not, see <http://www.gnu.org/licenses/>.
17
18 SPDX-License-Identifier: AGPL3.0-or-later
19 */
28#include "platform.h"
29#include "gnunet_common.h"
30#include <gnunet_util_lib.h>
33#include <gnunet_gns_service.h>
35#include <inttypes.h>
36
41#define WARN_RELATIVE_EXPIRATION_LIMIT GNUNET_TIME_relative_multiply ( \
42 GNUNET_TIME_UNIT_MINUTES, 15)
43
48{
53
58};
59
64{
69
74
78 char *name;
79
84};
85
90{
94 struct EgoEntry *next;
95
99 struct EgoEntry *prev;
100
105
110};
111
116
121
126
130static char *ego_name;
131
136
141
146
151
156
161
166
170static struct EgoEntry *ego_head;
171
175static struct EgoEntry *ego_tail;
176
181
186
190static int list;
191
195static int add;
196
200static int del;
201
205static int is_public;
206
210static int is_shadow;
211
215static int is_maintenance;
216
220static int omit_private;
221
226
227
231static int purge_zone;
232
237
241static int purge_orphaned;
242
246static int list_orphaned;
247
252
257
262
266static char *name;
267
271static char *value;
272
276static char *uri;
277
281static char *reverse_pkey;
282
286static char *typestring;
287
291static char *expirationstring;
292
296static char *nickstring;
297
301static int ret;
302
306static uint32_t type;
307
311static void *data;
312
316static size_t data_size;
317
321static uint64_t etime;
322
327
332
336static int monitor;
337
342
347
348/* FIXME: Make array and grow as needed */
349#define INITIAL_RI_BUFFER_SIZE 5000
350
351static unsigned int ri_count = 0;
352
354
356static unsigned int record_info_capacity = 0;
357
358/* How many records to put simulatneously */
359static unsigned int max_batch_size = 1000;
360
369static int
370parse_expiration (const char *exp_str,
371 int *is_rel,
372 uint64_t *exptime)
373{
374 struct GNUNET_TIME_Relative etime_rel;
375 struct GNUNET_TIME_Absolute etime_abs;
376
377 if (0 == strcmp (exp_str, "never"))
378 {
379 *exptime = GNUNET_TIME_UNIT_FOREVER_ABS.abs_value_us;
380 *is_rel = GNUNET_NO;
381 return GNUNET_OK;
382 }
383 if (GNUNET_OK ==
384 GNUNET_STRINGS_fancy_time_to_relative (exp_str, &etime_rel))
385 {
386 *is_rel = GNUNET_YES;
387 *exptime = etime_rel.rel_value_us;
389 {
391 "Relative expiration times of less than %s are not recommended. To improve availability, consider increasing this value.\n",
394 }
396 "Storing record with relative expiration time of %s\n",
398 return GNUNET_OK;
399 }
400 if (GNUNET_OK ==
401 GNUNET_STRINGS_fancy_time_to_absolute (exp_str, &etime_abs))
402 {
403 *is_rel = GNUNET_NO;
404 *exptime = etime_abs.abs_value_us;
406 "Storing record with absolute expiration time of %s\n",
408 return GNUNET_OK;
409 }
410 return GNUNET_SYSERR;
411}
412
413
414static int
416{
417 struct RecordSetEntry *r;
419 char *cp;
420 char *tok;
421 char *saveptr;
422 void *raw_data;
423
424 cp = GNUNET_strdup (line);
425 tok = strtok_r (cp, " ", &saveptr);
426 if (NULL == tok)
427 {
429 _ ("Missing entries in record line `%s'.\n"),
430 line);
431 GNUNET_free (cp);
432 return GNUNET_SYSERR;
433 }
435 if (UINT32_MAX == record.record_type)
436 {
437 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, _ ("Unknown record type `%s'\n"), tok);
438 GNUNET_free (cp);
439 return GNUNET_SYSERR;
440 }
441 tok = strtok_r (NULL, " ", &saveptr);
442 if (NULL == tok)
443 {
445 _ ("Empty record line argument is not allowed.\n"));
446 GNUNET_free (cp);
447 return GNUNET_SYSERR;
448 }
449 if (1 != sscanf (tok, "%" SCNu64, &record.expiration_time))
450 {
451 fprintf (stderr,
452 _ ("Error parsing expiration time %s.\n"), tok);
453 GNUNET_free (cp);
454 return GNUNET_SYSERR;
455 }
456 tok = strtok_r (NULL, " ", &saveptr);
457 if (NULL == tok)
458 {
460 _ ("Empty record line argument is not allowed.\n"));
461 GNUNET_free (cp);
462 return GNUNET_SYSERR;
463 }
465 if (NULL != strchr (tok, (unsigned char) 'r'))
467 if (NULL == strchr (tok, (unsigned char) 'p')) /* p = public */
469 if (NULL != strchr (tok, (unsigned char) 'S'))
471 if (NULL != strchr (tok, (unsigned char) 's'))
473 if (NULL != strchr (tok, (unsigned char) 'C'))
475 tok += strlen (tok) + 1;
477 tok,
478 &raw_data,
479 &record.data_size))
480 {
482 _ ("Invalid record data for type %s: `%s'.\n"),
484 tok);
485 GNUNET_free (cp);
486 return GNUNET_SYSERR;
487 }
488 GNUNET_free (cp);
489
490 r = GNUNET_malloc (sizeof(struct RecordSetEntry) + record.data_size);
491 r->next = recordset;
492 record.data = &r[1];
493 memcpy (&r[1], raw_data, record.data_size);
494 GNUNET_free (raw_data);
495 r->record = record;
496 recordset = r;
497 return GNUNET_OK;
498}
499
500
501static void
503{
504 struct RecordSetEntry *rs_entry;
505
506 while (NULL != (rs_entry = recordset))
507 {
509 GNUNET_free (rs_entry);
510 }
511 recordset = NULL;
512}
513
514
515static void
517{
518 struct MarkedRecord *mrec;
519 struct MarkedRecord *mrec_tmp;
521 if (NULL != ego_name)
522 {
524 ego_name = NULL;
525 }
526 if (NULL != name)
527 {
529 name = NULL;
530 }
531 if (NULL != value)
532 {
534 value = NULL;
535 }
536 if (NULL != uri)
537 {
539 uri = NULL;
540 }
541 if (NULL != expirationstring)
542 {
544 expirationstring = NULL;
545 }
546 if (NULL != purge_task)
547 {
549 purge_task = NULL;
550 }
551 for (mrec = marked_head; NULL != mrec;)
552 {
553 mrec_tmp = mrec;
554 mrec = mrec->next;
555 GNUNET_free (mrec_tmp->name);
556 GNUNET_free (mrec_tmp);
557 }
558 if (NULL != list_it)
559 {
561 list_it = NULL;
562 }
563 if (NULL != add_qe)
564 {
566 add_qe = NULL;
567 }
568 if (NULL != set_qe)
569 {
571 set_qe = NULL;
572 }
573 if (NULL != add_qe_uri)
574 {
576 add_qe_uri = NULL;
577 }
578 if (NULL != get_qe)
579 {
581 get_qe = NULL;
582 }
583 if (NULL != del_qe)
584 {
586 del_qe = NULL;
587 }
588 if (NULL != reverse_qe)
589 {
591 reverse_qe = NULL;
592 }
593 memset (&zone_pkey, 0, sizeof(zone_pkey));
594 if (NULL != zm)
595 {
597 zm = NULL;
598 }
599 if (NULL != data)
600 {
602 data = NULL;
603 }
604 if (NULL != typestring)
605 {
607 typestring = NULL;
608 }
609 list = 0;
610 is_public = 0;
611 is_shadow = 0;
612 is_maintenance = 0;
613 purge_zone = 0;
614}
615
616
622static void
623do_shutdown (void *cls)
624{
625 struct EgoEntry *ego_entry;
626 struct EgoEntry *ego_tmp;
627 (void) cls;
628
629 reset_handles ();
630 if (NULL != record_info)
632 record_info = NULL;
633 if (NULL != ns_qe)
634 {
636 ns_qe = NULL;
637 }
638 if (NULL != ns)
639 {
641 ns = NULL;
642 }
643 if (NULL != idh)
644 {
646 idh = NULL;
647 }
648 for (ego_entry = ego_head; NULL != ego_entry;)
649 {
650 ego_tmp = ego_entry;
651 ego_entry = ego_entry->next;
652 GNUNET_free (ego_tmp->identifier);
653 GNUNET_free (ego_tmp);
654 }
655}
656
657
658static void
660
661static unsigned int ri_sent = 0;
662
669static void
671
672static void
674{
675 // if (ri_sent < ri_count)
676 // {
677 // batch_insert_recordinfo (cfg);
678 // return;
679 // }
680 // reset_handles ();
681 if (read_from_stdin)
682 {
684 return;
685 }
687}
688
689
690static void
692{
693 struct GNUNET_NAMESTORE_QueueEntry **qe = cls;
694
695 *qe = NULL;
696 if (GNUNET_EC_NONE != ec)
697 {
698 fprintf (stderr,
699 _ ("Adding record failed: %s\n"),
702 ret = 1;
704 return;
705 }
706 ret = 0;
708}
709
710
711static void
713{
714 (void) cls;
715 del_qe = NULL;
717 {
718 fprintf (stderr,
719 _ ("Deleting record failed: %s\n"), GNUNET_ErrorCode_get_hint (
720 ec));
721 }
723}
724
725
726static void
727purge_next_record (void *cls);
728
729static void
731{
732 del_qe = NULL;
733 if (GNUNET_EC_NONE != ec)
734 {
735 fprintf (stderr,
736 _ ("Deleting record failed: %s\n"),
738 }
740}
741
742
743static void
745{
746 struct MarkedRecord *mrec;
747 purge_task = NULL;
748
749 if (NULL == marked_head)
750 {
751 ret = 0;
753 return;
754 }
755 mrec = marked_head;
758 mrec);
760 &mrec->key,
761 mrec->name,
762 0, NULL,
764 NULL);
765 GNUNET_free (mrec->name);
766 GNUNET_free (mrec);
767}
768
769
773static void
775{
776 (void) cls;
777 list_it = NULL;
779 {
781 return;
782 }
783 ret = 0;
785}
786
787
791static void
793{
794 (void) cls;
795 list_it = NULL;
796 fprintf (stderr, "Error iterating over zone\n");
797 ret = 1;
799}
800
801
802static void
804 GNUNET_CRYPTO_PrivateKey *zone_key,
805 const char *rname,
806 unsigned int rd_len,
807 const struct GNUNET_GNSRECORD_Data *rd)
808{
809 struct MarkedRecord *mrec;
810
811 mrec = GNUNET_new (struct MarkedRecord);
812 mrec->key = *zone_key;
813 mrec->name = GNUNET_strdup (rname);
816 mrec);
817}
818
819
820static void
822 const char *rname,
823 unsigned int rd_len,
824 const struct GNUNET_GNSRECORD_Data *rd)
825{
826 struct EgoEntry *ego;
827 struct MarkedRecord *orphan;
828 int is_orphaned = 1;
829
830 for (ego = ego_head; NULL != ego; ego = ego->next)
831 {
832 if (0 == memcmp (GNUNET_IDENTITY_ego_get_private_key (ego->ego),
833 zone_key,
834 sizeof (*zone_key)))
835 {
836 is_orphaned = 0;
837 break;
838 }
839 }
840 if (is_orphaned)
841 {
842 orphan = GNUNET_new (struct MarkedRecord);
843 orphan->key = *zone_key;
844 orphan->name = GNUNET_strdup (rname);
847 orphan);
848 }
849}
850
851
859static void
861 const char *rname,
862 unsigned int rd_len,
863 const struct GNUNET_GNSRECORD_Data *rd)
864{
865 const char *typestr;
866 char *s;
867 const char *ets;
868 struct GNUNET_TIME_Absolute at;
869 struct GNUNET_TIME_Relative rt;
870 struct EgoEntry *ego;
871 int have_record;
872 int is_orphaned = 1;
873 char *orphaned_str;
874
875 if ((NULL != name) && (0 != strcmp (name, rname)))
876 return;
877 have_record = GNUNET_NO;
878 for (unsigned int i = 0; i < rd_len; i++)
879 {
880 if ((GNUNET_GNSRECORD_TYPE_NICK == rd[i].record_type) &&
881 (0 != strcmp (rname, GNUNET_GNS_EMPTY_LABEL_AT)))
882 continue;
883 if ((type != rd[i].record_type) && (GNUNET_GNSRECORD_TYPE_ANY != type))
884 continue;
885 have_record = GNUNET_YES;
886 break;
887 }
888 if (GNUNET_NO == have_record)
889 return;
890 for (ego = ego_head; NULL != ego; ego = ego->next)
891 {
892 if (0 == memcmp (GNUNET_IDENTITY_ego_get_private_key (ego->ego),
893 zone_key,
894 sizeof (*zone_key)))
895 {
896 is_orphaned = 0;
897 break;
898 }
899 }
900 if (list_orphaned && ! is_orphaned)
901 return;
902 if (! list_orphaned && is_orphaned)
903 return;
904 orphaned_str = GNUNET_CRYPTO_private_key_to_string (zone_key);
905 fprintf (stdout, "%s.%s:\n", rname, is_orphaned ? orphaned_str :
906 ego->identifier);
907 GNUNET_free (orphaned_str);
908 if (NULL != typestring)
910 else
912 for (unsigned int i = 0; i < rd_len; i++)
913 {
914 if ((GNUNET_GNSRECORD_TYPE_NICK == rd[i].record_type) &&
915 (0 != strcmp (rname, GNUNET_GNS_EMPTY_LABEL_AT)))
916 continue;
917 if ((type != rd[i].record_type) && (GNUNET_GNSRECORD_TYPE_ANY != type))
918 continue;
919 typestr = GNUNET_GNSRECORD_number_to_typename (rd[i].record_type);
920 s = GNUNET_GNSRECORD_value_to_string (rd[i].record_type,
921 rd[i].data,
922 rd[i].data_size);
923 if (NULL == s)
924 {
925 fprintf (stdout,
926 _ ("\tCorrupt or unsupported record of type %u\n"),
927 (unsigned int) rd[i].record_type);
928 continue;
929 }
930 if (0 != (rd[i].flags & GNUNET_GNSRECORD_RF_RELATIVE_EXPIRATION))
931 {
934 }
935 else
936 {
939 }
940 {
941 char flgstr[16];
942 sprintf (flgstr, "[%s%s%s%s%s]",
943 (rd[i].flags & GNUNET_GNSRECORD_RF_PRIVATE) ? "" : "p",
944 (rd[i].flags & GNUNET_GNSRECORD_RF_SUPPLEMENTAL) ? "S" : "",
946 "",
947 (rd[i].flags & GNUNET_GNSRECORD_RF_SHADOW) ? "S" : "",
948 (rd[i].flags & GNUNET_GNSRECORD_RF_CRITICAL) ? "C" : "");
950 fprintf (stdout,
951 " %s %" PRIu64 " %s %s\n",
952 typestr,
953 rd[i].expiration_time,
954 flgstr,
955 s);
956 else
957 fprintf (stdout,
958 "\t%s: %s (%s)\t%s\t%s\t%s\n",
959 typestr,
960 s,
961 ets,
962 (0 != (rd[i].flags & GNUNET_GNSRECORD_RF_PRIVATE)) ? "PRIVATE"
963 : "PUBLIC",
964 (0 != (rd[i].flags & GNUNET_GNSRECORD_RF_SHADOW)) ? "SHADOW"
965 : "",
966 (0 != (rd[i].flags & GNUNET_GNSRECORD_RF_MAINTENANCE)) ?
967 "MAINTENANCE"
968 : "");
969 GNUNET_free (s);
970 }
971 }
972 // fprintf (stdout, "%s", "\n");
973}
974
975
976static void
978 const struct GNUNET_CRYPTO_PrivateKey *zone_key,
979 const char *rname,
980 unsigned int rd_len,
981 const struct GNUNET_GNSRECORD_Data *rd,
982 struct GNUNET_TIME_Absolute expiry)
983{
984 (void) cls;
985 (void) zone_key;
986 (void) expiry;
987 collect_zone_records_to_purge (zone_key, rname, rd_len, rd);
989}
990
991
992static void
994 const struct GNUNET_CRYPTO_PrivateKey *zone_key,
995 const char *rname,
996 unsigned int rd_len,
997 const struct GNUNET_GNSRECORD_Data *rd,
998 struct GNUNET_TIME_Absolute expiry)
999{
1000 (void) cls;
1001 (void) zone_key;
1002 (void) expiry;
1003 collect_orphans (zone_key, rname, rd_len, rd);
1005}
1006
1007
1017static void
1019 const struct GNUNET_CRYPTO_PrivateKey *zone_key,
1020 const char *rname,
1021 unsigned int rd_len,
1022 const struct GNUNET_GNSRECORD_Data *rd,
1023 struct GNUNET_TIME_Absolute expiry)
1024{
1025 (void) cls;
1026 (void) zone_key;
1027 (void) expiry;
1028 display_record (zone_key, rname, rd_len, rd);
1030}
1031
1032
1042static void
1044 const struct GNUNET_CRYPTO_PrivateKey *zone_key,
1045 const char *rname,
1046 unsigned int rd_len,
1047 const struct GNUNET_GNSRECORD_Data *rd,
1048 struct GNUNET_TIME_Absolute expiry)
1049{
1050 (void) cls;
1051 (void) zone_key;
1052 (void) expiry;
1053 display_record (zone_key, rname, rd_len, rd);
1055}
1056
1057
1067static void
1069 const struct GNUNET_CRYPTO_PrivateKey *zone_key,
1070 const char *rname,
1071 unsigned int rd_len,
1072 const struct GNUNET_GNSRECORD_Data *rd)
1073{
1074 (void) cls;
1075 (void) zone_key;
1076 get_qe = NULL;
1077 display_record (zone_key, rname, rd_len, rd);
1078 finish_command ();
1079}
1080
1081
1087static void
1088sync_cb (void *cls)
1089{
1090 (void) cls;
1091 fprintf (stdout, "%s", "Monitor is now in sync.\n");
1092}
1093
1094
1100static void
1102{
1103 (void) cls;
1104 fprintf (stderr, "%s", "Monitor disconnected and out of sync.\n");
1105}
1106
1107
1113static void
1115{
1116 (void) cls;
1117 get_qe = NULL;
1118 fprintf (stderr, "%s", "Failed to lookup record.\n");
1119 finish_command ();
1120}
1121
1122
1126static void
1127add_error_cb (void *cls)
1128{
1129 (void) cls;
1130 add_qe = NULL;
1131 GNUNET_break (0);
1132 ret = 1;
1133 finish_command ();
1134}
1135
1136
1147static void
1149 const struct GNUNET_CRYPTO_PrivateKey *zone_key,
1150 const char *rec_name,
1151 unsigned int rd_count,
1152 const struct GNUNET_GNSRECORD_Data *rd)
1153{
1154 struct GNUNET_GNSRECORD_Data rdn[rd_count + 1];
1155 struct GNUNET_GNSRECORD_Data *rde;
1156
1157 (void) cls;
1158 (void) zone_key;
1159 add_qe = NULL;
1160 if (0 != strcmp (rec_name, name))
1161 {
1162 GNUNET_break (0);
1163 ret = 1;
1164 finish_command ();
1165 return;
1166 }
1167
1169 "Received %u records for name `%s'\n",
1170 rd_count,
1171 rec_name);
1172 for (unsigned int i = 0; i < rd_count; i++)
1173 {
1174 switch (rd[i].record_type)
1175 {
1178 {
1179 fprintf (
1180 stderr,
1181 _ (
1182 "A SOA record exists already under `%s', cannot add a second SOA to the same zone.\n"),
1183 rec_name);
1184 ret = 1;
1185 finish_command ();
1186 return;
1187 }
1188 break;
1189 }
1190 }
1191 memset (rdn, 0, sizeof(struct GNUNET_GNSRECORD_Data));
1192 GNUNET_memcpy (&rdn[1], rd, rd_count * sizeof(struct GNUNET_GNSRECORD_Data));
1193 rde = &rdn[0];
1194 rde->data = data;
1195 rde->data_size = data_size;
1196 rde->record_type = type;
1197 if (1 == is_shadow)
1199 if (1 == is_maintenance)
1201 if (1 != is_public)
1203 rde->expiration_time = etime;
1204 if (GNUNET_YES == etime_is_rel)
1206 else if (GNUNET_NO != etime_is_rel)
1208 GNUNET_assert (NULL != name);
1210 &zone_pkey,
1211 name,
1212 rd_count + 1,
1213 rde,
1215 &add_qe);
1216}
1217
1218
1222static void
1224{
1225 (void) cls;
1226 reverse_qe = NULL;
1227 fprintf (stdout, "%s.zkey\n", reverse_pkey);
1228}
1229
1230
1241static void
1243 const struct GNUNET_CRYPTO_PrivateKey *zone,
1244 const char *label,
1245 unsigned int rd_count,
1246 const struct GNUNET_GNSRECORD_Data *rd)
1247{
1248 (void) cls;
1249 (void) zone;
1250 (void) rd_count;
1251 (void) rd;
1252 reverse_qe = NULL;
1253 if (NULL == label)
1254 fprintf (stdout, "%s\n", reverse_pkey);
1255 else
1256 fprintf (stdout, "%s.%s\n", label, ego_name);
1257 finish_command ();
1258}
1259
1260
1264static void
1266{
1267 (void) cls;
1268 del_qe = NULL;
1269 GNUNET_break (0);
1270 ret = 1;
1271 finish_command ();
1272}
1273
1274
1286static void
1287del_monitor (void *cls,
1288 const struct GNUNET_CRYPTO_PrivateKey *zone,
1289 const char *label,
1290 unsigned int rd_count,
1291 const struct GNUNET_GNSRECORD_Data *rd)
1292{
1293 struct GNUNET_GNSRECORD_Data rdx[rd_count];
1294 unsigned int rd_left;
1295 uint32_t del_type;
1296 char *vs;
1297
1298 (void) cls;
1299 (void) zone;
1300 del_qe = NULL;
1301 if (0 == rd_count)
1302 {
1303 fprintf (stderr,
1304 _ (
1305 "There are no records under label `%s' that could be deleted.\n")
1306 ,
1307 label);
1308 ret = 1;
1309 finish_command ();
1310 return;
1311 }
1312 if ((NULL == value) && (NULL == typestring))
1313 {
1314 /* delete everything */
1316 &zone_pkey,
1317 name,
1318 0,
1319 NULL,
1321 NULL);
1322 return;
1323 }
1324 rd_left = 0;
1325 if (NULL != typestring)
1327 else
1328 del_type = GNUNET_GNSRECORD_TYPE_ANY;
1329 for (unsigned int i = 0; i < rd_count; i++)
1330 {
1331 vs = NULL;
1332 if (! (((GNUNET_GNSRECORD_TYPE_ANY == del_type) ||
1333 (rd[i].record_type == del_type)) &&
1334 ((NULL == value) ||
1335 (NULL ==
1337 rd[i].data,
1338 rd[i].data_size)))) ||
1339 (0 == strcmp (vs, value)))))
1340 rdx[rd_left++] = rd[i];
1341 GNUNET_free (vs);
1342 }
1343 if (rd_count == rd_left)
1344 {
1345 /* nothing got deleted */
1346 fprintf (
1347 stderr,
1348 _ (
1349 "There are no records under label `%s' that match the request for deletion.\n"),
1350 label);
1351 finish_command ();
1352 return;
1353 }
1354 /* delete everything but what we copied to 'rdx' */
1356 &zone_pkey,
1357 name,
1358 rd_left,
1359 rdx,
1361 NULL);
1362}
1363
1364
1365static void
1367{
1368 finish_command ();
1369}
1370
1371
1372static void
1373replace_cont (void *cls, enum GNUNET_ErrorCode ec)
1374{
1375 (void) cls;
1376
1377 set_qe = NULL;
1378 if (GNUNET_EC_NONE != ec)
1379 {
1381 _ ("%s\n"),
1383 ret = 1; /* fail from 'main' */
1384 }
1386}
1387
1388
1395static void
1397{
1398 unsigned int sent_here;
1399
1400 GNUNET_assert (0 != ri_count);
1402 &zone_pkey,
1403 ri_count - ri_sent,
1405 &sent_here,
1406 &replace_cont,
1407 NULL);
1408 ri_sent += sent_here;
1409 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Sent %d/%d record infos\n", ri_sent,
1410 ri_count);
1411 if (ri_sent == ri_count)
1412 {
1413 for (int i = 0; i < ri_count; i++)
1414 {
1415 GNUNET_free (record_info[i].a_rd);
1416 record_info[i].a_rd = NULL;
1417 }
1418 ri_count = 0;
1419 ri_sent = 0;
1420 }
1421 return;
1422}
1423
1424
1431static void
1433{
1436
1437 if (omit_private)
1441 if (! (add | del | list | (NULL != nickstring) | (NULL != uri)
1442 | (NULL != reverse_pkey) | (NULL != recordset) | (monitor)
1444 {
1445 /* nothing more to be done */
1446 fprintf (stderr, _ ("No options given\n"));
1447 finish_command ();
1448 return;
1449 }
1450
1451 if (NULL != recordset)
1452 {
1453 /* replace entire record set */
1454 unsigned int rd_count;
1455 struct GNUNET_GNSRECORD_Data *rd_tmp;
1456
1457 /* FIXME: We could easily support append and delete with this as well */
1458 if (! add)
1459 {
1460 fprintf (stderr, _ ("Recordlines only work with option `%s'\n"),
1461 "-a");
1462 ret = 1;
1463 finish_command ();
1464 return;
1465 }
1466 if (NULL == name)
1467 {
1468 fprintf (stderr,
1469 _ ("Missing option `%s' for operation `%s'\n"),
1470 "-n",
1471 _ ("name"));
1472 ret = 1;
1473 finish_command ();
1474 return;
1475 }
1476 rd_count = 0;
1477 for (struct RecordSetEntry *e = recordset; NULL != e; e = e->next)
1478 rd_count++;
1480 rd_count = 0;
1481 for (struct RecordSetEntry *e = recordset; NULL != e; e = e->next)
1482 {
1483 rd_tmp[rd_count] = e->record;
1484 rd_count++;
1485 }
1487 &zone_pkey,
1488 name,
1489 rd_count,
1490 rd_tmp,
1491 &replace_cont,
1492 NULL);
1493 GNUNET_free (rd_tmp);
1494 return;
1495 }
1496 if (NULL != nickstring)
1497 {
1498 if (0 == strlen (nickstring))
1499 {
1500 fprintf (stderr, _ ("Invalid nick `%s'\n"), nickstring);
1501 ret = 1;
1502 finish_command ();
1503 return;
1504 }
1505 add = 1;
1510 is_public = 0;
1511 expirationstring = GNUNET_strdup ("never");
1513 nickstring = NULL;
1514 }
1515
1516 if (add)
1517 {
1518 if (NULL == ego_name)
1519 {
1520 fprintf (stderr,
1521 _ ("Missing option `%s' for operation `%s'\n"),
1522 "-z",
1523 _ ("add"));
1524 ret = 1;
1525 finish_command ();
1526 return;
1527 }
1528 if (NULL == name)
1529 {
1530 fprintf (stderr,
1531 _ ("Missing option `%s' for operation `%s'\n"),
1532 "-n",
1533 _ ("add"));
1534 ret = 1;
1535 finish_command ();
1536 return;
1537 }
1538 if (NULL == typestring)
1539 {
1540 fprintf (stderr,
1541 _ ("Missing option `%s' for operation `%s'\n"),
1542 "-t",
1543 _ ("add"));
1544 ret = 1;
1545 finish_command ();
1546 return;
1547 }
1549 if (UINT32_MAX == type)
1550 {
1551 fprintf (stderr, _ ("Unsupported type `%s'\n"), typestring);
1552 ret = 1;
1553 finish_command ();
1554 return;
1555 }
1560 {
1561 fprintf (stderr,
1562 _ (
1563 "For DNS record types `SRV', `TLSA', `SMIMEA' and `OPENPGPKEY'"));
1564 fprintf (stderr, ", please use a `BOX' record instead\n");
1565 ret = 1;
1566 finish_command ();
1567 return;
1568 }
1569 if (NULL == value)
1570 {
1571 fprintf (stderr,
1572 _ ("Missing option `%s' for operation `%s'\n"),
1573 "-V",
1574 _ ("add"));
1575 ret = 1;
1576 finish_command ();
1577 return;
1578 }
1579 if (GNUNET_OK !=
1581 {
1582 fprintf (stderr,
1583 _ ("Value `%s' invalid for record type `%s'\n"),
1584 value,
1585 typestring);
1586 ret = 1;
1587 finish_command ();
1588 return;
1589 }
1590 if (NULL == expirationstring)
1591 {
1592 fprintf (stderr,
1593 _ ("Missing option `%s' for operation `%s'\n"),
1594 "-e",
1595 _ ("add"));
1596 ret = 1;
1597 finish_command ();
1598 return;
1599 }
1601 {
1602 fprintf (stderr, _ ("Invalid time format `%s'\n"), expirationstring);
1603 ret = 1;
1604 finish_command ();
1605 return;
1606 }
1608 &zone_pkey,
1609 name,
1610 &add_error_cb,
1611 NULL,
1613 NULL);
1614 }
1615 if (del)
1616 {
1617 if (NULL == ego_name)
1618 {
1619 fprintf (stderr,
1620 _ ("Missing option `%s' for operation `%s'\n"),
1621 "-z",
1622 _ ("del"));
1623 ret = 1;
1624 finish_command ();
1625 return;
1626 }
1627 if (NULL == name)
1628 {
1629 fprintf (stderr,
1630 _ ("Missing option `%s' for operation `%s'\n"),
1631 "-n",
1632 _ ("del"));
1633 ret = 1;
1634 finish_command ();
1635 return;
1636 }
1638 &zone_pkey,
1639 name,
1641 NULL,
1642 &del_monitor,
1643 NULL,
1644 filter_flags);
1645 }
1646 if (purge_orphaned)
1647 {
1649 NULL,
1651 NULL,
1653 NULL,
1655 NULL,
1656 filter_flags);
1657
1658 }
1659 else if (purge_zone)
1660 {
1661 if (NULL == ego_name)
1662 {
1663 fprintf (stderr,
1664 _ ("Missing option `%s' for operation `%s'\n"),
1665 "-z",
1666 _ ("purge-zone"));
1667 ret = 1;
1668 finish_command ();
1669 return;
1670 }
1672 &zone_pkey,
1674 NULL,
1676 NULL,
1678 NULL,
1679 filter_flags);
1680
1681 }
1682 else if (list || list_orphaned)
1683 {
1684 if (NULL != name)
1685 {
1686 if (NULL == ego_name)
1687 {
1688 fprintf (stderr,
1689 _ ("Missing option `%s' for operation `%s'\n"),
1690 "-z",
1691 _ ("list"));
1692 ret = 1;
1693 finish_command ();
1694 return;
1695 }
1697 &zone_pkey,
1698 name,
1700 NULL,
1702 NULL);
1703 }
1704 else
1706 (NULL == ego_name) ?
1707 NULL : &zone_pkey,
1709 ,
1710 NULL,
1712 ,
1713 NULL,
1715 ,
1716 NULL,
1717 filter_flags);
1718 }
1719 if (NULL != reverse_pkey)
1720 {
1722
1723 if (NULL == ego_name)
1724 {
1725 fprintf (stderr,
1726 _ ("Missing option `%s' for operation `%s'\n"),
1727 "-z",
1728 _ ("reverse-pkey"));
1729 ret = 1;
1730 finish_command ();
1731 return;
1732 }
1733 if (GNUNET_OK !=
1735 &pubkey))
1736 {
1737 fprintf (stderr,
1738 _ ("Invalid public key for reverse lookup `%s'\n"),
1739 reverse_pkey);
1740 ret = 1;
1741 finish_command ();
1742 return;
1743 }
1745 &zone_pkey,
1746 &pubkey,
1748 NULL,
1750 NULL);
1751 }
1752 if (NULL != uri)
1753 {
1754 char sh[105];
1755 char sname[64];
1757 if (NULL == ego_name)
1758 {
1759 fprintf (stderr,
1760 _ ("Missing option `%s' for operation `%s'\n"),
1761 "-z",
1762 _ ("uri"));
1763 ret = 1;
1764 finish_command ();
1765 return;
1766 }
1767
1768 memset (sh, 0, 105);
1769 memset (sname, 0, 64);
1770
1771 if ((2 != (sscanf (uri, "gnunet://gns/%58s/%63s", sh, sname))) ||
1772 (GNUNET_OK !=
1774 {
1775 fprintf (stderr, _ ("Invalid URI `%s'\n"), uri);
1776 ret = 1;
1777 finish_command ();
1778 return;
1779 }
1780 if (NULL == expirationstring)
1781 {
1782 fprintf (stderr,
1783 _ ("Missing option `%s' for operation `%s'\n"),
1784 "-e",
1785 _ ("add"));
1786 ret = 1;
1787 finish_command ();
1788 return;
1789 }
1791 {
1792 fprintf (stderr, _ ("Invalid time format `%s'\n"), expirationstring);
1793 ret = 1;
1794 finish_command ();
1795 return;
1796 }
1797 memset (&rd, 0, sizeof(rd));
1798 rd.data = &pkey;
1800 rd.record_type = ntohl (pkey.type);
1802 if (GNUNET_YES == etime_is_rel)
1804 if (1 == is_shadow)
1806 if (1 == is_maintenance)
1809 &zone_pkey,
1810 sname,
1811 1,
1812 &rd,
1814 &add_qe_uri);
1815 }
1816 if (monitor)
1817 {
1819 (NULL != ego_name) ?
1820 &zone_pkey : NULL,
1821 GNUNET_YES,
1823 NULL,
1825 NULL,
1826 &sync_cb,
1827 NULL,
1828 filter_flags);
1829 }
1830}
1831
1832
1833#define MAX_LINE_LEN 4086
1834
1835#define MAX_ARGS 20
1836
1837static int
1839 struct GNUNET_CRYPTO_PrivateKey *zk)
1840{
1841 const struct GNUNET_CRYPTO_PrivateKey *privkey;
1843 struct GNUNET_CRYPTO_PublicKey ego_pubkey;
1844 struct EgoEntry *ego_entry;
1845
1847 &pubkey))
1848 {
1849 for (ego_entry = ego_head;
1850 NULL != ego_entry; ego_entry = ego_entry->next)
1851 {
1852 privkey = GNUNET_IDENTITY_ego_get_private_key (ego_entry->ego);
1853 GNUNET_IDENTITY_ego_get_public_key (ego_entry->ego, &ego_pubkey);
1854 if (0 == memcmp (&ego_pubkey, &pubkey, sizeof (pubkey)))
1855 {
1856 *zk = *privkey;
1857 return GNUNET_OK;
1858 }
1859 }
1860 }
1861 else
1862 {
1863 for (ego_entry = ego_head; NULL != ego_entry; ego_entry = ego_entry->next)
1864 {
1866 if (0 != strcmp (str, ego_entry->identifier))
1867 continue;
1868 *zk = *GNUNET_IDENTITY_ego_get_private_key (ego_entry->ego);
1869 return GNUNET_OK;
1870 }
1871 }
1872 return GNUNET_NO;
1873}
1874
1875
1876static void
1878{
1879 char buf[MAX_LINE_LEN];
1880 static struct GNUNET_CRYPTO_PrivateKey next_zone_key;
1881 static char next_name[GNUNET_DNSPARSER_MAX_NAME_LENGTH];
1882 static int finished = GNUNET_NO;
1883 static int have_next_recordline = GNUNET_NO;
1884 int zonekey_set = GNUNET_NO;
1885 char *tmp;
1886 char *current_name = NULL;
1887
1888
1889 if (GNUNET_YES == have_next_recordline)
1890 {
1891 zone_pkey = next_zone_key;
1892 if (NULL != current_name)
1893 GNUNET_free (current_name);
1894 current_name = GNUNET_strdup (next_name);
1895 zonekey_set = GNUNET_YES;
1896 }
1897 while (NULL != fgets (buf, sizeof (buf), stdin))
1898 {
1899 if (1 >= strlen (buf))
1900 continue;
1901 if (buf[strlen (buf) - 1] == '\n')
1902 buf[strlen (buf) - 1] = '\0';
1906 if (buf[strlen (buf) - 1] == ':')
1907 {
1908 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Switching to %s\n", buf);
1909 memset (next_name, 0, sizeof (next_name));
1910 strncpy (next_name, buf, strlen (buf) - 1);
1911 tmp = strchr (next_name, '.');
1912 if (NULL == tmp)
1913 {
1914 fprintf (stderr, "Error parsing name `%s'\n", next_name);
1916 ret = 1;
1917 return;
1918 }
1919 if (GNUNET_OK != get_identity_for_string (tmp + 1, &next_zone_key))
1920 {
1921 fprintf (stderr, "Error parsing zone name `%s'\n", tmp + 1);
1922 ret = 1;
1924 return;
1925 }
1926 *tmp = '\0';
1927 have_next_recordline = GNUNET_YES;
1928 /* Run a command for the previous record set */
1929 if (NULL != recordset)
1930 {
1932 {
1937 "Recordinfo array grown to %u bytes!\n",
1939 }
1940 record_info[ri_count].a_label = GNUNET_strdup (current_name);
1941 {
1942 int rd_count = 0;
1943 for (struct RecordSetEntry *e = recordset; NULL != e; e = e->next)
1944 rd_count++;
1946 struct
1948 rd_count = 0;
1949 for (struct RecordSetEntry *e = recordset; NULL != e; e = e->next)
1950 {
1951 record_info[ri_count].a_rd[rd_count] = e->record;
1953 record.
1954 data_size);
1956 data_size;
1957 memcpy ((void*) record_info[ri_count].a_rd[rd_count].data,
1958 e->record.data, e->record.data_size);
1959 rd_count++;
1960 }
1962 ri_count++;
1964 "Added %d records to record info\n", rd_count);
1965 clear_recordset ();
1966 }
1967 /* If the zone has changed, insert */
1968 /* If we have reached batch size, insert */
1969 if (0 != GNUNET_memcmp (&next_zone_key, &zone_pkey) ||
1971 {
1972 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Batch inserting %d RI\n",
1973 ri_count);
1975 return;
1976 }
1977 }
1978 zone_pkey = next_zone_key;
1979 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Switching from %s to %s\n",
1980 current_name, next_name);
1981 if (NULL != current_name)
1982 GNUNET_free (current_name);
1983 current_name = GNUNET_strdup (next_name);
1984 zonekey_set = GNUNET_YES;
1985 continue;
1986 }
1987 if (GNUNET_NO == zonekey_set)
1988 {
1989 fprintf (stderr, "Warning, encountered recordline without zone\n");
1990 continue;
1991 }
1992 parse_recordline (buf);
1993 }
1994 if (GNUNET_NO == finished)
1995 {
1996 if (NULL != recordset)
1997 {
1998 if (GNUNET_YES == zonekey_set)
1999 {
2000 record_info[ri_count].a_label = GNUNET_strdup (current_name);
2001 {
2002 int rd_count = 0;
2003 for (struct RecordSetEntry *e = recordset; NULL != e; e = e->next)
2004 rd_count++;
2006 struct
2008 rd_count = 0;
2009 for (struct RecordSetEntry *e = recordset; NULL != e; e = e->next)
2010 {
2011 record_info[ri_count].a_rd[rd_count] = e->record;
2013 .
2014 data_size);
2015 record_info[ri_count].a_rd[rd_count].data_size = e->record.data_size
2016 ;
2017 memcpy ((void*) record_info[ri_count].a_rd[rd_count].data,
2018 e->record.data, e->record.data_size);
2019 rd_count++;
2020 }
2022 }
2023 ri_count++;
2026 return;
2027 }
2028 fprintf (stderr, "Warning, encountered recordline without zone\n");
2029 }
2030 }
2031 if (ri_sent < ri_count)
2032 {
2034 return;
2035 }
2037 return;
2038}
2039
2040
2053static void
2054id_connect_cb (void *cls,
2055 struct GNUNET_IDENTITY_Ego *ego,
2056 void **ctx,
2057 const char *ego_name_tmp)
2058{
2060 struct EgoEntry *ego_entry;
2061
2062 (void) ctx;
2063 (void) ego_name_tmp;
2064 if ((NULL != ego_name_tmp) && (NULL != ego))
2065 {
2066 ego_entry = GNUNET_new (struct EgoEntry);
2068 ego_entry->ego = ego;
2069 ego_entry->identifier = GNUNET_strdup (ego_name_tmp);
2071 ego_tail,
2072 ego_entry);
2073 if ((NULL != ego_name) && (NULL != ego_name_tmp) &&
2074 (0 == strcmp (ego_name, ego_name_tmp)))
2076 return;
2077 }
2078 if (NULL != ego)
2079 return;
2080 if (read_from_stdin)
2081 {
2083 return;
2084 }
2086}
2087
2088
2097static void
2098run (void *cls,
2099 char *const *args,
2100 const char *cfgfile,
2101 const struct GNUNET_CONFIGURATION_Handle *_cfg)
2102{
2103 (void) cls;
2104 (void) args;
2105 (void) cfgfile;
2106 cfg = _cfg;
2107 if (NULL != args[0])
2108 GNUNET_log (
2110 _ ("Superfluous command line arguments (starting with `%s') ignored\n"),
2111 args[0]);
2112
2115 if (NULL == ns)
2116 {
2117 fprintf (stderr, _ ("Failed to connect to namestore\n"));
2119 return;
2120 }
2122 if (NULL == idh)
2123 {
2124 ret = -1;
2125 fprintf (stderr, _ ("Cannot connect to identity service\n"));
2127 }
2128}
2129
2130
2138int
2139main (int argc, char *const *argv)
2140{
2141 int lret;
2143 { GNUNET_GETOPT_option_flag ('a', "add", gettext_noop ("add record"), &add),
2145 "delete",
2146 gettext_noop ("delete record"),
2147 &del),
2149 "display",
2150 gettext_noop ("display records"),
2151 &list),
2153 "from-stdin",
2154 gettext_noop ("read commands from stdin"),
2157 'e',
2158 "expiration",
2159 "TIME",
2160 gettext_noop (
2161 "expiration time for record to use (for adding only), \"never\" is possible"),
2164 "nick",
2165 "NICKNAME",
2166 gettext_noop (
2167 "set the desired nick name for the zone"),
2168 &nickstring),
2170 "monitor",
2171 gettext_noop (
2172 "monitor changes in the namestore"),
2173 &monitor),
2175 "name",
2176 "NAME",
2177 gettext_noop (
2178 "name of the record to add/delete/display"),
2179 &name),
2181 "recordline",
2182 gettext_noop ("Output in recordline format"),
2185 "zone-to-name",
2186 "KEY",
2187 gettext_noop (
2188 "determine our name for the given KEY"),
2189 &reverse_pkey),
2191 "type",
2192 "TYPE",
2193 gettext_noop (
2194 "type of the record to add/delete/display"),
2195 &typestring),
2197 "uri",
2198 "URI",
2199 gettext_noop ("URI to import into our zone"),
2200 &uri),
2202 "value",
2203 "VALUE",
2204 gettext_noop (
2205 "value of the record to add/delete"),
2206 &value),
2208 "public",
2209 gettext_noop ("create or list public record"),
2210 &is_public),
2212 "omit-private",
2213 gettext_noop ("omit private records"),
2214 &omit_private),
2216 "include-maintenance",
2217 gettext_noop (
2218 "do not filter maintenance records"),
2221 "purge-orphans",
2222 gettext_noop (
2223 "purge namestore of all orphans"),
2226 "list-orphans",
2227 gettext_noop (
2228 "show private key for orphaned records for recovery using `gnunet-identity -C -P <key>'. Use in combination with --display"),
2229 &list_orphaned),
2231 "purge-zone-records",
2232 gettext_noop (
2233 "delete all records in specified zone"),
2234 &purge_zone),
2236 "batch-size",
2237 "NUMBER",
2238 gettext_noop (
2239 "number of records to buffer and send as batch (for use with --from-stdin)"),
2242 's',
2243 "shadow",
2244 gettext_noop (
2245 "create shadow record (only valid if all other records of the same type have expired)"),
2246 &is_shadow),
2248 'M',
2249 "maintenance",
2250 gettext_noop (
2251 "create maintenance record (e.g TOMBSTONEs)"),
2254 "zone",
2255 "EGO",
2256 gettext_noop (
2257 "name of the ego controlling the zone"),
2258 &ego_name),
2260
2261
2262 is_public = -1;
2263 is_shadow = -1;
2264 is_maintenance = -1;
2265 GNUNET_log_setup ("gnunet-namestore", "WARNING", NULL);
2266 if (GNUNET_OK !=
2268 argc,
2269 argv,
2270 "gnunet-namestore",
2271 _ ("GNUnet zone manipulation tool"),
2272 options,
2273 &run,
2274 NULL)))
2275 {
2276 // FIXME
2277 // GNUNET_CRYPTO_ecdsa_key_clear (&zone_pkey);
2278 return lret;
2279 }
2280 // FIXME
2281 // GNUNET_CRYPTO_ecdsa_key_clear (&zone_pkey);
2282 return ret;
2283}
2284
2285
2286/* end of gnunet-namestore.c */
struct GNUNET_GETOPT_CommandLineOption GNUNET_GETOPT_OPTION_END
Definition: 002.c:13
struct GNUNET_GETOPT_CommandLineOption options[]
Definition: 002.c:5
#define gettext_noop(String)
Definition: gettext.h:74
#define GNUNET_GNSRECORD_TYPE_NICK
GNS zone nickname.
static bool finished
Set to true once we are finished and should exit after sending our final message to the parent.
static void record(void *cls, size_t data_size, const void *data)
Process recorded audio data.
static char * line
Desired phone line (string to be converted to a hash).
static struct GNUNET_DATASTORE_QueueEntry * qe
Current operation.
static struct GNUNET_FS_Handle * ctx
static struct GNUNET_IDENTITY_Handle * sh
Handle to IDENTITY service.
struct GNUNET_CRYPTO_PrivateKey pk
Private key from command line option, or NULL.
static char * pkey
Public key of the zone to look in, in ASCII.
static struct GNUNET_CRYPTO_PublicKey pubkey
Public key of the zone to look in.
static unsigned int rd_count
Number of records for currently parsed set.
static struct GNUNET_GNSRECORD_Data rd[50]
The record data under a single label.
static struct EgoEntry * ego_tail
Ego list.
static struct GNUNET_NAMESTORE_QueueEntry * ns_qe
Queue entry for begin/commit.
#define MAX_LINE_LEN
static void display_record_monitor(void *cls, const struct GNUNET_CRYPTO_PrivateKey *zone_key, const char *rname, unsigned int rd_len, const struct GNUNET_GNSRECORD_Data *rd, struct GNUNET_TIME_Absolute expiry)
Process a record that was stored in the namestore.
static int output_recordline
Output in recordline format.
static int omit_private
Filter private records.
static void zone_iteration_finished(void *cls)
Function called when we are done with a zone iteration.
static void replace_cont(void *cls, enum GNUNET_ErrorCode ec)
static void sync_cb(void *cls)
Function called once we are in sync in monitor mode.
static struct GNUNET_NAMESTORE_QueueEntry * get_qe
Queue entry for the 'lookup' operation.
static void del_lookup_error_cb(void *cls)
Function called if lookup for deletion fails.
static void purge_zone_iterator(void *cls, const struct GNUNET_CRYPTO_PrivateKey *zone_key, const char *rname, unsigned int rd_len, const struct GNUNET_GNSRECORD_Data *rd, struct GNUNET_TIME_Absolute expiry)
static struct GNUNET_CRYPTO_PrivateKey zone_pkey
Private key for the our zone.
static struct GNUNET_NAMESTORE_ZoneMonitor * zm
Monitor handle.
static void run_with_zone_pkey(const struct GNUNET_CONFIGURATION_Handle *cfg_)
We have obtained the zone's private key, so now process the main commands using it.
static int parse_recordline(const char *line)
static void del_continuation(void *cls, enum GNUNET_ErrorCode ec)
static int list_orphaned
List records and zone keys of orphaned records.
#define WARN_RELATIVE_EXPIRATION_LIMIT
The upper bound for the zone iteration interval (per record).
static void purge_next_record(void *cls)
static int purge_orphaned
Purge orphaned records.
static struct GNUNET_NAMESTORE_QueueEntry * add_qe
Queue entry for the 'add' operation.
static void id_connect_cb(void *cls, struct GNUNET_IDENTITY_Ego *ego, void **ctx, const char *ego_name_tmp)
Function called with ALL of the egos known to the identity service, used on startup if the user did n...
static char * nickstring
Desired nick name.
static void display_record_lookup(void *cls, const struct GNUNET_CRYPTO_PrivateKey *zone_key, const char *rname, unsigned int rd_len, const struct GNUNET_GNSRECORD_Data *rd)
Process a record that was stored in the namestore.
static int monitor
Enables monitor mode.
static char * value
Value of the record to add/remove.
static int list
Desired action is to list records.
const struct GNUNET_CONFIGURATION_Handle * cfg
Configuration handle.
static struct GNUNET_NAMESTORE_QueueEntry * del_qe
Queue entry for the 'del' operation.
static void batch_insert_recordinfo(const struct GNUNET_CONFIGURATION_Handle *cfg)
We have obtained the zone's private key, so now process the main commands using it.
static int purge_zone
Purge zone contents.
static char * name
Name of the records to add/list/remove.
static int include_maintenance
Do not filter maintenance records.
static struct GNUNET_NAMESTORE_QueueEntry * set_qe
Queue entry for the 'set/replace' operation.
static int get_identity_for_string(const char *str, struct GNUNET_CRYPTO_PrivateKey *zk)
static void display_record(const struct GNUNET_CRYPTO_PrivateKey *zone_key, const char *rname, unsigned int rd_len, const struct GNUNET_GNSRECORD_Data *rd)
Process a record that was stored in the namestore.
static void collect_orphans(const struct GNUNET_CRYPTO_PrivateKey *zone_key, const char *rname, unsigned int rd_len, const struct GNUNET_GNSRECORD_Data *rd)
static int ret
Global return value.
static void handle_reverse_lookup(void *cls, const struct GNUNET_CRYPTO_PrivateKey *zone, const char *label, unsigned int rd_count, const struct GNUNET_GNSRECORD_Data *rd)
Function called with the result of our attempt to obtain a name for a given public key.
static void reset_handles(void)
static unsigned int max_batch_size
static void * data
Value in binary format.
static void lookup_error_cb(void *cls)
Function called on errors while monitoring.
static void clear_recordset()
static void do_shutdown(void *cls)
Task run on shutdown.
static struct GNUNET_IDENTITY_Handle * idh
Identity service handle.
static struct RecordSetEntry * recordset
Entry in record set for processing records in bulk.
static char * ego_name
Name of the ego controlling the zone.
static void reverse_error_cb(void *cls)
Function called if we encountered an error in zone-to-name.
static struct MarkedRecord * marked_head
Marked record list.
static struct EgoEntry * ego_head
Ego list.
static int parse_expiration(const char *exp_str, int *is_rel, uint64_t *exptime)
Parse expiration time.
static int is_shadow
Is record a shadow record (GNUNET_GNSRECORD_RF_SHADOW)
static void add_continuation(void *cls, enum GNUNET_ErrorCode ec)
static struct GNUNET_SCHEDULER_Task * purge_task
Purge task.
static void run(void *cls, char *const *args, const char *cfgfile, const struct GNUNET_CONFIGURATION_Handle *_cfg)
Main function that will be run.
static unsigned int ri_sent
static void finish_command(void)
static int del
Desired action is to remove a record.
static int etime_is_rel
Is expiration time relative or absolute time?
static void add_error_cb(void *cls)
Function called if lookup fails.
static struct GNUNET_NAMESTORE_Handle * ns
Handle to the namestore.
static void marked_deleted(void *cls, enum GNUNET_ErrorCode ec)
static struct GNUNET_NAMESTORE_ZoneIterator * list_it
List iterator for the 'list' operation.
static int is_maintenance
Is record a maintenance record (GNUNET_GNSRECORD_RF_MAINTENANCE)
static struct MarkedRecord * marked_tail
Marked record list.
static void display_record_iterator(void *cls, const struct GNUNET_CRYPTO_PrivateKey *zone_key, const char *rname, unsigned int rd_len, const struct GNUNET_GNSRECORD_Data *rd, struct GNUNET_TIME_Absolute expiry)
Process a record that was stored in the namestore.
static void purge_orphans_iterator(void *cls, const struct GNUNET_CRYPTO_PrivateKey *zone_key, const char *rname, unsigned int rd_len, const struct GNUNET_GNSRECORD_Data *rd, struct GNUNET_TIME_Absolute expiry)
static void monitor_error_cb(void *cls)
Function called on errors while monitoring.
static int read_from_stdin
Run in read from stdin mode.
static void process_command_stdin(void)
int main(int argc, char *const *argv)
The main function for gnunet-namestore.
static uint32_t type
Type string converted to DNS type value.
static size_t data_size
Number of bytes in data.
static char * expirationstring
Desired expiration time.
static unsigned int record_info_capacity
Maximum capacity of record_info array.
static void collect_zone_records_to_purge(const struct GNUNET_CRYPTO_PrivateKey *zone_key, const char *rname, unsigned int rd_len, const struct GNUNET_GNSRECORD_Data *rd)
static struct GNUNET_NAMESTORE_RecordInfo * record_info
static struct GNUNET_NAMESTORE_QueueEntry * add_qe_uri
Queue entry for the 'add-uri' operation.
static void del_monitor(void *cls, const struct GNUNET_CRYPTO_PrivateKey *zone, const char *label, unsigned int rd_count, const struct GNUNET_GNSRECORD_Data *rd)
We were asked to delete something; this function is called with the existing records.
static void schedule_finish(void *cls)
static int add
Desired action is to add a record.
static struct GNUNET_NAMESTORE_QueueEntry * reverse_qe
Queue entry for the 'reverse lookup' operation (in combination with a name).
static void zone_iteration_error_cb(void *cls)
Function called when we encountered an error in a zone iteration.
static void get_existing_record(void *cls, const struct GNUNET_CRYPTO_PrivateKey *zone_key, const char *rec_name, unsigned int rd_count, const struct GNUNET_GNSRECORD_Data *rd)
We're storing a record; this function is given the existing record so that we can merge the informati...
static char * typestring
Type of the record to add/remove, NULL to remove all.
static char * uri
URI to import.
static uint64_t etime
Expiration string converted to numeric value.
static char * reverse_pkey
Reverse lookup to perform.
static unsigned int ri_count
static int is_public
Is record public (opposite of GNUNET_GNSRECORD_RF_PRIVATE)
commonly used definitions; globals in this file are exempt from the rule that the module name ("commo...
const char * GNUNET_ErrorCode_get_hint(enum GNUNET_ErrorCode ec)
Returns a hint for a given error code.
GNUNET_ErrorCode
Taler error codes.
@ GNUNET_EC_NONE
No error (success).
@ GNUNET_EC_NAMESTORE_RECORD_EXISTS
Record already exists.
@ GNUNET_EC_NAMESTORE_RECORD_NOT_FOUND
Record not found.
API to the GNS service.
API that can be used to manipulate GNS record data.
Identity service; implements identity management for GNUnet.
API that can be used to store naming information on a GNUnet node;.
#define GNUNET_CONTAINER_DLL_remove(head, tail, element)
Remove an element from a DLL.
#define GNUNET_CONTAINER_DLL_insert_tail(head, tail, element)
Insert an element at the tail of a DLL.
#define GNUNET_CONTAINER_DLL_insert(head, tail, element)
Insert an element at the head of a DLL.
#define GNUNET_DNSPARSER_TYPE_OPENPGPKEY
#define GNUNET_DNSPARSER_TYPE_TLSA
#define GNUNET_DNSPARSER_TYPE_SRV
#define GNUNET_DNSPARSER_TYPE_SOA
#define GNUNET_DNSPARSER_TYPE_SMIMEA
#define GNUNET_DNSPARSER_MAX_NAME_LENGTH
Maximum length of a name in DNS.
struct GNUNET_GETOPT_CommandLineOption GNUNET_GETOPT_option_uint(char shortName, const char *name, const char *argumentHelp, const char *description, unsigned int *val)
Allow user to specify an unsigned int.
struct GNUNET_GETOPT_CommandLineOption GNUNET_GETOPT_option_flag(char shortName, const char *name, const char *description, int *val)
Allow user to specify a flag (which internally means setting an integer to 1/GNUNET_YES/GNUNET_OK.
struct GNUNET_GETOPT_CommandLineOption GNUNET_GETOPT_option_string(char shortName, const char *name, const char *argumentHelp, const char *description, char **str)
Allow user to specify a string.
const char * GNUNET_GNSRECORD_number_to_typename(uint32_t type)
Convert a type number to the corresponding type string (e.g.
Definition: gnsrecord.c:219
uint32_t GNUNET_GNSRECORD_typename_to_number(const char *dns_typename)
Convert a type name (e.g.
Definition: gnsrecord.c:192
int GNUNET_GNSRECORD_string_to_value(uint32_t type, const char *s, void **data, size_t *data_size)
Convert human-readable version of the value s of a record of type type to the respective binary repre...
Definition: gnsrecord.c:169
#define GNUNET_GNS_EMPTY_LABEL_AT
String we use to indicate an empty label (top-level entry in the zone).
GNUNET_GNSRECORD_Filter
Filter for GNUNET_GNSRECORD_normalize_record_set().
#define GNUNET_GNSRECORD_TYPE_ANY
Record type indicating any record/'*'.
char * GNUNET_GNSRECORD_value_to_string(uint32_t type, const void *data, size_t data_size)
Convert the binary value data of a record of type type to a human-readable string.
Definition: gnsrecord.c:147
@ GNUNET_GNSRECORD_RF_RELATIVE_EXPIRATION
This expiration time of the record is a relative time (not an absolute time).
@ GNUNET_GNSRECORD_RF_CRITICAL
This record is critical.
@ GNUNET_GNSRECORD_RF_SUPPLEMENTAL
This is a supplemental record.
@ GNUNET_GNSRECORD_RF_MAINTENANCE
Maintenance records.
@ GNUNET_GNSRECORD_RF_SHADOW
This record should not be used unless all (other) records in the set with an absolute expiration time...
@ GNUNET_GNSRECORD_RF_PRIVATE
This is a private record of this peer and it should thus not be published.
@ GNUNET_GNSRECORD_RF_NONE
Entry for no flags / cleared flags.
@ GNUNET_GNSRECORD_FILTER_NONE
No filter flags set.
@ GNUNET_GNSRECORD_FILTER_INCLUDE_MAINTENANCE
Include maintenance records (TOMBSTONE etc).
@ GNUNET_GNSRECORD_FILTER_OMIT_PRIVATE
Filter private records.
const struct GNUNET_CRYPTO_PrivateKey * GNUNET_IDENTITY_ego_get_private_key(const struct GNUNET_IDENTITY_Ego *ego)
Obtain the ECC key associated with a ego.
Definition: identity_api.c:517
struct GNUNET_IDENTITY_Handle * GNUNET_IDENTITY_connect(const struct GNUNET_CONFIGURATION_Handle *cfg, GNUNET_IDENTITY_Callback cb, void *cb_cls)
Connect to the identity service.
Definition: identity_api.c:487
void GNUNET_IDENTITY_disconnect(struct GNUNET_IDENTITY_Handle *h)
Disconnect from identity service.
Definition: identity_api.c:732
void GNUNET_IDENTITY_ego_get_public_key(struct GNUNET_IDENTITY_Ego *ego, struct GNUNET_CRYPTO_PublicKey *pk)
Get the identifier (public key) of an ego.
Definition: identity_api.c:529
ssize_t GNUNET_CRYPTO_public_key_get_length(const struct GNUNET_CRYPTO_PublicKey *key)
Get the compacted length of a GNUNET_CRYPTO_PublicKey.
Definition: crypto_pkey.c:85
#define GNUNET_log(kind,...)
char * GNUNET_CRYPTO_private_key_to_string(const struct GNUNET_CRYPTO_PrivateKey *key)
Creates a (Base32) string representation of the private key.
Definition: crypto_pkey.c:389
#define GNUNET_memcmp(a, b)
Compare memory in a and b, where both must be of the same pointer type.
#define GNUNET_memcpy(dst, src, n)
Call memcpy() but check for n being 0 first.
enum GNUNET_GenericReturnValue GNUNET_CRYPTO_public_key_from_string(const char *str, struct GNUNET_CRYPTO_PublicKey *key)
Parses a (Base32) string representation of the public key.
Definition: crypto_pkey.c:399
@ GNUNET_OK
@ GNUNET_YES
@ GNUNET_NO
@ GNUNET_SYSERR
#define GNUNET_assert(cond)
Use this for fatal errors that cannot be handled.
#define GNUNET_break(cond)
Use this for internal assertion violations that are not fatal (can be handled) but should not occur.
enum GNUNET_GenericReturnValue GNUNET_log_setup(const char *comp, const char *loglevel, const char *logfile)
Setup logging.
@ GNUNET_ERROR_TYPE_WARNING
@ GNUNET_ERROR_TYPE_ERROR
@ GNUNET_ERROR_TYPE_MESSAGE
@ GNUNET_ERROR_TYPE_DEBUG
#define GNUNET_strdup(a)
Wrapper around GNUNET_xstrdup_.
#define GNUNET_array_grow(arr, size, tsize)
Grow a well-typed (!) array.
#define GNUNET_new(type)
Allocate a struct or union of the given type.
#define GNUNET_malloc(size)
Wrapper around malloc.
#define GNUNET_new_array(n, type)
Allocate a size n array with structs or unions of the given type.
#define GNUNET_free(ptr)
Wrapper around free.
struct GNUNET_NAMESTORE_ZoneIterator * GNUNET_NAMESTORE_zone_iteration_start2(struct GNUNET_NAMESTORE_Handle *h, const struct GNUNET_CRYPTO_PrivateKey *zone, GNUNET_SCHEDULER_TaskCallback error_cb, void *error_cb_cls, GNUNET_NAMESTORE_RecordSetMonitor proc, void *proc_cls, GNUNET_SCHEDULER_TaskCallback finish_cb, void *finish_cb_cls, enum GNUNET_GNSRECORD_Filter filter)
Starts a new zone iteration (used to periodically PUT all of our records into our DHT).
struct GNUNET_NAMESTORE_QueueEntry * GNUNET_NAMESTORE_records_lookup(struct GNUNET_NAMESTORE_Handle *h, const struct GNUNET_CRYPTO_PrivateKey *pkey, const char *label, GNUNET_SCHEDULER_TaskCallback error_cb, void *error_cb_cls, GNUNET_NAMESTORE_RecordMonitor rm, void *rm_cls)
Lookup an item in the namestore.
struct GNUNET_NAMESTORE_QueueEntry * GNUNET_NAMESTORE_record_set_store(struct GNUNET_NAMESTORE_Handle *h, const struct GNUNET_CRYPTO_PrivateKey *pkey, const char *label, unsigned int rd_count, const struct GNUNET_GNSRECORD_Data *rd, GNUNET_NAMESTORE_ContinuationWithStatus cont, void *cont_cls)
Store an item in the namestore.
void GNUNET_NAMESTORE_disconnect(struct GNUNET_NAMESTORE_Handle *h)
Disconnect from the namestore service (and free associated resources).
void GNUNET_NAMESTORE_zone_iterator_next(struct GNUNET_NAMESTORE_ZoneIterator *it, uint64_t limit)
Calls the record processor specified in GNUNET_NAMESTORE_zone_iteration_start for the next record.
void GNUNET_NAMESTORE_cancel(struct GNUNET_NAMESTORE_QueueEntry *qe)
Cancel a namestore operation.
struct GNUNET_NAMESTORE_QueueEntry * GNUNET_NAMESTORE_records_lookup2(struct GNUNET_NAMESTORE_Handle *h, const struct GNUNET_CRYPTO_PrivateKey *pkey, const char *label, GNUNET_SCHEDULER_TaskCallback error_cb, void *error_cb_cls, GNUNET_NAMESTORE_RecordMonitor rm, void *rm_cls, enum GNUNET_GNSRECORD_Filter filter)
Lookup an item in the namestore with GNSRECORD filter.
void GNUNET_NAMESTORE_zone_monitor_stop(struct GNUNET_NAMESTORE_ZoneMonitor *zm)
Stop monitoring a zone for changes.
struct GNUNET_NAMESTORE_QueueEntry * GNUNET_NAMESTORE_zone_to_name(struct GNUNET_NAMESTORE_Handle *h, const struct GNUNET_CRYPTO_PrivateKey *zone, const struct GNUNET_CRYPTO_PublicKey *value_zone, GNUNET_SCHEDULER_TaskCallback error_cb, void *error_cb_cls, GNUNET_NAMESTORE_RecordMonitor proc, void *proc_cls)
Look for an existing PKEY delegation record for a given public key.
struct GNUNET_NAMESTORE_ZoneMonitor * GNUNET_NAMESTORE_zone_monitor_start2(const struct GNUNET_CONFIGURATION_Handle *cfg, const struct GNUNET_CRYPTO_PrivateKey *zone, int iterate_first, GNUNET_SCHEDULER_TaskCallback error_cb, void *error_cb_cls, GNUNET_NAMESTORE_RecordSetMonitor monitor, void *monitor_cls, GNUNET_SCHEDULER_TaskCallback sync_cb, void *sync_cb_cls, enum GNUNET_GNSRECORD_Filter filter)
Begin monitoring a zone for changes.
struct GNUNET_NAMESTORE_QueueEntry * GNUNET_NAMESTORE_records_store(struct GNUNET_NAMESTORE_Handle *h, const struct GNUNET_CRYPTO_PrivateKey *pkey, unsigned int rd_set_count, const struct GNUNET_NAMESTORE_RecordInfo *record_info, unsigned int *rds_sent, GNUNET_NAMESTORE_ContinuationWithStatus cont, void *cont_cls)
Store one or more record sets in the namestore.
void GNUNET_NAMESTORE_zone_monitor_next(struct GNUNET_NAMESTORE_ZoneMonitor *zm, uint64_t limit)
Calls the monitor processor specified in GNUNET_NAMESTORE_zone_monitor_start for the next record(s).
struct GNUNET_NAMESTORE_Handle * GNUNET_NAMESTORE_connect(const struct GNUNET_CONFIGURATION_Handle *cfg)
Connect to the namestore service.
void GNUNET_NAMESTORE_zone_iteration_stop(struct GNUNET_NAMESTORE_ZoneIterator *it)
Stops iteration and releases the namestore handle for further calls.
const struct GNUNET_OS_ProjectData * GNUNET_OS_project_data_gnunet(void)
Return default project data used by 'libgnunetutil' for GNUnet.
enum GNUNET_GenericReturnValue GNUNET_PROGRAM_run(const struct GNUNET_OS_ProjectData *pd, int argc, char *const *argv, const char *binaryName, const char *binaryHelp, const struct GNUNET_GETOPT_CommandLineOption *options, GNUNET_PROGRAM_Main task, void *task_cls)
Run a standard GNUnet command startup sequence (initialize loggers and configuration,...
Definition: program.c:407
void GNUNET_SCHEDULER_shutdown(void)
Request the shutdown of a scheduler.
Definition: scheduler.c:567
struct GNUNET_SCHEDULER_Task * GNUNET_SCHEDULER_add_shutdown(GNUNET_SCHEDULER_TaskCallback task, void *task_cls)
Schedule a new task to be run on shutdown, that is when a CTRL-C signal is received,...
Definition: scheduler.c:1339
void * GNUNET_SCHEDULER_cancel(struct GNUNET_SCHEDULER_Task *task)
Cancel the task with the specified identifier.
Definition: scheduler.c:980
struct GNUNET_SCHEDULER_Task * GNUNET_SCHEDULER_add_now(GNUNET_SCHEDULER_TaskCallback task, void *task_cls)
Schedule a new task to be run as soon as possible.
Definition: scheduler.c:1304
enum GNUNET_GenericReturnValue GNUNET_STRINGS_fancy_time_to_relative(const char *fancy_time, struct GNUNET_TIME_Relative *rtime)
Convert a given fancy human-readable time to our internal representation.
Definition: strings.c:259
#define GNUNET_TIME_relative_cmp(t1, op, t2)
Compare two relative times.
const char * GNUNET_STRINGS_relative_time_to_string(struct GNUNET_TIME_Relative delta, int do_round)
Give relative time in human-readable fancy format.
Definition: strings.c:579
const char * GNUNET_STRINGS_absolute_time_to_string(struct GNUNET_TIME_Absolute t)
Like asctime, except for GNUnet time.
Definition: strings.c:640
#define GNUNET_TIME_UNIT_FOREVER_ABS
Constant used to specify "forever".
enum GNUNET_GenericReturnValue GNUNET_STRINGS_fancy_time_to_absolute(const char *fancy_time, struct GNUNET_TIME_Absolute *atime)
Convert a given fancy human-readable time to our internal representation.
Definition: strings.c:301
#define _(String)
GNU gettext support macro.
Definition: platform.h:179
The default namestore ego.
char * identifier
Ego Identifier.
struct EgoEntry * prev
DLL.
struct EgoEntry * next
DLL.
struct GNUNET_IDENTITY_Ego * ego
The Ego.
A private key for an identity as per LSD0001.
An identity key as per LSD0001.
Definition of a command line option.
uint32_t record_type
Type of the GNS/DNS record.
const void * data
Binary value stored in the DNS record.
size_t data_size
Number of bytes in data.
enum GNUNET_GNSRECORD_Flags flags
Flags for the record.
uint64_t expiration_time
Expiration time for the DNS record.
Handle for an ego.
Definition: identity.h:37
Handle for the service.
Definition: identity_api.c:97
Connection to the NAMESTORE service.
An QueueEntry used to store information for a pending NAMESTORE record operation.
Definition: namestore_api.c:49
A struct for record bulk import.
struct GNUNET_GNSRECORD_Data * a_rd
Handle for a zone iterator operation.
Handle for a monitoring activity.
Entry in list of pending tasks.
Definition: scheduler.c:136
Time for absolute times used by GNUnet, in microseconds.
uint64_t abs_value_us
The actual value.
Time for relative time used by GNUnet, in microseconds.
uint64_t rel_value_us
The actual value.
The record marked for deletion.
struct MarkedRecord * next
DLL.
struct GNUNET_CRYPTO_PrivateKey key
The zone key.
char * name
Ego Identifier.
struct MarkedRecord * prev
DLL.
Entry in record set for bulk processing.
struct GNUNET_GNSRECORD_Data record
The record to add/remove.
struct RecordSetEntry * next
Kept in a linked list.