comparison 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
comparison
equal deleted inserted replaced
27545:8c41a23e6b44 27546:e90fa379fcec
52 } 52 }
53 53
54 return TRUE; 54 return TRUE;
55 } 55 }
56 56
57 gboolean jabber_nameprep_validate(const char *str) 57 gboolean jabber_domain_validate(const char *str)
58 { 58 {
59 const char *c; 59 const char *c;
60 60
61 if(!str) 61 if(!str)
62 return TRUE; 62 return TRUE;
63 63
64 if(strlen(str) > 1023) 64 if(strlen(str) > 1023)
65 return FALSE; 65 return FALSE;
66 66
67 /*
68 * TODO: An IPv6 address of the form [2001:470:1f05:d58::2] is also
69 * a valid XMPP domain portion.
70 */
71 c = str; 67 c = str;
68
69 if (*c == '[') {
70 /* Check if str is a valid IPv6 identifier */
71 const gchar *end_bracket = strstr(c, "]");
72 gboolean valid = FALSE;
73
74 if (!end_bracket || *(end_bracket + 1) != '\0')
75 return FALSE;
76
77 /* Ugly, but in-place */
78 *(gchar *)end_bracket = '\0';
79 valid = purple_ipv6_address_is_valid(c + 1);
80 *(gchar *)end_bracket = ']';
81
82 return valid;
83 }
84
72 while(c && *c) { 85 while(c && *c) {
73 gunichar ch = g_utf8_get_char(c); 86 gunichar ch = g_utf8_get_char(c);
74 /* The list of characters allowed in domain names is pretty small */ 87 /* The list of characters allowed in domain names is pretty small */
75 if ((ch <= 0x7F && !( (ch >= 'a' && ch <= 'z') 88 if ((ch <= 0x7F && !( (ch >= 'a' && ch <= 'z')
76 || (ch >= '0' && ch <= '9') 89 || (ch >= '0' && ch <= '9')
269 g_free(domain); 282 g_free(domain);
270 } 283 }
271 284
272 /* and finally the jabber nodeprep */ 285 /* and finally the jabber nodeprep */
273 if(!jabber_nodeprep_validate(jid->node) || 286 if(!jabber_nodeprep_validate(jid->node) ||
274 !jabber_nameprep_validate(jid->domain) || 287 !jabber_domain_validate(jid->domain) ||
275 !jabber_resourceprep_validate(jid->resource)) { 288 !jabber_resourceprep_validate(jid->resource)) {
276 jabber_id_free(jid); 289 jabber_id_free(jid);
277 return NULL; 290 return NULL;
278 } 291 }
279 292