diff libpurple/protocols/jabber/jutil.c @ 27546:e90fa379fcec

Validate IPv6 identifiers in the domain portion of a JID.
author Paul Aurich <paul@darkrain42.org>
date Sat, 11 Jul 2009 07:47:07 +0000
parents da3d0159333d
children f1f901b3d6f2
line wrap: on
line diff
--- a/libpurple/protocols/jabber/jutil.c	Sat Jul 11 07:32:27 2009 +0000
+++ b/libpurple/protocols/jabber/jutil.c	Sat Jul 11 07:47:07 2009 +0000
@@ -54,7 +54,7 @@
 	return TRUE;
 }
 
-gboolean jabber_nameprep_validate(const char *str)
+gboolean jabber_domain_validate(const char *str)
 {
 	const char *c;
 
@@ -64,11 +64,24 @@
 	if(strlen(str) > 1023)
 		return FALSE;
 
-	/*
-	 * TODO: An IPv6 address of the form [2001:470:1f05:d58::2] is also
-	 * a valid XMPP domain portion.
-	 */
 	c = str;
+
+	if (*c == '[') {
+		/* Check if str is a valid IPv6 identifier */
+		const gchar *end_bracket = strstr(c, "]");
+		gboolean valid = FALSE;
+
+		if (!end_bracket || *(end_bracket + 1) != '\0')
+			return FALSE;
+
+		/* Ugly, but in-place */
+		*(gchar *)end_bracket = '\0';
+		valid = purple_ipv6_address_is_valid(c + 1);
+		*(gchar *)end_bracket = ']';
+
+		return valid;
+	}
+
 	while(c && *c) {
 		gunichar ch = g_utf8_get_char(c);
 		/* The list of characters allowed in domain names is pretty small */
@@ -271,7 +284,7 @@
 
 	/* and finally the jabber nodeprep */
 	if(!jabber_nodeprep_validate(jid->node) ||
-			!jabber_nameprep_validate(jid->domain) ||
+			!jabber_domain_validate(jid->domain) ||
 			!jabber_resourceprep_validate(jid->resource)) {
 		jabber_id_free(jid);
 		return NULL;