Fri, 14 Feb 2020 07:46:31 +0000
Merged in default (pull request #667)
Make libidn required
Approved-by: Richard Laager
Approved-by: Elliott Sales de Andrade
--- a/libpurple/protocols/jabber/jutil.c Wed Feb 05 02:20:05 2020 +0000 +++ b/libpurple/protocols/jabber/jutil.c Fri Feb 14 07:46:31 2020 +0000 @@ -32,13 +32,10 @@ #include "presence.h" #include "jutil.h" -#ifdef USE_IDN #include <idna.h> #include <stringprep.h> static char idn_buffer[1024]; -#endif -#ifdef USE_IDN static gboolean jabber_nodeprep(char *str, size_t buflen) { return stringprep_xmpp_nodeprep(str, buflen) == STRINGPREP_OK; @@ -169,15 +166,9 @@ return jid; } -#endif /* USE_IDN */ - gboolean jabber_nodeprep_validate(const char *str) { -#ifdef USE_IDN gboolean result; -#else - const char *c; -#endif if(!str) return TRUE; @@ -185,24 +176,10 @@ if(strlen(str) > 1023) return FALSE; -#ifdef USE_IDN strncpy(idn_buffer, str, sizeof(idn_buffer) - 1); idn_buffer[sizeof(idn_buffer) - 1] = '\0'; result = jabber_nodeprep(idn_buffer, sizeof(idn_buffer)); return result; -#else /* USE_IDN */ - c = str; - while(c && *c) { - gunichar ch = g_utf8_get_char(c); - if(ch == '\"' || ch == '&' || ch == '\'' || ch == '/' || ch == ':' || - ch == '<' || ch == '>' || ch == '@' || !g_unichar_isgraph(ch)) { - return FALSE; - } - c = g_utf8_next_char(c); - } - - return TRUE; -#endif /* USE_IDN */ } gboolean jabber_domain_validate(const char *str) @@ -258,11 +235,7 @@ gboolean jabber_resourceprep_validate(const char *str) { -#ifdef USE_IDN gboolean result; -#else - const char *c; -#endif if(!str) return TRUE; @@ -270,28 +243,14 @@ if(strlen(str) > 1023) return FALSE; -#ifdef USE_IDN strncpy(idn_buffer, str, sizeof(idn_buffer) - 1); idn_buffer[sizeof(idn_buffer) - 1] = '\0'; result = jabber_resourceprep(idn_buffer, sizeof(idn_buffer)); return result; -#else /* USE_IDN */ - c = str; - while(c && *c) { - gunichar ch = g_utf8_get_char(c); - if(!g_unichar_isgraph(ch) && ch != ' ') - return FALSE; - - c = g_utf8_next_char(c); - } - - return TRUE; -#endif /* USE_IDN */ } char *jabber_saslprep(const char *in) { -#ifdef USE_IDN char *out; g_return_val_if_fail(in != NULL, NULL); @@ -309,22 +268,6 @@ out = g_strdup(idn_buffer); memset(idn_buffer, 0, sizeof(idn_buffer)); return out; -#else /* USE_IDN */ - /* TODO: Something better than disallowing all non-ASCII characters */ - /* TODO: Is this even correct? */ - const guchar *c; - - c = (const guchar *)in; - for ( ; *c; ++c) { - if (*c > 0x7f || /* Non-ASCII characters */ - *c == 0x7f || /* ASCII Delete character */ - (*c < 0x20 && *c != '\t' && *c != '\n' && *c != '\r')) - /* ASCII control characters */ - return NULL; - } - - return g_strdup(in); -#endif /* USE_IDN */ } static JabberID* @@ -334,10 +277,6 @@ const char *slash = NULL; const char *c; gboolean needs_validation = FALSE; -#ifndef USE_IDN - char *node = NULL; - char *domain; -#endif JabberID *jid; if (!str) @@ -431,52 +370,7 @@ if (!g_utf8_validate(str, -1, NULL)) return NULL; -#ifdef USE_IDN return jabber_idn_validate(str, at, slash, c /* points to the null */); -#else /* USE_IDN */ - - jid = g_new0(JabberID, 1); - - /* normalization */ - if(at) { - node = g_utf8_casefold(str, at-str); - if(slash) { - domain = g_utf8_casefold(at+1, slash-(at+1)); - if (*(slash + 1)) - jid->resource = g_utf8_normalize(slash+1, -1, G_NORMALIZE_NFKC); - } else { - domain = g_utf8_casefold(at+1, -1); - } - } else { - if(slash) { - domain = g_utf8_casefold(str, slash-str); - if (*(slash + 1)) - jid->resource = g_utf8_normalize(slash+1, -1, G_NORMALIZE_NFKC); - } else { - domain = g_utf8_casefold(str, -1); - } - } - - if (node) { - jid->node = g_utf8_normalize(node, -1, G_NORMALIZE_NFKC); - g_free(node); - } - - if (domain) { - jid->domain = g_utf8_normalize(domain, -1, G_NORMALIZE_NFKC); - g_free(domain); - } - - /* and finally the jabber nodeprep */ - if(!jabber_nodeprep_validate(jid->node) || - !jabber_domain_validate(jid->domain) || - !jabber_resourceprep_validate(jid->resource)) { - jabber_id_free(jid); - return NULL; - } - - return jid; -#endif /* USE_IDN */ } void
--- a/libpurple/protocols/jabber/meson.build Wed Feb 05 02:20:05 2020 +0000 +++ b/libpurple/protocols/jabber/meson.build Fri Feb 14 07:46:31 2020 +0000 @@ -2,13 +2,6 @@ # Check for Internationalized Domain Name support ####################################################################### -idn = dependency('libidn', version : '>= 0.0.0', required : get_option('idn')) -if idn.found() - use_idn = [ '-DUSE_IDN' ] -else - use_idn = [] -endif - JABBERSOURCES = [ 'adhoccommands.c', 'adhoccommands.h', @@ -114,8 +107,9 @@ endif if DYNAMIC_JABBER + idn = dependency('libidn', version : '>= 0.0.0') + jabber_prpl = shared_library('jabber', JABBERSOURCES, - c_args : use_idn, link_args : jabber_link_args, dependencies : [gstreamer, idn, libxml, sasl, libpurple_dep, libsoup, glib, gio, math, ws2_32], install : true, install_dir : PURPLE_PLUGINDIR)
--- a/libpurple/protocols/jabber/tests/test_jabber_jutil.c Wed Feb 05 02:20:05 2020 +0000 +++ b/libpurple/protocols/jabber/tests/test_jabber_jutil.c Fri Feb 14 07:46:31 2020 +0000 @@ -184,7 +184,6 @@ /* Cyrillic capital EF (U+0424) maps to lowercase EF (U+0444) */ assert_jid_parts("ф", "example.com", "Ф@example.com"); -#ifdef USE_IDN /* * These character (U+A664 and U+A665) are not mapped to anything in * RFC3454 B.2. This first test *fails* when not using IDN because glib's @@ -195,7 +194,6 @@ */ assert_jid_parts("Ꙥ", "example.com", "Ꙥ@example.com"); assert_jid_parts("ꙥ", "example.com", "ꙥ@example.com"); -#endif /* U+04E9 to U+04E9 */ assert_jid_parts("noone", "өexample.com", "noone@Өexample.com");
--- a/libpurple/protocols/jabber/tests/test_jabber_scram.c Wed Feb 05 02:20:05 2020 +0000 +++ b/libpurple/protocols/jabber/tests/test_jabber_scram.c Fri Feb 14 07:46:31 2020 +0000 @@ -86,13 +86,11 @@ "c=biws,r=H7yDYKAWBCrM2Fa5SxGa4iezFPVDPpDUcGxPkH3RzP,p=pXkak78EuwwOEwk2/h/OzD7NkEI=", "v=ldX4EBNnOgDnNTOCmbSfBHAUCOs="); -#ifdef USE_IDN assert_successful_exchange("pass½word", "GNb2HsNI7VnTv8ABsE5AnY8W", "n=paul,r=GNb2HsNI7VnTv8ABsE5AnY8W", "r=GNb2HsNI7VnTv8ABsE5AnY8W/w/I3eRKM0I7jxFWOH,s=ysAriUjPzFqOXnMQ,i=4096", "c=biws,r=GNb2HsNI7VnTv8ABsE5AnY8W/w/I3eRKM0I7jxFWOH,p=n/CtgdWjOYnLQ4m9Na+wPn9D2uY=", "v=4TkZwKWy6JHNmrUbU2+IdAaXtos="); -#endif } gint
--- a/meson.build Wed Feb 05 02:20:05 2020 +0000 +++ b/meson.build Fri Feb 14 07:46:31 2020 +0000 @@ -796,7 +796,6 @@ message('') message('Build with GStreamer support.. : ' + gstreamer.found().to_string()) message('Build with voice and video.... : ' + enable_vv.to_string()) -message('Build with GNU Libidn......... : ' + idn.found().to_string()) message('Build with Nettle support..... : ' + nettle.found().to_string()) message('Build with Cyrus SASL support. : ' + sasl.found().to_string()) message('Use external libzephyr........ : ' + EXTERNAL_LIBZEPHYR.to_string())
--- a/meson_options.txt Wed Feb 05 02:20:05 2020 +0000 +++ b/meson_options.txt Fri Feb 14 07:46:31 2020 +0000 @@ -58,9 +58,6 @@ option('cyrus-sasl', type : 'feature', description : 'enable Cyrus SASL support for XMPP/IRC') -option('idn', type : 'feature', - description : 'compile with IDN support') - option('krb4', type : 'boolean', value : false, description : 'compile Zephyr plugin with Kerberos 4 support')