aboutsummaryrefslogtreecommitdiff
path: root/src/plugin/gnsrecord/plugin_gnsrecord_dns.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugin/gnsrecord/plugin_gnsrecord_dns.c')
-rw-r--r--src/plugin/gnsrecord/plugin_gnsrecord_dns.c67
1 files changed, 65 insertions, 2 deletions
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 } };