Use libidn2 instead of libidn
This commit is contained in:
		
							parent
							
								
									6b0461ca1f
								
							
						
					
					
						commit
						64e4d30516
					
				
							
								
								
									
										342
									
								
								mutt-1.9.5-add_libidn2_support.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										342
									
								
								mutt-1.9.5-add_libidn2_support.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,342 @@ | ||||
| From 13a2f6144c51c0451b20056bf92cbd0b2f338f1e Mon Sep 17 00:00:00 2001 | ||||
| From: Matej Muzila <mmuzila@redhat.com> | ||||
| Date: Mon, 9 Apr 2018 13:46:42 +0200 | ||||
| Subject: [PATCH] Add libidn2 support | ||||
| 
 | ||||
| ---
 | ||||
|  configure.ac       | 55 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ | ||||
|  doc/makedoc-defs.h |  3 +++ | ||||
|  init.h             |  4 ++-- | ||||
|  main.c             | 13 ++++++++++++- | ||||
|  mutt.h             |  2 +- | ||||
|  mutt_idna.c        | 20 ++++++++++---------- | ||||
|  mutt_idna.h        |  8 ++++++-- | ||||
|  mutt_socket.c      |  8 ++++---- | ||||
|  mutt_ssl.c         |  2 +- | ||||
|  9 files changed, 94 insertions(+), 21 deletions(-) | ||||
| 
 | ||||
| diff --git a/configure.ac b/configure.ac
 | ||||
| index c46f72b0..5c6de33c 100644
 | ||||
| --- a/configure.ac
 | ||||
| +++ b/configure.ac
 | ||||
| @@ -1293,6 +1293,25 @@ AC_ARG_WITH(idn, AS_HELP_STRING([--with-idn=@<:@PFX@:>@],[Use GNU libidn for int
 | ||||
|  		 ], | ||||
|  		 [with_idn=auto]) | ||||
|   | ||||
| +AC_ARG_WITH(idn2, AS_HELP_STRING([--with-idn2=@<:@PFX@:>@],[Use GNU libidn2 for internationalized domain names]),
 | ||||
| +        [
 | ||||
| +          if test "$with_idn2" != "no" ; then
 | ||||
| +            if test "$with_idn" = "auto"; then
 | ||||
| +              with_idn="no"
 | ||||
| +            fi
 | ||||
| +
 | ||||
| +            if test "$with_idn" != "no"; then
 | ||||
| +              AC_MSG_ERROR([Cannot enable IDN and IDN2 support at the same time])
 | ||||
| +            fi
 | ||||
| +
 | ||||
| +            if test "$with_idn2" != "yes" ; then
 | ||||
| +              CPPFLAGS="$CPPFLAGS -I$with_idn2/include"
 | ||||
| +              LDFLAGS="$LDFLAGS -L$with_idn2/lib"
 | ||||
| +            fi
 | ||||
| +          fi
 | ||||
| +        ],
 | ||||
| +        [with_idn2=no])
 | ||||
| +
 | ||||
|  if test "x$with_idn" != "xno"; then | ||||
|    if test "$am_cv_func_iconv" != "yes"; then | ||||
|      if test "$with_idn" != "auto"; then | ||||
| @@ -1332,6 +1351,42 @@ if test "x$with_idn" != "xno"; then
 | ||||
|    fi | ||||
|  fi | ||||
|   | ||||
| +dnl idna2
 | ||||
| +if test "x$with_idn2" != "xno"; then
 | ||||
| +  if test "$am_cv_func_iconv" != "yes"; then
 | ||||
| +    if test "$with_idn2" != "auto"; then
 | ||||
| +      AC_MSG_ERROR([IDN2 requested but iconv is disabled or unavailable])
 | ||||
| +    fi
 | ||||
| +  else
 | ||||
| +    dnl Solaris 11 has /usr/include/idn
 | ||||
| +    have_idn2_h=no
 | ||||
| +    AC_CHECK_HEADERS([idn2.h idn/idn2.h], [
 | ||||
| +              have_idn2_h=yes
 | ||||
| +              break])
 | ||||
| +
 | ||||
| +    mutt_save_LIBS="$LIBS"
 | ||||
| +    LIBS=
 | ||||
| +
 | ||||
| +    AC_SEARCH_LIBS([idn2_check_version], [idn2], [
 | ||||
| +      AC_DEFINE([HAVE_LIBIDN2], 1, [Define to 1 if you have the GNU idn2 library])
 | ||||
| +      MUTTLIBS="$MUTTLIBS $LIBS"
 | ||||
| +
 | ||||
| +      LIBS="$LIBS $LIBICONV"
 | ||||
| +      AC_DEFINE([HAVE_IDNA_TO_UNICODE_8Z8Z])
 | ||||
| +      AC_DEFINE([HAVE_IDNA_TO_ASCII_8Z])
 | ||||
| +      AC_DEFINE([HAVE_IDNA_TO_ASCII_LZ])
 | ||||
| +    ])
 | ||||
| +
 | ||||
| +    LIBS="$mutt_save_LIBS"
 | ||||
| +
 | ||||
| +    if test "$with_idn2" != "no"; then
 | ||||
| +      if test "$have_idn2_h" = "no" || test "$ac_cv_search_idn2_check_version" = "no"; then
 | ||||
| +        AC_MSG_ERROR([IDN2 was requested, but libidn2 was not usable on this system])
 | ||||
| +      fi
 | ||||
| +    fi
 | ||||
| +  fi
 | ||||
| +fi
 | ||||
| +
 | ||||
|  dnl -- locales -- | ||||
|   | ||||
|  AC_CHECK_HEADERS(wchar.h) | ||||
| diff --git a/doc/makedoc-defs.h b/doc/makedoc-defs.h
 | ||||
| index 2da29f48..78a4ebc0 100644
 | ||||
| --- a/doc/makedoc-defs.h
 | ||||
| +++ b/doc/makedoc-defs.h
 | ||||
| @@ -52,6 +52,9 @@
 | ||||
|  # ifndef HAVE_LIBIDN | ||||
|  #  define HAVE_LIBIDN | ||||
|  # endif | ||||
| +# ifndef HAVE_LIBIDN2
 | ||||
| +#  define HAVE_LIBIDN2
 | ||||
| +# endif
 | ||||
|  # ifndef HAVE_GETADDRINFO | ||||
|  #  define HAVE_GETADDRINFO | ||||
|  # endif | ||||
| diff --git a/init.h b/init.h
 | ||||
| index bdd22543..5e79786c 100644
 | ||||
| --- a/init.h
 | ||||
| +++ b/init.h
 | ||||
| @@ -1177,7 +1177,7 @@ struct option_t MuttVars[] = {
 | ||||
|    ** .pp | ||||
|    ** Also see $$use_domain and $$hidden_host. | ||||
|    */ | ||||
| -#ifdef HAVE_LIBIDN
 | ||||
| +#if defined(HAVE_LIBIDN) || defined(HAVE_LIBIDN2)
 | ||||
|    { "idn_decode",	DT_BOOL, R_MENU, OPTIDNDECODE, 1}, | ||||
|    /* | ||||
|    ** .pp | ||||
| @@ -1192,7 +1192,7 @@ struct option_t MuttVars[] = {
 | ||||
|    ** IDN.  Unset this if your SMTP server can handle newer (RFC 6531) | ||||
|    ** UTF-8 encoded domains. (IDN only) | ||||
|    */ | ||||
| -#endif /* HAVE_LIBIDN */
 | ||||
| +#endif /* defined(HAVE_LIBIDN) || defined(HAVE_LIBIDN2) */
 | ||||
|    { "ignore_linear_white_space",    DT_BOOL, R_NONE, OPTIGNORELWS, 0 }, | ||||
|    /* | ||||
|    ** .pp | ||||
| diff --git a/main.c b/main.c
 | ||||
| index b189c860..0d2dbac4 100644
 | ||||
| --- a/main.c
 | ||||
| +++ b/main.c
 | ||||
| @@ -218,6 +218,11 @@ static void show_version (void)
 | ||||
|  	  STRINGPREP_VERSION); | ||||
|  #endif | ||||
|   | ||||
| +#ifdef HAVE_LIBIDN2
 | ||||
| +  printf ("\nlibidn2: %s (compiled with %s)", idn2_check_version (NULL),
 | ||||
| +	  IDN2_VERSION);
 | ||||
| +#endif
 | ||||
| +
 | ||||
|  #ifdef USE_HCACHE | ||||
|    printf ("\nhcache backend: %s", mutt_hcache_backend ()); | ||||
|  #endif | ||||
| @@ -485,7 +490,13 @@ static void show_version (void)
 | ||||
|  #else | ||||
|  	"-HAVE_LIBIDN  " | ||||
|  #endif | ||||
| -	
 | ||||
| +
 | ||||
| +#if HAVE_LIBIDN2
 | ||||
| +	"+HAVE_LIBIDN2  "
 | ||||
| +#else
 | ||||
| +	"-HAVE_LIBIDN2  "
 | ||||
| +#endif
 | ||||
| +
 | ||||
|  #if HAVE_GETSID | ||||
|  	"+HAVE_GETSID  " | ||||
|  #else | ||||
| diff --git a/mutt.h b/mutt.h
 | ||||
| index 4fe7ce49..7372a510 100644
 | ||||
| --- a/mutt.h
 | ||||
| +++ b/mutt.h
 | ||||
| @@ -492,7 +492,7 @@ enum
 | ||||
|    OPTUSEDOMAIN, | ||||
|    OPTUSEFROM, | ||||
|    OPTUSEGPGAGENT, | ||||
| -#ifdef HAVE_LIBIDN
 | ||||
| +#if defined(HAVE_LIBIDN) || defined(HAVE_LIBIDN2)
 | ||||
|    OPTIDNDECODE, | ||||
|    OPTIDNENCODE, | ||||
|  #endif | ||||
| diff --git a/mutt_idna.c b/mutt_idna.c
 | ||||
| index a059e867..cb231b5a 100644
 | ||||
| --- a/mutt_idna.c
 | ||||
| +++ b/mutt_idna.c
 | ||||
| @@ -24,7 +24,7 @@
 | ||||
|  #include "charset.h" | ||||
|  #include "mutt_idna.h" | ||||
|   | ||||
| -#ifdef HAVE_LIBIDN
 | ||||
| +#if defined(HAVE_LIBIDN) || defined(HAVE_LIBIDN2)
 | ||||
|  static int check_idn (char *domain) | ||||
|  { | ||||
|    if (! domain) | ||||
| @@ -41,7 +41,7 @@ static int check_idn (char *domain)
 | ||||
|   | ||||
|    return 0; | ||||
|  } | ||||
| -#endif /* HAVE_LIBIDN */
 | ||||
| +#endif /* defined(HAVE_LIBIDN) || defined(HAVE_LIBIDN2) */
 | ||||
|   | ||||
|  static int mbox_to_udomain (const char *mbx, char **user, char **domain) | ||||
|  { | ||||
| @@ -90,14 +90,14 @@ static char *intl_to_local (char *orig_user, char *orig_domain, int flags)
 | ||||
|    char *local_user = NULL, *local_domain = NULL, *mailbox = NULL; | ||||
|    char *reversed_user = NULL, *reversed_domain = NULL; | ||||
|    char *tmp = NULL; | ||||
| -#ifdef HAVE_LIBIDN
 | ||||
| +#if defined(HAVE_LIBIDN) || defined(HAVE_LIBIDN2)
 | ||||
|    int is_idn_encoded = 0; | ||||
| -#endif /* HAVE_LIBIDN */
 | ||||
| +#endif /* defined(HAVE_LIBIDN) || defined(HAVE_LIBIDN2) */
 | ||||
|   | ||||
|    local_user = safe_strdup (orig_user); | ||||
|    local_domain = safe_strdup (orig_domain); | ||||
|   | ||||
| -#ifdef HAVE_LIBIDN
 | ||||
| +#if defined(HAVE_LIBIDN) || defined(HAVE_LIBIDN2)
 | ||||
|    is_idn_encoded = check_idn (local_domain); | ||||
|    if (is_idn_encoded && option (OPTIDNDECODE)) | ||||
|    { | ||||
| @@ -106,7 +106,7 @@ static char *intl_to_local (char *orig_user, char *orig_domain, int flags)
 | ||||
|      mutt_str_replace (&local_domain, tmp); | ||||
|      FREE (&tmp); | ||||
|    } | ||||
| -#endif /* HAVE_LIBIDN */
 | ||||
| +#endif /* defined(HAVE_LIBIDN) || defined(HAVE_LIBIDN2) */
 | ||||
|   | ||||
|    /* we don't want charset-hook effects, so we set flags to 0 */ | ||||
|    if (mutt_convert_string (&local_user, "utf-8", Charset, 0) == -1) | ||||
| @@ -148,7 +148,7 @@ static char *intl_to_local (char *orig_user, char *orig_domain, int flags)
 | ||||
|        goto cleanup; | ||||
|      } | ||||
|   | ||||
| -#ifdef HAVE_LIBIDN
 | ||||
| +#if defined(HAVE_LIBIDN) || defined(HAVE_LIBIDN2)
 | ||||
|      /* If the original domain was UTF-8, idna encoding here could | ||||
|       * produce a non-matching domain!  Thus we only want to do the | ||||
|       * idna_to_ascii_8z() if the original domain was IDNA encoded. | ||||
| @@ -164,7 +164,7 @@ static char *intl_to_local (char *orig_user, char *orig_domain, int flags)
 | ||||
|        } | ||||
|        mutt_str_replace (&reversed_domain, tmp); | ||||
|      } | ||||
| -#endif /* HAVE_LIBIDN */
 | ||||
| +#endif /* defined(HAVE_LIBIDN) || defined(HAVE_LIBIDN2) */
 | ||||
|   | ||||
|      if (ascii_strcasecmp (orig_domain, reversed_domain)) | ||||
|      { | ||||
| @@ -203,14 +203,14 @@ static char *local_to_intl (char *user, char *domain)
 | ||||
|    if (mutt_convert_string (&intl_domain, Charset, "utf-8", 0) == -1) | ||||
|      goto cleanup; | ||||
|   | ||||
| -#ifdef HAVE_LIBIDN
 | ||||
| +#if defined(HAVE_LIBIDN) || defined(HAVE_LIBIDN2)
 | ||||
|    if (option (OPTIDNENCODE)) | ||||
|    { | ||||
|      if (idna_to_ascii_8z (intl_domain, &tmp, IDNA_ALLOW_UNASSIGNED) != IDNA_SUCCESS) | ||||
|        goto cleanup; | ||||
|      mutt_str_replace (&intl_domain, tmp); | ||||
|    } | ||||
| -#endif /* HAVE_LIBIDN */
 | ||||
| +#endif /* defined(HAVE_LIBIDN) || defined(HAVE_LIBIDN2) */
 | ||||
|   | ||||
|    mailbox = safe_malloc (mutt_strlen (intl_user) + mutt_strlen (intl_domain) + 2); | ||||
|    sprintf (mailbox, "%s@%s", NONULL(intl_user), NONULL(intl_domain)); /* __SPRINTF_CHECKED__ */ | ||||
| diff --git a/mutt_idna.h b/mutt_idna.h
 | ||||
| index 192e08db..62e6e301 100644
 | ||||
| --- a/mutt_idna.h
 | ||||
| +++ b/mutt_idna.h
 | ||||
| @@ -26,13 +26,17 @@
 | ||||
|  #include <idna.h> | ||||
|  #elif defined(HAVE_IDN_IDNA_H) | ||||
|  #include <idn/idna.h> | ||||
| +#elif defined(HAVE_IDN2_H)
 | ||||
| +#include <idn2.h>
 | ||||
| +#elif defined(HAVE_IDN_IDN2_H)
 | ||||
| +#include <idn/idn2.h>
 | ||||
|  #endif | ||||
|   | ||||
|  #define MI_MAY_BE_IRREVERSIBLE		(1 << 0) | ||||
|   | ||||
|  /* Work around incompatibilities in the libidn API */ | ||||
|   | ||||
| -#ifdef HAVE_LIBIDN
 | ||||
| +#if defined(HAVE_LIBIDN) || defined(HAVE_LIBIDN2)
 | ||||
|  # if (!defined(HAVE_IDNA_TO_ASCII_8Z) && defined(HAVE_IDNA_TO_ASCII_FROM_UTF8)) | ||||
|  #  define idna_to_ascii_8z(a,b,c) idna_to_ascii_from_utf8(a,b,(c)&1,((c)&2)?1:0) | ||||
|  # endif | ||||
| @@ -42,7 +46,7 @@
 | ||||
|  # if (!defined(HAVE_IDNA_TO_UNICODE_8Z8Z) && defined(HAVE_IDNA_TO_UNICODE_UTF8_FROM_UTF8)) | ||||
|  #  define idna_to_unicode_8z8z(a,b,c) idna_to_unicode_utf8_from_utf8(a,b,(c)&1,((c)&2)?1:0) | ||||
|  # endif | ||||
| -#endif /* HAVE_LIBIDN */
 | ||||
| +#endif /* defined(HAVE_LIBIDN) || defined(HAVE_LIBIDN2) */
 | ||||
|   | ||||
|   | ||||
|  #ifdef HAVE_ICONV | ||||
| diff --git a/mutt_socket.c b/mutt_socket.c
 | ||||
| index 16e52dce..dc845865 100644
 | ||||
| --- a/mutt_socket.c
 | ||||
| +++ b/mutt_socket.c
 | ||||
| @@ -499,7 +499,7 @@ int raw_socket_open (CONNECTION* conn)
 | ||||
|   | ||||
|    snprintf (port, sizeof (port), "%d", conn->account.port); | ||||
|     | ||||
| -# ifdef HAVE_LIBIDN
 | ||||
| +# if defined(HAVE_LIBIDN) || defined(HAVE_LIBIDN2)
 | ||||
|    if (idna_to_ascii_lz (conn->account.host, &host_idna, 1) != IDNA_SUCCESS) | ||||
|    { | ||||
|      mutt_error (_("Bad IDN \"%s\"."), conn->account.host); | ||||
| @@ -514,7 +514,7 @@ int raw_socket_open (CONNECTION* conn)
 | ||||
|     | ||||
|    rc = getaddrinfo (host_idna, port, &hints, &res); | ||||
|   | ||||
| -# ifdef HAVE_LIBIDN
 | ||||
| +# if defined(HAVE_LIBIDN) || defined(HAVE_LIBIDN2)
 | ||||
|    FREE (&host_idna); | ||||
|  # endif | ||||
|   | ||||
| @@ -558,7 +558,7 @@ int raw_socket_open (CONNECTION* conn)
 | ||||
|    sin.sin_port = htons (conn->account.port); | ||||
|    sin.sin_family = AF_INET; | ||||
|   | ||||
| -# ifdef HAVE_LIBIDN
 | ||||
| +# if defined(HAVE_LIBIDN) || defined(HAVE_LIBIDN2)
 | ||||
|    if (idna_to_ascii_lz (conn->account.host, &host_idna, 1) != IDNA_SUCCESS) | ||||
|    { | ||||
|      mutt_error (_("Bad IDN \"%s\"."), conn->account.host); | ||||
| @@ -573,7 +573,7 @@ int raw_socket_open (CONNECTION* conn)
 | ||||
|   | ||||
|    he = gethostbyname (host_idna); | ||||
|   | ||||
| -# ifdef HAVE_LIBIDN
 | ||||
| +# if defined(HAVE_LIBIDN) || defined(HAVE_LIBIDN2)
 | ||||
|      FREE (&host_idna); | ||||
|  # endif | ||||
|   | ||||
| diff --git a/mutt_ssl.c b/mutt_ssl.c
 | ||||
| index eacd1556..3467b618 100644
 | ||||
| --- a/mutt_ssl.c
 | ||||
| +++ b/mutt_ssl.c
 | ||||
| @@ -935,7 +935,7 @@ static int check_host (X509 *x509cert, const char *hostname, char *err, size_t e
 | ||||
|    /* Check if 'hostname' matches the one of the subjectAltName extensions of | ||||
|     * type DNS or the Common Name (CN). */ | ||||
|   | ||||
| -#ifdef HAVE_LIBIDN
 | ||||
| +#if defined(HAVE_LIBIDN) || defined(HAVE_LIBIDN2)
 | ||||
|    if (idna_to_ascii_lz(hostname, &hostname_ascii, 0) != IDNA_SUCCESS) | ||||
|    { | ||||
|      hostname_ascii = safe_strdup(hostname); | ||||
| -- 
 | ||||
| 2.13.6 | ||||
| 
 | ||||
							
								
								
									
										17
									
								
								mutt.spec
									
									
									
									
									
								
							
							
						
						
									
										17
									
								
								mutt.spec
									
									
									
									
									
								
							| @ -5,7 +5,8 @@ | ||||
| %bcond_without gnutls | ||||
| %bcond_without gss | ||||
| %bcond_without sasl | ||||
| %bcond_without idn | ||||
| %bcond_with idn | ||||
| %bcond_without idn2 | ||||
| %bcond_without hcache | ||||
| %bcond_without tokyocabinet | ||||
| %bcond_with bdb | ||||
| @ -19,7 +20,7 @@ | ||||
| Summary: A text mode mail user agent | ||||
| Name: mutt | ||||
| Version: 1.9.5 | ||||
| Release: 1%{?dist} | ||||
| Release: 2%{?dist} | ||||
| Epoch: 5 | ||||
| # The entire source code is GPLv2+ except | ||||
| # pgpewrap.c setenv.c sha1.c wcwidth.c which are Public Domain | ||||
| @ -34,8 +35,9 @@ Patch2: mutt-1.8.0-cabundle.patch | ||||
| Patch3: mutt-1.7.0-syncdebug.patch | ||||
| # FIXME make it to upstream | ||||
| Patch8: mutt-1.5.23-system_certs.patch | ||||
| Patch10: mutt-1.9.4-lynx_no_backscapes.patch | ||||
| Patch9: mutt-1.9.0-ssl_ciphers.patch | ||||
| Patch10: mutt-1.9.4-lynx_no_backscapes.patch | ||||
| Patch11: mutt-1.9.5-add_libidn2_support.patch | ||||
| Url: http://www.mutt.org | ||||
| Requires: mailcap, urlview | ||||
| BuildRequires: ncurses-devel, gettext, automake | ||||
| @ -61,6 +63,7 @@ BuildRequires: lynx | ||||
| %endif | ||||
| 
 | ||||
| %{?with_idn:BuildRequires: libidn-devel} | ||||
| %{?with_idn2:BuildRequires: libidn2-devel} | ||||
| %{?with_gpgme:BuildRequires: gpgme-devel} | ||||
| 
 | ||||
| 
 | ||||
| @ -85,6 +88,7 @@ autoreconf --install | ||||
| %patch8 -p1 -b .system_certs | ||||
| %patch9 -p1 -b .ssl_ciphers | ||||
| %patch10 -p1 -b .lynx_no_backscapes | ||||
| %patch11 -p1 -b .add_libidn2_support | ||||
| 
 | ||||
| sed -i -r 's/`$GPGME_CONFIG --libs`/"\0 -lgpg-error"/' configure | ||||
| # disable mutt_dotlock program - remove support from mutt binary | ||||
| @ -129,7 +133,11 @@ rm -f mutt_ssl.c | ||||
|     %{?with_gss:	--with-gss} \ | ||||
|     %endif | ||||
| \ | ||||
|     %{?with_idn:	--with-idn} \ | ||||
|     %{!?with_idn:	--without-idn} \ | ||||
|     %{?with_idn2:   --with-idn2} \ | ||||
|     %{!?with_idn2:  --without-idn2} \ | ||||
| \ | ||||
|     %{?with_gpgme:	--enable-gpgme} \ | ||||
|     %{?with_sidebar: --enable-sidebar} \ | ||||
|     --with-docdir=%{_pkgdocdir} | ||||
| @ -197,6 +205,9 @@ ln -sf ./muttrc.5 %{buildroot}%{_mandir}/man5/muttrc.local.5 | ||||
| 
 | ||||
| 
 | ||||
| %changelog | ||||
| * Mon Apr 16 2018 Matej Mužila <mmuzila@redhat.com> - 5:1.9.5-2 | ||||
| - Use libidn2 instead of libidn | ||||
| 
 | ||||
| * Mon Apr 16 2018 Matej Mužila <mmuzila@redhat.com> - 5:1.9.5-1 | ||||
| - Upgrade to 1.9.5 | ||||
| 
 | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user