correctly convert to IDNA when transitioning to DNS
authorSchanzenbach, Martin <mschanzenbach@posteo.de>
Sat, 30 Nov 2019 11:34:17 +0000 (12:34 +0100)
committerSchanzenbach, Martin <mschanzenbach@posteo.de>
Sat, 30 Nov 2019 11:34:17 +0000 (12:34 +0100)
src/gns/Makefile.am
src/gns/gnunet-service-gns_resolver.c

index bb319ce6e7c28f7a4593130994065008bd1d0ea3..764590589eb98aed18e74b9b546ef9a03f776aed 100644 (file)
@@ -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)
 
index fda2e69e0eadbfc355b323bf23b9cfe48b831fab..bb319633aee6b2f1813d195d175048bfaf6ff65e 100644 (file)
  * @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);