pidgin/pidgin

Merged in default (pull request #667)

2020-02-14, Gary Kramlich
8177902f9562
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')