summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSchanzenbach, Martin <mschanzenbach@posteo.de>2019-11-30 12:34:17 +0100
committerSchanzenbach, Martin <mschanzenbach@posteo.de>2019-11-30 12:34:17 +0100
commit61efbfb56dde7db7ede7478817d5dbb0ae1f95c1 (patch)
tree08e02aec853d38233fff0867cf2743624eac5005
parent6495b7d3b6f83aa8c00dbdfde05c8609c22eb92b (diff)
correctly convert to IDNA when transitioning to DNS
-rw-r--r--src/gns/Makefile.am1
-rw-r--r--src/gns/gnunet-service-gns_resolver.c27
2 files changed, 28 insertions, 0 deletions
diff --git a/src/gns/Makefile.am b/src/gns/Makefile.am
index bb319ce6e..764590589 100644
--- a/src/gns/Makefile.am
+++ b/src/gns/Makefile.am
@@ -237,6 +237,7 @@ gnunet_service_gns_LDADD = \
$(top_builddir)/src/dns/libgnunetdns.la \
$(top_builddir)/src/dht/libgnunetdht.la \
$(top_builddir)/src/namecache/libgnunetnamecache.la \
+ $(LIBIDN) $(LIBIDN2) \
$(USE_VPN) \
$(GN_LIBINTL)
diff --git a/src/gns/gnunet-service-gns_resolver.c b/src/gns/gnunet-service-gns_resolver.c
index fda2e69e0..bb319633a 100644
--- a/src/gns/gnunet-service-gns_resolver.c
+++ b/src/gns/gnunet-service-gns_resolver.c
@@ -25,6 +25,19 @@
* @author Christian Grothoff
*/
#include "platform.h"
+#if HAVE_LIBIDN2
+#if HAVE_IDN2_H
+#include <idn2.h>
+#elif HAVE_IDN2_IDN2_H
+#include <idn2/idn2.h>
+#endif
+#elif HAVE_LIBIDN
+#if HAVE_IDNA_H
+#include <idna.h>
+#elif HAVE_IDN_IDNA_H
+#include <idn/idna.h>
+#endif
+#endif
#include "gnunet_util_lib.h"
#include "gnunet_dnsstub_lib.h"
#include "gnunet_dht_service.h"
@@ -1824,6 +1837,20 @@ recursive_gns2dns_resolution (struct GNS_ResolverHandle *rh,
(0 != rh->name_resolution_pos) ? "." : "",
ns);
GNUNET_free (ns);
+#ifndef LSD001
+ /* the GNS name is UTF-8 and may include multibyte chars.
+ * We have to convert the combined name to a DNS-compatible IDNA.
+ */
+ char *tmp = ac->label;
+ if (IDNA_SUCCESS != idna_to_ascii_8z (tmp, &ac->label, IDNA_ALLOW_UNASSIGNED))
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
+ _("Name `%s' cannot be converted to IDNA."), tmp);
+ return GNUNET_SYSERR;
+ }
+ GNUNET_free (tmp);
+#endif
+
GNUNET_CONTAINER_DLL_insert_tail (rh->ac_head,
rh->ac_tail,
ac);