GNUnet 0.21.1
gnunet-service-reclaim.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 */
25#include "platform.h"
26#include "gnunet_util_lib.h"
29#include "gnunet_protocols.h"
30#include "gnunet_reclaim_lib.h"
32#include "reclaim.h"
33
34
39
44
48static const struct GNUNET_CONFIGURATION_Handle *cfg;
49
53struct IdpClient;
54
59{
64
69
74
78 uint32_t r_id;
79
84};
85
86
91{
95 struct Iterator *next;
96
100 struct Iterator *prev;
101
106
111
116
120 uint32_t request_id;
121
125 void *ctx;
126};
127
128
133{
138
143
148
153
160
167
174
181
186
191
196
201
206
211
216
221
226
235
240};
241
242
247{
252
257
262
267
268
273
278
283
288
293
298
303
308
312 char *label;
313
317 uint32_t r_id;
318};
319
320
325{
330
335
340
345
350
355
360
365
370
374 uint32_t r_id;
375};
376
377
382{
387
392
397
401 uint32_t r_id;
402
407};
408
409
414{
419
424
429
434
438 uint32_t r_id;
439};
440
441
446{
451
456
461
465 uint32_t r_id;
466};
467
468
472static struct IdpClient *client_list_head = NULL;
473
477static struct IdpClient *client_list_tail = NULL;
478
479
485static void
487{
488 struct TicketRecordsEntry *le;
489
490 if (NULL != adh->ns_it)
492 if (NULL != adh->ns_qe)
494 if (NULL != adh->label)
495 GNUNET_free (adh->label);
496 if (NULL != adh->claim)
497 GNUNET_free (adh->claim);
498 if (NULL != adh->credential)
499 GNUNET_free (adh->credential);
500 if (NULL != adh->existing_credentials)
502 if (NULL != adh->existing_attributes)
504 while (NULL != (le = adh->tickets_to_update_head))
505 {
508 le);
509 if (NULL != le->label)
510 GNUNET_free (le->label);
511 if (NULL != le->data)
512 GNUNET_free (le->data);
513 GNUNET_free (le);
514 }
515 GNUNET_free (adh);
516}
517
518
524static void
526{
527 if (NULL != ash->ns_qe)
529 if (NULL != ash->claim)
530 GNUNET_free (ash->claim);
531 if (NULL != ash->credential)
532 GNUNET_free (ash->credential);
533 GNUNET_free (ash);
534}
535
536
542static void
544{
545 struct Iterator *ai;
546 struct TicketIteration *ti;
547 struct TicketRevocationOperation *rop;
548 struct TicketIssueOperation *iss;
549 struct ConsumeTicketOperation *ct;
550 struct AttributeStoreHandle *as;
551 struct AttributeDeleteHandle *adh;
552
553 while (NULL != (iss = idp->issue_op_head))
554 {
555 GNUNET_CONTAINER_DLL_remove (idp->issue_op_head, idp->issue_op_tail, iss);
556 GNUNET_free (iss);
557 }
558 while (NULL != (ct = idp->consume_op_head))
559 {
560 GNUNET_CONTAINER_DLL_remove (idp->consume_op_head,
561 idp->consume_op_tail,
562 ct);
563 if (NULL != ct->ch)
565 GNUNET_free (ct);
566 }
567 while (NULL != (as = idp->store_op_head))
568 {
569 GNUNET_CONTAINER_DLL_remove (idp->store_op_head, idp->store_op_tail, as);
571 }
572 while (NULL != (adh = idp->delete_op_head))
573 {
574 GNUNET_CONTAINER_DLL_remove (idp->delete_op_head, idp->delete_op_tail, adh);
575 cleanup_adh (adh);
576 }
577
578 while (NULL != (ai = idp->attr_iter_head))
579 {
580 GNUNET_CONTAINER_DLL_remove (idp->attr_iter_head, idp->attr_iter_tail, ai);
581 GNUNET_free (ai);
582 }
583 while (NULL != (ai = idp->cred_iter_head))
584 {
585 GNUNET_CONTAINER_DLL_remove (idp->cred_iter_head, idp->cred_iter_tail,
586 ai);
587 GNUNET_free (ai);
588 }
589
590 while (NULL != (rop = idp->revoke_op_head))
591 {
592 GNUNET_CONTAINER_DLL_remove (idp->revoke_op_head, idp->revoke_op_tail, rop);
593 if (NULL != rop->rh)
595 GNUNET_free (rop);
596 }
597 while (NULL != (ti = idp->ticket_iter_head))
598 {
599 GNUNET_CONTAINER_DLL_remove (idp->ticket_iter_head,
600 idp->ticket_iter_tail,
601 ti);
602 if (NULL != ti->iter)
604 GNUNET_free (ti);
605 }
607}
608
609
613static void
615{
616 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Cleaning up\n");
617
619 if (NULL != timeout_task)
621 if (NULL != nsh)
623}
624
625
631static void
632do_shutdown (void *cls)
633{
634 GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Shutting down...\n");
635 cleanup ();
636}
637
638
647static void
649 uint32_t r_id,
650 const struct GNUNET_RECLAIM_Ticket *ticket,
651 const struct GNUNET_RECLAIM_PresentationList *presentations,
652 uint32_t success)
653{
654 struct TicketResultMessage *irm;
655 struct GNUNET_MQ_Envelope *env;
656 size_t pres_len = 0;
657 size_t tkt_len = 0;
658 ssize_t written;
659 char *buf;
660
661 if (NULL != presentations)
662 {
663 pres_len =
665 }
666 if (NULL != ticket)
669 pres_len + tkt_len,
671 buf = (char*) &irm[1];
672 if (NULL != ticket)
673 {
674 written = GNUNET_RECLAIM_write_ticket_to_buffer (ticket, buf, tkt_len);
675 GNUNET_assert (0 <= written);
676 buf += written;
677 }
678 // TODO add success member
679 irm->id = htonl (r_id);
680 irm->tkt_len = htons (tkt_len);
681 irm->presentations_len = htons (pres_len);
682 if (NULL != presentations)
683 {
685 buf);
686 }
687 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Sending TICKET_RESULT message\n");
688 GNUNET_MQ_send (client->mq, env);
689}
690
691
701static void
704 struct GNUNET_RECLAIM_PresentationList *presentations,
705 int32_t success,
706 const char *emsg)
707{
708 struct TicketIssueOperation *tio = cls;
709
710 if (GNUNET_OK != success)
711 {
712 send_ticket_result (tio->client, tio->r_id, NULL, NULL, GNUNET_SYSERR);
713 GNUNET_CONTAINER_DLL_remove (tio->client->issue_op_head,
714 tio->client->issue_op_tail,
715 tio);
717 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Error issuing ticket: %s\n", emsg);
718 return;
719 }
720 send_ticket_result (tio->client, tio->r_id,
721 ticket, presentations, GNUNET_SYSERR);
722 GNUNET_CONTAINER_DLL_remove (tio->client->issue_op_head,
723 tio->client->issue_op_tail,
724 tio);
726}
727
728
736static int
738{
739 uint16_t size;
740 size_t attrs_len;
741 size_t key_len;
742 size_t pkey_len;
743
744 size = ntohs (im->header.size);
745 attrs_len = ntohs (im->attr_len);
746 key_len = ntohs (im->key_len);
747 pkey_len = ntohs (im->pkey_len);
748 if (size != attrs_len + key_len + pkey_len + sizeof(struct
750 {
751 GNUNET_break (0);
752 return GNUNET_SYSERR;
753 }
754 return GNUNET_OK;
755}
756
757
764static void
766{
768 struct IdpClient *idp = cls;
769 struct GNUNET_RECLAIM_AttributeList *attrs;
773 size_t attrs_len;
774 size_t key_len;
775 size_t pkey_len;
776 size_t read;
777 char *buf;
778
779 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Received ISSUE_TICKET message\n");
780 key_len = ntohs (im->key_len);
781 buf = (char *) &im[1];
782 if ((GNUNET_SYSERR ==
784 &identity, &read)) ||
785 (read != key_len))
786 {
788 "Failed to read private key\n");
790 return;
791 }
792 buf += read;
793 pkey_len = ntohs (im->pkey_len);
794 if ((GNUNET_SYSERR ==
796 &rp, &read)) ||
797 (read != pkey_len))
798 {
800 "Failed to read public key\n");
802 return;
803 }
804 buf += read;
806 attrs_len = ntohs (im->attr_len);
808 attrs_len);
809 for (le = attrs->list_head; NULL != le; le = le->next)
811 "List entry: %s\n", le->attribute->name);
812
813 tio->r_id = ntohl (im->id);
814 tio->client = idp;
815 GNUNET_CONTAINER_DLL_insert (idp->issue_op_head, idp->issue_op_tail, tio);
817 attrs,
818 &rp,
820 tio);
823}
824
825
826/**********************************************************
827* Revocation
828**********************************************************/
829
836static void
837revoke_result_cb (void *cls, int32_t success)
838{
839 struct TicketRevocationOperation *rop = cls;
840 struct GNUNET_MQ_Envelope *env;
841 struct RevokeTicketResultMessage *trm;
842
844 "Sending REVOKE_TICKET_RESULT message\n");
845 rop->rh = NULL;
847 trm->id = htonl (rop->r_id);
848 trm->success = htonl (success);
849 GNUNET_MQ_send (rop->client->mq, env);
852 rop);
853 GNUNET_free (rop);
854}
855
856
864static int
866{
867 uint16_t size;
868 size_t key_len;
869 size_t tkt_len;
870
871 size = ntohs (rm->header.size);
872 key_len = ntohs (rm->key_len);
873 tkt_len = ntohs (rm->tkt_len);
874
875 if (size != sizeof(struct RevokeTicketMessage) + key_len + tkt_len)
876 {
877 GNUNET_break (0);
878 return GNUNET_SYSERR;
879 }
880 return GNUNET_OK;
881}
882
883
890static void
892{
893 struct TicketRevocationOperation *rop;
894 struct IdpClient *idp = cls;
897 size_t key_len;
898 size_t tkt_len;
899 size_t read;
900 char *buf;
901
902 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Received REVOKE_TICKET message\n");
903 key_len = ntohs (rm->key_len);
904 buf = (char *) &rm[1];
905 if ((GNUNET_SYSERR ==
907 &identity, &read)) ||
908 (read != key_len))
909 {
911 "Failed to read private key\n");
913 return;
914 }
915 buf += read;
916 tkt_len = ntohs (rm->tkt_len);
917 if ((GNUNET_SYSERR ==
919 &ticket, &read)) ||
920 (read != tkt_len))
921 {
923 "Failed to read ticket\n");
925 return;
926 }
928 rop->r_id = ntohl (rm->id);
929 rop->client = idp;
930 GNUNET_CONTAINER_DLL_insert (idp->revoke_op_head, idp->revoke_op_tail, rop);
931 rop->rh
934}
935
936
946static void
948 const struct GNUNET_CRYPTO_PublicKey *identity,
949 const struct GNUNET_RECLAIM_AttributeList *attrs,
950 const struct GNUNET_RECLAIM_PresentationList *presentations,
951 int32_t success,
952 const char *emsg)
953{
954 struct ConsumeTicketOperation *cop = cls;
955 struct ConsumeTicketResultMessage *crm;
956 struct GNUNET_MQ_Envelope *env;
957 char *data_tmp;
958 size_t attrs_len = 0;
959 size_t pres_len = 0;
960 size_t key_len;
961 ssize_t written;
962
963 if (GNUNET_OK != success)
964 {
965 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Error consuming ticket: %s\n", emsg);
966 }
969 presentations);
972 "Sending CONSUME_TICKET_RESULT message\n");
974 attrs_len + pres_len + key_len,
976 crm->id = htonl (cop->r_id);
977 crm->attrs_len = htons (attrs_len);
978 crm->presentations_len = htons (pres_len);
979 crm->key_len = htons (key_len);
980 crm->result = htons (success);
981 data_tmp = (char *) &crm[1];
983 data_tmp,
984 key_len);
985 GNUNET_assert (0 <= written);
986 data_tmp += written;
988 data_tmp += attrs_len;
989 GNUNET_RECLAIM_presentation_list_serialize (presentations, data_tmp);
990 GNUNET_MQ_send (cop->client->mq, env);
993 cop);
994 GNUNET_free (cop);
995}
996
997
1004static int
1006{
1007 uint16_t size;
1008
1009 size = ntohs (cm->header.size);
1010 if (size <= sizeof(struct ConsumeTicketMessage))
1011 {
1012 GNUNET_break (0);
1013 return GNUNET_SYSERR;
1014 }
1015 return GNUNET_OK;
1016}
1017
1018
1025static void
1027{
1028 struct ConsumeTicketOperation *cop;
1029 struct IdpClient *idp = cls;
1032 size_t key_len;
1033 size_t tkt_len;
1034 size_t read;
1035 char *buf;
1036
1037 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Received CONSUME_TICKET message\n");
1038 key_len = ntohs (cm->key_len);
1039 buf = (char *) &cm[1];
1040 if ((GNUNET_SYSERR ==
1042 &identity, &read)) ||
1043 (read != key_len))
1044 {
1046 "Failed to read private key\n");
1048 return;
1049 }
1050 buf += read;
1051 tkt_len = ntohs (cm->tkt_len);
1052 if ((GNUNET_SYSERR ==
1054 &ticket, &read)) ||
1055 (read != tkt_len))
1056 {
1058 "Failed to read ticket\n");
1060 return;
1061 }
1062 cop = GNUNET_new (struct ConsumeTicketOperation);
1063 cop->r_id = ntohl (cm->id);
1064 cop->client = idp;
1065 cop->ch
1067 cop);
1068 GNUNET_CONTAINER_DLL_insert (idp->consume_op_head, idp->consume_op_tail, cop);
1070}
1071
1072
1073/*****************************************
1074* Attribute store
1075*****************************************/
1076
1077
1085static void
1087{
1088 struct AttributeStoreHandle *ash = cls;
1089 struct GNUNET_MQ_Envelope *env;
1090 struct SuccessResultMessage *acr_msg;
1091
1092 ash->ns_qe = NULL;
1094 ash->client->store_op_tail,
1095 ash);
1096
1097 if (GNUNET_EC_NONE != ec)
1098 {
1100 "Failed to store attribute %s\n",
1102 cleanup_as_handle (ash);
1104 return;
1105 }
1106
1107 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Sending SUCCESS_RESPONSE message\n");
1109 acr_msg->id = htonl (ash->r_id);
1110 acr_msg->op_result = htonl (GNUNET_OK);
1111 GNUNET_MQ_send (ash->client->mq, env);
1112 cleanup_as_handle (ash);
1113}
1114
1115
1121static void
1123{
1124 struct AttributeStoreHandle *ash = cls;
1125 struct GNUNET_GNSRECORD_Data rd[1];
1126 char *buf;
1127 char *label;
1128 size_t buf_size;
1129
1130 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Storing attribute\n");
1132 buf = GNUNET_malloc (buf_size);
1133 // Give the ash a new id if unset
1137 label
1139 sizeof (ash->claim->id));
1140 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Encrypting with label %s\n", label);
1141
1142 rd[0].data_size = buf_size;
1143 rd[0].data = buf;
1148 &ash->identity,
1149 label,
1150 1,
1151 rd,
1153 ash);
1154 GNUNET_free (buf);
1155 GNUNET_free (label);
1156}
1157
1158
1165static int
1167 const struct AttributeStoreMessage *sam)
1168{
1169 uint16_t size;
1170
1171 size = ntohs (sam->header.size);
1172 if (size <= sizeof(struct AttributeStoreMessage))
1173 {
1174 GNUNET_break (0);
1175 return GNUNET_SYSERR;
1176 }
1177 return GNUNET_OK;
1178}
1179
1180
1187static void
1189 const struct AttributeStoreMessage *sam)
1190{
1191 struct AttributeStoreHandle *ash;
1192 struct IdpClient *idp = cls;
1194 size_t data_len;
1195 size_t key_len;
1196 size_t read;
1197 char *buf;
1198
1199 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Received ATTRIBUTE_STORE message\n");
1200
1201 data_len = ntohs (sam->attr_len);
1202 key_len = ntohs (sam->key_len);
1203 buf = (char *) &sam[1];
1204 if ((GNUNET_SYSERR ==
1206 &identity, &read)) ||
1207 (read != key_len))
1208 {
1210 "Failed to read private key\n");
1212 return;
1213 }
1214 buf += read;
1215 ash = GNUNET_new (struct AttributeStoreHandle);
1217 data_len,
1218 &ash->claim);
1219
1220 ash->r_id = ntohl (sam->id);
1221 ash->identity = identity;
1222 ash->exp.rel_value_us = GNUNET_ntohll (sam->exp);
1224
1226 ash->client = idp;
1227 GNUNET_CONTAINER_DLL_insert (idp->store_op_head, idp->store_op_tail, ash);
1229}
1230
1231
1239static void
1241{
1242 struct AttributeStoreHandle *ash = cls;
1243 struct GNUNET_MQ_Envelope *env;
1244 struct SuccessResultMessage *acr_msg;
1245
1246 ash->ns_qe = NULL;
1248 ash->client->store_op_tail,
1249 ash);
1250
1251 if (GNUNET_EC_NONE != ec)
1252 {
1254 "Failed to store credential: %s\n",
1256 cleanup_as_handle (ash);
1258 return;
1259 }
1260
1261 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Sending SUCCESS_RESPONSE message\n");
1263 acr_msg->id = htonl (ash->r_id);
1264 acr_msg->op_result = htonl (GNUNET_OK);
1265 GNUNET_MQ_send (ash->client->mq, env);
1266 cleanup_as_handle (ash);
1267}
1268
1269
1275static void
1276cred_error (void *cls)
1277{
1278 struct AttributeStoreHandle *ash = cls;
1280 "Failed to check for existing credential.\n");
1281 cleanup_as_handle (ash);
1283 return;
1284}
1285
1286
1296static void
1297cred_add_cb (void *cls,
1298 const struct GNUNET_CRYPTO_PrivateKey *zone,
1299 const char *label,
1300 unsigned int rd_count,
1301 const struct GNUNET_GNSRECORD_Data *rd)
1302{
1303 struct AttributeStoreHandle *ash = cls;
1304 struct GNUNET_GNSRECORD_Data rd_new[1];
1305 char *buf;
1306 size_t buf_size;
1307
1309 buf = GNUNET_malloc (buf_size);
1312 "Storing new credential under `%s'.\n",
1313 label);
1314 rd_new[0].data_size = buf_size;
1315 rd_new[0].data = buf;
1318 rd_new[0].expiration_time = ash->exp.rel_value_us;
1320 &ash->identity,
1321 label,
1322 1,
1323 rd_new,
1325 ash);
1326 GNUNET_free (buf);
1327 return;
1328}
1329
1330
1336static void
1338{
1339 struct AttributeStoreHandle *ash = cls;
1340 char *label;
1341
1342 // Give the ash a new id if unset
1346 sizeof (ash->credential->id));
1348 "Looking up existing data under label `%s'\n", label);
1350 &ash->identity,
1351 label,
1352 &cred_error,
1353 ash,
1354 &cred_add_cb,
1355 ash);
1356 GNUNET_free (label);
1357}
1358
1359
1366static int
1368 const struct AttributeStoreMessage *sam)
1369{
1370 uint16_t size;
1371
1372 size = ntohs (sam->header.size);
1373 if (size <= sizeof(struct AttributeStoreMessage))
1374 {
1375 GNUNET_break (0);
1376 return GNUNET_SYSERR;
1377 }
1378 return GNUNET_OK;
1379}
1380
1381
1388static void
1390 const struct AttributeStoreMessage *sam)
1391{
1392 struct AttributeStoreHandle *ash;
1393 struct IdpClient *idp = cls;
1395 size_t data_len;
1396 size_t key_len;
1397 size_t read;
1398 char *buf;
1399
1400 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Received CREDENTIAL_STORE message\n");
1401
1402 data_len = ntohs (sam->attr_len);
1403 key_len = ntohs (sam->key_len);
1404 buf = (char *) &sam[1];
1405 if ((GNUNET_SYSERR ==
1407 &identity, &read)) ||
1408 (read != key_len))
1409 {
1411 "Failed to read private key\n");
1413 return;
1414 }
1415 buf += read;
1416 ash = GNUNET_new (struct AttributeStoreHandle);
1418 data_len);
1419
1420 ash->r_id = ntohl (sam->id);
1421 ash->identity = identity;
1422 ash->exp.rel_value_us = GNUNET_ntohll (sam->exp);
1424
1426 ash->client = idp;
1427 GNUNET_CONTAINER_DLL_insert (idp->store_op_head, idp->store_op_tail, ash);
1429}
1430
1431
1438static void
1439send_delete_response (struct AttributeDeleteHandle *adh, int32_t success)
1440{
1441 struct GNUNET_MQ_Envelope *env;
1442 struct SuccessResultMessage *acr_msg;
1443
1445 adh->client->delete_op_tail,
1446 adh);
1447
1448 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Sending SUCCESS_RESPONSE message\n");
1450 acr_msg->id = htonl (adh->r_id);
1451 acr_msg->op_result = htonl (success);
1452 GNUNET_MQ_send (adh->client->mq, env);
1453}
1454
1455
1466static void
1468 const struct GNUNET_CRYPTO_PrivateKey *zone,
1469 const char *label,
1470 unsigned int rd_count,
1471 const struct GNUNET_GNSRECORD_Data *rd)
1472{
1473 struct AttributeDeleteHandle *adh = cls;
1474 struct TicketRecordsEntry *le;
1477 int is_ticket = GNUNET_NO;
1478 for (int i = 0; i < rd_count; i++)
1479 {
1480 switch (rd[i].record_type)
1481 {
1485 rd[i].data_size,
1486 &ale->attribute);
1489 ale);
1490 break;
1494 rd[i].data_size);
1497 cle);
1498 break;
1501 "Ticket to delete found (%s)\n",
1502 label);
1503 is_ticket = GNUNET_YES;
1504 break;
1505 default:
1506 break;
1507 }
1508 if (GNUNET_YES == is_ticket)
1509 break;
1510 }
1511 if (GNUNET_YES == is_ticket)
1512 {
1513 le = GNUNET_new (struct TicketRecordsEntry);
1515 le->data = GNUNET_malloc (le->data_size);
1516 le->rd_count = rd_count;
1517 le->label = GNUNET_strdup (label);
1521 le);
1522 }
1524}
1525
1526
1531static void
1532update_tickets (void *cls);
1533
1534
1542static void
1544{
1545 struct AttributeDeleteHandle *adh = cls;
1546
1547 adh->ns_qe = NULL;
1549}
1550
1551
1559static void
1561{
1562 struct AttributeDeleteHandle *adh = cls;
1563 struct TicketRecordsEntry *le;
1564
1565 if (NULL == adh->tickets_to_update_head)
1566 {
1568 "Finished updating tickets, success\n");
1570 cleanup_adh (adh);
1571 return;
1572 }
1573 le = adh->tickets_to_update_head;
1576 le);
1577 struct GNUNET_GNSRECORD_Data rd[le->rd_count];
1578 struct GNUNET_GNSRECORD_Data rd_new[le->rd_count - 1];
1580 le->data,
1581 le->rd_count,
1582 rd))
1583 {
1585 "Unable to deserialize record data!\n");
1587 cleanup_adh (adh);
1588 return;
1589 }
1590 int j = 0;
1591 int i = 0;
1594 struct GNUNET_RECLAIM_Presentation *presentation;
1595 for (i = 0; i < le->rd_count; i++)
1596 {
1597 switch (rd[i].record_type)
1598 {
1600 for (ale = adh->existing_attributes->list_head; NULL != ale; ale =
1601 ale->next)
1602 {
1604 &ale->attribute->id))
1605 {
1607 "Found attribute %s, readding...\n",
1608 ale->attribute->name);
1609 rd_new[j] = rd[i];
1610 j++;
1611 break; // Found and added
1612 }
1613 }
1614 break;
1617 rd[i].data_size);
1618 for (cle = adh->existing_credentials->list_head; NULL != cle; cle =
1619 cle->next)
1620 {
1622 &presentation->credential_id,
1623 &cle->credential->id))
1624 {
1626 "Found presentation for credential %s, readding...\n",
1627 cle->credential->name);
1628 rd_new[j] = rd[i];
1629 j++;
1630 break; // Found and added
1631 }
1632 }
1633 GNUNET_free (presentation);
1634 break;
1636 rd_new[j] = rd[i];
1637 j++;
1638 break; // Found and added
1639 default:
1640 GNUNET_break (0);
1641 }
1642 }
1644 "Updating ticket with %d entries (%d before)...\n",
1645 j, i);
1647 &adh->identity,
1648 le->label,
1649 j,
1650 rd_new,
1652 adh);
1653 GNUNET_free (le->label);
1654 GNUNET_free (le->data);
1655 GNUNET_free (le);
1656}
1657
1658
1663static void
1664purge_attributes (void *cls);;
1665
1666static void
1668{
1669 struct AttributeDeleteHandle *adh = cls;
1670
1671 adh->ns_qe = NULL;
1672 if (GNUNET_EC_NONE != ec)
1673 {
1675 "Error deleting attribute %s\n",
1676 adh->label);
1678 cleanup_adh (adh);
1679 return;
1680 }
1681 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Continuing consistency check...\n");
1683}
1684
1685
1690static void
1692{
1693 struct AttributeDeleteHandle *adh = cls;
1696
1697 for (ale = adh->existing_attributes->list_head; NULL != ale; ale = ale->next)
1698 {
1699 if (GNUNET_YES ==
1701 continue;
1702
1703 for (cle = adh->existing_credentials->list_head;
1704 NULL != cle; cle = cle->next)
1705 {
1706 if (GNUNET_YES !=
1708 &ale->attribute->credential))
1709 continue;
1710 break;
1711 }
1712 if (NULL == cle)
1713 {
1715 "Found attribute with missing credential\n");
1716 break;
1717 }
1718 }
1719 if (NULL == ale)
1720 {
1722 "Attributes consistent, updating tickets.\n");
1724 return;
1725 }
1727 "Attributes inconsistent, deleting offending attribute.\n");
1728 char *label
1730 sizeof(ale->attribute->id));
1731
1733 &adh->identity,
1734 label,
1735 0,
1736 NULL,
1738 adh);
1741 ale);
1742 GNUNET_free (ale);
1743 GNUNET_free (label);
1744}
1745
1746
1752static void
1754{
1755 struct AttributeDeleteHandle *adh = cls;
1756 adh->ns_it = NULL;
1758}
1759
1760
1766static void
1768{
1769 struct AttributeDeleteHandle *adh = cls;
1770
1771 adh->ns_it = NULL;
1773 "Namestore error on consistency check\n");
1775 cleanup_adh (adh);
1776}
1777
1778
1785static void
1787{
1788 struct AttributeDeleteHandle *adh = cls;
1789
1792
1794 &adh->identity,
1796 adh,
1798 adh,
1800 adh);
1801}
1802
1803
1811static void
1813{
1814 struct AttributeDeleteHandle *adh = cls;
1815
1816 adh->ns_qe = NULL;
1817 if (GNUNET_EC_NONE != ec)
1818 {
1820 "Error deleting attribute %s\n",
1821 adh->label);
1823 cleanup_adh (adh);
1824 return;
1825 }
1826 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Updating tickets...\n");
1828}
1829
1830
1837static int
1839 const struct AttributeDeleteMessage *dam)
1840{
1841 uint16_t size;
1842
1843 size = ntohs (dam->header.size);
1844 if (size <= sizeof(struct AttributeDeleteMessage))
1845 {
1846 GNUNET_break (0);
1847 return GNUNET_SYSERR;
1848 }
1849 return GNUNET_OK;
1850}
1851
1852
1859static void
1861 const struct AttributeDeleteMessage *dam)
1862{
1863 struct AttributeDeleteHandle *adh;
1864 struct IdpClient *idp = cls;
1866 size_t data_len;
1867 size_t key_len;
1868 size_t read;
1869 char *buf;
1870
1871 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Received ATTRIBUTE_DELETE message\n");
1872
1873 data_len = ntohs (dam->attr_len);
1874 key_len = ntohs (dam->key_len);
1875 buf = (char *) &dam[1];
1876 if ((GNUNET_SYSERR ==
1878 &identity, &read)) ||
1879 (read != key_len))
1880 {
1882 "Failed to read private key\n");
1884 return;
1885 }
1886 buf += read;
1887 adh = GNUNET_new (struct AttributeDeleteHandle);
1889 data_len,
1890 &adh->claim);
1891 adh->credential = NULL;
1892
1893 adh->r_id = ntohl (dam->id);
1894 adh->identity = identity;
1895 adh->label
1897 sizeof(adh->claim->id));
1899 adh->client = idp;
1900 GNUNET_CONTAINER_DLL_insert (idp->delete_op_head, idp->delete_op_tail, adh);
1902 &adh->identity,
1903 adh->label,
1904 0,
1905 NULL,
1907 adh);
1908}
1909
1910
1918static void
1920{
1921 struct AttributeDeleteHandle *adh = cls;
1922
1923 adh->ns_qe = NULL;
1924 if (GNUNET_EC_NONE != ec)
1925 {
1927 "Error deleting credential `%s'\n",
1928 adh->label);
1930 cleanup_adh (adh);
1931 return;
1932 }
1933 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Updating tickets...\n");
1935}
1936
1937
1944static int
1946 const struct AttributeDeleteMessage *dam)
1947{
1948 uint16_t size;
1949
1950 size = ntohs (dam->header.size);
1951 if (size <= sizeof(struct AttributeDeleteMessage))
1952 {
1953 GNUNET_break (0);
1954 return GNUNET_SYSERR;
1955 }
1956 return GNUNET_OK;
1957}
1958
1959
1966static void
1968 const struct AttributeDeleteMessage *dam)
1969{
1970 struct AttributeDeleteHandle *adh;
1971 struct IdpClient *idp = cls;
1973 size_t data_len;
1974 size_t key_len;
1975 size_t read;
1976 char *buf;
1977
1978 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Received CREDENTIAL_DELETE message\n");
1979
1980 data_len = ntohs (dam->attr_len);
1981 key_len = ntohs (dam->key_len);
1982 buf = (char *) &dam[1];
1983 if ((GNUNET_SYSERR ==
1985 &identity, &read)) ||
1986 (read != key_len))
1987 {
1989 "Failed to read private key\n");
1991 return;
1992 }
1993 buf += read;
1994 adh = GNUNET_new (struct AttributeDeleteHandle);
1996 data_len);
1997 adh->claim = NULL;
1998
1999 adh->r_id = ntohl (dam->id);
2000 adh->identity = identity;
2001 adh->label
2003 sizeof(adh->credential->id));
2005 adh->client = idp;
2006 GNUNET_CONTAINER_DLL_insert (idp->delete_op_head, idp->delete_op_tail, adh);
2008 &adh->identity,
2009 adh->label,
2010 0,
2011 NULL,
2013 adh);
2014}
2015
2016
2017/*************************************************
2018 * Attribute iteration
2019 *************************************************/
2020
2021
2027static void
2029{
2030 struct Iterator *ai = cls;
2031 struct GNUNET_MQ_Envelope *env;
2032 struct AttributeResultMessage *arm;
2033
2034 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Sending ATTRIBUTE_RESULT message\n");
2036 arm->id = htonl (ai->request_id);
2037 arm->attr_len = htons (0);
2038 arm->pkey_len = htons (0);
2039 GNUNET_MQ_send (ai->client->mq, env);
2040 GNUNET_CONTAINER_DLL_remove (ai->client->attr_iter_head,
2041 ai->client->attr_iter_tail,
2042 ai);
2043 GNUNET_free (ai);
2044}
2045
2046
2052static void
2054{
2055 struct Iterator *ai = cls;
2056
2057 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Failed to iterate over attributes\n");
2059}
2060
2061
2071static void
2072attr_iter_cb (void *cls,
2073 const struct GNUNET_CRYPTO_PrivateKey *zone,
2074 const char *label,
2075 unsigned int rd_count,
2076 const struct GNUNET_GNSRECORD_Data *rd)
2077{
2078 struct Iterator *ai = cls;
2079 struct GNUNET_MQ_Envelope *env;
2081 char *data_tmp;
2082 size_t key_len;
2083 ssize_t written;
2084
2085 if ((rd_count != 1) ||
2087 {
2089 return;
2090 }
2091 struct AttributeResultMessage *arm;
2092 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Found attribute under: %s\n",
2093 label);
2095 "Sending ATTRIBUTE_RESULT message\n");
2098 env = GNUNET_MQ_msg_extra (arm,
2099 rd->data_size + key_len,
2101 arm->id = htonl (ai->request_id);
2102 arm->attr_len = htons (rd->data_size);
2103 data_tmp = (char *) &arm[1];
2104 arm->pkey_len = htons (key_len);
2106 data_tmp,
2107 key_len);
2108 GNUNET_assert (0 <= written);
2109 data_tmp += written;
2110 GNUNET_memcpy (data_tmp, rd->data, rd->data_size);
2111 GNUNET_MQ_send (ai->client->mq, env);
2112}
2113
2114
2115static enum GNUNET_GenericReturnValue
2117 void *cls,
2118 const struct AttributeIterationStartMessage *ais_msg)
2119{
2120 uint16_t size;
2121 size_t key_len;
2122
2123 size = ntohs (ais_msg->header.size);
2124 key_len = ntohs (ais_msg->key_len);
2125
2126 if (size < key_len + sizeof(*ais_msg))
2127 {
2128 GNUNET_break (0);
2129 return GNUNET_SYSERR;
2130 }
2131 return GNUNET_OK;
2132}
2133
2134
2141static void
2143 const struct AttributeIterationStartMessage *ais_msg)
2144{
2145 struct IdpClient *idp = cls;
2146 struct Iterator *ai;
2148 size_t key_len;
2149 size_t read;
2150
2152 "Received ATTRIBUTE_ITERATION_START message\n");
2153 key_len = ntohs (ais_msg->key_len);
2154 if ((GNUNET_SYSERR ==
2156 key_len,
2157 &identity,
2158 &read)) ||
2159 (read != key_len))
2160 {
2162 "Failed to read private key.\n");
2164 return;
2165 }
2166 ai = GNUNET_new (struct Iterator);
2167 ai->request_id = ntohl (ais_msg->id);
2168 ai->client = idp;
2169 ai->identity = identity;
2170
2171 GNUNET_CONTAINER_DLL_insert (idp->attr_iter_head, idp->attr_iter_tail, ai);
2173 &ai->identity,
2175 ai,
2176 &attr_iter_cb,
2177 ai,
2179 ai);
2181}
2182
2183
2190static void
2192 const struct AttributeIterationStopMessage *ais_msg)
2193{
2194 struct IdpClient *idp = cls;
2195 struct Iterator *ai;
2196 uint32_t rid;
2197
2199 "Received `%s' message\n",
2200 "ATTRIBUTE_ITERATION_STOP");
2201 rid = ntohl (ais_msg->id);
2202 for (ai = idp->attr_iter_head; NULL != ai; ai = ai->next)
2203 if (ai->request_id == rid)
2204 break;
2205 if (NULL == ai)
2206 {
2207 GNUNET_break (0);
2209 return;
2210 }
2211 GNUNET_CONTAINER_DLL_remove (idp->attr_iter_head, idp->attr_iter_tail, ai);
2212 GNUNET_free (ai);
2214}
2215
2216
2223static void
2225 const struct AttributeIterationNextMessage *ais_msg)
2226{
2227 struct IdpClient *idp = cls;
2228 struct Iterator *ai;
2229 uint32_t rid;
2230
2232 "Received ATTRIBUTE_ITERATION_NEXT message\n");
2233 rid = ntohl (ais_msg->id);
2234 for (ai = idp->attr_iter_head; NULL != ai; ai = ai->next)
2235 if (ai->request_id == rid)
2236 break;
2237 if (NULL == ai)
2238 {
2239 GNUNET_break (0);
2241 return;
2242 }
2245}
2246
2247
2248/*************************************************
2249 * Credential iteration
2250 *************************************************/
2251
2252
2258static void
2260{
2261 struct Iterator *ai = cls;
2262 struct GNUNET_MQ_Envelope *env;
2263 struct CredentialResultMessage *arm;
2264
2265 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Sending CREDENTIAL_RESULT message\n");
2267 arm->id = htonl (ai->request_id);
2268 arm->credential_len = htons (0);
2269 arm->key_len = htons (0);
2270 GNUNET_MQ_send (ai->client->mq, env);
2271 GNUNET_CONTAINER_DLL_remove (ai->client->cred_iter_head,
2272 ai->client->cred_iter_tail,
2273 ai);
2274 GNUNET_free (ai);
2275}
2276
2277
2283static void
2285{
2286 struct Iterator *ai = cls;
2287
2288 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Failed to iterate over credentials\n");
2290}
2291
2292
2302static void
2303cred_iter_cb (void *cls,
2304 const struct GNUNET_CRYPTO_PrivateKey *zone,
2305 const char *label,
2306 unsigned int rd_count,
2307 const struct GNUNET_GNSRECORD_Data *rd)
2308{
2309 struct Iterator *ai = cls;
2310 struct GNUNET_MQ_Envelope *env;
2311 struct CredentialResultMessage *arm;
2313 char *data_tmp;
2314 size_t key_len;
2315 ssize_t written;
2316
2317 if ((rd_count != 1) ||
2319 {
2321 return;
2322 }
2323 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Found credential under: %s\n",
2324 label);
2326 "Sending CREDENTIAL_RESULT message\n");
2329 env = GNUNET_MQ_msg_extra (arm,
2330 rd->data_size + key_len,
2332 arm->id = htonl (ai->request_id);
2333 arm->credential_len = htons (rd->data_size);
2334 arm->key_len = htons (key_len);
2335 data_tmp = (char *) &arm[1];
2337 data_tmp,
2338 key_len);
2339 GNUNET_assert (written >= 0);
2340 data_tmp += written;
2341 GNUNET_memcpy (data_tmp, rd->data, rd->data_size);
2342 GNUNET_MQ_send (ai->client->mq, env);
2343}
2344
2345
2346static enum GNUNET_GenericReturnValue
2348 void *cls,
2349 const struct CredentialIterationStartMessage *cis_msg)
2350{
2351 uint16_t size;
2352 size_t key_len;
2353
2354 size = ntohs (cis_msg->header.size);
2355 key_len = ntohs (cis_msg->key_len);
2356
2357 if (size < key_len + sizeof(*cis_msg))
2358 {
2359 GNUNET_break (0);
2360 return GNUNET_SYSERR;
2361 }
2362 return GNUNET_OK;
2363}
2364
2365
2372static void
2374 const struct
2376{
2377 struct IdpClient *idp = cls;
2378 struct Iterator *ai;
2380 size_t key_len;
2381 size_t read;
2382
2384 "Received CREDENTIAL_ITERATION_START message\n");
2385 key_len = ntohs (ais_msg->key_len);
2386 if ((GNUNET_SYSERR ==
2388 key_len,
2389 &identity,
2390 &read)) ||
2391 (read != key_len))
2392 {
2394 "Failed to read private key.\n");
2396 return;
2397 }
2398 ai = GNUNET_new (struct Iterator);
2399 ai->request_id = ntohl (ais_msg->id);
2400 ai->client = idp;
2401 ai->identity = identity;
2402
2403 GNUNET_CONTAINER_DLL_insert (idp->cred_iter_head, idp->cred_iter_tail,
2404 ai);
2406 &ai->identity,
2408 ai,
2409 &cred_iter_cb,
2410 ai,
2412 ai);
2414}
2415
2416
2423static void
2425 const struct
2427{
2428 struct IdpClient *idp = cls;
2429 struct Iterator *ai;
2430 uint32_t rid;
2431
2433 "Received `%s' message\n",
2434 "CREDENTIAL_ITERATION_STOP");
2435 rid = ntohl (ais_msg->id);
2436 for (ai = idp->cred_iter_head; NULL != ai; ai = ai->next)
2437 if (ai->request_id == rid)
2438 break;
2439 if (NULL == ai)
2440 {
2441 GNUNET_break (0);
2443 return;
2444 }
2445 GNUNET_CONTAINER_DLL_remove (idp->cred_iter_head, idp->cred_iter_tail,
2446 ai);
2447 GNUNET_free (ai);
2449}
2450
2451
2458static void
2460 const struct
2462{
2463 struct IdpClient *idp = cls;
2464 struct Iterator *ai;
2465 uint32_t rid;
2466
2468 "Received CREDENTIAL_ITERATION_NEXT message\n");
2469 rid = ntohl (ais_msg->id);
2470 for (ai = idp->cred_iter_head; NULL != ai; ai = ai->next)
2471 if (ai->request_id == rid)
2472 break;
2473 if (NULL == ai)
2474 {
2475 GNUNET_break (0);
2477 return;
2478 }
2481}
2482
2483
2484/******************************************************
2485 * Ticket iteration
2486 ******************************************************/
2487
2494static void
2496{
2497 struct TicketIteration *ti = cls;
2498 struct GNUNET_MQ_Envelope *env;
2499 struct TicketResultMessage *trm;
2500 size_t tkt_len;
2501
2502 if (NULL == ticket)
2503 tkt_len = 0;
2504 else
2506
2507 env = GNUNET_MQ_msg_extra (trm,
2508 tkt_len,
2510 if (NULL == ticket)
2511 {
2512 /* send empty response to indicate end of list */
2515 ti);
2516 }
2517 else
2518 {
2520 &trm[1],
2521 tkt_len);
2522 }
2523 trm->id = htonl (ti->r_id);
2524 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Sending TICKET_RESULT message\n");
2525 trm->tkt_len = htons (tkt_len);
2526 trm->presentations_len = htons (0);
2527 GNUNET_MQ_send (ti->client->mq, env);
2528 if (NULL == ticket)
2529 GNUNET_free (ti);
2530}
2531
2532
2533static enum GNUNET_GenericReturnValue
2535 void *cls,
2536 const struct TicketIterationStartMessage *tis_msg)
2537{
2538 uint16_t size;
2539 size_t key_len;
2540
2541 size = ntohs (tis_msg->header.size);
2542 key_len = ntohs (tis_msg->key_len);
2543
2544 if (size < key_len + sizeof(*tis_msg))
2545 {
2546 GNUNET_break (0);
2547 return GNUNET_SYSERR;
2548 }
2549 return GNUNET_OK;
2550}
2551
2552
2559static void
2561 void *cls,
2562 const struct TicketIterationStartMessage *tis_msg)
2563{
2565 struct IdpClient *client = cls;
2566 struct TicketIteration *ti;
2567 size_t key_len;
2568 size_t read;
2569
2571 "Received TICKET_ITERATION_START message\n");
2572 key_len = ntohs (tis_msg->key_len);
2573 if ((GNUNET_SYSERR ==
2575 key_len,
2576 &identity,
2577 &read)) ||
2578 (read != key_len))
2579 {
2581 "Failed to read private key\n");
2583 return;
2584 }
2585 ti = GNUNET_new (struct TicketIteration);
2586 ti->r_id = ntohl (tis_msg->id);
2587 ti->client = client;
2590 ti);
2591 ti->iter
2594}
2595
2596
2603static void
2605 const struct TicketIterationStopMessage *tis_msg)
2606{
2607 struct IdpClient *client = cls;
2608 struct TicketIteration *ti;
2609 uint32_t rid;
2610
2612 "Received `%s' message\n",
2613 "TICKET_ITERATION_STOP");
2614 rid = ntohl (tis_msg->id);
2615 for (ti = client->ticket_iter_head; NULL != ti; ti = ti->next)
2616 if (ti->r_id == rid)
2617 break;
2618 if (NULL == ti)
2619 {
2620 GNUNET_break (0);
2622 return;
2623 }
2627 ti);
2628 GNUNET_free (ti);
2630}
2631
2632
2639static void
2641 const struct TicketIterationNextMessage *tis_msg)
2642{
2643 struct IdpClient *client = cls;
2644 struct TicketIteration *ti;
2645 uint32_t rid;
2646
2648 "Received TICKET_ITERATION_NEXT message\n");
2649 rid = ntohl (tis_msg->id);
2650 for (ti = client->ticket_iter_head; NULL != ti; ti = ti->next)
2651 if (ti->r_id == rid)
2652 break;
2653 if (NULL == ti)
2654 {
2655 GNUNET_break (0);
2657 return;
2658 }
2661}
2662
2663
2671static void
2672run (void *cls,
2673 const struct GNUNET_CONFIGURATION_Handle *c,
2674 struct GNUNET_SERVICE_Handle *server)
2675{
2676 cfg = c;
2677
2679 {
2681 "Unable to initialize TICKETS subsystem.\n");
2683 return;
2684 }
2685 // Connect to identity and namestore services
2687 if (NULL == nsh)
2688 {
2690 "error connecting to namestore");
2691 }
2692
2694}
2695
2696
2704static void
2707 void *app_ctx)
2708{
2709 struct IdpClient *idp = app_ctx;
2710
2711 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Client %p disconnected\n", client);
2714 idp);
2716}
2717
2718
2727static void *
2730 struct GNUNET_MQ_Handle *mq)
2731{
2732 struct IdpClient *idp;
2733
2734 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Client %p connected\n", client);
2735 idp = GNUNET_new (struct IdpClient);
2736 idp->client = client;
2737 idp->mq = mq;
2740 idp);
2741 return idp;
2742}
2743
2744
2749 "reclaim",
2751 &run,
2754 NULL,
2755 GNUNET_MQ_hd_var_size (attribute_store_message,
2757 struct AttributeStoreMessage,
2758 NULL),
2759 GNUNET_MQ_hd_var_size (credential_store_message,
2761 struct AttributeStoreMessage,
2762 NULL),
2763 GNUNET_MQ_hd_var_size (attribute_delete_message,
2766 NULL),
2767 GNUNET_MQ_hd_var_size (credential_delete_message,
2770 NULL),
2771 GNUNET_MQ_hd_var_size (iteration_start,
2774 NULL),
2775 GNUNET_MQ_hd_fixed_size (iteration_next,
2778 NULL),
2779 GNUNET_MQ_hd_fixed_size (iteration_stop,
2782 NULL),
2783 GNUNET_MQ_hd_var_size (credential_iteration_start,
2786 NULL),
2787 GNUNET_MQ_hd_fixed_size (credential_iteration_next,
2790 NULL),
2791 GNUNET_MQ_hd_fixed_size (credential_iteration_stop,
2794 NULL),
2795
2796 GNUNET_MQ_hd_var_size (issue_ticket_message,
2798 struct IssueTicketMessage,
2799 NULL),
2800 GNUNET_MQ_hd_var_size (consume_ticket_message,
2802 struct ConsumeTicketMessage,
2803 NULL),
2804 GNUNET_MQ_hd_var_size (ticket_iteration_start,
2807 NULL),
2808 GNUNET_MQ_hd_fixed_size (ticket_iteration_next,
2811 NULL),
2812 GNUNET_MQ_hd_fixed_size (ticket_iteration_stop,
2815 NULL),
2816 GNUNET_MQ_hd_var_size (revoke_ticket_message,
2818 struct RevokeTicketMessage,
2819 NULL),
2821/* end of gnunet-service-reclaim.c */
struct GNUNET_MQ_Handle * mq
Definition: 003.c:5
struct GNUNET_MQ_Envelope * env
Definition: 005.c:1
static struct GNUNET_CADET_ListTunnels * tio
Active tunnel listing operation.
Definition: gnunet-cadet.c:112
static struct GNUNET_TRANSPORT_AddressIdentifier * ai
Handle to the operation that publishes our address.
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.
static struct GNUNET_RECLAIM_Ticket ticket
Ticket to consume.
static char * rp
Relying party.
static void handle_ticket_iteration_next(void *cls, const struct TicketIterationNextMessage *tis_msg)
Client requests next result.
static void cred_delete_cont(void *cls, enum GNUNET_ErrorCode ec)
Credential deleted callback.
static void attr_store_cont(void *cls, enum GNUNET_ErrorCode ec)
Attribute store result handler.
static int check_consume_ticket_message(void *cls, const struct ConsumeTicketMessage *cm)
Check a consume ticket message.
static int check_issue_ticket_message(void *cls, const struct IssueTicketMessage *im)
Check issue ticket message.
static void cleanup_adh(struct AttributeDeleteHandle *adh)
Cleanup attribute delete handle.
static void handle_issue_ticket_message(void *cls, const struct IssueTicketMessage *im)
Handle ticket issue message.
static void update_tickets(void *cls)
Recursion prototype for function.
static void consume_result_cb(void *cls, const struct GNUNET_CRYPTO_PublicKey *identity, const struct GNUNET_RECLAIM_AttributeList *attrs, const struct GNUNET_RECLAIM_PresentationList *presentations, int32_t success, const char *emsg)
Handle a ticket consume result.
static void cred_store_task(void *cls)
Add a new credential.
static void attr_iter_finished(void *cls)
Done iterating over attributes.
static void handle_iteration_start(void *cls, const struct AttributeIterationStartMessage *ais_msg)
Iterate over zone to get attributes.
static int check_credential_store_message(void *cls, const struct AttributeStoreMessage *sam)
Check an credential store message.
static void revoke_result_cb(void *cls, int32_t success)
Handles revocation result.
static void handle_credential_iteration_start(void *cls, const struct CredentialIterationStartMessage *ais_msg)
Iterate over zone to get attributes.
static int check_revoke_ticket_message(void *cls, const struct RevokeTicketMessage *rm)
Check revocation message format.
static int check_attribute_store_message(void *cls, const struct AttributeStoreMessage *sam)
Check an attribute store message.
static void cred_iter_error(void *cls)
Error iterating over credentials.
static struct IdpClient * client_list_tail
Client list.
static void cred_iter_cb(void *cls, const struct GNUNET_CRYPTO_PrivateKey *zone, const char *label, unsigned int rd_count, const struct GNUNET_GNSRECORD_Data *rd)
Got record.
static void consistency_iter(void *cls, const struct GNUNET_CRYPTO_PrivateKey *zone, const char *label, unsigned int rd_count, const struct GNUNET_GNSRECORD_Data *rd)
Namestore iteration within attribute deletion.
static void handle_revoke_ticket_message(void *cls, const struct RevokeTicketMessage *rm)
Handle a revocation message to a ticket.
static const struct GNUNET_CONFIGURATION_Handle * cfg
Our configuration.
static void cleanup()
Cleanup task.
static void send_delete_response(struct AttributeDeleteHandle *adh, int32_t success)
Send a deletion success response.
static void offending_attr_delete_cont(void *cls, enum GNUNET_ErrorCode ec)
static void cred_store_cont(void *cls, enum GNUNET_ErrorCode ec)
Credential store result handler.
static void consistency_iter_err(void *cls)
Error collecting affected tickets.
static void cred_error(void *cls)
Error looking up potential credential.
static void handle_attribute_delete_message(void *cls, const struct AttributeDeleteMessage *dam)
Handle attribute deletion.
static void purge_attributes(void *cls)
Delete all attributes which reference credentials that no longer exist.
static void handle_credential_delete_message(void *cls, const struct AttributeDeleteMessage *dam)
Handle credential deletion.
static void handle_credential_iteration_next(void *cls, const struct CredentialIterationNextMessage *ais_msg)
Client requests next credential from iterator.
static void run(void *cls, const struct GNUNET_CONFIGURATION_Handle *c, struct GNUNET_SERVICE_Handle *server)
Main function that will be run.
static void handle_ticket_iteration_start(void *cls, const struct TicketIterationStartMessage *tis_msg)
Client requests a ticket iteration.
static void do_shutdown(void *cls)
Shutdown task.
static void * client_connect_cb(void *cls, struct GNUNET_SERVICE_Client *client, struct GNUNET_MQ_Handle *mq)
Add a client to our list of active clients.
static void start_consistency_update(void *cls)
Start processing tickets which may still contain reference to deleted attribute.
static void consistency_iter_fin(void *cls)
Done collecting affected tickets, start updating.
static void ticket_iter_cb(void *cls, struct GNUNET_RECLAIM_Ticket *ticket)
Got a ticket.
static void ticket_updated(void *cls, enum GNUNET_ErrorCode ec)
Callback called when a ticket was updated.
static void attr_iter_cb(void *cls, const struct GNUNET_CRYPTO_PrivateKey *zone, const char *label, unsigned int rd_count, const struct GNUNET_GNSRECORD_Data *rd)
Got record.
static void handle_credential_store_message(void *cls, const struct AttributeStoreMessage *sam)
Handle a credential store message.
static void attr_delete_cont(void *cls, enum GNUNET_ErrorCode ec)
Attribute deleted callback.
static void issue_ticket_result_cb(void *cls, struct GNUNET_RECLAIM_Ticket *ticket, struct GNUNET_RECLAIM_PresentationList *presentations, int32_t success, const char *emsg)
Issue ticket result.
static void handle_consume_ticket_message(void *cls, const struct ConsumeTicketMessage *cm)
Handle a consume ticket message.
static struct GNUNET_NAMESTORE_Handle * nsh
Namestore handle.
static int check_credential_delete_message(void *cls, const struct AttributeDeleteMessage *dam)
Check credential delete message format.
static void handle_attribute_store_message(void *cls, const struct AttributeStoreMessage *sam)
Handle an attribute store message.
static void cred_iter_finished(void *cls)
Done iterating over credentials.
static void cred_add_cb(void *cls, const struct GNUNET_CRYPTO_PrivateKey *zone, const char *label, unsigned int rd_count, const struct GNUNET_GNSRECORD_Data *rd)
Check for existing record before storing credential.
static struct IdpClient * client_list_head
Client list.
static struct GNUNET_SCHEDULER_Task * timeout_task
Timeout task.
static void attr_iter_error(void *cls)
Error iterating over attributes.
static void send_ticket_result(const struct IdpClient *client, uint32_t r_id, const struct GNUNET_RECLAIM_Ticket *ticket, const struct GNUNET_RECLAIM_PresentationList *presentations, uint32_t success)
Sends a ticket result message to the client.
static int check_attribute_delete_message(void *cls, const struct AttributeDeleteMessage *dam)
Check attribute delete message format.
static void handle_iteration_stop(void *cls, const struct AttributeIterationStopMessage *ais_msg)
Handle iteration stop message from client.
static void attr_store_task(void *cls)
Add a new attribute.
GNUNET_SERVICE_MAIN("reclaim", GNUNET_SERVICE_OPTION_NONE, &run, &client_connect_cb, &client_disconnect_cb, NULL, GNUNET_MQ_hd_var_size(attribute_store_message, GNUNET_MESSAGE_TYPE_RECLAIM_ATTRIBUTE_STORE, struct AttributeStoreMessage, NULL), GNUNET_MQ_hd_var_size(credential_store_message, GNUNET_MESSAGE_TYPE_RECLAIM_CREDENTIAL_STORE, struct AttributeStoreMessage, NULL), GNUNET_MQ_hd_var_size(attribute_delete_message, GNUNET_MESSAGE_TYPE_RECLAIM_ATTRIBUTE_DELETE, struct AttributeDeleteMessage, NULL), GNUNET_MQ_hd_var_size(credential_delete_message, GNUNET_MESSAGE_TYPE_RECLAIM_CREDENTIAL_DELETE, struct AttributeDeleteMessage, NULL), GNUNET_MQ_hd_var_size(iteration_start, GNUNET_MESSAGE_TYPE_RECLAIM_ATTRIBUTE_ITERATION_START, struct AttributeIterationStartMessage, NULL), GNUNET_MQ_hd_fixed_size(iteration_next, GNUNET_MESSAGE_TYPE_RECLAIM_ATTRIBUTE_ITERATION_NEXT, struct AttributeIterationNextMessage, NULL), GNUNET_MQ_hd_fixed_size(iteration_stop, GNUNET_MESSAGE_TYPE_RECLAIM_ATTRIBUTE_ITERATION_STOP, struct AttributeIterationStopMessage, NULL), GNUNET_MQ_hd_var_size(credential_iteration_start, GNUNET_MESSAGE_TYPE_RECLAIM_CREDENTIAL_ITERATION_START, struct CredentialIterationStartMessage, NULL), GNUNET_MQ_hd_fixed_size(credential_iteration_next, GNUNET_MESSAGE_TYPE_RECLAIM_CREDENTIAL_ITERATION_NEXT, struct CredentialIterationNextMessage, NULL), GNUNET_MQ_hd_fixed_size(credential_iteration_stop, GNUNET_MESSAGE_TYPE_RECLAIM_CREDENTIAL_ITERATION_STOP, struct CredentialIterationStopMessage, NULL), GNUNET_MQ_hd_var_size(issue_ticket_message, GNUNET_MESSAGE_TYPE_RECLAIM_ISSUE_TICKET, struct IssueTicketMessage, NULL), GNUNET_MQ_hd_var_size(consume_ticket_message, GNUNET_MESSAGE_TYPE_RECLAIM_CONSUME_TICKET, struct ConsumeTicketMessage, NULL), GNUNET_MQ_hd_var_size(ticket_iteration_start, GNUNET_MESSAGE_TYPE_RECLAIM_TICKET_ITERATION_START, struct TicketIterationStartMessage, NULL), GNUNET_MQ_hd_fixed_size(ticket_iteration_next, GNUNET_MESSAGE_TYPE_RECLAIM_TICKET_ITERATION_NEXT, struct TicketIterationNextMessage, NULL), GNUNET_MQ_hd_fixed_size(ticket_iteration_stop, GNUNET_MESSAGE_TYPE_RECLAIM_TICKET_ITERATION_STOP, struct TicketIterationStopMessage, NULL), GNUNET_MQ_hd_var_size(revoke_ticket_message, GNUNET_MESSAGE_TYPE_RECLAIM_REVOKE_TICKET, struct RevokeTicketMessage, NULL), GNUNET_MQ_handler_end())
Define "main" method using service macro.
static void client_disconnect_cb(void *cls, struct GNUNET_SERVICE_Client *client, void *app_ctx)
Called whenever a client is disconnected.
static enum GNUNET_GenericReturnValue check_iteration_start(void *cls, const struct AttributeIterationStartMessage *ais_msg)
static void handle_credential_iteration_stop(void *cls, const struct CredentialIterationStopMessage *ais_msg)
Handle iteration stop message from client.
static void cleanup_client(struct IdpClient *idp)
Cleanup client.
static void cleanup_as_handle(struct AttributeStoreHandle *ash)
Cleanup attribute store handle.
static enum GNUNET_GenericReturnValue check_credential_iteration_start(void *cls, const struct CredentialIterationStartMessage *cis_msg)
static void handle_iteration_next(void *cls, const struct AttributeIterationNextMessage *ais_msg)
Client requests next attribute from iterator.
static void handle_ticket_iteration_stop(void *cls, const struct TicketIterationStopMessage *tis_msg)
Client has had enough tickets.
static enum GNUNET_GenericReturnValue check_ticket_iteration_start(void *cls, const struct TicketIterationStartMessage *tis_msg)
void RECLAIM_TICKETS_iteration_stop(struct RECLAIM_TICKETS_Iterator *iter)
Stop a running ticket iteration.
void RECLAIM_TICKETS_consume_cancel(struct RECLAIM_TICKETS_ConsumeHandle *cth)
Cancel a consume operation.
struct RECLAIM_TICKETS_ConsumeHandle * RECLAIM_TICKETS_consume(const struct GNUNET_CRYPTO_PrivateKey *id, const struct GNUNET_RECLAIM_Ticket *ticket, RECLAIM_TICKETS_ConsumeCallback cb, void *cb_cls)
Consume a ticket.
struct RECLAIM_TICKETS_Iterator * RECLAIM_TICKETS_iteration_start(const struct GNUNET_CRYPTO_PrivateKey *identity, RECLAIM_TICKETS_TicketIter cb, void *cb_cls)
Iterate over all tickets issued by an identity.
void RECLAIM_TICKETS_revoke_cancel(struct RECLAIM_TICKETS_RevokeHandle *rh)
Cancel a revocation.
int RECLAIM_TICKETS_init(const struct GNUNET_CONFIGURATION_Handle *c)
Initialize tickets component.
void RECLAIM_TICKETS_iteration_next(struct RECLAIM_TICKETS_Iterator *iter)
Continue ticket iteration.
struct RECLAIM_TICKETS_RevokeHandle * RECLAIM_TICKETS_revoke(const struct GNUNET_RECLAIM_Ticket *ticket, const struct GNUNET_CRYPTO_PrivateKey *identity, RECLAIM_TICKETS_RevokeCallback cb, void *cb_cls)
Revoke a ticket.
void RECLAIM_TICKETS_issue(const struct GNUNET_CRYPTO_PrivateKey *identity, const struct GNUNET_RECLAIM_AttributeList *attrs, const struct GNUNET_CRYPTO_PublicKey *audience, RECLAIM_TICKETS_TicketResult cb, void *cb_cls)
Issue a new reclaim ticket, thereby authorizing the audience to access the set of provided attributes...
void RECLAIM_TICKETS_deinit(void)
Close handles and clean up.
API that can be used to manipulate GNS record data.
Constants for network protocols.
Identity attribute definitions.
reclaim service; implements identity and personal data sharing for GNUnet
#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.
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.
@ GNUNET_GNSRECORD_RF_RELATIVE_EXPIRATION
This expiration time of the record is a relative time (not an absolute time).
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:68
#define GNUNET_log(kind,...)
ssize_t GNUNET_CRYPTO_write_public_key_to_buffer(const struct GNUNET_CRYPTO_PublicKey *key, void *buffer, size_t len)
Writes a GNUNET_CRYPTO_PublicKey to a compact buffer.
Definition: crypto_pkey.c:128
enum GNUNET_GenericReturnValue GNUNET_CRYPTO_key_get_public(const struct GNUNET_CRYPTO_PrivateKey *privkey, struct GNUNET_CRYPTO_PublicKey *key)
Retrieves the public key representation of a private key.
Definition: crypto_pkey.c:602
uint64_t GNUNET_ntohll(uint64_t n)
Convert unsigned 64-bit integer to host byte order.
Definition: common_endian.c:54
#define GNUNET_memcpy(dst, src, n)
Call memcpy() but check for n being 0 first.
enum GNUNET_GenericReturnValue GNUNET_CRYPTO_read_public_key_from_buffer(const void *buffer, size_t len, struct GNUNET_CRYPTO_PublicKey *key, size_t *read)
Reads a GNUNET_CRYPTO_PublicKey from a compact buffer.
Definition: crypto_pkey.c:103
GNUNET_GenericReturnValue
Named constants for return values.
enum GNUNET_GenericReturnValue GNUNET_CRYPTO_read_private_key_from_buffer(const void *buffer, size_t len, struct GNUNET_CRYPTO_PrivateKey *key, size_t *read)
Reads a GNUNET_CRYPTO_PrivateKey from a compact buffer.
Definition: crypto_pkey.c:146
@ 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
@ GNUNET_ERROR_TYPE_INFO
#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.
void GNUNET_MQ_send(struct GNUNET_MQ_Handle *mq, struct GNUNET_MQ_Envelope *ev)
Send a message with the given message queue.
Definition: mq.c:304
#define GNUNET_MQ_handler_end()
End-marker for the handlers array.
#define GNUNET_MQ_msg_extra(mvar, esize, type)
Allocate an envelope, with extra space allocated after the space needed by the message struct.
Definition: gnunet_mq_lib.h:63
#define GNUNET_MQ_msg(mvar, type)
Allocate a GNUNET_MQ_Envelope.
Definition: gnunet_mq_lib.h:78
#define GNUNET_MQ_hd_var_size(name, code, str, ctx)
#define GNUNET_MQ_hd_fixed_size(name, code, str, ctx)
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_ZoneIterator * GNUNET_NAMESTORE_zone_iteration_start(struct GNUNET_NAMESTORE_Handle *h, const struct GNUNET_CRYPTO_PrivateKey *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)
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_MESSAGE_TYPE_RECLAIM_CONSUME_TICKET_RESULT
#define GNUNET_MESSAGE_TYPE_RECLAIM_SUCCESS_RESPONSE
#define GNUNET_MESSAGE_TYPE_RECLAIM_ATTRIBUTE_RESULT
#define GNUNET_MESSAGE_TYPE_RECLAIM_CREDENTIAL_DELETE
#define GNUNET_MESSAGE_TYPE_RECLAIM_CREDENTIAL_ITERATION_STOP
#define GNUNET_MESSAGE_TYPE_RECLAIM_ISSUE_TICKET
#define GNUNET_MESSAGE_TYPE_RECLAIM_ATTRIBUTE_STORE
#define GNUNET_MESSAGE_TYPE_RECLAIM_TICKET_RESULT
#define GNUNET_MESSAGE_TYPE_RECLAIM_TICKET_ITERATION_START
#define GNUNET_MESSAGE_TYPE_RECLAIM_TICKET_ITERATION_STOP
#define GNUNET_MESSAGE_TYPE_RECLAIM_ATTRIBUTE_ITERATION_STOP
#define GNUNET_MESSAGE_TYPE_RECLAIM_ATTRIBUTE_ITERATION_NEXT
#define GNUNET_MESSAGE_TYPE_RECLAIM_CREDENTIAL_RESULT
#define GNUNET_MESSAGE_TYPE_RECLAIM_TICKET_ITERATION_NEXT
#define GNUNET_MESSAGE_TYPE_RECLAIM_CREDENTIAL_ITERATION_NEXT
#define GNUNET_MESSAGE_TYPE_RECLAIM_REVOKE_TICKET
#define GNUNET_MESSAGE_TYPE_RECLAIM_CONSUME_TICKET
#define GNUNET_MESSAGE_TYPE_RECLAIM_ATTRIBUTE_ITERATION_START
#define GNUNET_MESSAGE_TYPE_RECLAIM_ATTRIBUTE_DELETE
#define GNUNET_MESSAGE_TYPE_RECLAIM_CREDENTIAL_ITERATION_START
#define GNUNET_MESSAGE_TYPE_RECLAIM_CREDENTIAL_STORE
#define GNUNET_MESSAGE_TYPE_RECLAIM_REVOKE_TICKET_RESULT
#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.
void GNUNET_RECLAIM_credential_list_destroy(struct GNUNET_RECLAIM_CredentialList *credentials)
Destroy credential list.
#define GNUNET_RECLAIM_id_is_zero(a)
struct GNUNET_RECLAIM_AttributeList * GNUNET_RECLAIM_attribute_list_deserialize(const char *data, size_t data_size)
Deserialize an attribute 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.
size_t GNUNET_RECLAIM_attribute_list_serialize(const struct GNUNET_RECLAIM_AttributeList *attrs, char *result)
Serialize an attribute list.
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_presentation_list_serialize(const struct GNUNET_RECLAIM_PresentationList *presentations, char *result)
Serialize a presentation list.
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_presentation_list_serialize_get_size(const struct GNUNET_RECLAIM_PresentationList *presentations)
Get required size for serialization buffer.
size_t GNUNET_RECLAIM_attribute_list_serialize_get_size(const struct GNUNET_RECLAIM_AttributeList *attrs)
Get required size for serialization buffer.
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.
enum GNUNET_GenericReturnValue GNUNET_RECLAIM_read_ticket_from_buffer(const void *buffer, size_t len, struct GNUNET_RECLAIM_Ticket *tkt, size_t *tb_read)
Deserializes a ticket.
Definition: reclaim_api.c:1752
ssize_t GNUNET_RECLAIM_write_ticket_to_buffer(const struct GNUNET_RECLAIM_Ticket *tkt, void *buffer, size_t len)
Serializes a ticket.
Definition: reclaim_api.c:1785
size_t GNUNET_RECLAIM_ticket_serialize_get_size(const struct GNUNET_RECLAIM_Ticket *tkt)
Get serialized ticket size.
Definition: reclaim_api.c:1742
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:1340
void * GNUNET_SCHEDULER_cancel(struct GNUNET_SCHEDULER_Task *task)
Cancel the task with the specified identifier.
Definition: scheduler.c:981
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:1305
void GNUNET_SERVICE_client_drop(struct GNUNET_SERVICE_Client *c)
Ask the server to disconnect from the given client.
Definition: service.c:2489
void GNUNET_SERVICE_client_continue(struct GNUNET_SERVICE_Client *c)
Continue receiving further messages from the given client.
Definition: service.c:2408
@ GNUNET_SERVICE_OPTION_NONE
Use defaults.
char * GNUNET_STRINGS_data_to_string_alloc(const void *buf, size_t size)
Return the base32crockford encoding of the given buffer.
Definition: strings.c:764
static struct GNUNET_RECLAIM_Handle * idp
Identity Provider.
static unsigned int size
Size of the "table".
Definition: peer.c:68
Common type definitions for the identity provider service and API.
#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
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).
Handle for attribute deletion request.
struct GNUNET_RECLAIM_CredentialList * existing_credentials
Existing credentials.
struct GNUNET_CRYPTO_PrivateKey identity
Identity.
struct TicketRecordsEntry * tickets_to_update_tail
Tickets to update.
struct GNUNET_RECLAIM_Attribute * claim
The attribute to delete.
struct AttributeDeleteHandle * next
DLL.
struct IdpClient * client
Client connection.
char * label
Attribute label.
struct GNUNET_NAMESTORE_ZoneIterator * ns_it
Iterator.
struct GNUNET_RECLAIM_AttributeList * existing_attributes
Existing attributes.
struct GNUNET_NAMESTORE_QueueEntry * ns_qe
QueueEntry.
struct AttributeDeleteHandle * prev
DLL.
struct GNUNET_RECLAIM_Credential * credential
The credential to delete.
struct TicketRecordsEntry * tickets_to_update_head
Tickets to update.
Use to delete an identity attribute.
Definition: reclaim.h:77
struct GNUNET_MessageHeader header
Type: GNUNET_MESSAGE_TYPE_IDENTITY_SET_DEFAULT.
Definition: reclaim.h:81
uint16_t key_len
The length of the private key.
Definition: reclaim.h:96
uint16_t attr_len
The length of the attribute.
Definition: reclaim.h:91
uint32_t id
Unique identifier for this request (for key collisions).
Definition: reclaim.h:86
Ask for next result of attribute iteration for the given operation.
Definition: reclaim.h:233
uint32_t id
Unique identifier for this request (for key collisions).
Definition: reclaim.h:242
Start a attribute iteration for the given identity.
Definition: reclaim.h:202
uint16_t key_len
The length of the private key.
Definition: reclaim.h:221
uint32_t id
Unique identifier for this request (for key collisions).
Definition: reclaim.h:211
struct GNUNET_MessageHeader header
Message.
Definition: reclaim.h:206
Stop attribute iteration for the given operation.
Definition: reclaim.h:315
uint32_t id
Unique identifier for this request (for key collisions).
Definition: reclaim.h:324
Attribute is returned from the idp.
Definition: reclaim.h:127
uint16_t attr_len
Length of serialized attribute data.
Definition: reclaim.h:146
uint16_t pkey_len
The length of the public key.
Definition: reclaim.h:156
uint32_t id
Unique identifier for this request (for key collisions).
Definition: reclaim.h:136
Handle for attribute store request.
struct GNUNET_NAMESTORE_QueueEntry * ns_qe
QueueEntry.
struct IdpClient * client
Client connection.
struct GNUNET_CRYPTO_PrivateKey identity
Identity.
struct GNUNET_RECLAIM_Credential * credential
The credential to store.
struct GNUNET_TIME_Relative exp
The attribute expiration interval.
struct GNUNET_CRYPTO_PublicKey identity_pkey
Identity pubkey.
struct AttributeStoreHandle * prev
DLL.
struct AttributeStoreHandle * next
DLL.
struct GNUNET_RECLAIM_Attribute * claim
The attribute to store.
Use to store an identity attribute.
Definition: reclaim.h:41
struct GNUNET_MessageHeader header
Type: GNUNET_MESSAGE_TYPE_IDENTITY_SET_DEFAULT.
Definition: reclaim.h:45
uint64_t exp
The expiration interval of the attribute.
Definition: reclaim.h:50
uint16_t key_len
The length of the private key.
Definition: reclaim.h:65
uint16_t attr_len
The length of the attribute.
Definition: reclaim.h:60
uint32_t id
Unique identifier for this request (for key collisions).
Definition: reclaim.h:55
Ticket consume message.
Definition: reclaim.h:523
uint32_t id
Unique identifier for this request (for key collisions).
Definition: reclaim.h:532
struct GNUNET_MessageHeader header
Type will be GNUNET_MESSAGE_TYPE_RECLAIM_CONSUME_TICKET.
Definition: reclaim.h:527
uint16_t key_len
The length of the private key.
Definition: reclaim.h:537
uint16_t tkt_len
The length of the ticket.
Definition: reclaim.h:542
Handle for ticket consume request.
struct ConsumeTicketOperation * next
DLL.
struct IdpClient * client
Client connection.
struct ConsumeTicketOperation * prev
DLL.
struct RECLAIM_TICKETS_ConsumeHandle * ch
Ticket consume handle.
Attribute list is returned from the idp.
Definition: reclaim.h:554
uint16_t attrs_len
Length of serialized attribute data.
Definition: reclaim.h:578
uint16_t presentations_len
Length of presentation data.
Definition: reclaim.h:583
uint32_t id
Unique identifier for this request (for key collisions).
Definition: reclaim.h:563
uint16_t key_len
The length of the private key.
Definition: reclaim.h:588
uint32_t result
Result.
Definition: reclaim.h:568
Ask for next result of credential iteration for the given operation.
Definition: reclaim.h:281
uint32_t id
Unique identifier for this request (for key collisions).
Definition: reclaim.h:290
Start a credential iteration for the given identity.
Definition: reclaim.h:250
uint32_t id
Unique identifier for this request (for key collisions).
Definition: reclaim.h:259
struct GNUNET_MessageHeader header
Message.
Definition: reclaim.h:254
uint16_t key_len
The length of the private key.
Definition: reclaim.h:269
Stop credential iteration for the given operation.
Definition: reclaim.h:298
uint32_t id
Unique identifier for this request (for key collisions).
Definition: reclaim.h:307
Credential is returned from the idp.
Definition: reclaim.h:169
uint16_t credential_len
Length of serialized attribute data.
Definition: reclaim.h:183
uint32_t id
Unique identifier for this request (for key collisions).
Definition: reclaim.h:178
uint16_t key_len
The length of the public key.
Definition: reclaim.h:188
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.
Handle to a message queue.
Definition: mq.c:87
uint16_t size
The length of the struct (in bytes, including the length field itself), in big-endian format.
Connection to the NAMESTORE service.
An QueueEntry used to store information for a pending NAMESTORE record operation.
Definition: namestore_api.c:49
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.
struct GNUNET_RECLAIM_CredentialListEntry * next
DLL.
struct GNUNET_RECLAIM_Credential * credential
The credential.
A list of GNUNET_RECLAIM_Credential structures.
struct GNUNET_RECLAIM_CredentialListEntry * list_head
List head.
struct GNUNET_RECLAIM_CredentialListEntry * list_tail
List tail.
const char * name
The name of the credential.
struct GNUNET_RECLAIM_Identifier id
ID.
struct GNUNET_CLIENT_Connection * client
Socket (if available).
Definition: reclaim_api.c:325
struct GNUNET_MQ_Handle * mq
Connection to service (if available).
Definition: reclaim_api.c:390
A list of GNUNET_RECLAIM_Presentation structures.
A credential presentation.
struct GNUNET_RECLAIM_Identifier credential_id
The credential id of which this is a presentation.
The authorization ticket.
Entry in list of pending tasks.
Definition: scheduler.c:136
Handle to a client that is connected to a service.
Definition: service.c:252
Handle to a service.
Definition: service.c:118
Time for relative time used by GNUnet, in microseconds.
uint64_t rel_value_us
The actual value.
struct GNUNET_TRANSPORT_AddressIdentifier * next
Kept in a DLL.
An idp client.
struct IdpClient * next
DLL.
struct TicketIteration * ticket_iter_tail
Tail of DLL of ticket iteration ops.
struct GNUNET_SERVICE_Client * client
The client.
struct Iterator * attr_iter_tail
Tail of the DLL of Attribute iteration operations in progress initiated by this client.
struct IdpClient * prev
DLL.
struct TicketRevocationOperation * revoke_op_head
Head of DLL of ticket revocation ops.
struct AttributeStoreHandle * store_op_head
Head of DLL of attribute store ops.
struct TicketIssueOperation * issue_op_tail
Tail of DLL of ticket issue ops.
struct Iterator * cred_iter_tail
Tail of the DLL of Credential iteration operations in progress initiated by this client.
struct AttributeDeleteHandle * delete_op_tail
Tail of DLL of attribute delete ops.
struct TicketRevocationOperation * revoke_op_tail
Tail of DLL of ticket revocation ops.
struct TicketIssueOperation * issue_op_head
Head of DLL of ticket issue ops.
struct AttributeDeleteHandle * delete_op_head
Head of DLL of attribute delete ops.
struct Iterator * cred_iter_head
Head of the DLL of Credential iteration operations in progress initiated by this client.
struct GNUNET_MQ_Handle * mq
Message queue for transmission to client.
struct AttributeStoreHandle * store_op_tail
Tail of DLL of attribute store ops.
struct ConsumeTicketOperation * consume_op_head
Head of DLL of ticket consume ops.
struct ConsumeTicketOperation * consume_op_tail
Tail of DLL of ticket consume ops.
struct TicketIteration * ticket_iter_head
Head of DLL of ticket iteration ops.
struct Iterator * attr_iter_head
Head of the DLL of Attribute iteration operations in progress initiated by this client.
Ticket issue message.
Definition: reclaim.h:396
uint32_t id
Unique identifier for this request (for key collisions).
Definition: reclaim.h:405
struct GNUNET_MessageHeader header
Type will be GNUNET_MESSAGE_TYPE_RECLAIM_ISSUE_TICKET.
Definition: reclaim.h:400
uint16_t pkey_len
The length of the relying party public key.
Definition: reclaim.h:425
uint16_t key_len
The length of the identity private key.
Definition: reclaim.h:420
uint16_t attr_len
length of serialized attribute list
Definition: reclaim.h:415
An attribute iteration operation.
struct Iterator * prev
Previous element in the DLL.
struct GNUNET_NAMESTORE_ZoneIterator * ns_it
Namestore iterator.
struct IdpClient * client
IDP client which intiated this zone iteration.
struct GNUNET_CRYPTO_PrivateKey identity
Key of the zone we are iterating over.
void * ctx
Context.
struct Iterator * next
Next element in the DLL.
uint32_t request_id
The operation id for the zone iteration in the response for the client.
Ticket revocation request handle.
Ticket revoke message.
Definition: reclaim.h:438
uint16_t key_len
The length of the private key.
Definition: reclaim.h:452
uint32_t id
Unique identifier for this request (for key collisions).
Definition: reclaim.h:447
uint16_t tkt_len
The length of the ticket.
Definition: reclaim.h:457
struct GNUNET_MessageHeader header
Type will be GNUNET_MESSAGE_TYPE_RECLAIM_REVOKE_TICKET.
Definition: reclaim.h:442
Ticket revoke message.
Definition: reclaim.h:470
uint32_t id
Unique identifier for this request (for key collisions).
Definition: reclaim.h:479
uint32_t success
Revocation result.
Definition: reclaim.h:484
Attribute store/delete response message.
Definition: reclaim.h:106
uint32_t id
Unique identifier for this request (for key collisions).
Definition: reclaim.h:115
int32_t op_result
GNUNET_SYSERR on failure, GNUNET_OK on success
Definition: reclaim.h:120
Ticket issue operation handle.
struct TicketIssueOperation * next
DLL.
struct IdpClient * client
Client connection.
struct TicketIssueOperation * prev
DLL.
Ask for next result of ticket iteration for the given operation.
Definition: reclaim.h:362
uint32_t id
Unique identifier for this request (for key collisions).
Definition: reclaim.h:371
Start a ticket iteration for the given identity.
Definition: reclaim.h:331
uint16_t key_len
The length of the private key.
Definition: reclaim.h:350
uint32_t id
Unique identifier for this request (for key collisions).
Definition: reclaim.h:340
struct GNUNET_MessageHeader header
Message.
Definition: reclaim.h:335
Stop ticket iteration for the given operation.
Definition: reclaim.h:379
uint32_t id
Unique identifier for this request (for key collisions).
Definition: reclaim.h:388
A ticket iteration operation.
struct TicketIteration * next
DLL.
struct IdpClient * client
Client which intiated this zone iteration.
uint32_t r_id
The operation id for the iteration in the response for the client.
struct RECLAIM_TICKETS_Iterator * iter
The ticket iterator.
struct TicketIteration * prev
DLL.
unsigned int rd_count
Record count.
Ticket result message.
Definition: reclaim.h:492
uint32_t id
Unique identifier for this request (for key collisions).
Definition: reclaim.h:501
uint16_t presentations_len
Length of new presentations created.
Definition: reclaim.h:511
uint16_t tkt_len
Ticket length.
Definition: reclaim.h:506
Ticket revocation request handle.
struct TicketRevocationOperation * next
DLL.
struct RECLAIM_TICKETS_RevokeHandle * rh
Revocation handle.
struct TicketRevocationOperation * prev
DLL.
struct IdpClient * client
Client connection.