diff options
author | Sebastian Nadler <sebastian.nadler@tum.de> | 2023-10-25 22:01:39 +0200 |
---|---|---|
committer | Sebastian Nadler <sebastian.nadler@tum.de> | 2023-11-30 19:33:39 +0100 |
commit | 4bbdc27dea7445bfa22af9b675b049ffc23b96b1 (patch) | |
tree | 40332abfcac637b92c0ceae510d97005209f374e | |
parent | aa8979eac7a4f6621c02261e6ea1120f31fbe546 (diff) | |
download | gnunet-4bbdc27dea7445bfa22af9b675b049ffc23b96b1.tar.gz gnunet-4bbdc27dea7445bfa22af9b675b049ffc23b96b1.zip |
URI & SMIMEA DNS RR
-rw-r--r-- | src/cli/namestore/gnunet-namestore.c | 3 | ||||
-rw-r--r-- | src/cli/namestore/gnunet-zoneimport.c | 11 | ||||
-rw-r--r-- | src/include/gnunet_dnsparser_lib.h | 86 | ||||
-rw-r--r-- | src/include/gnunet_tun_lib.h | 23 | ||||
-rw-r--r-- | src/lib/util/dnsparser.c | 130 | ||||
-rw-r--r-- | src/plugin/gnsrecord/plugin_gnsrecord_dns.c | 67 | ||||
-rw-r--r-- | src/service/dns/gnunet-dns-monitor.c | 17 | ||||
-rw-r--r-- | src/service/dns/gnunet-zonewalk.c | 11 | ||||
-rw-r--r-- | src/service/gns/gnunet-service-gns_interceptor.c | 10 | ||||
-rw-r--r-- | src/service/gns/gnunet-service-gns_resolver.c | 55 |
10 files changed, 409 insertions, 4 deletions
diff --git a/src/cli/namestore/gnunet-namestore.c b/src/cli/namestore/gnunet-namestore.c index baa036ac7..00eacfcfd 100644 --- a/src/cli/namestore/gnunet-namestore.c +++ b/src/cli/namestore/gnunet-namestore.c | |||
@@ -1465,10 +1465,11 @@ run_with_zone_pkey (const struct GNUNET_CONFIGURATION_Handle *cfg) | |||
1465 | } | 1465 | } |
1466 | if ((GNUNET_DNSPARSER_TYPE_SRV == type) || | 1466 | if ((GNUNET_DNSPARSER_TYPE_SRV == type) || |
1467 | (GNUNET_DNSPARSER_TYPE_TLSA == type) || | 1467 | (GNUNET_DNSPARSER_TYPE_TLSA == type) || |
1468 | (GNUNET_DNSPARSER_TYPE_SMIMEA == type) || | ||
1468 | (GNUNET_DNSPARSER_TYPE_OPENPGPKEY == type)) | 1469 | (GNUNET_DNSPARSER_TYPE_OPENPGPKEY == type)) |
1469 | { | 1470 | { |
1470 | fprintf (stderr, | 1471 | fprintf (stderr, |
1471 | _ ("For DNS record types `SRV', `TLSA' and `OPENPGPKEY'")); | 1472 | _ ("For DNS record types `SRV', `TLSA', `SMIMEA' and `OPENPGPKEY'")); |
1472 | fprintf (stderr, ", please use a `BOX' record instead\n"); | 1473 | fprintf (stderr, ", please use a `BOX' record instead\n"); |
1473 | ret = 1; | 1474 | ret = 1; |
1474 | finish_command (); | 1475 | finish_command (); |
diff --git a/src/cli/namestore/gnunet-zoneimport.c b/src/cli/namestore/gnunet-zoneimport.c index c7e0cf65f..9e8185653 100644 --- a/src/cli/namestore/gnunet-zoneimport.c +++ b/src/cli/namestore/gnunet-zoneimport.c | |||
@@ -876,6 +876,17 @@ process_record (void *cls, const struct GNUNET_DNSPARSER_Record *rec) | |||
876 | } | 876 | } |
877 | break; | 877 | break; |
878 | 878 | ||
879 | case GNUNET_DNSPARSER_TYPE_URI: | ||
880 | if (GNUNET_OK == | ||
881 | GNUNET_DNSPARSER_builder_add_uri (dst, dst_len, &off, rec->data.uri)) | ||
882 | { | ||
883 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, | ||
884 | "Converting URI record for `%s'\n", | ||
885 | rec->name); | ||
886 | add_record (req, rec->type, expiration_time, dst, off); | ||
887 | } | ||
888 | break; | ||
889 | |||
879 | case GNUNET_DNSPARSER_TYPE_PTR: | 890 | case GNUNET_DNSPARSER_TYPE_PTR: |
880 | if (GNUNET_OK == GNUNET_DNSPARSER_builder_add_name (dst, | 891 | if (GNUNET_OK == GNUNET_DNSPARSER_builder_add_name (dst, |
881 | dst_len, | 892 | dst_len, |
diff --git a/src/include/gnunet_dnsparser_lib.h b/src/include/gnunet_dnsparser_lib.h index 8064b554b..9a84f346f 100644 --- a/src/include/gnunet_dnsparser_lib.h +++ b/src/include/gnunet_dnsparser_lib.h | |||
@@ -84,6 +84,7 @@ | |||
84 | #define GNUNET_DNSPARSER_TYPE_NSEC3 50 | 84 | #define GNUNET_DNSPARSER_TYPE_NSEC3 50 |
85 | #define GNUNET_DNSPARSER_TYPE_NSEC3PARAM 51 | 85 | #define GNUNET_DNSPARSER_TYPE_NSEC3PARAM 51 |
86 | #define GNUNET_DNSPARSER_TYPE_TLSA 52 | 86 | #define GNUNET_DNSPARSER_TYPE_TLSA 52 |
87 | #define GNUNET_DNSPARSER_TYPE_SMIMEA 53 | ||
87 | #define GNUNET_DNSPARSER_TYPE_HIP 55 | 88 | #define GNUNET_DNSPARSER_TYPE_HIP 55 |
88 | #define GNUNET_DNSPARSER_TYPE_CDS 59 | 89 | #define GNUNET_DNSPARSER_TYPE_CDS 59 |
89 | #define GNUNET_DNSPARSER_TYPE_CDNSKEY 60 | 90 | #define GNUNET_DNSPARSER_TYPE_CDNSKEY 60 |
@@ -178,6 +179,33 @@ struct GNUNET_DNSPARSER_SrvRecord | |||
178 | 179 | ||
179 | 180 | ||
180 | /** | 181 | /** |
182 | * Information from URI records (RFC 7553). | ||
183 | */ | ||
184 | struct GNUNET_DNSPARSER_UriRecord | ||
185 | { | ||
186 | /** | ||
187 | * URI of the target, | ||
188 | * where the URI is as specified in RFC 3986. | ||
189 | */ | ||
190 | char *target; | ||
191 | |||
192 | /** | ||
193 | * Preference for this entry (lower value is higher preference). Clients | ||
194 | * will contact hosts from the lowest-priority group first and fall back | ||
195 | * to higher priorities if the low-priority entries are unavailable. | ||
196 | */ | ||
197 | uint16_t priority; | ||
198 | |||
199 | /** | ||
200 | * Relative weight for records with the same priority. Clients will use | ||
201 | * the hosts of the same (lowest) priority with a probability proportional | ||
202 | * to the weight given. | ||
203 | */ | ||
204 | uint16_t weight; | ||
205 | }; | ||
206 | |||
207 | |||
208 | /** | ||
181 | * DNS CERT types as defined in RFC 4398. | 209 | * DNS CERT types as defined in RFC 4398. |
182 | */ | 210 | */ |
183 | enum GNUNET_DNSPARSER_CertType | 211 | enum GNUNET_DNSPARSER_CertType |
@@ -479,6 +507,11 @@ struct GNUNET_DNSPARSER_Record | |||
479 | struct GNUNET_DNSPARSER_SrvRecord *srv; | 507 | struct GNUNET_DNSPARSER_SrvRecord *srv; |
480 | 508 | ||
481 | /** | 509 | /** |
510 | * URI data for URI records. | ||
511 | */ | ||
512 | struct GNUNET_DNSPARSER_UriRecord *uri; | ||
513 | |||
514 | /** | ||
482 | * Raw data for all other types. | 515 | * Raw data for all other types. |
483 | */ | 516 | */ |
484 | struct GNUNET_DNSPARSER_RawRecord raw; | 517 | struct GNUNET_DNSPARSER_RawRecord raw; |
@@ -743,6 +776,25 @@ GNUNET_DNSPARSER_builder_add_srv (char *dst, | |||
743 | size_t *off, | 776 | size_t *off, |
744 | const struct GNUNET_DNSPARSER_SrvRecord *srv); | 777 | const struct GNUNET_DNSPARSER_SrvRecord *srv); |
745 | 778 | ||
779 | |||
780 | /** | ||
781 | * Add an URI record to the UDP packet at the given location. | ||
782 | * | ||
783 | * @param dst where to write the URI record | ||
784 | * @param dst_len number of bytes in @a dst | ||
785 | * @param off pointer to offset where to write the URI information (increment by bytes used) | ||
786 | * can also change if there was an error | ||
787 | * @param uri URI information to write | ||
788 | * @return #GNUNET_SYSERR if @a uri is invalid | ||
789 | * #GNUNET_NO if @a uri did not fit | ||
790 | * #GNUNET_OK if @a uri was added to @a dst | ||
791 | */ | ||
792 | int | ||
793 | GNUNET_DNSPARSER_builder_add_uri (char *dst, | ||
794 | size_t dst_len, | ||
795 | size_t *off, | ||
796 | const struct GNUNET_DNSPARSER_UriRecord *uri); | ||
797 | |||
746 | /* ***************** low-level parsing API ******************** */ | 798 | /* ***************** low-level parsing API ******************** */ |
747 | 799 | ||
748 | /** | 800 | /** |
@@ -853,6 +905,21 @@ GNUNET_DNSPARSER_parse_srv (const char *udp_payload, | |||
853 | size_t udp_payload_length, | 905 | size_t udp_payload_length, |
854 | size_t *off); | 906 | size_t *off); |
855 | 907 | ||
908 | |||
909 | /** | ||
910 | * Parse a DNS URI record. | ||
911 | * | ||
912 | * @param udp_payload reference to UDP packet | ||
913 | * @param udp_payload_length length of @a udp_payload | ||
914 | * @param off pointer to the offset of the query to parse in the URI record (to be | ||
915 | * incremented by the size of the record), unchanged on error | ||
916 | * @return the parsed URI record, NULL on error | ||
917 | */ | ||
918 | struct GNUNET_DNSPARSER_UriRecord * | ||
919 | GNUNET_DNSPARSER_parse_uri (const char *udp_payload, | ||
920 | size_t udp_payload_length, | ||
921 | size_t *off); | ||
922 | |||
856 | /* ***************** low-level duplication API ******************** */ | 923 | /* ***************** low-level duplication API ******************** */ |
857 | 924 | ||
858 | /** | 925 | /** |
@@ -909,6 +976,16 @@ GNUNET_DNSPARSER_duplicate_srv_record (const struct | |||
909 | GNUNET_DNSPARSER_SrvRecord *r); | 976 | GNUNET_DNSPARSER_SrvRecord *r); |
910 | 977 | ||
911 | 978 | ||
979 | /** | ||
980 | * Duplicate (deep-copy) the given DNS record | ||
981 | * | ||
982 | * @param r the record | ||
983 | * @return the newly allocated record | ||
984 | */ | ||
985 | struct GNUNET_DNSPARSER_UriRecord * | ||
986 | GNUNET_DNSPARSER_duplicate_uri_record (const struct | ||
987 | GNUNET_DNSPARSER_UriRecord *r); | ||
988 | |||
912 | /* ***************** low-level deallocation API ******************** */ | 989 | /* ***************** low-level deallocation API ******************** */ |
913 | 990 | ||
914 | /** | 991 | /** |
@@ -939,6 +1016,15 @@ GNUNET_DNSPARSER_free_srv (struct GNUNET_DNSPARSER_SrvRecord *srv); | |||
939 | 1016 | ||
940 | 1017 | ||
941 | /** | 1018 | /** |
1019 | * Free URI information record. | ||
1020 | * | ||
1021 | * @param uri record to free | ||
1022 | */ | ||
1023 | void | ||
1024 | GNUNET_DNSPARSER_free_uri (struct GNUNET_DNSPARSER_UriRecord *uri); | ||
1025 | |||
1026 | |||
1027 | /** | ||
942 | * Free SOA information record. | 1028 | * Free SOA information record. |
943 | * | 1029 | * |
944 | * @param soa record to free | 1030 | * @param soa record to free |
diff --git a/src/include/gnunet_tun_lib.h b/src/include/gnunet_tun_lib.h index 17acfe5f8..6c7d2cd42 100644 --- a/src/include/gnunet_tun_lib.h +++ b/src/include/gnunet_tun_lib.h | |||
@@ -550,6 +550,29 @@ struct GNUNET_TUN_DnsSrvRecord | |||
550 | 550 | ||
551 | 551 | ||
552 | /** | 552 | /** |
553 | * Payload of DNS URI record (header). | ||
554 | */ | ||
555 | struct GNUNET_TUN_DnsUriRecord | ||
556 | { | ||
557 | /** | ||
558 | * Preference for this entry (lower value is higher preference). Clients | ||
559 | * will contact hosts from the lowest-priority group first and fall back | ||
560 | * to higher priorities if the low-priority entries are unavailable. (NBO) | ||
561 | */ | ||
562 | uint16_t prio GNUNET_PACKED; | ||
563 | |||
564 | /** | ||
565 | * Relative weight for records with the same priority. Clients will use | ||
566 | * the hosts of the same (lowest) priority with a probability proportional | ||
567 | * to the weight given. (NBO) | ||
568 | */ | ||
569 | uint16_t weight GNUNET_PACKED; | ||
570 | |||
571 | /* followed by 'target' name */ | ||
572 | }; | ||
573 | |||
574 | |||
575 | /** | ||
553 | * Payload of DNS CERT record. | 576 | * Payload of DNS CERT record. |
554 | */ | 577 | */ |
555 | struct GNUNET_TUN_DnsCertRecord | 578 | struct GNUNET_TUN_DnsCertRecord |
diff --git a/src/lib/util/dnsparser.c b/src/lib/util/dnsparser.c index dab38def7..eb2d8a93b 100644 --- a/src/lib/util/dnsparser.c +++ b/src/lib/util/dnsparser.c | |||
@@ -146,6 +146,21 @@ GNUNET_DNSPARSER_free_srv (struct GNUNET_DNSPARSER_SrvRecord *srv) | |||
146 | 146 | ||
147 | 147 | ||
148 | /** | 148 | /** |
149 | * Free URI information record. | ||
150 | * | ||
151 | * @param uri record to free | ||
152 | */ | ||
153 | void | ||
154 | GNUNET_DNSPARSER_free_uri (struct GNUNET_DNSPARSER_UriRecord *uri) | ||
155 | { | ||
156 | if (NULL == uri) | ||
157 | return; | ||
158 | GNUNET_free (uri->target); | ||
159 | GNUNET_free (uri); | ||
160 | } | ||
161 | |||
162 | |||
163 | /** | ||
149 | * Free MX information record. | 164 | * Free MX information record. |
150 | * | 165 | * |
151 | * @param mx record to free | 166 | * @param mx record to free |
@@ -183,6 +198,10 @@ GNUNET_DNSPARSER_free_record (struct GNUNET_DNSPARSER_Record *r) | |||
183 | GNUNET_DNSPARSER_free_srv (r->data.srv); | 198 | GNUNET_DNSPARSER_free_srv (r->data.srv); |
184 | break; | 199 | break; |
185 | 200 | ||
201 | case GNUNET_DNSPARSER_TYPE_URI: | ||
202 | GNUNET_DNSPARSER_free_uri (r->data.uri); | ||
203 | break; | ||
204 | |||
186 | case GNUNET_DNSPARSER_TYPE_CERT: | 205 | case GNUNET_DNSPARSER_TYPE_CERT: |
187 | GNUNET_DNSPARSER_free_cert (r->data.cert); | 206 | GNUNET_DNSPARSER_free_cert (r->data.cert); |
188 | break; | 207 | break; |
@@ -506,6 +525,46 @@ GNUNET_DNSPARSER_parse_srv (const char *udp_payload, | |||
506 | 525 | ||
507 | 526 | ||
508 | /** | 527 | /** |
528 | * Parse a DNS URI record. | ||
529 | * | ||
530 | * @param udp_payload reference to UDP packet | ||
531 | * @param udp_payload_length length of @a udp_payload | ||
532 | * @param off pointer to the offset of the query to parse in the URI record (to be | ||
533 | * incremented by the size of the record), unchanged on error | ||
534 | * @return the parsed URI record, NULL on error | ||
535 | */ | ||
536 | struct GNUNET_DNSPARSER_UriRecord * | ||
537 | GNUNET_DNSPARSER_parse_uri (const char *udp_payload, | ||
538 | size_t udp_payload_length, | ||
539 | size_t *off) | ||
540 | { | ||
541 | struct GNUNET_DNSPARSER_UriRecord *uri; | ||
542 | struct GNUNET_TUN_DnsUriRecord uri_bin; | ||
543 | size_t old_off; | ||
544 | |||
545 | old_off = *off; | ||
546 | if (*off + sizeof(struct GNUNET_TUN_DnsUriRecord) > udp_payload_length) | ||
547 | return NULL; | ||
548 | GNUNET_memcpy (&uri_bin, | ||
549 | &udp_payload[*off], | ||
550 | sizeof(struct GNUNET_TUN_DnsUriRecord)); | ||
551 | (*off) += sizeof(struct GNUNET_TUN_DnsUriRecord); | ||
552 | uri = GNUNET_new (struct GNUNET_DNSPARSER_UriRecord); | ||
553 | uri->priority = ntohs (uri_bin.prio); | ||
554 | uri->weight = ntohs (uri_bin.weight); | ||
555 | GNUNET_asprintf(&(uri->target), "%.*s", udp_payload_length - sizeof(struct GNUNET_TUN_DnsUriRecord), &udp_payload[*off]); | ||
556 | (*off) += sizeof(uri->target) + 1; | ||
557 | if (NULL == uri->target) // || GNUNET_STRINGS_parse_uri(uri->target, NULL, NULL) == GNUNET_NO) | ||
558 | { | ||
559 | GNUNET_DNSPARSER_free_uri (uri); | ||
560 | *off = old_off; | ||
561 | return NULL; | ||
562 | } | ||
563 | return uri; | ||
564 | } | ||
565 | |||
566 | |||
567 | /** | ||
509 | * Parse a DNS CERT record. | 568 | * Parse a DNS CERT record. |
510 | * | 569 | * |
511 | * @param udp_payload reference to UDP packet | 570 | * @param udp_payload reference to UDP packet |
@@ -633,6 +692,16 @@ GNUNET_DNSPARSER_parse_record (const char *udp_payload, | |||
633 | } | 692 | } |
634 | return GNUNET_OK; | 693 | return GNUNET_OK; |
635 | 694 | ||
695 | case GNUNET_DNSPARSER_TYPE_URI: | ||
696 | r->data.uri = | ||
697 | GNUNET_DNSPARSER_parse_uri (udp_payload, udp_payload_length, off); | ||
698 | if ((NULL == r->data.uri) || (old_off + data_len != *off)) | ||
699 | { | ||
700 | GNUNET_break_op (0); | ||
701 | return GNUNET_SYSERR; | ||
702 | } | ||
703 | return GNUNET_OK; | ||
704 | |||
636 | default: | 705 | default: |
637 | r->data.raw.data = GNUNET_malloc (data_len); | 706 | r->data.raw.data = GNUNET_malloc (data_len); |
638 | r->data.raw.data_len = data_len; | 707 | r->data.raw.data_len = data_len; |
@@ -768,6 +837,11 @@ GNUNET_DNSPARSER_duplicate_record (const struct GNUNET_DNSPARSER_Record *r) | |||
768 | break; | 837 | break; |
769 | } | 838 | } |
770 | 839 | ||
840 | case GNUNET_DNSPARSER_TYPE_URI: { | ||
841 | dup->data.uri = GNUNET_DNSPARSER_duplicate_uri_record (r->data.uri); | ||
842 | break; | ||
843 | } | ||
844 | |||
771 | default: { | 845 | default: { |
772 | dup->data.raw.data = GNUNET_memdup (r->data.raw.data, | 846 | dup->data.raw.data = GNUNET_memdup (r->data.raw.data, |
773 | r->data.raw.data_len); | 847 | r->data.raw.data_len); |
@@ -846,6 +920,23 @@ GNUNET_DNSPARSER_duplicate_srv_record ( | |||
846 | 920 | ||
847 | 921 | ||
848 | /** | 922 | /** |
923 | * Duplicate (deep-copy) the given DNS record | ||
924 | * | ||
925 | * @param r the record | ||
926 | * @return the newly allocated record | ||
927 | */ | ||
928 | struct GNUNET_DNSPARSER_UriRecord * | ||
929 | GNUNET_DNSPARSER_duplicate_uri_record ( | ||
930 | const struct GNUNET_DNSPARSER_UriRecord *r) | ||
931 | { | ||
932 | struct GNUNET_DNSPARSER_UriRecord *dup = GNUNET_memdup (r, sizeof(*r)); | ||
933 | |||
934 | dup->target = GNUNET_strdup (r->target); | ||
935 | return dup; | ||
936 | } | ||
937 | |||
938 | |||
939 | /** | ||
849 | * Free memory taken by a packet. | 940 | * Free memory taken by a packet. |
850 | * | 941 | * |
851 | * @param p packet to free | 942 | * @param p packet to free |
@@ -1141,6 +1232,40 @@ GNUNET_DNSPARSER_builder_add_srv (char *dst, | |||
1141 | 1232 | ||
1142 | 1233 | ||
1143 | /** | 1234 | /** |
1235 | * Add an URI record to the UDP packet at the given location. | ||
1236 | * | ||
1237 | * @param dst where to write the URI record | ||
1238 | * @param dst_len number of bytes in @a dst | ||
1239 | * @param off pointer to offset where to write the URI information (increment by bytes used) | ||
1240 | * can also change if there was an error | ||
1241 | * @param uri URI information to write | ||
1242 | * @return #GNUNET_SYSERR if @a uri is invalid | ||
1243 | * #GNUNET_NO if @a uri did not fit | ||
1244 | * #GNUNET_OK if @a uri was added to @a dst | ||
1245 | */ | ||
1246 | int | ||
1247 | GNUNET_DNSPARSER_builder_add_uri (char *dst, | ||
1248 | size_t dst_len, | ||
1249 | size_t *off, | ||
1250 | const struct GNUNET_DNSPARSER_UriRecord *uri) | ||
1251 | { | ||
1252 | struct GNUNET_TUN_DnsUriRecord sd; | ||
1253 | int ret; | ||
1254 | |||
1255 | if (*off + sizeof(struct GNUNET_TUN_DnsUriRecord) > dst_len) | ||
1256 | return GNUNET_NO; | ||
1257 | sd.prio = htons (uri->priority); | ||
1258 | sd.weight = htons (uri->weight); | ||
1259 | GNUNET_memcpy (&dst[*off], &sd, sizeof(sd)); | ||
1260 | (*off) += sizeof(sd); | ||
1261 | GNUNET_memcpy(&dst[*off], uri->target, sizeof(uri->target)); | ||
1262 | (*off) += sizeof(uri->target); | ||
1263 | dst[*off++] = '\0'; | ||
1264 | return GNUNET_OK; | ||
1265 | } | ||
1266 | |||
1267 | |||
1268 | /** | ||
1144 | * Add a DNS record to the UDP packet at the given location. | 1269 | * Add a DNS record to the UDP packet at the given location. |
1145 | * | 1270 | * |
1146 | * @param dst where to write the query | 1271 | * @param dst where to write the query |
@@ -1205,6 +1330,11 @@ add_record (char *dst, | |||
1205 | GNUNET_DNSPARSER_builder_add_srv (dst, dst_len, &pos, record->data.srv); | 1330 | GNUNET_DNSPARSER_builder_add_srv (dst, dst_len, &pos, record->data.srv); |
1206 | break; | 1331 | break; |
1207 | 1332 | ||
1333 | case GNUNET_DNSPARSER_TYPE_URI: | ||
1334 | ret = | ||
1335 | GNUNET_DNSPARSER_builder_add_uri (dst, dst_len, &pos, record->data.uri); | ||
1336 | break; | ||
1337 | |||
1208 | default: | 1338 | default: |
1209 | if (pos + record->data.raw.data_len > dst_len) | 1339 | if (pos + record->data.raw.data_len > dst_len) |
1210 | { | 1340 | { |
diff --git a/src/plugin/gnsrecord/plugin_gnsrecord_dns.c b/src/plugin/gnsrecord/plugin_gnsrecord_dns.c index 5844d9eda..226481c5d 100644 --- a/src/plugin/gnsrecord/plugin_gnsrecord_dns.c +++ b/src/plugin/gnsrecord/plugin_gnsrecord_dns.c | |||
@@ -207,7 +207,30 @@ dns_value_to_string (void *cls, | |||
207 | GNUNET_DNSPARSER_free_srv (srv); | 207 | GNUNET_DNSPARSER_free_srv (srv); |
208 | return result; | 208 | return result; |
209 | } | 209 | } |
210 | |||
211 | case GNUNET_DNSPARSER_TYPE_URI: { // RFC7553 | ||
212 | struct GNUNET_DNSPARSER_UriRecord *uri; | ||
213 | size_t off; | ||
210 | 214 | ||
215 | off = 0; | ||
216 | uri = GNUNET_DNSPARSER_parse_uri (data, data_size, &off); | ||
217 | if ((NULL == uri) || (off != data_size)) | ||
218 | { | ||
219 | GNUNET_break_op (0); | ||
220 | if (NULL != uri) | ||
221 | GNUNET_DNSPARSER_free_uri (uri); | ||
222 | return NULL; | ||
223 | } | ||
224 | GNUNET_asprintf (&result, | ||
225 | "%d %d \"%s\"", | ||
226 | uri->priority, | ||
227 | uri->weight, | ||
228 | uri->target); | ||
229 | GNUNET_DNSPARSER_free_uri (uri); | ||
230 | return result; | ||
231 | } | ||
232 | |||
233 | case GNUNET_DNSPARSER_TYPE_SMIMEA: | ||
211 | case GNUNET_DNSPARSER_TYPE_TLSA: { | 234 | case GNUNET_DNSPARSER_TYPE_TLSA: { |
212 | const struct GNUNET_TUN_DnsTlsaRecord *tlsa; | 235 | const struct GNUNET_TUN_DnsTlsaRecord *tlsa; |
213 | char *tlsa_str; | 236 | char *tlsa_str; |
@@ -627,6 +650,43 @@ dns_string_to_value (void *cls, | |||
627 | return GNUNET_OK; | 650 | return GNUNET_OK; |
628 | } | 651 | } |
629 | 652 | ||
653 | case GNUNET_DNSPARSER_TYPE_URI: { | ||
654 | struct GNUNET_DNSPARSER_UriRecord uri; | ||
655 | char target[strlen(s)]; | ||
656 | unsigned int priority; | ||
657 | unsigned int weight; | ||
658 | size_t off; | ||
659 | |||
660 | if (3 != sscanf (s, "%u %u \"%s", &priority, &weight, &target)) // only \" bevor %s becuse %s will consume the ending " of the presentation of the URI record | ||
661 | { | ||
662 | GNUNET_log (GNUNET_ERROR_TYPE_ERROR, | ||
663 | _ ("Unable to parse URI record `%s'\n"), | ||
664 | s); | ||
665 | return GNUNET_SYSERR; | ||
666 | } | ||
667 | target[strlen(target)-1] = '\0'; // Removing the last " of the presentation of the URI record | ||
668 | |||
669 | uri.priority = (uint16_t) priority; | ||
670 | uri.weight = (uint16_t) weight; | ||
671 | uri.target = target; | ||
672 | off = 0; | ||
673 | |||
674 | char uribuf[sizeof(struct GNUNET_TUN_DnsUriRecord) + strlen(target) + 1]; | ||
675 | |||
676 | if (GNUNET_OK != | ||
677 | GNUNET_DNSPARSER_builder_add_uri (uribuf, sizeof(uribuf), &off, &uri)) | ||
678 | { | ||
679 | GNUNET_log (GNUNET_ERROR_TYPE_ERROR, | ||
680 | _ ("Failed to serialize URI record with target `%s'\n"), | ||
681 | target); | ||
682 | return GNUNET_SYSERR; | ||
683 | } | ||
684 | *data_size = off; | ||
685 | *data = GNUNET_malloc (off); | ||
686 | GNUNET_memcpy (*data, uribuf, off); | ||
687 | return GNUNET_OK; | ||
688 | } | ||
689 | |||
630 | case GNUNET_DNSPARSER_TYPE_TXT: | 690 | case GNUNET_DNSPARSER_TYPE_TXT: |
631 | *data = GNUNET_strdup (s); | 691 | *data = GNUNET_strdup (s); |
632 | *data_size = strlen (s); | 692 | *data_size = strlen (s); |
@@ -645,6 +705,7 @@ dns_string_to_value (void *cls, | |||
645 | GNUNET_memcpy (*data, &value_aaaa, sizeof(value_aaaa)); | 705 | GNUNET_memcpy (*data, &value_aaaa, sizeof(value_aaaa)); |
646 | return GNUNET_OK; | 706 | return GNUNET_OK; |
647 | 707 | ||
708 | case GNUNET_DNSPARSER_TYPE_SMIMEA: | ||
648 | case GNUNET_DNSPARSER_TYPE_TLSA: { | 709 | case GNUNET_DNSPARSER_TYPE_TLSA: { |
649 | unsigned int usage; | 710 | unsigned int usage; |
650 | unsigned int selector; | 711 | unsigned int selector; |
@@ -656,7 +717,7 @@ dns_string_to_value (void *cls, | |||
656 | hex)) | 717 | hex)) |
657 | { | 718 | { |
658 | GNUNET_log (GNUNET_ERROR_TYPE_ERROR, | 719 | GNUNET_log (GNUNET_ERROR_TYPE_ERROR, |
659 | _ ("Unable to parse TLSA record string `%s'\n"), | 720 | _ ("Unable to parse TLSA/SMIMEA record string `%s'\n"), |
660 | s); | 721 | s); |
661 | *data_size = 0; | 722 | *data_size = 0; |
662 | return GNUNET_SYSERR; | 723 | return GNUNET_SYSERR; |
@@ -670,7 +731,7 @@ dns_string_to_value (void *cls, | |||
670 | if (strlen (hex) / 2 != GNUNET_DNSPARSER_hex_to_bin (hex, &tlsa[1])) | 731 | if (strlen (hex) / 2 != GNUNET_DNSPARSER_hex_to_bin (hex, &tlsa[1])) |
671 | { | 732 | { |
672 | GNUNET_log (GNUNET_ERROR_TYPE_ERROR, | 733 | GNUNET_log (GNUNET_ERROR_TYPE_ERROR, |
673 | _ ("Unable to parse TLSA record string `%s'\n"), | 734 | _ ("Unable to parse TLSA/SMIMEA record string `%s'\n"), |
674 | s); | 735 | s); |
675 | GNUNET_free (*data); | 736 | GNUNET_free (*data); |
676 | *data = NULL; | 737 | *data = NULL; |
@@ -727,7 +788,9 @@ static struct | |||
727 | { "TXT", GNUNET_DNSPARSER_TYPE_TXT }, | 788 | { "TXT", GNUNET_DNSPARSER_TYPE_TXT }, |
728 | { "AAAA", GNUNET_DNSPARSER_TYPE_AAAA }, | 789 | { "AAAA", GNUNET_DNSPARSER_TYPE_AAAA }, |
729 | { "SRV", GNUNET_DNSPARSER_TYPE_SRV }, | 790 | { "SRV", GNUNET_DNSPARSER_TYPE_SRV }, |
791 | { "URI", GNUNET_DNSPARSER_TYPE_URI }, | ||
730 | { "TLSA", GNUNET_DNSPARSER_TYPE_TLSA }, | 792 | { "TLSA", GNUNET_DNSPARSER_TYPE_TLSA }, |
793 | { "SMIMEA", GNUNET_DNSPARSER_TYPE_SMIMEA }, | ||
731 | { "CERT", GNUNET_DNSPARSER_TYPE_CERT }, | 794 | { "CERT", GNUNET_DNSPARSER_TYPE_CERT }, |
732 | { "CAA", GNUNET_DNSPARSER_TYPE_CAA }, | 795 | { "CAA", GNUNET_DNSPARSER_TYPE_CAA }, |
733 | { NULL, UINT32_MAX } }; | 796 | { NULL, UINT32_MAX } }; |
diff --git a/src/service/dns/gnunet-dns-monitor.c b/src/service/dns/gnunet-dns-monitor.c index c1ef17255..afdb336f0 100644 --- a/src/service/dns/gnunet-dns-monitor.c +++ b/src/service/dns/gnunet-dns-monitor.c | |||
@@ -84,6 +84,8 @@ get_type (uint16_t type) | |||
84 | case GNUNET_DNSPARSER_TYPE_AAAA: return "AAAA"; | 84 | case GNUNET_DNSPARSER_TYPE_AAAA: return "AAAA"; |
85 | 85 | ||
86 | case GNUNET_DNSPARSER_TYPE_SRV: return "SRV"; | 86 | case GNUNET_DNSPARSER_TYPE_SRV: return "SRV"; |
87 | |||
88 | case GNUNET_DNSPARSER_TYPE_URI: return "URI"; | ||
87 | } | 89 | } |
88 | GNUNET_snprintf (buf, sizeof(buf), "%u", (unsigned int) type); | 90 | GNUNET_snprintf (buf, sizeof(buf), "%u", (unsigned int) type); |
89 | return buf; | 91 | return buf; |
@@ -210,6 +212,21 @@ display_record (const struct GNUNET_DNSPARSER_Record *record) | |||
210 | format = tmp; | 212 | format = tmp; |
211 | } | 213 | } |
212 | break; | 214 | break; |
215 | |||
216 | case GNUNET_DNSPARSER_TYPE_URI: | ||
217 | if (NULL == record->data.uri) | ||
218 | format = "<invalid>"; | ||
219 | else | ||
220 | { | ||
221 | GNUNET_asprintf (&tmp, | ||
222 | "priority %u, weight = %u, target = \"%s\"", | ||
223 | (unsigned int) record->data.uri->priority, | ||
224 | (unsigned int) record->data.uri->weight, | ||
225 | record->data.uri->target); | ||
226 | format = tmp; | ||
227 | } | ||
228 | break; | ||
229 | |||
213 | 230 | ||
214 | case GNUNET_DNSPARSER_TYPE_TXT: | 231 | case GNUNET_DNSPARSER_TYPE_TXT: |
215 | GNUNET_asprintf (&tmp, | 232 | GNUNET_asprintf (&tmp, |
diff --git a/src/service/dns/gnunet-zonewalk.c b/src/service/dns/gnunet-zonewalk.c index 0526df698..f4b676d6c 100644 --- a/src/service/dns/gnunet-zonewalk.c +++ b/src/service/dns/gnunet-zonewalk.c | |||
@@ -214,6 +214,15 @@ process_record (struct Request *req, | |||
214 | rec->data.srv->weight, | 214 | rec->data.srv->weight, |
215 | rec->data.srv->port); | 215 | rec->data.srv->port); |
216 | break; | 216 | break; |
217 | |||
218 | case GNUNET_DNSPARSER_TYPE_URI: | ||
219 | fprintf (stdout, | ||
220 | "%s URI \"%s\" %u %u\n", | ||
221 | req->hostname, | ||
222 | rec->data.uri->target, | ||
223 | rec->data.uri->priority, | ||
224 | rec->data.uri->weight); | ||
225 | break; | ||
217 | 226 | ||
218 | case GNUNET_DNSPARSER_TYPE_PTR: | 227 | case GNUNET_DNSPARSER_TYPE_PTR: |
219 | fprintf (stdout, | 228 | fprintf (stdout, |
@@ -247,7 +256,6 @@ process_record (struct Request *req, | |||
247 | case GNUNET_DNSPARSER_TYPE_RP: | 256 | case GNUNET_DNSPARSER_TYPE_RP: |
248 | case GNUNET_DNSPARSER_TYPE_TKEY: | 257 | case GNUNET_DNSPARSER_TYPE_TKEY: |
249 | case GNUNET_DNSPARSER_TYPE_TSIG: | 258 | case GNUNET_DNSPARSER_TYPE_TSIG: |
250 | case GNUNET_DNSPARSER_TYPE_URI: | ||
251 | case GNUNET_DNSPARSER_TYPE_TA: | 259 | case GNUNET_DNSPARSER_TYPE_TA: |
252 | 260 | ||
253 | /* DNSSEC */ | 261 | /* DNSSEC */ |
@@ -265,6 +273,7 @@ process_record (struct Request *req, | |||
265 | case GNUNET_DNSPARSER_TYPE_SSHFP: | 273 | case GNUNET_DNSPARSER_TYPE_SSHFP: |
266 | case GNUNET_DNSPARSER_TYPE_IPSECKEY: | 274 | case GNUNET_DNSPARSER_TYPE_IPSECKEY: |
267 | case GNUNET_DNSPARSER_TYPE_TLSA: | 275 | case GNUNET_DNSPARSER_TYPE_TLSA: |
276 | case GNUNET_DNSPARSER_TYPE_SMIMEA: | ||
268 | case GNUNET_DNSPARSER_TYPE_OPENPGPKEY: | 277 | case GNUNET_DNSPARSER_TYPE_OPENPGPKEY: |
269 | 278 | ||
270 | /* obsolete records */ | 279 | /* obsolete records */ |
diff --git a/src/service/gns/gnunet-service-gns_interceptor.c b/src/service/gns/gnunet-service-gns_interceptor.c index f49d60b94..acc4e3fbc 100644 --- a/src/service/gns/gnunet-service-gns_interceptor.c +++ b/src/service/gns/gnunet-service-gns_interceptor.c | |||
@@ -168,6 +168,11 @@ reply_to_dns (void *cls, uint32_t rd_count, | |||
168 | skip_answers++; | 168 | skip_answers++; |
169 | break; | 169 | break; |
170 | 170 | ||
171 | case GNUNET_DNSPARSER_TYPE_URI: | ||
172 | /* FIXME: URI is not yet supported */ | ||
173 | skip_answers++; | ||
174 | break; | ||
175 | |||
171 | case GNUNET_DNSPARSER_TYPE_MX: | 176 | case GNUNET_DNSPARSER_TYPE_MX: |
172 | answer_records[i - skip_answers].data.mx | 177 | answer_records[i - skip_answers].data.mx |
173 | = GNUNET_DNSPARSER_parse_mx (rd[i].data, | 178 | = GNUNET_DNSPARSER_parse_mx (rd[i].data, |
@@ -245,6 +250,11 @@ reply_to_dns (void *cls, uint32_t rd_count, | |||
245 | skip_answers++; | 250 | skip_answers++; |
246 | break; | 251 | break; |
247 | 252 | ||
253 | case GNUNET_DNSPARSER_TYPE_URI: | ||
254 | /* FIXME: URI is not yet supported */ | ||
255 | skip_answers++; | ||
256 | break; | ||
257 | |||
248 | default: | 258 | default: |
249 | additional_records[i - skip_additional].data.raw.data_len = | 259 | additional_records[i - skip_additional].data.raw.data_len = |
250 | rd[i].data_size; | 260 | rd[i].data_size; |
diff --git a/src/service/gns/gnunet-service-gns_resolver.c b/src/service/gns/gnunet-service-gns_resolver.c index aa0189b15..edef6a8ab 100644 --- a/src/service/gns/gnunet-service-gns_resolver.c +++ b/src/service/gns/gnunet-service-gns_resolver.c | |||
@@ -1085,6 +1085,22 @@ dns_result_parser (void *cls, | |||
1085 | rd[i - skip].data_size = buf_off - buf_start; | 1085 | rd[i - skip].data_size = buf_off - buf_start; |
1086 | rd[i - skip].data = &buf[buf_start]; | 1086 | rd[i - skip].data = &buf[buf_start]; |
1087 | break; | 1087 | break; |
1088 | |||
1089 | case GNUNET_DNSPARSER_TYPE_URI: | ||
1090 | buf_start = buf_off; | ||
1091 | if (GNUNET_OK != | ||
1092 | GNUNET_DNSPARSER_builder_add_uri (buf, | ||
1093 | sizeof(buf), | ||
1094 | &buf_off, | ||
1095 | rec->data.uri)) | ||
1096 | { | ||
1097 | GNUNET_break (0); | ||
1098 | skip++; | ||
1099 | continue; | ||
1100 | } | ||
1101 | rd[i - skip].data_size = buf_off - buf_start; | ||
1102 | rd[i - skip].data = &buf[buf_start]; | ||
1103 | break; | ||
1088 | 1104 | ||
1089 | default: | 1105 | default: |
1090 | GNUNET_log (GNUNET_ERROR_TYPE_INFO, | 1106 | GNUNET_log (GNUNET_ERROR_TYPE_INFO, |
@@ -2170,6 +2186,45 @@ handle_gns_resolution_result (void *cls, | |||
2170 | } | 2186 | } |
2171 | break; | 2187 | break; |
2172 | 2188 | ||
2189 | case GNUNET_DNSPARSER_TYPE_URI: | ||
2190 | { | ||
2191 | struct GNUNET_DNSPARSER_UriRecord *uri; | ||
2192 | |||
2193 | off = 0; | ||
2194 | uri = GNUNET_DNSPARSER_parse_uri (rd[i].data, | ||
2195 | rd[i].data_size, | ||
2196 | &off); | ||
2197 | if ((NULL == uri) || | ||
2198 | (off != rd[i].data_size)) | ||
2199 | { | ||
2200 | GNUNET_log (GNUNET_ERROR_TYPE_ERROR, | ||
2201 | _ ("Failed to deserialize URI record with target\n")); | ||
2202 | GNUNET_break_op (0); /* record not well-formed */ | ||
2203 | } | ||
2204 | else | ||
2205 | { | ||
2206 | scratch_start = scratch_off; | ||
2207 | if (GNUNET_OK != | ||
2208 | GNUNET_DNSPARSER_builder_add_uri (scratch, | ||
2209 | sizeof(scratch), | ||
2210 | &scratch_off, | ||
2211 | uri)) | ||
2212 | { | ||
2213 | GNUNET_break (0); | ||
2214 | } | ||
2215 | else | ||
2216 | { | ||
2217 | GNUNET_assert (rd_off < rd_count); | ||
2218 | rd_new[rd_off].data = &scratch[scratch_start]; | ||
2219 | rd_new[rd_off].data_size = scratch_off - scratch_start; | ||
2220 | rd_off++; | ||
2221 | } | ||
2222 | } | ||
2223 | if (NULL != uri) | ||
2224 | GNUNET_DNSPARSER_free_uri (uri); | ||
2225 | } | ||
2226 | break; | ||
2227 | |||
2173 | case GNUNET_GNSRECORD_TYPE_PKEY: | 2228 | case GNUNET_GNSRECORD_TYPE_PKEY: |
2174 | case GNUNET_GNSRECORD_TYPE_EDKEY: | 2229 | case GNUNET_GNSRECORD_TYPE_EDKEY: |
2175 | { | 2230 | { |