Mercurial > pidgin.yaz
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 |