diff options
Diffstat (limited to 'src/plugin/gnsrecord/plugin_gnsrecord_dns.c')
-rw-r--r-- | src/plugin/gnsrecord/plugin_gnsrecord_dns.c | 67 |
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 } }; |