diff options
author | Markus Voggenreiter <Markus.Voggenreiter@tum.de> | 2019-11-27 12:30:49 +0100 |
---|---|---|
committer | Schanzenbach, Martin <mschanzenbach@posteo.de> | 2020-01-13 13:31:05 +0100 |
commit | cb08bbcbefc98afe6b8c7600bb0dfb1241343cff (patch) | |
tree | ec801cb4e772bd245ca8d22f19bc751ca67d2737 /src/reclaim/gnunet-service-reclaim_tickets.c | |
parent | c0fce9ca75973a646f80372fcc08c059818ba548 (diff) | |
download | gnunet-cb08bbcbefc98afe6b8c7600bb0dfb1241343cff.tar.gz gnunet-cb08bbcbefc98afe6b8c7600bb0dfb1241343cff.zip |
Basic Functionality Implemented
Diffstat (limited to 'src/reclaim/gnunet-service-reclaim_tickets.c')
-rw-r--r-- | src/reclaim/gnunet-service-reclaim_tickets.c | 260 |
1 files changed, 211 insertions, 49 deletions
diff --git a/src/reclaim/gnunet-service-reclaim_tickets.c b/src/reclaim/gnunet-service-reclaim_tickets.c index 4d1a26333..b022225b8 100644 --- a/src/reclaim/gnunet-service-reclaim_tickets.c +++ b/src/reclaim/gnunet-service-reclaim_tickets.c | |||
@@ -667,8 +667,7 @@ rvk_move_attr_cb (void *cls, | |||
667 | const struct GNUNET_GNSRECORD_Data *rd) | 667 | const struct GNUNET_GNSRECORD_Data *rd) |
668 | { | 668 | { |
669 | struct RECLAIM_TICKETS_RevokeHandle *rvk = cls; | 669 | struct RECLAIM_TICKETS_RevokeHandle *rvk = cls; |
670 | struct GNUNET_RECLAIM_ATTRIBUTE_Claim *claim; | 670 | struct GNUNET_GNSRECORD_Data new_rd[rd_count]; |
671 | struct GNUNET_GNSRECORD_Data new_rd; | ||
672 | struct RevokedAttributeEntry *le; | 671 | struct RevokedAttributeEntry *le; |
673 | char *new_label; | 672 | char *new_label; |
674 | char *attr_data; | 673 | char *attr_data; |
@@ -677,7 +676,7 @@ rvk_move_attr_cb (void *cls, | |||
677 | if (0 == rd_count) | 676 | if (0 == rd_count) |
678 | { | 677 | { |
679 | GNUNET_log (GNUNET_ERROR_TYPE_WARNING, | 678 | GNUNET_log (GNUNET_ERROR_TYPE_WARNING, |
680 | "The attribute %s no longer exists!\n", | 679 | "The claim %s no longer exists!\n", |
681 | label); | 680 | label); |
682 | le = rvk->move_attr; | 681 | le = rvk->move_attr; |
683 | rvk->move_attr = le->next; | 682 | rvk->move_attr = le->next; |
@@ -686,32 +685,82 @@ rvk_move_attr_cb (void *cls, | |||
686 | GNUNET_SCHEDULER_add_now (&move_attrs_cont, rvk); | 685 | GNUNET_SCHEDULER_add_now (&move_attrs_cont, rvk); |
687 | return; | 686 | return; |
688 | } | 687 | } |
689 | /** find a new place for this attribute **/ | 688 | rvk->move_attr->new_id =GNUNET_CRYPTO_random_u64 (GNUNET_CRYPTO_QUALITY_STRONG, UINT64_MAX); |
690 | rvk->move_attr->new_id = | 689 | new_label=NULL; |
691 | GNUNET_CRYPTO_random_u64 (GNUNET_CRYPTO_QUALITY_STRONG, UINT64_MAX); | 690 | attr_data=NULL; |
692 | new_rd = *rd; | 691 | //new_rd = *rd; |
693 | claim = GNUNET_RECLAIM_ATTRIBUTE_deserialize (rd->data, rd->data_size); | 692 | for (int i = 0; i < rd_count; i++) |
694 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, | 693 | { |
695 | "Attribute to update: Name=%s, ID=%" PRIu64 "\n", | 694 | if (GNUNET_GNSRECORD_TYPE_RECLAIM_ATTR == rd[i].record_type) |
696 | claim->name, | 695 | { |
697 | claim->id); | 696 | /** find a new place for this attribute **/ |
698 | claim->id = rvk->move_attr->new_id; | 697 | struct GNUNET_RECLAIM_ATTRIBUTE_Claim *claim; |
699 | new_rd.data_size = GNUNET_RECLAIM_ATTRIBUTE_serialize_get_size (claim); | 698 | claim = GNUNET_RECLAIM_ATTRIBUTE_deserialize (rd[i].data, rd[i].data_size); |
700 | attr_data = GNUNET_malloc (rd->data_size); | 699 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, |
701 | new_rd.data_size = GNUNET_RECLAIM_ATTRIBUTE_serialize (claim, attr_data); | 700 | "Attribute to update: Name=%s, ID=%" PRIu64 "\n", |
702 | new_rd.data = attr_data; | 701 | claim->name, |
703 | new_label = GNUNET_STRINGS_data_to_string_alloc (&rvk->move_attr->new_id, | 702 | claim->id); |
704 | sizeof(uint64_t)); | 703 | claim->id = rvk->move_attr->new_id; |
705 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Adding attribute %s\n", new_label); | 704 | new_rd[i].data_size = GNUNET_RECLAIM_ATTRIBUTE_serialize_get_size (claim); |
705 | attr_data = GNUNET_malloc (rd[i].data_size); | ||
706 | new_rd[i].data_size = GNUNET_RECLAIM_ATTRIBUTE_serialize (claim, attr_data); | ||
707 | new_rd[i].data = attr_data; | ||
708 | new_rd[i].record_type = rd[i].record_type; | ||
709 | new_rd[i].flags = rd[i].flags; | ||
710 | new_rd[i].expiration_time = rd[i].expiration_time; | ||
711 | new_label = GNUNET_STRINGS_data_to_string_alloc (&rvk->move_attr->new_id, | ||
712 | sizeof(uint64_t)); | ||
713 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Adding attribute %s\n", new_label); | ||
714 | GNUNET_free (claim); | ||
715 | } else if (GNUNET_GNSRECORD_TYPE_RECLAIM_ATTEST_ATTR == rd[i].record_type) | ||
716 | { | ||
717 | struct GNUNET_RECLAIM_ATTESTATION_Claim *attest; | ||
718 | attest=GNUNET_RECLAIM_ATTESTATION_deserialize(rd[i].data, rd[i].data_size); | ||
719 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, | ||
720 | "Attestation to update: Name=%s, ID=%" PRIu64 "\n", | ||
721 | attest->name, | ||
722 | attest->id); | ||
723 | attest->id = rvk->move_attr->new_id; | ||
724 | new_rd[i].data_size = GNUNET_RECLAIM_ATTESTATION_serialize_get_size (attest); | ||
725 | attr_data = GNUNET_malloc (rd[i].data_size); | ||
726 | new_rd[i].data_size = GNUNET_RECLAIM_ATTESTATION_serialize (attest, attr_data); | ||
727 | new_rd[i].data = attr_data; | ||
728 | new_rd[i].record_type = rd[i].record_type; | ||
729 | new_rd[i].flags = rd[i].flags; | ||
730 | new_rd[i].expiration_time = rd[i].expiration_time; | ||
731 | new_label = GNUNET_STRINGS_data_to_string_alloc (&rvk->move_attr->new_id, sizeof(uint64_t)); | ||
732 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Adding attestation %s\n", new_label); | ||
733 | GNUNET_free (attest); | ||
734 | } else if (GNUNET_GNSRECORD_TYPE_RECLAIM_REFERENCE == rd[i].record_type) | ||
735 | { | ||
736 | struct GNUNET_RECLAIM_ATTESTATION_REFERENCE *reference; | ||
737 | reference=GNUNET_RECLAIM_ATTESTATION_REF_deserialize(rd[i].data, rd[i].data_size); | ||
738 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, | ||
739 | "Reference to update: Name=%s, ID=%" PRIu64 "\n", | ||
740 | reference->name, | ||
741 | reference->id); | ||
742 | reference->id = rvk->move_attr->new_id; | ||
743 | reference->id_attest = rvk->move_attr->new_id; | ||
744 | new_rd[i].data_size = GNUNET_RECLAIM_ATTESTATION_REF_serialize_get_size (reference); | ||
745 | attr_data = GNUNET_malloc (rd[i].data_size); | ||
746 | new_rd[i].data_size = GNUNET_RECLAIM_ATTESTATION_REF_serialize (reference, attr_data); | ||
747 | new_rd[i].data = attr_data; | ||
748 | new_label = GNUNET_STRINGS_data_to_string_alloc (&rvk->move_attr->new_id, sizeof(uint64_t)); | ||
749 | new_rd[i].record_type = rd[i].record_type; | ||
750 | new_rd[i].flags = rd[i].flags; | ||
751 | new_rd[i].expiration_time = rd[i].expiration_time; | ||
752 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Adding reference %s\n", new_label); | ||
753 | GNUNET_free (reference); | ||
754 | } | ||
755 | } | ||
706 | rvk->ns_qe = GNUNET_NAMESTORE_records_store (nsh, | 756 | rvk->ns_qe = GNUNET_NAMESTORE_records_store (nsh, |
707 | &rvk->identity, | 757 | &rvk->identity, |
708 | new_label, | 758 | new_label, |
709 | 1, | 759 | rd_count, |
710 | &new_rd, | 760 | new_rd, |
711 | &move_attr_finished, | 761 | &move_attr_finished, |
712 | rvk); | 762 | rvk); |
713 | GNUNET_free (new_label); | 763 | GNUNET_free (new_label); |
714 | GNUNET_free (claim); | ||
715 | GNUNET_free (attr_data); | 764 | GNUNET_free (attr_data); |
716 | } | 765 | } |
717 | 766 | ||
@@ -745,7 +794,7 @@ move_attrs (struct RECLAIM_TICKETS_RevokeHandle *rvk) | |||
745 | } | 794 | } |
746 | label = GNUNET_STRINGS_data_to_string_alloc (&rvk->move_attr->old_id, | 795 | label = GNUNET_STRINGS_data_to_string_alloc (&rvk->move_attr->old_id, |
747 | sizeof(uint64_t)); | 796 | sizeof(uint64_t)); |
748 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Moving attribute %s\n", label); | 797 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Moving claim %s\n", label); |
749 | 798 | ||
750 | rvk->ns_qe = GNUNET_NAMESTORE_records_lookup (nsh, | 799 | rvk->ns_qe = GNUNET_NAMESTORE_records_lookup (nsh, |
751 | &rvk->identity, | 800 | &rvk->identity, |
@@ -982,21 +1031,70 @@ process_parallel_lookup_result (void *cls, | |||
982 | 1031 | ||
983 | 1032 | ||
984 | GNUNET_free (parallel_lookup); | 1033 | GNUNET_free (parallel_lookup); |
985 | if (1 != rd_count) | 1034 | if (0 == rd_count) |
986 | GNUNET_break (0); // FIXME: We should never find this. | 1035 | GNUNET_break (0); |
987 | if (rd->record_type == GNUNET_GNSRECORD_TYPE_RECLAIM_ATTR) | 1036 | // REMARK: It is possible now to find rd_count > 1 |
1037 | for (int i = 0; i < rd_count; i++) | ||
988 | { | 1038 | { |
989 | attr_le = GNUNET_new (struct GNUNET_RECLAIM_ATTRIBUTE_ClaimListEntry); | 1039 | if (GNUNET_GNSRECORD_TYPE_RECLAIM_ATTR == rd[i].record_type) |
990 | attr_le->claim = | 1040 | { |
991 | GNUNET_RECLAIM_ATTRIBUTE_deserialize (rd->data, rd->data_size); | 1041 | attr_le = GNUNET_new (struct GNUNET_RECLAIM_ATTRIBUTE_ClaimListEntry); |
992 | GNUNET_CONTAINER_DLL_insert (cth->attrs->list_head, | 1042 | attr_le->claim = |
993 | cth->attrs->list_tail, | 1043 | GNUNET_RECLAIM_ATTRIBUTE_deserialize (rd[i].data, rd[i].data_size); |
994 | attr_le); | 1044 | GNUNET_CONTAINER_DLL_insert (cth->attrs->list_head, |
995 | } | 1045 | cth->attrs->list_tail, |
1046 | attr_le); | ||
1047 | attr_le->reference = NULL; | ||
1048 | attr_le->attest = NULL; | ||
1049 | } | ||
1050 | else if (GNUNET_GNSRECORD_TYPE_RECLAIM_ATTEST_ATTR == rd[i].record_type) | ||
1051 | { | ||
1052 | /**Ignore all plain attestations | ||
1053 | *attr_le = GNUNET_new (struct GNUNET_RECLAIM_ATTRIBUTE_ClaimListEntry); | ||
1054 | *attr_le->attest = | ||
1055 | * GNUNET_RECLAIM_ATTESTATION_deserialize (rd[i].data, rd[i].data_size); | ||
1056 | *GNUNET_CONTAINER_DLL_insert (cth->attrs->list_head, | ||
1057 | * cth->attrs->list_tail, | ||
1058 | * attr_le); | ||
1059 | */ | ||
1060 | continue; | ||
1061 | } | ||
1062 | else if (GNUNET_GNSRECORD_TYPE_RECLAIM_REFERENCE == rd[i].record_type) | ||
1063 | { | ||
1064 | struct GNUNET_RECLAIM_ATTRIBUTE_ClaimListEntry *attr_le2; | ||
1065 | attr_le = GNUNET_new (struct GNUNET_RECLAIM_ATTRIBUTE_ClaimListEntry); | ||
1066 | attr_le2 = GNUNET_new (struct GNUNET_RECLAIM_ATTRIBUTE_ClaimListEntry); | ||
1067 | if (GNUNET_GNSRECORD_TYPE_RECLAIM_ATTEST_ATTR == rd[0].record_type) | ||
1068 | { | ||
1069 | attr_le->attest = GNUNET_RECLAIM_ATTESTATION_deserialize (rd[0].data, | ||
1070 | rd[0]. | ||
1071 | data_size); | ||
1072 | attr_le2->reference = | ||
1073 | GNUNET_RECLAIM_ATTESTATION_REF_deserialize (rd[i].data, | ||
1074 | rd[i].data_size); | ||
1075 | attr_le->claim = NULL; | ||
1076 | attr_le->reference = NULL; | ||
1077 | attr_le2->claim = NULL; | ||
1078 | attr_le2->attest = NULL; | ||
1079 | GNUNET_CONTAINER_DLL_insert (cth->attrs->list_head, | ||
1080 | cth->attrs->list_tail, | ||
1081 | attr_le); | ||
1082 | GNUNET_CONTAINER_DLL_insert (cth->attrs->list_head, | ||
1083 | cth->attrs->list_tail, | ||
1084 | attr_le2); | ||
1085 | } | ||
1086 | else | ||
1087 | { | ||
1088 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, | ||
1089 | "Parallel Lookup of Reference without Attestation"); | ||
1090 | continue; | ||
1091 | } | ||
996 | 1092 | ||
1093 | |||
1094 | } | ||
1095 | } | ||
997 | if (NULL != cth->parallel_lookups_head) | 1096 | if (NULL != cth->parallel_lookups_head) |
998 | return; // Wait for more | 1097 | return; // Wait for more |
999 | |||
1000 | /* Else we are done */ | 1098 | /* Else we are done */ |
1001 | cth->cb (cth->cb_cls, &cth->ticket.identity, cth->attrs, GNUNET_OK, NULL); | 1099 | cth->cb (cth->cb_cls, &cth->ticket.identity, cth->attrs, GNUNET_OK, NULL); |
1002 | cleanup_cth (cth); | 1100 | cleanup_cth (cth); |
@@ -1076,7 +1174,7 @@ lookup_authz_cb (void *cls, | |||
1076 | GNUNET_GNS_lookup (gns, | 1174 | GNUNET_GNS_lookup (gns, |
1077 | lbl, | 1175 | lbl, |
1078 | &cth->ticket.identity, | 1176 | &cth->ticket.identity, |
1079 | GNUNET_GNSRECORD_TYPE_RECLAIM_ATTR, | 1177 | GNUNET_GNSRECORD_TYPE_ANY, |
1080 | GNUNET_GNS_LO_DEFAULT, | 1178 | GNUNET_GNS_LO_DEFAULT, |
1081 | &process_parallel_lookup_result, | 1179 | &process_parallel_lookup_result, |
1082 | parallel_lookup); | 1180 | parallel_lookup); |
@@ -1223,6 +1321,7 @@ issue_ticket (struct TicketIssueHandle *ih) | |||
1223 | char *label; | 1321 | char *label; |
1224 | size_t list_len = 1; | 1322 | size_t list_len = 1; |
1225 | int i; | 1323 | int i; |
1324 | char *attest_string; | ||
1226 | 1325 | ||
1227 | for (le = ih->attrs->list_head; NULL != le; le = le->next) | 1326 | for (le = ih->attrs->list_head; NULL != le; le = le->next) |
1228 | list_len++; | 1327 | list_len++; |
@@ -1232,8 +1331,51 @@ issue_ticket (struct TicketIssueHandle *ih) | |||
1232 | i = 0; | 1331 | i = 0; |
1233 | for (le = ih->attrs->list_head; NULL != le; le = le->next) | 1332 | for (le = ih->attrs->list_head; NULL != le; le = le->next) |
1234 | { | 1333 | { |
1235 | attrs_record[i].data = &le->claim->id; | 1334 | if (NULL != le->claim) |
1236 | attrs_record[i].data_size = sizeof(le->claim->id); | 1335 | { |
1336 | attrs_record[i].data = &le->claim->id; | ||
1337 | attrs_record[i].data_size = sizeof(le->claim->id); | ||
1338 | } | ||
1339 | else if (NULL != le->attest) | ||
1340 | { | ||
1341 | // REMARK: Since we only store IDs, the references are irrelevant | ||
1342 | int j = 0; | ||
1343 | GNUNET_asprintf (&attest_string,"%d",le->attest->id); | ||
1344 | while (j<i) | ||
1345 | { | ||
1346 | if (0 == strcmp (attest_string,GNUNET_STRINGS_data_to_string_alloc ( | ||
1347 | attrs_record[j].data, attrs_record[j].data_size))) | ||
1348 | break; | ||
1349 | j++; | ||
1350 | } | ||
1351 | if (j < i) | ||
1352 | { | ||
1353 | list_len--; | ||
1354 | continue; | ||
1355 | } | ||
1356 | attrs_record[i].data = &le->attest->id; | ||
1357 | attrs_record[i].data_size = sizeof(le->attest->id); | ||
1358 | } | ||
1359 | else if (NULL != le->reference) | ||
1360 | { | ||
1361 | list_len--; | ||
1362 | continue; | ||
1363 | /* | ||
1364 | int j = 0; | ||
1365 | GNUNET_asprintf (&attest_string,"%d",le->attest->id); | ||
1366 | while (j<i) | ||
1367 | { | ||
1368 | if (strcmp(attest_string, GNUNET_STRINGS_data_to_string_alloc ( | ||
1369 | attrs_record[j].data, attrs_record[j].data_size))) | ||
1370 | break; | ||
1371 | j++; | ||
1372 | } | ||
1373 | if (j < i) | ||
1374 | continue; | ||
1375 | attrs_record[i].data = &le->reference->id; | ||
1376 | attrs_record[i].data_size = sizeof(le->reference->id); | ||
1377 | */ | ||
1378 | } | ||
1237 | /** | 1379 | /** |
1238 | * FIXME: Should this be the attribute expiration time or ticket | 1380 | * FIXME: Should this be the attribute expiration time or ticket |
1239 | * refresh interval? Probably min(attrs.expiration) | 1381 | * refresh interval? Probably min(attrs.expiration) |
@@ -1344,14 +1486,34 @@ filter_tickets_cb (void *cls, | |||
1344 | for (le = tih->attrs->list_head; NULL != le; le = le->next) | 1486 | for (le = tih->attrs->list_head; NULL != le; le = le->next) |
1345 | { | 1487 | { |
1346 | // cmp attr_ref id with requested attr id | 1488 | // cmp attr_ref id with requested attr id |
1347 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, | 1489 | if (NULL !=le->claim) |
1348 | " %" PRIu64 "\n %" PRIu64 "\n", | 1490 | { |
1349 | *((uint64_t *) rd[i].data), | 1491 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, |
1350 | le->claim->id); | 1492 | " %" PRIu64 "\n %" PRIu64 "\n", |
1351 | 1493 | *((uint64_t *) rd[i].data), | |
1494 | le->claim->id); | ||
1495 | if (0 == memcmp (rd[i].data, &le->claim->id, sizeof(uint64_t))) | ||
1496 | found_attrs_cnt++; | ||
1497 | } | ||
1498 | else if (NULL !=le->attest) | ||
1499 | { | ||
1500 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, | ||
1501 | " %" PRIu64 "\n %" PRIu64 "\n", | ||
1502 | *((uint64_t *) rd[i].data), | ||
1503 | le->attest->id); | ||
1504 | if (0 == memcmp (rd[i].data, &le->attest->id, sizeof(uint64_t))) | ||
1505 | found_attrs_cnt++; | ||
1506 | } | ||
1507 | else if (NULL != le->reference) | ||
1508 | { | ||
1509 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, | ||
1510 | " %" PRIu64 "\n %" PRIu64 "\n", | ||
1511 | *((uint64_t *) rd[i].data), | ||
1512 | le->reference->id); | ||
1513 | if (0 == memcmp (rd[i].data, &le->reference->id, sizeof(uint64_t))) | ||
1514 | found_attrs_cnt++; | ||
1515 | } | ||
1352 | 1516 | ||
1353 | if (0 == memcmp (rd[i].data, &le->claim->id, sizeof(uint64_t))) | ||
1354 | found_attrs_cnt++; | ||
1355 | } | 1517 | } |
1356 | } | 1518 | } |
1357 | 1519 | ||