GNUnet 0.25.2-12-g8d1cef5f6
 
Loading...
Searching...
No Matches
gnunet-service-reclaim_tickets.c
Go to the documentation of this file.
1/*
2 This file is part of GNUnet.
3 Copyright (C) 2012-2015 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 */
20
28#include "gnunet_common.h"
29#include "gnunet_gns_service.h"
32#include <string.h>
33
34
39#define DEFAULT_TICKET_REFRESH_INTERVAL GNUNET_TIME_UNIT_HOURS
40
45struct ParallelLookup;
46
47
73
74
137
138
143{
144 /* DLL */
146
147 /* DLL */
149
150 /* The GNS request */
152
153 /* The handle the return to */
155
160
161 /* The label to look up */
162 char *label;
163};
164
165
223
224
245
246
269
270
336
337
342
343
344/* Namestore handle */
346
347
348/* GNS handle */
349static struct GNUNET_GNS_Handle *gns;
350
351
352/* Handle to the statistics service */
354
355
361static void
363{
364 struct RevokedAttributeEntry *ae;
365 struct TicketRecordsEntry *le;
366
367 if (NULL != rh->ns_qe)
369 if (NULL != rh->ns_it)
371 while (NULL != (ae = rh->attrs_head))
372 {
374 GNUNET_free (ae);
375 }
376 while (NULL != (le = rh->tickets_to_update_head))
377 {
380 le);
381 if (NULL != le->data)
382 GNUNET_free (le->data);
383 if (NULL != le->label)
384 GNUNET_free (le->label);
385 GNUNET_free (le);
386 }
387 GNUNET_free (rh);
388}
389
390
397static void
398process_tickets (void *cls);
399
400
409static void
411{
412 struct RECLAIM_TICKETS_RevokeHandle *rvk = cls;
413
414 rvk->ns_qe = NULL;
416}
417
418
424static void
426{
427 struct RECLAIM_TICKETS_RevokeHandle *rvk = cls;
428 struct TicketRecordsEntry *le;
429 struct RevokedAttributeEntry *ae;
430
431 if (NULL == rvk->tickets_to_update_head)
432 {
434 "Finished updatding tickets, success\n");
435 rvk->cb (rvk->cb_cls, GNUNET_OK);
436 cleanup_rvk (rvk);
437 return;
438 }
439 le = rvk->tickets_to_update_head;
442 le);
443 {
446 le->data,
447 le->rd_count,
448 rd))
449 {
451 "Unable to deserialize ticket record(s)\n");
452 rvk->cb (rvk->cb_cls, GNUNET_SYSERR);
453 cleanup_rvk (rvk);
454 return;
455 }
456 for (int i = 0; i < le->rd_count; i++)
457 {
459 continue;
460 for (ae = rvk->attrs_head; NULL != ae; ae = ae->next)
461 {
462 if (0 != memcmp (rd[i].data, &ae->old_id, sizeof(ae->old_id)))
463 continue;
464 rd[i].data = &ae->new_id;
465 }
466 }
468 &rvk->identity,
469 le->label,
470 le->rd_count,
471 rd,
473 rvk);
474 }
475 GNUNET_free (le->label);
476 GNUNET_free (le->data);
477 GNUNET_free (le);
478}
479
480
486static void
488{
489 struct RECLAIM_TICKETS_RevokeHandle *rvk = cls;
490
491 rvk->ns_it = NULL;
493}
494
495
506static void
508 const struct GNUNET_CRYPTO_BlindablePrivateKey *zone,
509 const char *label,
510 unsigned int rd_count,
511 const struct GNUNET_GNSRECORD_Data *rd)
512{
513 struct RECLAIM_TICKETS_RevokeHandle *rvk = cls;
514 struct TicketRecordsEntry *le;
515 struct RevokedAttributeEntry *ae;
516 int has_changed = GNUNET_NO;
517
519 for (int i = 0; i < rd_count; i++)
520 {
522 continue;
523 for (ae = rvk->attrs_head; NULL != ae; ae = ae->next)
524 {
525 if (0 != memcmp (rd[i].data, &ae->old_id, sizeof(ae->old_id)))
526 continue;
527 has_changed = GNUNET_YES;
528 break;
529 }
530 if (GNUNET_YES == has_changed)
531 break;
532 }
533 if (GNUNET_YES == has_changed)
534 {
535 le = GNUNET_new (struct TicketRecordsEntry);
537 le->data = GNUNET_malloc (le->data_size);
538 le->rd_count = rd_count;
539 le->label = GNUNET_strdup (label);
543 le);
544 }
546}
547
548
554static void
556{
557 struct RECLAIM_TICKETS_RevokeHandle *rvk = cls;
558
559 rvk->ns_it = NULL;
560 rvk->cb (rvk->cb_cls, GNUNET_SYSERR);
561 cleanup_rvk (rvk);
562}
563
564
570static void
571rvk_ns_err (void *cls)
572{
573 struct RECLAIM_TICKETS_RevokeHandle *rvk = cls;
574
575 rvk->ns_qe = NULL;
576 rvk->cb (rvk->cb_cls, GNUNET_SYSERR);
577 cleanup_rvk (rvk);
578}
579
580
589static void
591
592
598static void
600{
602}
603
604
613static void
615{
616 struct RECLAIM_TICKETS_RevokeHandle *rvk = cls;
617
618 rvk->ns_qe = NULL;
619 if (GNUNET_EC_NONE != ec)
620 {
622 "Error removing attribute: %s\n",
624 rvk->cb (rvk->cb_cls, GNUNET_SYSERR);
625 cleanup_rvk (rvk);
626 return;
627 }
628 rvk->move_attr = rvk->move_attr->next;
630}
631
632
642static void
644{
645 struct RECLAIM_TICKETS_RevokeHandle *rvk = cls;
646 char *label;
647
648 rvk->ns_qe = NULL;
649 if (GNUNET_EC_NONE != ec)
650 {
652 "Error moving attribute: %s\n",
654 rvk->cb (rvk->cb_cls, GNUNET_SYSERR);
655 cleanup_rvk (rvk);
656 return;
657 }
659 sizeof(rvk->move_attr->old_id));
660 GNUNET_assert (NULL != label);
661 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Removing attribute %s\n", label);
663 &rvk->identity,
664 label,
665 0,
666 NULL,
668 rvk);
669 GNUNET_free (label);
670}
671
672
682static void
684 const struct GNUNET_CRYPTO_BlindablePrivateKey *zone,
685 const char *label,
686 unsigned int rd_count,
687 const struct GNUNET_GNSRECORD_Data *rd)
688{
689 struct RECLAIM_TICKETS_RevokeHandle *rvk = cls;
690 struct GNUNET_GNSRECORD_Data new_rd[rd_count];
691 struct RevokedAttributeEntry *le;
692 char *new_label;
693 char *attr_data;
694
695 rvk->ns_qe = NULL;
696 if (0 == rd_count)
697 {
699 "The claim %s no longer exists!\n",
700 label);
701 le = rvk->move_attr;
702 rvk->move_attr = le->next;
704 GNUNET_free (le);
706 return;
707 }
709 new_label =
711 sizeof (rvk->move_attr->new_id));
712
713 attr_data = NULL;
714 // new_rd = *rd;
715 for (int i = 0; i < rd_count; i++)
716 {
717 if (GNUNET_GNSRECORD_TYPE_RECLAIM_ATTRIBUTE == rd[i].record_type)
718 {
722 rd[i].data_size,
723 &claim);
725 "Attribute to update: Name=%s\n",
726 claim->name);
727 claim->id = rvk->move_attr->new_id;
729 attr_data = GNUNET_malloc (rd[i].data_size);
731 attr_data);
732 new_rd[i].data = attr_data;
733 new_rd[i].record_type = rd[i].record_type;
734 new_rd[i].flags = rd[i].flags;
735 new_rd[i].expiration_time = rd[i].expiration_time;
736 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Adding attribute %s\n", new_label);
738 }
739 else if (GNUNET_GNSRECORD_TYPE_RECLAIM_CREDENTIAL == rd[i].record_type)
740 {
743 rd[i].data_size);
745 "Credential to update: Name=%s\n",
746 credential->name);
747 credential->id = rvk->move_attr->new_id;
748 new_rd[i].data_size =
750 attr_data = GNUNET_malloc (rd[i].data_size);
752 attr_data);
753 new_rd[i].data = attr_data;
754 new_rd[i].record_type = rd[i].record_type;
755 new_rd[i].flags = rd[i].flags;
756 new_rd[i].expiration_time = rd[i].expiration_time;
757 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Adding credential %s\n",
758 new_label);
760 }
761 else
762 {
763 memcpy (&new_rd[i], &rd[i], sizeof (struct GNUNET_GNSRECORD_Data));
764 }
765 }
767 &rvk->identity,
768 new_label,
769 rd_count,
770 new_rd,
772 rvk);
773 GNUNET_free (new_label);
774 GNUNET_free (attr_data);
775}
776
777
778static void
780{
781 char *label;
782
783 if (NULL == rvk->move_attr)
784 {
785 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Finished moving attributes\n");
786 rvk->ns_it =
788 &rvk->identity,
790 rvk,
792 rvk,
794 rvk);
795 return;
796 }
798 sizeof (rvk->move_attr->old_id));
799 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Moving claim %s\n", label);
800
802 &rvk->identity,
803 label,
804 &rvk_ns_err,
805 rvk,
807 rvk);
808 GNUNET_free (label);
809}
810
811
823static void
825{
826 struct RECLAIM_TICKETS_RevokeHandle *rvk = cls;
827
828 rvk->ns_qe = NULL;
829 if (GNUNET_EC_NONE != ec)
830 {
833 rvk->cb (rvk->cb_cls, GNUNET_SYSERR);
834 cleanup_rvk (rvk);
835 return;
836 }
837 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Deleted ticket\n");
838 if (0 == rvk->ticket_attrs)
839 {
841 "No attributes to move... strange\n");
842 rvk->cb (rvk->cb_cls, GNUNET_OK);
843 cleanup_rvk (rvk);
844 return;
845 }
846 rvk->move_attr = rvk->attrs_head;
847 move_attrs (rvk);
848}
849
850
861static void
863 const struct GNUNET_CRYPTO_BlindablePrivateKey *zone,
864 const char *label,
865 unsigned int rd_count,
866 const struct GNUNET_GNSRECORD_Data *rd)
867
868{
869 struct RECLAIM_TICKETS_RevokeHandle *rvk = cls;
870 struct RevokedAttributeEntry *le;
871
872 rvk->ns_qe = NULL;
877 for (int i = 0; i < rd_count; i++)
878 {
880 continue;
881 le = GNUNET_new (struct RevokedAttributeEntry);
882 le->old_id = *((struct GNUNET_RECLAIM_Identifier *) rd[i].data);
884 rvk->ticket_attrs++;
885 }
886
889 &rvk->identity,
890 label,
891 0,
892 NULL,
894 rvk);
895}
896
897
903static void
905{
906 struct RECLAIM_TICKETS_RevokeHandle *rvk = cls;
907
908 rvk->cb (rvk->cb_cls, GNUNET_SYSERR);
909 cleanup_rvk (rvk);
910}
911
912
927 ,
929 void *cb_cls)
930{
932 char *label;
933 char *tmp;
934
936 rvk->cb = cb;
937 rvk->cb_cls = cb_cls;
938 rvk->identity = *identity;
939 rvk->ticket = *ticket;
941 label = strtok (tmp, ".");
942 GNUNET_assert (NULL != label);
945 identity,
946 label,
948 rvk,
950 rvk);
951 GNUNET_free (tmp);
952 return rvk;
953}
954
955
961void
967
968
969/*******************************
970* Ticket consume
971*******************************/
972
978static void
980{
981 struct ParallelLookup *lu;
982
983 if (NULL != cth->lookup_request)
985 if (NULL != cth->kill_task)
987 while (NULL != (lu = cth->parallel_lookups_head))
988 {
989 if (NULL != lu->lookup_request)
991 GNUNET_free (lu->label);
994 lu);
995 GNUNET_free (lu);
996 }
997
998 if (NULL != cth->attrs)
1000 if (NULL != cth->presentations)
1002 GNUNET_free (cth);
1003}
1004
1005
1006static void
1008 uint32_t rd_count,
1009 const struct GNUNET_GNSRECORD_Data *rd)
1010{
1011 struct ParallelLookup *parallel_lookup = cls;
1012 struct RECLAIM_TICKETS_ConsumeHandle *cth = parallel_lookup->handle;
1013 struct GNUNET_RECLAIM_AttributeListEntry *attr_le;
1015
1017 "Parallel lookup finished (count=%u)\n",
1018 rd_count);
1019
1022 parallel_lookup);
1023 GNUNET_free (parallel_lookup->label);
1024
1026 "attribute_lookup_time_total",
1028 parallel_lookup->lookup_start_time)
1029 .rel_value_us,
1030 GNUNET_YES);
1031 GNUNET_STATISTICS_update (stats, "attribute_lookups_count", 1, GNUNET_YES);
1032
1033
1034 GNUNET_free (parallel_lookup);
1035 if (0 == rd_count)
1036 GNUNET_break (0);
1037 // REMARK: It is possible now to find rd_count > 1
1038 for (int i = 0; i < rd_count; i++)
1039 {
1040 if (GNUNET_GNSRECORD_TYPE_RECLAIM_ATTRIBUTE != rd[i].record_type)
1041 continue;
1044 &attr_le->attribute);
1046 cth->attrs->list_tail,
1047 attr_le);
1048 }
1049 if (NULL != cth->parallel_lookups_head)
1050 return; // Wait for more
1051 /* Else we are done */
1053 );
1054 cth->cb (cth->cb_cls, &iss,
1055 cth->attrs, cth->presentations, GNUNET_OK, NULL);
1056 cleanup_cth (cth);
1057}
1058
1059
1065static void
1067{
1068 struct RECLAIM_TICKETS_ConsumeHandle *cth = cls;
1069 struct ParallelLookup *lu;
1070 struct ParallelLookup *tmp;
1071
1072 cth->kill_task = NULL;
1073 for (lu = cth->parallel_lookups_head; NULL != lu;)
1074 {
1076 GNUNET_free (lu->label);
1077 tmp = lu->next;
1080 lu);
1081 GNUNET_free (lu);
1082 lu = tmp;
1083 }
1084 cth->cb (cth->cb_cls, NULL, NULL, NULL, GNUNET_SYSERR, "Aborted");
1085}
1086
1087
1088static void
1090 int is_gns,
1091 uint32_t rd_count,
1092 const struct GNUNET_GNSRECORD_Data *rd)
1093{
1094 struct RECLAIM_TICKETS_ConsumeHandle *cth = cls;
1096 struct ParallelLookup *parallel_lookup;
1097 const char *rp_uri = NULL;
1098 char *lbl;
1100
1101 cth->lookup_request = NULL;
1102
1103 GNUNET_assert (GNUNET_YES == is_gns);
1105 "reclaim_authz_lookup_time_total",
1107 cth->lookup_start_time)
1108 .rel_value_us,
1109 GNUNET_YES);
1111 "reclaim_authz_lookups_count",
1112 1,
1113 GNUNET_YES);
1114
1116 == GNUNET_GNS_parse_ztld (cth->ticket.gns_name, &iss));
1117 for (int i = 0; i < rd_count; i++)
1118 {
1123 switch (rd[i].record_type)
1124 {
1126 rp_uri = rd[i].data;
1127 break;
1130 ale->presentation =
1132 rd[i].data_size);
1135 ale);
1136 break;
1139 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Ticket reference found %s\n", lbl);
1140 parallel_lookup = GNUNET_new (struct ParallelLookup);
1141 parallel_lookup->handle = cth;
1142 parallel_lookup->label = lbl;
1143 parallel_lookup->lookup_start_time = GNUNET_TIME_absolute_get ();
1144 parallel_lookup->lookup_request =
1146 lbl,
1147 &iss,
1151 parallel_lookup);
1154 parallel_lookup);
1155 break;
1156 default:
1158 "Ignoring unknown record type %d", rd[i].record_type);
1159 }
1160 }
1161 if (NULL == rp_uri)
1162 {
1164 "RP URI not found along references, ignoring...\n");
1168 cth->cb (cth->cb_cls, &iss,
1169 cth->attrs, NULL, GNUNET_NO, NULL);
1170 cleanup_cth (cth);
1171 return;
1172 }
1173 if (0 != strcmp (rp_uri, cth->rp_uri))
1174 {
1176 "RP URI does not match consume request: `%s' != `%s'\n",
1177 rp_uri, cth->rp_uri);
1181 cth->cb (cth->cb_cls, &iss,
1182 cth->attrs, NULL, GNUNET_NO, NULL);
1183 cleanup_cth (cth);
1184 return;
1185 }
1190 if (NULL != cth->parallel_lookups_head)
1191 {
1195 cth);
1196 return;
1197 }
1201 cth->cb (cth->cb_cls, &iss,
1202 cth->attrs, NULL, GNUNET_OK, NULL);
1203 cleanup_cth (cth);
1204}
1205
1206
1220 const char *rp_uri,
1222 void *cb_cls)
1223{
1225
1227
1230 cth->ticket = *ticket;
1231 memcpy (cth->rp_uri, rp_uri, strlen (rp_uri) + 1);
1232 cth->cb = cb;
1233 cth->cb_cls = cb_cls;
1235 cth->lookup_request =
1241 cth);
1242 return cth;
1243}
1244
1245
1251void
1253{
1254 cleanup_cth (cth);
1255 return;
1256}
1257
1258
1259/*******************************
1260 * Ticket issue
1261 *******************************/
1262
1267static void
1269{
1270 if (NULL != handle->ns_qe)
1273}
1274
1275
1284static void
1286{
1287 struct TicketIssueHandle *handle = cls;
1288
1289 handle->ns_qe = NULL;
1290 if (GNUNET_EC_NONE != ec)
1291 {
1292 handle->cb (handle->cb_cls,
1293 &handle->ticket,
1294 NULL,
1296 "Error storing AuthZ ticket in GNS");
1297 return;
1298 }
1299 handle->cb (handle->cb_cls,
1300 &handle->ticket,
1301 handle->presentations,
1302 GNUNET_OK, NULL);
1304}
1305
1306
1314static void
1316{
1319 struct GNUNET_GNSRECORD_Data *attrs_record;
1320 struct GNUNET_RECLAIM_Presentation *presentation;
1322 char *label;
1323 char *tkt_data;
1324 int i;
1325 int j;
1326 int attrs_count = 0;
1327
1328 for (le = ih->attrs->list_head; NULL != le; le = le->next)
1329 attrs_count++;
1330
1331 // Worst case we have one presentation per attribute plus the ticket
1332 // plus the RP URI record
1333 attrs_record =
1334 GNUNET_malloc ((2 * attrs_count + 2)
1335 * sizeof(struct GNUNET_GNSRECORD_Data));
1336 i = 0;
1337 for (le = ih->attrs->list_head; NULL != le; le = le->next)
1338 {
1340 "Adding list entry: %s\n", le->attribute->name);
1341
1342 attrs_record[i].data = &le->attribute->id;
1343 attrs_record[i].data_size = sizeof(le->attribute->id);
1347 i++;
1349 {
1351 "Attribute is backed by credential. Adding...\n");
1352 presentation = NULL;
1353 for (j = 0; j < i; j++)
1354 {
1355 if (attrs_record[j].record_type
1357 continue;
1359 attrs_record[j].data,
1360 attrs_record[j].
1361 data_size);
1362 if (NULL == presentation)
1363 {
1365 "Failed to deserialize presentation\n");
1366 continue;
1367 }
1368 if (0 == memcmp (&presentation->credential_id,
1369 &le->attribute->credential,
1370 sizeof (le->attribute->credential)))
1371 break;
1372 GNUNET_free (presentation);
1373 presentation = NULL;
1374 }
1375 if (NULL != presentation)
1376 {
1377 GNUNET_free (presentation);
1378 continue; // Skip as we have already added this credential presentation.
1379 }
1380 for (ple = ih->presentations->list_head; NULL != ple; ple = ple->next)
1381 {
1383 "Checking presentation....\n");
1384
1385 if (0 != memcmp (&le->attribute->credential,
1387 sizeof (le->attribute->credential)))
1388 {
1390 "Presentation does not match credential ID.\n");
1391 continue;
1392 }
1393 {
1394 char *pres_buf;
1395 size_t pres_size;
1396
1397 pres_size =
1399 pres_buf = GNUNET_malloc (pres_size);
1401 pres_buf);
1402 attrs_record[i].data = pres_buf;
1403 attrs_record[i].data_size = pres_size;
1404 attrs_record[i].expiration_time =
1406 attrs_record[i].record_type =
1409 i++;
1410 break;
1411 }
1412 }
1413 }
1414 }
1415
1416 label =
1418 sizeof(ih->rnd));
1420 &pub);
1421 {
1424 "Storing AuthZ information under %s in %s\n", label, str);
1425 sprintf (ih->ticket.gns_name, "%s.%s", label, str);
1426 GNUNET_free (str);
1427 }
1428
1429 attrs_record[i].data_size =
1430 strlen (ih->ticket.gns_name) + 1;
1431 tkt_data = GNUNET_malloc (attrs_record[i].data_size);
1432 memcpy (tkt_data, &ih->ticket, attrs_record[i].data_size);
1433 // The ticket: Could be removed?
1434 attrs_record[i].data = tkt_data;
1437 attrs_record[i].flags =
1439 i++;
1440 // The RP URI
1441 attrs_record[i].data_size = strlen (ih->rp_uri);
1442 attrs_record[i].data = ih->rp_uri;
1444 attrs_record[i].record_type = GNUNET_DNSPARSER_TYPE_TXT;
1445 attrs_record[i].flags =
1447 i++;
1448
1449 // Publish record
1451 &ih->identity,
1452 label,
1453 i,
1454 attrs_record,
1456 ih);
1457 for (j = 0; j < i; j++)
1458 {
1459 char *ptr = (char*) attrs_record[j].data;
1460 if (attrs_record[j].record_type
1462 continue;
1463 // Yes, we are allowed to do this because we allocated it above
1464 GNUNET_free (ptr);
1465 }
1466 GNUNET_free (tkt_data);
1467 GNUNET_free (attrs_record);
1468 GNUNET_free (label);
1469}
1470
1471
1472/*************************************************
1473 * Ticket iteration (finding a specific ticket)
1474 *************************************************/
1475
1476
1482static void
1484{
1485 struct TicketIssueHandle *tih = cls;
1486
1487 tih->ns_it = NULL;
1488 tih->cb (tih->cb_cls,
1489 &tih->ticket,
1490 NULL,
1492 "Error storing AuthZ ticket in GNS");
1494}
1495
1496
1509static void
1511 const struct GNUNET_CRYPTO_BlindablePrivateKey *zone,
1512 const char *label,
1513 unsigned int rd_count,
1514 const struct GNUNET_GNSRECORD_Data *rd)
1515{
1516 struct TicketIssueHandle *tih = cls;
1518 struct GNUNET_RECLAIM_Presentation *presentation;
1519 struct GNUNET_RECLAIM_PresentationList *ticket_presentations;
1523 unsigned int attr_cnt = 0;
1524 unsigned int pres_cnt = 0;
1525 unsigned int found_attrs_cnt = 0;
1526 unsigned int found_pres_cnt = 0;
1527 int ticket_found = GNUNET_NO;
1528 int rp_uri_matches = GNUNET_NO;
1529
1530 for (le = tih->attrs->list_head; NULL != le; le = le->next)
1531 {
1532 attr_cnt++;
1534 pres_cnt++;
1535 }
1536
1537 // ticket search
1538 found_attrs_cnt = 0;
1539 found_pres_cnt = 0;
1540 ticket_presentations = GNUNET_new (struct GNUNET_RECLAIM_PresentationList);
1541
1542 for (int i = 0; i < rd_count; i++)
1543 {
1544 // found ticket
1545 if (GNUNET_GNSRECORD_TYPE_RECLAIM_TICKET == rd[i].record_type)
1546 {
1547 ticket = (struct GNUNET_RECLAIM_Ticket *) rd[i].data;
1548 tih->ticket = *ticket;
1549 ticket_found = GNUNET_YES;
1550 }
1551 if (GNUNET_DNSPARSER_TYPE_TXT == rd[i].record_type)
1552 {
1553 // cmp audience
1554 if (0 != strncmp (tih->rp_uri,
1555 rd[i].data,
1556 rd[i].data_size))
1557 continue;
1558 rp_uri_matches = GNUNET_YES;
1559 }
1560 // cmp requested attributes with ticket attributes
1561 if (GNUNET_GNSRECORD_TYPE_RECLAIM_ATTRIBUTE_REF == rd[i].record_type)
1562 {
1563 for (le = tih->attrs->list_head; NULL != le; le = le->next)
1564 {
1566 &le->attribute->id))
1567 found_attrs_cnt++;
1568 }
1569 }
1570 if (GNUNET_GNSRECORD_TYPE_RECLAIM_CREDENTIAL == rd[i].record_type)
1571 {
1573 "Found credential...\n");
1574
1575 for (le = tih->attrs->list_head; NULL != le; le = le->next)
1576 {
1578 rd[i].data_size);
1580 &le->attribute->credential
1581 ))
1582 {
1584 "No match.\n");
1585 GNUNET_free (cred);
1586 continue;
1587 }
1589 "Match, creating presentation...\n");
1591 cred,
1592 tih->attrs,
1593 &presentation))
1594 {
1596 "Unable to retrieve presentation from credential\n");
1597 GNUNET_free (cred);
1598 continue;
1599 }
1601 ple->presentation = presentation;
1604 ple);
1605 GNUNET_free (cred);
1606 break;
1607 }
1608 }
1609 if (GNUNET_GNSRECORD_TYPE_RECLAIM_PRESENTATION == rd[i].record_type)
1610 {
1611 for (le = tih->attrs->list_head; NULL != le; le = le->next)
1612 {
1614 rd[i].data_size)
1615 ;
1616 if (NULL == presentation)
1617 {
1619 "Failed to deserialize presentation\n");
1620 continue;
1621 }
1623 &presentation->credential_id,
1624 &le->attribute->credential))
1625 {
1626 found_pres_cnt++;
1628 ple->presentation = presentation;
1629 GNUNET_CONTAINER_DLL_insert (ticket_presentations->list_head,
1630 ticket_presentations->list_tail,
1631 ple);
1632 }
1633 }
1634 }
1635 }
1636
1641 if ((attr_cnt == found_attrs_cnt) &&
1642 (pres_cnt == found_pres_cnt) &&
1643 (GNUNET_YES == ticket_found) &&
1644 (GNUNET_YES == rp_uri_matches))
1645 {
1647 tih->cb (tih->cb_cls, &tih->ticket, ticket_presentations, GNUNET_OK, NULL);
1648 GNUNET_RECLAIM_presentation_list_destroy (ticket_presentations);
1650 return;
1651 }
1652 GNUNET_RECLAIM_presentation_list_destroy (ticket_presentations);
1653 // ticket not found in current record, checking next record set
1655}
1656
1657
1665static void
1667{
1668 struct TicketIssueHandle *tih = cls;
1669
1671 issue_ticket (tih);
1672}
1673
1674
1686void
1688 const struct GNUNET_RECLAIM_AttributeList *attrs,
1689 const char *rp,
1691 void *cb_cls)
1692{
1693 struct TicketIssueHandle *tih;
1694
1695 tih = GNUNET_new (struct TicketIssueHandle);
1696 tih->cb = cb;
1697 tih->cb_cls = cb_cls;
1700 tih->identity = *identity;
1701 memcpy (tih->rp_uri, rp, strlen (rp) + 1);
1702
1703 // First check whether the ticket has already been issued
1704 tih->ns_it =
1706 &tih->identity,
1708 tih,
1710 tih,
1712 tih);
1713}
1714
1715
1716/************************************
1717 * Ticket iteration
1718 ************************************/
1719
1725static void
1727{
1728 if (NULL != iter->ns_it)
1730 GNUNET_free (iter);
1731}
1732
1733
1745static void
1747 const struct GNUNET_CRYPTO_BlindablePrivateKey *zone,
1748 const char *label,
1749 unsigned int rd_count,
1750 const struct GNUNET_GNSRECORD_Data *rd)
1751{
1752 struct RECLAIM_TICKETS_Iterator *iter = cls;
1754 int ticket_found = GNUNET_NO;
1755 const char *rp_uri = NULL;
1756
1757 for (int i = 0; i < rd_count; i++)
1758 {
1759 if (GNUNET_DNSPARSER_TYPE_TXT == rd[i].record_type)
1760 rp_uri = rd[i].data;
1761 if (GNUNET_GNSRECORD_TYPE_RECLAIM_TICKET != rd[i].record_type)
1762 continue;
1763 if ((GNUNET_YES == ticket_found) && (NULL != rp_uri))
1764 break;
1765 ticket = (struct GNUNET_RECLAIM_Ticket *) rd[i].data;
1766 ticket_found = GNUNET_YES;
1767 }
1768 if ((GNUNET_YES == ticket_found) && (NULL != rp_uri))
1769 iter->cb (iter->cb_cls, ticket, rp_uri);
1771}
1772
1773
1779static void
1781{
1782 struct RECLAIM_TICKETS_Iterator *iter = cls;
1783
1784 iter->ns_it = NULL;
1785 iter->cb (iter->cb_cls, NULL, NULL);
1786 cleanup_iter (iter);
1787}
1788
1789
1795static void
1797{
1798 struct RECLAIM_TICKETS_Iterator *iter = cls;
1799
1800 iter->ns_it = NULL;
1801 iter->cb (iter->cb_cls, NULL, NULL);
1802 cleanup_iter (iter);
1803}
1804
1805
1811void
1816
1817
1823void
1829
1830
1843 void *cb_cls)
1844{
1845 struct RECLAIM_TICKETS_Iterator *iter;
1846
1847 iter = GNUNET_new (struct RECLAIM_TICKETS_Iterator);
1848 iter->cb = cb;
1849 iter->cb_cls = cb_cls;
1850 iter->ns_it =
1852 identity,
1854 iter,
1856 iter,
1858 iter);
1859 return iter;
1860}
1861
1862
1869int
1871{
1872 // Get ticket expiration time (relative) from config
1873 if (GNUNET_OK ==
1875 "reclaim",
1876 "TICKET_REFRESH_INTERVAL",
1878 {
1880 "Configured refresh interval for tickets: %s\n",
1882 GNUNET_YES));
1883 }
1884 else
1885 {
1887 }
1888 // Connect to identity and namestore services
1890 if (NULL == nsh)
1891 {
1893 "error connecting to namestore");
1894 return GNUNET_SYSERR;
1895 }
1896 gns = GNUNET_GNS_connect (c);
1897 if (NULL == gns)
1898 {
1899 GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR, "error connecting to gns");
1900 return GNUNET_SYSERR;
1901 }
1902 stats = GNUNET_STATISTICS_create ("reclaim", c);
1903 return GNUNET_OK;
1904}
1905
1906
1911void
1913{
1914 if (NULL != nsh)
1916 nsh = NULL;
1917 if (NULL != gns)
1919 gns = NULL;
1920 if (NULL != stats)
1921 {
1923 stats = NULL;
1924 }
1925}
#define GNUNET_GNSRECORD_TYPE_RECLAIM_ATTRIBUTE
identity attribute
#define GNUNET_GNSRECORD_TYPE_RECLAIM_PRESENTATION
Record type for a presentation of a credential.
#define GNUNET_GNSRECORD_TYPE_RECLAIM_ATTRIBUTE_REF
for reclaim records
#define GNUNET_GNSRECORD_TYPE_RECLAIM_CREDENTIAL
Record type for an attribute attestation (e.g.
#define GNUNET_GNSRECORD_TYPE_RECLAIM_TICKET
local ticket reference
static gnutls_certificate_credentials_t cred
The credential.
static char * data
The data to insert into the dht.
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 size_t data_size
Number of bytes in data.
static struct GNUNET_IDENTITY_Handle * identity
Which namespace do we publish to? NULL if we do not publish to a namespace.
struct GNUNET_RECLAIM_Attribute * claim
Claim to store.
static struct GNUNET_RECLAIM_Ticket ticket
Ticket to consume.
static char * rp
Relying party.
static struct GNUNET_RECLAIM_Identifier credential
Credential ID.
static struct GNUNET_CRYPTO_EddsaPublicKey pub
void RECLAIM_TICKETS_iteration_stop(struct RECLAIM_TICKETS_Iterator *iter)
Stop a running ticket iteration.
static struct GNUNET_GNS_Handle * gns
static void cleanup_rvk(struct RECLAIM_TICKETS_RevokeHandle *rh)
Cleanup revoke handle.
static void filter_tickets_finished_cb(void *cls)
Done iterating over tickets and we apparently did not find an existing, matching ticket.
void RECLAIM_TICKETS_consume_cancel(struct RECLAIM_TICKETS_ConsumeHandle *cth)
Cancel a consume operation.
static void revoke_attrs_cb(void *cls, const struct GNUNET_CRYPTO_BlindablePrivateKey *zone, const char *label, unsigned int rd_count, const struct GNUNET_GNSRECORD_Data *rd)
We found the attribute references.
static void collect_tickets_finished_cb(void *cls)
Signal ticket iteration has finished.
static void rvk_move_attr_cb(void *cls, const struct GNUNET_CRYPTO_BlindablePrivateKey *zone, const char *label, unsigned int rd_count, const struct GNUNET_GNSRECORD_Data *rd)
Got the referenced attribute.
static void move_attrs_cont(void *cls)
Delayed continuation for move_attrs.
static void abort_parallel_lookups(void *cls)
Cancel the lookups for attribute records.
void RECLAIM_TICKETS_revoke_cancel(struct RECLAIM_TICKETS_RevokeHandle *rh)
Cancel a revocation.
static void lookup_authz_cb(void *cls, int is_gns, uint32_t rd_count, const struct GNUNET_GNSRECORD_Data *rd)
static void rvk_ticket_update_finished(void *cls)
Done collecting tickets.
static struct GNUNET_STATISTICS_Handle * stats
#define DEFAULT_TICKET_REFRESH_INTERVAL
FIXME: the default ticket iteration interval should probably be the minimum attribute expiration.
int RECLAIM_TICKETS_init(const struct GNUNET_CONFIGURATION_Handle *c)
Initialize tickets component.
static void cleanup_iter(struct RECLAIM_TICKETS_Iterator *iter)
Cleanup ticket iterator.
static struct GNUNET_TIME_Relative ticket_refresh_interval
Ticket expiration interval.
void RECLAIM_TICKETS_iteration_next(struct RECLAIM_TICKETS_Iterator *iter)
Continue ticket iteration.
void RECLAIM_TICKETS_issue(const struct GNUNET_CRYPTO_BlindablePrivateKey *identity, const struct GNUNET_RECLAIM_AttributeList *attrs, const char *rp, RECLAIM_TICKETS_TicketResult cb, void *cb_cls)
Issue a new reclaim ticket, thereby authorizing the audience to access the set of provided attributes...
static void collect_tickets_error_cb(void *cls)
Cancel ticket iteration on namestore error.
static void filter_tickets_cb(void *cls, const struct GNUNET_CRYPTO_BlindablePrivateKey *zone, const char *label, unsigned int rd_count, const struct GNUNET_GNSRECORD_Data *rd)
Iterator over records.
static void move_attrs(struct RECLAIM_TICKETS_RevokeHandle *rh)
We change every attribute ID of the ticket attributes we want to revoke.
static void remove_ticket_cont(void *cls, enum GNUNET_ErrorCode ec)
Finished deleting ticket and attribute references.
static void cleanup_cth(struct RECLAIM_TICKETS_ConsumeHandle *cth)
Cleanup ticket consume handle.
static void store_ticket_issue_cont(void *cls, enum GNUNET_ErrorCode ec)
Store finished, abort on error.
static void del_attr_finished(void *cls, enum GNUNET_ErrorCode ec)
Done deleting the old record.
static void process_tickets(void *cls)
For each ticket, store new, updated attribute references (Implementation further below)
static void cleanup_issue_handle(struct TicketIssueHandle *handle)
Cleanup ticket consume handle.
static void move_attr_finished(void *cls, enum GNUNET_ErrorCode ec)
Updated an attribute ID.
static void issue_ticket(struct TicketIssueHandle *ih)
Issue a new ticket.
static void filter_tickets_error_cb(void *cls)
Namestore error on issue.
static struct GNUNET_NAMESTORE_Handle * nsh
static void rvk_ns_err(void *cls)
Error storing new attribute in namestore.
static void rvk_ns_iter_err(void *cls)
Error iterating namestore.
static void ticket_processed(void *cls, enum GNUNET_ErrorCode ec)
Finished storing updated attribute references.
struct RECLAIM_TICKETS_ConsumeHandle * RECLAIM_TICKETS_consume(const struct GNUNET_RECLAIM_Ticket *ticket, const char *rp_uri, RECLAIM_TICKETS_ConsumeCallback cb, void *cb_cls)
Consume a ticket.
struct RECLAIM_TICKETS_RevokeHandle * RECLAIM_TICKETS_revoke(const struct GNUNET_RECLAIM_Ticket *ticket, const struct GNUNET_CRYPTO_BlindablePrivateKey *identity, RECLAIM_TICKETS_RevokeCallback cb, void *cb_cls)
Revoke a ticket.
static void rvk_ticket_update(void *cls, const struct GNUNET_CRYPTO_BlindablePrivateKey *zone, const char *label, unsigned int rd_count, const struct GNUNET_GNSRECORD_Data *rd)
We need to update all other tickets with the new attribute IDs.
static void collect_tickets_cb(void *cls, const struct GNUNET_CRYPTO_BlindablePrivateKey *zone, const char *label, unsigned int rd_count, const struct GNUNET_GNSRECORD_Data *rd)
Return each record of type GNUNET_GNSRECORD_TYPE_RECLAIM_TICKET to the caller and proceed with the it...
struct RECLAIM_TICKETS_Iterator * RECLAIM_TICKETS_iteration_start(const struct GNUNET_CRYPTO_BlindablePrivateKey *identity, RECLAIM_TICKETS_TicketIter cb, void *cb_cls)
Iterate over all tickets issued by an identity.
static void rvk_attrs_err_cb(void *cls)
Failed to query namestore.
void RECLAIM_TICKETS_deinit(void)
Close handles and clean up.
static void process_parallel_lookup_result(void *cls, uint32_t rd_count, const struct GNUNET_GNSRECORD_Data *rd)
void(* RECLAIM_TICKETS_TicketIter)(void *cls, struct GNUNET_RECLAIM_Ticket *ticket, const char *rp_uri)
Continuation called with ticket.
void(* RECLAIM_TICKETS_ConsumeCallback)(void *cls, const struct GNUNET_CRYPTO_BlindablePublicKey *identity, const struct GNUNET_RECLAIM_AttributeList *attributes, const struct GNUNET_RECLAIM_PresentationList *presentations, int32_t success, const char *emsg)
Consume callback.
void(* RECLAIM_TICKETS_TicketResult)(void *cls, struct GNUNET_RECLAIM_Ticket *ticket, struct GNUNET_RECLAIM_PresentationList *presentations, int32_t success, const char *emsg)
Continuation called with ticket.
void(* RECLAIM_TICKETS_RevokeCallback)(void *cls, int32_t success)
Revocation callback.
static struct GNUNET_VPN_Handle * handle
Handle to vpn service.
Definition gnunet-vpn.c:35
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).
API to the GNS service.
API that can be used to manipulate GNS record data.
reclaim service; implements identity and personal data sharing for GNUnet
enum GNUNET_GenericReturnValue GNUNET_CONFIGURATION_get_value_time(const struct GNUNET_CONFIGURATION_Handle *cfg, const char *section, const char *option, struct GNUNET_TIME_Relative *time)
Get a configuration value that should be a relative time.
#define GNUNET_CONTAINER_DLL_remove(head, tail, element)
Remove an element from a DLL.
#define GNUNET_CONTAINER_DLL_insert(head, tail, element)
Insert an element at the head of a DLL.
#define GNUNET_DNSPARSER_TYPE_TXT
void GNUNET_GNS_disconnect(struct GNUNET_GNS_Handle *handle)
Shutdown connection with the GNS service.
Definition gns_api.c:289
struct GNUNET_GNS_LookupWithTldRequest * GNUNET_GNS_lookup_with_tld(struct GNUNET_GNS_Handle *handle, const char *name, uint32_t type, enum GNUNET_GNS_LocalOptions options, GNUNET_GNS_LookupResultProcessor2 proc, void *proc_cls)
Perform an asynchronous lookup operation on the GNS, determining the zone using the TLD of the given ...
struct GNUNET_GNS_LookupRequest * GNUNET_GNS_lookup(struct GNUNET_GNS_Handle *handle, const char *name, const struct GNUNET_CRYPTO_BlindablePublicKey *zone, uint32_t type, enum GNUNET_GNS_LocalOptions options, GNUNET_GNS_LookupResultProcessor proc, void *proc_cls)
Perform an asynchronous lookup operation on the GNS.
Definition gns_api.c:421
void * GNUNET_GNS_lookup_with_tld_cancel(struct GNUNET_GNS_LookupWithTldRequest *ltr)
Cancel pending lookup request.
enum GNUNET_GenericReturnValue GNUNET_GNS_parse_ztld(const char *name, struct GNUNET_CRYPTO_BlindablePublicKey *ztld_key)
Try to parse the zTLD into a public key.
void * GNUNET_GNS_lookup_cancel(struct GNUNET_GNS_LookupRequest *lr)
Cancel pending lookup request.
Definition gns_api.c:313
struct GNUNET_GNS_Handle * GNUNET_GNS_connect(const struct GNUNET_CONFIGURATION_Handle *cfg)
Initialize the connection with the GNS service.
Definition gns_api.c:267
@ GNUNET_GNS_LO_DEFAULT
Defaults, look in cache, then in DHT.
int GNUNET_GNSRECORD_records_deserialize(size_t len, const char *src, unsigned int rd_count, struct GNUNET_GNSRECORD_Data *dest)
Deserialize the given records to the given destination.
ssize_t GNUNET_GNSRECORD_records_serialize(unsigned int rd_count, const struct GNUNET_GNSRECORD_Data *rd, size_t dest_size, char *dest)
Serialize the given records to the given destination buffer.
ssize_t GNUNET_GNSRECORD_records_get_size(unsigned int rd_count, const struct GNUNET_GNSRECORD_Data *rd)
Calculate how many bytes we will need to serialize the given records.
#define GNUNET_GNSRECORD_TYPE_ANY
Record type indicating any record/'*'.
@ GNUNET_GNSRECORD_RF_RELATIVE_EXPIRATION
This expiration time of the record is a relative time (not an absolute time).
@ GNUNET_GNSRECORD_RF_PRIVATE
This is a private record of this peer and it should thus not be published.
enum GNUNET_GenericReturnValue GNUNET_CRYPTO_blindable_key_get_public(const struct GNUNET_CRYPTO_BlindablePrivateKey *privkey, struct GNUNET_CRYPTO_BlindablePublicKey *key)
Retrieves the public key representation of a private key.
#define GNUNET_log(kind,...)
char * GNUNET_CRYPTO_blindable_public_key_to_string(const struct GNUNET_CRYPTO_BlindablePublicKey *key)
Creates a (Base32) string representation of the public key.
@ 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.
#define GNUNET_log_strerror(level, cmd)
Log an error message at log-level 'level' that indicates a failure of the command 'cmd' with the mess...
@ GNUNET_ERROR_TYPE_WARNING
@ GNUNET_ERROR_TYPE_ERROR
@ GNUNET_ERROR_TYPE_DEBUG
#define GNUNET_strdup(a)
Wrapper around GNUNET_xstrdup_.
#define GNUNET_new(type)
Allocate a struct or union of the given type.
#define GNUNET_malloc(size)
Wrapper around malloc.
#define GNUNET_free(ptr)
Wrapper around free.
struct GNUNET_NAMESTORE_QueueEntry * GNUNET_NAMESTORE_record_set_store(struct GNUNET_NAMESTORE_Handle *h, const struct GNUNET_CRYPTO_BlindablePrivateKey *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.
struct GNUNET_NAMESTORE_ZoneIterator * GNUNET_NAMESTORE_zone_iteration_start(struct GNUNET_NAMESTORE_Handle *h, const struct GNUNET_CRYPTO_BlindablePrivateKey *zone, GNUNET_SCHEDULER_TaskCallback error_cb, void *error_cb_cls, GNUNET_NAMESTORE_RecordMonitor proc, void *proc_cls, GNUNET_SCHEDULER_TaskCallback finish_cb, void *finish_cb_cls)
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_lookup(struct GNUNET_NAMESTORE_Handle *h, const struct GNUNET_CRYPTO_BlindablePrivateKey *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_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.
#define GNUNET_RECLAIM_id_is_equal(a, b)
void GNUNET_RECLAIM_attribute_list_destroy(struct GNUNET_RECLAIM_AttributeList *attrs)
Destroy claim list.
struct GNUNET_RECLAIM_Presentation * GNUNET_RECLAIM_presentation_deserialize(const char *data, size_t data_size)
Deserialize a presentation.
size_t GNUNET_RECLAIM_presentation_serialize_get_size(const struct GNUNET_RECLAIM_Presentation *presentation)
Get required size for serialization buffer.
int GNUNET_RECLAIM_credential_get_presentation(const struct GNUNET_RECLAIM_Credential *cred, const struct GNUNET_RECLAIM_AttributeList *attrs, struct GNUNET_RECLAIM_Presentation **presentation)
Create a presentation from a credential and a lift of (selected) attributes in the credential.
#define GNUNET_RECLAIM_id_is_zero(a)
size_t GNUNET_RECLAIM_presentation_serialize(const struct GNUNET_RECLAIM_Presentation *presentation, char *result)
Serialize a presentation.
struct GNUNET_RECLAIM_AttributeList * GNUNET_RECLAIM_attribute_list_dup(const struct GNUNET_RECLAIM_AttributeList *attrs)
Make a (deep) copy of a claim list.
void GNUNET_RECLAIM_presentation_list_destroy(struct GNUNET_RECLAIM_PresentationList *presentations)
Destroy presentations list.
#define GNUNET_RECLAIM_id_generate(id)
size_t GNUNET_RECLAIM_attribute_serialize_get_size(const struct GNUNET_RECLAIM_Attribute *attr)
Get required size for serialization buffer.
ssize_t GNUNET_RECLAIM_attribute_deserialize(const char *data, size_t data_size, struct GNUNET_RECLAIM_Attribute **attr)
Deserialize an attribute.
size_t GNUNET_RECLAIM_credential_serialize(const struct GNUNET_RECLAIM_Credential *credential, char *result)
Serialize an credential.
struct GNUNET_RECLAIM_Credential * GNUNET_RECLAIM_credential_deserialize(const char *data, size_t data_size)
Deserialize an credential.
size_t GNUNET_RECLAIM_credential_serialize_get_size(const struct GNUNET_RECLAIM_Credential *credential)
Get required size for serialization buffer.
size_t GNUNET_RECLAIM_attribute_serialize(const struct GNUNET_RECLAIM_Attribute *attr, char *result)
Serialize an attribute.
#define GNUNET_RECLAIM_TICKET_RP_URI_MAX_LEN
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
struct GNUNET_SCHEDULER_Task * GNUNET_SCHEDULER_add_delayed(struct GNUNET_TIME_Relative delay, GNUNET_SCHEDULER_TaskCallback task, void *task_cls)
Schedule a new task to be run with a specified delay.
Definition scheduler.c:1277
struct GNUNET_STATISTICS_Handle * GNUNET_STATISTICS_create(const char *subsystem, const struct GNUNET_CONFIGURATION_Handle *cfg)
Get handle for the statistics service.
void GNUNET_STATISTICS_update(struct GNUNET_STATISTICS_Handle *handle, const char *name, int64_t delta, int make_persistent)
Set statistic value for the peer.
void GNUNET_STATISTICS_destroy(struct GNUNET_STATISTICS_Handle *h, int sync_first)
Destroy a handle (free all state associated with it).
char * GNUNET_STRINGS_data_to_string_alloc(const void *buf, size_t size)
Return the base32crockford encoding of the given buffer.
Definition strings.c:807
struct GNUNET_TIME_Relative GNUNET_TIME_absolute_get_duration(struct GNUNET_TIME_Absolute whence)
Get the duration of an operation as the difference of the current time and the given start time "henc...
Definition time.c:438
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:599
struct GNUNET_TIME_Absolute GNUNET_TIME_absolute_get(void)
Get the current time.
Definition time.c:111
#define GNUNET_TIME_UNIT_MINUTES
One minute.
struct GNUNET_TIME_Relative GNUNET_TIME_relative_multiply(struct GNUNET_TIME_Relative rel, unsigned long long factor)
Multiply relative time by a given factor.
Definition time.c:486
A private key for an identity as per LSD0001.
An identity key as per LSD0001.
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.
Connection to the GNS service.
Definition gns_api.h:36
Handle to a lookup request.
Definition gns_api.c:48
Handle to a lookup request.
Definition gns_tld_api.c:45
Connection to the NAMESTORE service.
An QueueEntry used to store information for a pending NAMESTORE record operation.
Handle for a zone iterator operation.
struct GNUNET_RECLAIM_Attribute * attribute
The attribute claim.
struct GNUNET_RECLAIM_AttributeListEntry * next
DLL.
A list of GNUNET_RECLAIM_Attribute structures.
struct GNUNET_RECLAIM_AttributeListEntry * list_tail
List tail.
struct GNUNET_RECLAIM_AttributeListEntry * list_head
List head.
const char * name
The name of the attribute.
struct GNUNET_RECLAIM_Identifier credential
Referenced ID of credential (may be GNUNET_RECLAIM_ID_ZERO if self-creded)
struct GNUNET_RECLAIM_Identifier id
ID.
A reclaim identifier FIXME maybe put this in a different namespace.
struct GNUNET_RECLAIM_Presentation * presentation
The credential.
struct GNUNET_RECLAIM_PresentationListEntry * next
DLL.
A list of GNUNET_RECLAIM_Presentation structures.
struct GNUNET_RECLAIM_PresentationListEntry * list_head
List head.
struct GNUNET_RECLAIM_PresentationListEntry * list_tail
List tail.
A credential presentation.
struct GNUNET_RECLAIM_Identifier credential_id
The credential id of which this is a presentation.
The authorization ticket.
char gns_name[63 *2+2]
The ticket.
Entry in list of pending tasks.
Definition scheduler.c:136
Handle for the service.
Time for absolute times used by GNUnet, in microseconds.
Time for relative time used by GNUnet, in microseconds.
uint64_t rel_value_us
The actual value.
Handle for a parallel GNS lookup job.
struct GNUNET_TIME_Absolute lookup_start_time
Lookup time.
struct RECLAIM_TICKETS_ConsumeHandle * handle
struct ParallelLookup * prev
struct ParallelLookup * next
struct GNUNET_GNS_LookupRequest * lookup_request
RECLAIM_TICKETS_ConsumeCallback cb
Callback.
char rp_uri[GNUNET_RECLAIM_TICKET_RP_URI_MAX_LEN]
The ticket audience (= relying party) URI.
struct GNUNET_TIME_Absolute lookup_start_time
Lookup time.
struct GNUNET_RECLAIM_AttributeList * attrs
Attributes.
struct ParallelLookup * parallel_lookups_tail
Lookup DLL.
struct GNUNET_RECLAIM_Ticket ticket
Ticket.
struct ParallelLookup * parallel_lookups_head
Lookup DLL.
struct GNUNET_GNS_LookupWithTldRequest * lookup_request
LookupRequest.
struct GNUNET_RECLAIM_PresentationList * presentations
Presentations.
struct GNUNET_SCHEDULER_Task * kill_task
Kill task.
RECLAIM_TICKETS_TicketIter cb
Iter callback.
struct GNUNET_NAMESTORE_ZoneIterator * ns_it
Namestore queue entry.
Ticket revocation request handle.
struct GNUNET_CRYPTO_BlindablePrivateKey identity
Issuer Key.
struct GNUNET_RECLAIM_Ticket ticket
Ticket to issue.
struct TicketRecordsEntry * tickets_to_update_head
Tickets to update.
struct TicketRecordsEntry * tickets_to_update_tail
Tickets to update.
struct RevokedAttributeEntry * move_attr
Current attribute to move.
RECLAIM_TICKETS_RevokeCallback cb
Callback.
struct RevokedAttributeEntry * attrs_tail
Revoked attributes.
struct GNUNET_NAMESTORE_ZoneIterator * ns_it
Namestore iterator.
struct GNUNET_NAMESTORE_QueueEntry * ns_qe
QueueEntry.
unsigned int ticket_attrs
Number of attributes in ticket.
struct RevokedAttributeEntry * attrs_head
Revoked attributes.
struct GNUNET_RECLAIM_Identifier old_id
Old ID of the attribute.
struct RevokedAttributeEntry * next
DLL.
struct RevokedAttributeEntry * prev
DLL.
struct GNUNET_RECLAIM_Identifier new_id
New ID of the attribute.
Ticket issue request handle.
struct GNUNET_RECLAIM_AttributeList * attrs
Attributes to issue.
struct GNUNET_NAMESTORE_ZoneIterator * ns_it
Namestore Iterator.
struct GNUNET_NAMESTORE_QueueEntry * ns_qe
QueueEntry.
struct GNUNET_RECLAIM_PresentationList * presentations
Presentations to add.
RECLAIM_TICKETS_TicketResult cb
Callback.
char rp_uri[GNUNET_RECLAIM_TICKET_RP_URI_MAX_LEN]
The ticket audience (= relying party) URI.
struct GNUNET_CRYPTO_BlindablePrivateKey identity
Issuer Key.
struct GNUNET_RECLAIM_Ticket ticket
Ticket to issue.
struct GNUNET_RECLAIM_Identifier rnd
The ticket random identifier.
unsigned int rd_count
Record count.
A reference to a ticket stored in GNS.
struct TicketReference * prev
DLL.
struct GNUNET_RECLAIM_AttributeList * attrs
Attributes.
struct GNUNET_RECLAIM_Ticket ticket
Tickets.
struct TicketReference * next
DLL.
const char * str
Definition time.c:1252