aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSebastian Nadler <sebastian.nadler@tum.de>2023-10-25 22:01:39 +0200
committerSebastian Nadler <sebastian.nadler@tum.de>2023-11-30 19:33:39 +0100
commit4bbdc27dea7445bfa22af9b675b049ffc23b96b1 (patch)
tree40332abfcac637b92c0ceae510d97005209f374e
parentaa8979eac7a4f6621c02261e6ea1120f31fbe546 (diff)
downloadgnunet-4bbdc27dea7445bfa22af9b675b049ffc23b96b1.tar.gz
gnunet-4bbdc27dea7445bfa22af9b675b049ffc23b96b1.zip
URI & SMIMEA DNS RR
-rw-r--r--src/cli/namestore/gnunet-namestore.c3
-rw-r--r--src/cli/namestore/gnunet-zoneimport.c11
-rw-r--r--src/include/gnunet_dnsparser_lib.h86
-rw-r--r--src/include/gnunet_tun_lib.h23
-rw-r--r--src/lib/util/dnsparser.c130
-rw-r--r--src/plugin/gnsrecord/plugin_gnsrecord_dns.c67
-rw-r--r--src/service/dns/gnunet-dns-monitor.c17
-rw-r--r--src/service/dns/gnunet-zonewalk.c11
-rw-r--r--src/service/gns/gnunet-service-gns_interceptor.c10
-rw-r--r--src/service/gns/gnunet-service-gns_resolver.c55
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 */
184struct 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 */
183enum GNUNET_DNSPARSER_CertType 211enum 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 */
792int
793GNUNET_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 */
918struct GNUNET_DNSPARSER_UriRecord *
919GNUNET_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 */
985struct GNUNET_DNSPARSER_UriRecord *
986GNUNET_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 */
1023void
1024GNUNET_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 */
555struct 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 */
555struct GNUNET_TUN_DnsCertRecord 578struct 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 */
153void
154GNUNET_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 */
536struct GNUNET_DNSPARSER_UriRecord *
537GNUNET_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 */
928struct GNUNET_DNSPARSER_UriRecord *
929GNUNET_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 */
1246int
1247GNUNET_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 {