Sun, 29 Nov 2009 19:06:30 +0000
propagate from branch 'im.pidgin.pidgin' (head ac6acf2722f309aeb9182beddbee5d96caf7ee6a)
to branch 'im.pidgin.cpw.malu.ft_thumbnails' (head 92c3b2ccbc48ccbfd6404d5e87b16bb36aa0c3a0)
| 7014 | 1 | /* |
| 15884 | 2 | * purple - Jabber Protocol Plugin |
| 3127 | 3 | * |
|
28322
ac8fec1d2234
Remove specific copyright lines from the XMPP prpl.
Paul Aurich <darkrain42@pidgin.im>
parents:
27899
diff
changeset
|
4 | * Purple is the legal property of its developers, whose names are too numerous |
|
ac8fec1d2234
Remove specific copyright lines from the XMPP prpl.
Paul Aurich <darkrain42@pidgin.im>
parents:
27899
diff
changeset
|
5 | * to list here. Please refer to the COPYRIGHT file distributed with this |
|
ac8fec1d2234
Remove specific copyright lines from the XMPP prpl.
Paul Aurich <darkrain42@pidgin.im>
parents:
27899
diff
changeset
|
6 | * source distribution. |
| 3127 | 7 | * |
| 7014 | 8 | * This program is free software; you can redistribute it and/or modify |
| 9 | * it under the terms of the GNU General Public License as published by | |
| 10 | * the Free Software Foundation; either version 2 of the License, or | |
| 11 | * (at your option) any later version. | |
| 3127 | 12 | * |
| 7014 | 13 | * This program is distributed in the hope that it will be useful, |
| 14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| 16 | * GNU General Public License for more details. | |
| 17 | * | |
| 18 | * You should have received a copy of the GNU General Public License | |
| 19 | * along with this program; if not, write to the Free Software | |
|
19859
71d37b57eff2
The FSF changed its address a while ago; our files were out of date.
John Bailey <rekkanoryo@rekkanoryo.org>
parents:
15952
diff
changeset
|
20 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA |
| 3127 | 21 | * |
| 7014 | 22 | */ |
| 23 | #include "internal.h" | |
|
15952
c087855dc551
Re-arrange #includes so 'make check' stands a chance of passing during
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
15884
diff
changeset
|
24 | #include "account.h" |
|
25110
40b3fffdb00b
Fix up the XMPP User Avatar SHA1 hashing so that we don't mess up the checksum
Paul Aurich <darkrain42@pidgin.im>
parents:
19859
diff
changeset
|
25 | #include "cipher.h" |
|
15952
c087855dc551
Re-arrange #includes so 'make check' stands a chance of passing during
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
15884
diff
changeset
|
26 | #include "conversation.h" |
|
25110
40b3fffdb00b
Fix up the XMPP User Avatar SHA1 hashing so that we don't mess up the checksum
Paul Aurich <darkrain42@pidgin.im>
parents:
19859
diff
changeset
|
27 | #include "debug.h" |
| 7014 | 28 | #include "server.h" |
| 8043 | 29 | #include "util.h" |
|
15952
c087855dc551
Re-arrange #includes so 'make check' stands a chance of passing during
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
15884
diff
changeset
|
30 | #include "xmlnode.h" |
| 7014 | 31 | |
| 7322 | 32 | #include "chat.h" |
| 7014 | 33 | #include "presence.h" |
| 34 | #include "jutil.h" | |
| 3127 | 35 | |
|
27849
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
36 | #ifdef USE_IDN |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
37 | #include <idna.h> |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
38 | #include <stringprep.h> |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
39 | static char idn_buffer[1024]; |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
40 | #endif |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
41 | |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
42 | #ifdef USE_IDN |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
43 | static gboolean jabber_nodeprep(char *str, size_t buflen) |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
44 | { |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
45 | return stringprep_xmpp_nodeprep(str, buflen) == STRINGPREP_OK; |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
46 | } |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
47 | |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
48 | static gboolean jabber_resourceprep(char *str, size_t buflen) |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
49 | { |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
50 | return stringprep_xmpp_resourceprep(str, buflen) == STRINGPREP_OK; |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
51 | } |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
52 | |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
53 | static JabberID* |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
54 | jabber_idn_validate(const char *str, const char *at, const char *slash, |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
55 | const char *null) |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
56 | { |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
57 | const char *node = NULL; |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
58 | const char *domain = NULL; |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
59 | const char *resource = NULL; |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
60 | int node_len = 0; |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
61 | int domain_len = 0; |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
62 | int resource_len = 0; |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
63 | char *out; |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
64 | JabberID *jid; |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
65 | |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
66 | /* Ensure no parts are > 1023 bytes */ |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
67 | if (at) { |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
68 | node = str; |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
69 | node_len = at - str; |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
70 | |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
71 | domain = at + 1; |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
72 | if (slash) { |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
73 | domain_len = slash - (at + 1); |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
74 | resource = slash + 1; |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
75 | resource_len = null - (slash + 1); |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
76 | } else { |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
77 | domain_len = null - (at + 1); |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
78 | } |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
79 | } else { |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
80 | domain = str; |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
81 | |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
82 | if (slash) { |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
83 | domain_len = slash - str; |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
84 | resource = slash; |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
85 | resource_len = null - (slash + 1); |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
86 | } else { |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
87 | domain_len = null - (str + 1); |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
88 | } |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
89 | } |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
90 | |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
91 | if (node && node_len > 1023) |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
92 | return NULL; |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
93 | if (domain_len > 1023) |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
94 | return NULL; |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
95 | if (resource && resource_len > 1023) |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
96 | return NULL; |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
97 | |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
98 | jid = g_new0(JabberID, 1); |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
99 | |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
100 | if (node) { |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
101 | strncpy(idn_buffer, node, node_len); |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
102 | idn_buffer[node_len] = '\0'; |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
103 | |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
104 | if (!jabber_nodeprep(idn_buffer, sizeof(idn_buffer))) { |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
105 | jabber_id_free(jid); |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
106 | jid = NULL; |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
107 | goto out; |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
108 | } |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
109 | |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
110 | jid->node = g_strdup(idn_buffer); |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
111 | } |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
112 | |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
113 | /* domain *must* be here */ |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
114 | strncpy(idn_buffer, domain, domain_len); |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
115 | idn_buffer[domain_len] = '\0'; |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
116 | if (domain[0] == '[') { /* IPv6 address */ |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
117 | gboolean valid = FALSE; |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
118 | |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
119 | if (idn_buffer[domain_len - 1] == ']') { |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
120 | idn_buffer[domain_len - 1] = '\0'; |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
121 | valid = purple_ipv6_address_is_valid(idn_buffer + 1); |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
122 | } |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
123 | |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
124 | if (!valid) { |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
125 | jabber_id_free(jid); |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
126 | jid = NULL; |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
127 | goto out; |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
128 | } |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
129 | } else { |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
130 | /* Apply nameprep */ |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
131 | if (stringprep_nameprep(idn_buffer, sizeof(idn_buffer)) != STRINGPREP_OK) { |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
132 | jabber_id_free(jid); |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
133 | jid = NULL; |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
134 | goto out; |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
135 | } |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
136 | |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
137 | /* And now ToASCII */ |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
138 | if (idna_to_ascii_8z(idn_buffer, &out, IDNA_USE_STD3_ASCII_RULES) != IDNA_SUCCESS) { |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
139 | jabber_id_free(jid); |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
140 | jid = NULL; |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
141 | goto out; |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
142 | } |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
143 | |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
144 | /* This *MUST* be freed using 'free', not 'g_free' */ |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
145 | free(out); |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
146 | jid->domain = g_strdup(idn_buffer); |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
147 | } |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
148 | |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
149 | if (resource) { |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
150 | strncpy(idn_buffer, resource, resource_len); |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
151 | idn_buffer[resource_len] = '\0'; |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
152 | |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
153 | if (!jabber_resourceprep(idn_buffer, sizeof(idn_buffer))) { |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
154 | jabber_id_free(jid); |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
155 | jid = NULL; |
|
28535
2c150600a9e9
Fix a crash when attempting to validate a JID with an invalid resource.
Paul Aurich <darkrain42@pidgin.im>
parents:
28431
diff
changeset
|
156 | goto out; |
|
2c150600a9e9
Fix a crash when attempting to validate a JID with an invalid resource.
Paul Aurich <darkrain42@pidgin.im>
parents:
28431
diff
changeset
|
157 | } else |
|
2c150600a9e9
Fix a crash when attempting to validate a JID with an invalid resource.
Paul Aurich <darkrain42@pidgin.im>
parents:
28431
diff
changeset
|
158 | jid->resource = g_strdup(idn_buffer); |
|
27849
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
159 | } |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
160 | |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
161 | out: |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
162 | return jid; |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
163 | } |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
164 | |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
165 | #endif /* USE_IDN */ |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
166 | |
| 7310 | 167 | gboolean jabber_nodeprep_validate(const char *str) |
| 168 | { | |
|
27849
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
169 | #ifdef USE_IDN |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
170 | gboolean result; |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
171 | #else |
| 7310 | 172 | const char *c; |
|
27849
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
173 | #endif |
| 7310 | 174 | |
| 175 | if(!str) | |
| 176 | return TRUE; | |
| 177 | ||
| 178 | if(strlen(str) > 1023) | |
| 179 | return FALSE; | |
| 180 | ||
|
27849
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
181 | #ifdef USE_IDN |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
182 | strncpy(idn_buffer, str, sizeof(idn_buffer) - 1); |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
183 | idn_buffer[sizeof(idn_buffer) - 1] = '\0'; |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
184 | result = jabber_nodeprep(idn_buffer, sizeof(idn_buffer)); |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
185 | return result; |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
186 | #else /* USE_IDN */ |
| 7310 | 187 | c = str; |
| 188 | while(c && *c) { | |
| 189 | gunichar ch = g_utf8_get_char(c); | |
| 190 | if(ch == '\"' || ch == '&' || ch == '\'' || ch == '/' || ch == ':' || | |
| 191 | ch == '<' || ch == '>' || ch == '@' || !g_unichar_isgraph(ch)) { | |
| 192 | return FALSE; | |
| 193 | } | |
| 194 | c = g_utf8_next_char(c); | |
| 195 | } | |
| 196 | ||
| 197 | return TRUE; | |
|
27849
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
198 | #endif /* USE_IDN */ |
| 7310 | 199 | } |
| 200 | ||
|
27728
03b2a20ba465
Validate IPv6 identifiers in the domain portion of a JID.
Paul Aurich <darkrain42@pidgin.im>
parents:
27723
diff
changeset
|
201 | gboolean jabber_domain_validate(const char *str) |
| 7310 | 202 | { |
| 203 | const char *c; | |
|
27731
53ddfbc48e11
Save one traversal of the domain for IPv6 validation.
Paul Aurich <darkrain42@pidgin.im>
parents:
27728
diff
changeset
|
204 | size_t len; |
| 7310 | 205 | |
| 206 | if(!str) | |
| 207 | return TRUE; | |
| 208 | ||
|
27731
53ddfbc48e11
Save one traversal of the domain for IPv6 validation.
Paul Aurich <darkrain42@pidgin.im>
parents:
27728
diff
changeset
|
209 | len = strlen(str); |
|
53ddfbc48e11
Save one traversal of the domain for IPv6 validation.
Paul Aurich <darkrain42@pidgin.im>
parents:
27728
diff
changeset
|
210 | if (len > 1023) |
| 7310 | 211 | return FALSE; |
| 212 | ||
| 213 | c = str; | |
|
27728
03b2a20ba465
Validate IPv6 identifiers in the domain portion of a JID.
Paul Aurich <darkrain42@pidgin.im>
parents:
27723
diff
changeset
|
214 | |
|
03b2a20ba465
Validate IPv6 identifiers in the domain portion of a JID.
Paul Aurich <darkrain42@pidgin.im>
parents:
27723
diff
changeset
|
215 | if (*c == '[') { |
|
03b2a20ba465
Validate IPv6 identifiers in the domain portion of a JID.
Paul Aurich <darkrain42@pidgin.im>
parents:
27723
diff
changeset
|
216 | /* Check if str is a valid IPv6 identifier */ |
|
03b2a20ba465
Validate IPv6 identifiers in the domain portion of a JID.
Paul Aurich <darkrain42@pidgin.im>
parents:
27723
diff
changeset
|
217 | gboolean valid = FALSE; |
|
03b2a20ba465
Validate IPv6 identifiers in the domain portion of a JID.
Paul Aurich <darkrain42@pidgin.im>
parents:
27723
diff
changeset
|
218 | |
|
27731
53ddfbc48e11
Save one traversal of the domain for IPv6 validation.
Paul Aurich <darkrain42@pidgin.im>
parents:
27728
diff
changeset
|
219 | if (*(c + len - 1) != ']') |
|
27728
03b2a20ba465
Validate IPv6 identifiers in the domain portion of a JID.
Paul Aurich <darkrain42@pidgin.im>
parents:
27723
diff
changeset
|
220 | return FALSE; |
|
03b2a20ba465
Validate IPv6 identifiers in the domain portion of a JID.
Paul Aurich <darkrain42@pidgin.im>
parents:
27723
diff
changeset
|
221 | |
|
03b2a20ba465
Validate IPv6 identifiers in the domain portion of a JID.
Paul Aurich <darkrain42@pidgin.im>
parents:
27723
diff
changeset
|
222 | /* Ugly, but in-place */ |
|
27731
53ddfbc48e11
Save one traversal of the domain for IPv6 validation.
Paul Aurich <darkrain42@pidgin.im>
parents:
27728
diff
changeset
|
223 | *(gchar *)(c + len - 1) = '\0'; |
|
27728
03b2a20ba465
Validate IPv6 identifiers in the domain portion of a JID.
Paul Aurich <darkrain42@pidgin.im>
parents:
27723
diff
changeset
|
224 | valid = purple_ipv6_address_is_valid(c + 1); |
|
27731
53ddfbc48e11
Save one traversal of the domain for IPv6 validation.
Paul Aurich <darkrain42@pidgin.im>
parents:
27728
diff
changeset
|
225 | *(gchar *)(c + len - 1) = ']'; |
|
27728
03b2a20ba465
Validate IPv6 identifiers in the domain portion of a JID.
Paul Aurich <darkrain42@pidgin.im>
parents:
27723
diff
changeset
|
226 | |
|
03b2a20ba465
Validate IPv6 identifiers in the domain portion of a JID.
Paul Aurich <darkrain42@pidgin.im>
parents:
27723
diff
changeset
|
227 | return valid; |
|
03b2a20ba465
Validate IPv6 identifiers in the domain portion of a JID.
Paul Aurich <darkrain42@pidgin.im>
parents:
27723
diff
changeset
|
228 | } |
|
03b2a20ba465
Validate IPv6 identifiers in the domain portion of a JID.
Paul Aurich <darkrain42@pidgin.im>
parents:
27723
diff
changeset
|
229 | |
| 7310 | 230 | while(c && *c) { |
| 231 | gunichar ch = g_utf8_get_char(c); | |
|
27720
a809853d8d46
Be more restrictive in the characters allowed by jabber_nameprep_validate()
Mark Doliner <markdoliner@pidgin.im>
parents:
27719
diff
changeset
|
232 | /* The list of characters allowed in domain names is pretty small */ |
|
27722
3f93427031cd
XMPP allows for internationalized domain names.
Paul Aurich <darkrain42@pidgin.im>
parents:
27721
diff
changeset
|
233 | if ((ch <= 0x7F && !( (ch >= 'a' && ch <= 'z') |
|
27720
a809853d8d46
Be more restrictive in the characters allowed by jabber_nameprep_validate()
Mark Doliner <markdoliner@pidgin.im>
parents:
27719
diff
changeset
|
234 | || (ch >= '0' && ch <= '9') |
|
a809853d8d46
Be more restrictive in the characters allowed by jabber_nameprep_validate()
Mark Doliner <markdoliner@pidgin.im>
parents:
27719
diff
changeset
|
235 | || (ch >= 'A' && ch <= 'Z') |
|
a809853d8d46
Be more restrictive in the characters allowed by jabber_nameprep_validate()
Mark Doliner <markdoliner@pidgin.im>
parents:
27719
diff
changeset
|
236 | || ch == '.' |
|
27722
3f93427031cd
XMPP allows for internationalized domain names.
Paul Aurich <darkrain42@pidgin.im>
parents:
27721
diff
changeset
|
237 | || ch == '-' )) || (ch >= 0x80 && !g_unichar_isgraph(ch))) |
| 7310 | 238 | return FALSE; |
| 239 | ||
| 240 | c = g_utf8_next_char(c); | |
| 241 | } | |
| 242 | ||
| 243 | return TRUE; | |
| 244 | } | |
| 245 | ||
| 246 | gboolean jabber_resourceprep_validate(const char *str) | |
| 247 | { | |
|
27849
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
248 | #ifdef USE_IDN |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
249 | gboolean result; |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
250 | #else |
| 7310 | 251 | const char *c; |
|
27849
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
252 | #endif |
| 7310 | 253 | |
| 254 | if(!str) | |
| 255 | return TRUE; | |
| 256 | ||
| 257 | if(strlen(str) > 1023) | |
| 258 | return FALSE; | |
| 259 | ||
|
27849
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
260 | #ifdef USE_IDN |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
261 | strncpy(idn_buffer, str, sizeof(idn_buffer) - 1); |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
262 | idn_buffer[sizeof(idn_buffer) - 1] = '\0'; |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
263 | result = jabber_resourceprep(idn_buffer, sizeof(idn_buffer)); |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
264 | return result; |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
265 | #else /* USE_IDN */ |
| 7310 | 266 | c = str; |
| 267 | while(c && *c) { | |
| 268 | gunichar ch = g_utf8_get_char(c); | |
| 7419 | 269 | if(!g_unichar_isgraph(ch) && ch != ' ') |
| 7310 | 270 | return FALSE; |
| 271 | ||
| 272 | c = g_utf8_next_char(c); | |
| 273 | } | |
| 274 | ||
| 275 | return TRUE; | |
|
27849
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
276 | #endif /* USE_IDN */ |
| 7310 | 277 | } |
| 278 | ||
|
28414
5093c1a49d5c
jabber: Use a better method for dealing with terminating slashes in JIDs.
Paul Aurich <darkrain42@pidgin.im>
parents:
28336
diff
changeset
|
279 | static JabberID* |
|
5093c1a49d5c
jabber: Use a better method for dealing with terminating slashes in JIDs.
Paul Aurich <darkrain42@pidgin.im>
parents:
28336
diff
changeset
|
280 | jabber_id_new_internal(const char *str, gboolean allow_terminating_slash) |
| 2086 | 281 | { |
|
27713
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
282 | const char *at = NULL; |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
283 | const char *slash = NULL; |
|
27714
c86eb4fefae2
Change jabber_id_new() to iterate byte by byte instead of character
Mark Doliner <markdoliner@pidgin.im>
parents:
27713
diff
changeset
|
284 | const char *c; |
|
27713
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
285 | gboolean needs_validation = FALSE; |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
286 | #if 0 |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
287 | gboolean node_is_required = FALSE; |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
288 | #endif |
|
27849
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
289 | #ifndef USE_IDN |
|
27130
9cb09f3df8c7
jabber_id_new() needs to be case-folding the node and domain.
Paul Aurich <darkrain42@pidgin.im>
parents:
25110
diff
changeset
|
290 | char *node = NULL; |
|
9cb09f3df8c7
jabber_id_new() needs to be case-folding the node and domain.
Paul Aurich <darkrain42@pidgin.im>
parents:
25110
diff
changeset
|
291 | char *domain; |
|
27849
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
292 | #endif |
| 7014 | 293 | JabberID *jid; |
| 2086 | 294 | |
|
27713
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
295 | if (!str) |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
296 | return NULL; |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
297 | |
|
27714
c86eb4fefae2
Change jabber_id_new() to iterate byte by byte instead of character
Mark Doliner <markdoliner@pidgin.im>
parents:
27713
diff
changeset
|
298 | for (c = str; *c != '\0'; c++) |
|
27713
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
299 | { |
|
27714
c86eb4fefae2
Change jabber_id_new() to iterate byte by byte instead of character
Mark Doliner <markdoliner@pidgin.im>
parents:
27713
diff
changeset
|
300 | switch (*c) { |
|
27713
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
301 | case '@': |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
302 | if (!slash) { |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
303 | if (at) { |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
304 | /* Multiple @'s in the node/domain portion, not a valid JID! */ |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
305 | return NULL; |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
306 | } |
|
27714
c86eb4fefae2
Change jabber_id_new() to iterate byte by byte instead of character
Mark Doliner <markdoliner@pidgin.im>
parents:
27713
diff
changeset
|
307 | if (c == str) { |
|
27713
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
308 | /* JIDs cannot start with @ */ |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
309 | return NULL; |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
310 | } |
|
27714
c86eb4fefae2
Change jabber_id_new() to iterate byte by byte instead of character
Mark Doliner <markdoliner@pidgin.im>
parents:
27713
diff
changeset
|
311 | if (c[1] == '\0') { |
|
27713
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
312 | /* JIDs cannot end with @ */ |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
313 | return NULL; |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
314 | } |
|
27714
c86eb4fefae2
Change jabber_id_new() to iterate byte by byte instead of character
Mark Doliner <markdoliner@pidgin.im>
parents:
27713
diff
changeset
|
315 | at = c; |
|
27713
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
316 | } |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
317 | break; |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
318 | |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
319 | case '/': |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
320 | if (!slash) { |
|
27714
c86eb4fefae2
Change jabber_id_new() to iterate byte by byte instead of character
Mark Doliner <markdoliner@pidgin.im>
parents:
27713
diff
changeset
|
321 | if (c == str) { |
|
27713
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
322 | /* JIDs cannot start with / */ |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
323 | return NULL; |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
324 | } |
|
28414
5093c1a49d5c
jabber: Use a better method for dealing with terminating slashes in JIDs.
Paul Aurich <darkrain42@pidgin.im>
parents:
28336
diff
changeset
|
325 | if (c[1] == '\0' && !allow_terminating_slash) { |
|
27713
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
326 | /* JIDs cannot end with / */ |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
327 | return NULL; |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
328 | } |
|
27714
c86eb4fefae2
Change jabber_id_new() to iterate byte by byte instead of character
Mark Doliner <markdoliner@pidgin.im>
parents:
27713
diff
changeset
|
329 | slash = c; |
|
27713
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
330 | } |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
331 | break; |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
332 | |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
333 | default: |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
334 | /* characters allowed everywhere */ |
|
27719
cc4aea1fd74c
Of course, these should be >= and <=
Mark Doliner <markdoliner@pidgin.im>
parents:
27714
diff
changeset
|
335 | if ((*c >= 'a' && *c <= 'z') |
|
cc4aea1fd74c
Of course, these should be >= and <=
Mark Doliner <markdoliner@pidgin.im>
parents:
27714
diff
changeset
|
336 | || (*c >= '0' && *c <= '9') |
|
cc4aea1fd74c
Of course, these should be >= and <=
Mark Doliner <markdoliner@pidgin.im>
parents:
27714
diff
changeset
|
337 | || (*c >= 'A' && *c <= 'Z') |
|
27714
c86eb4fefae2
Change jabber_id_new() to iterate byte by byte instead of character
Mark Doliner <markdoliner@pidgin.im>
parents:
27713
diff
changeset
|
338 | || *c == '.' || *c == '-') |
|
27713
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
339 | /* We're good */ |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
340 | break; |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
341 | |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
342 | #if 0 |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
343 | if (slash != NULL) { |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
344 | /* characters allowed only in the resource */ |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
345 | if (implement_me) |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
346 | /* We're good */ |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
347 | break; |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
348 | } |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
349 | |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
350 | /* characters allowed only in the node */ |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
351 | if (implement_me) { |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
352 | /* |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
353 | * Ok, this character is valid, but only if it's a part |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
354 | * of the node and not the domain. But we don't know |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
355 | * if "c" is a part of the node or the domain until after |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
356 | * we've found the @. So set a flag for now and check |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
357 | * that we found an @ later. |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
358 | */ |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
359 | node_is_required = TRUE; |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
360 | break; |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
361 | } |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
362 | #endif |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
363 | |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
364 | /* |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
365 | * Hmm, this character is a bit more exotic. Better fall |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
366 | * back to using the more expensive UTF-8 compliant |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
367 | * stringprep functions. |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
368 | */ |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
369 | needs_validation = TRUE; |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
370 | break; |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
371 | } |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
372 | } |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
373 | |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
374 | #if 0 |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
375 | if (node_is_required && at == NULL) |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
376 | /* Found invalid characters in the domain */ |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
377 | return NULL; |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
378 | #endif |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
379 | |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
380 | if (!needs_validation) { |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
381 | /* JID is made of only ASCII characters--just lowercase and return */ |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
382 | jid = g_new0(JabberID, 1); |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
383 | |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
384 | if (at) { |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
385 | jid->node = g_ascii_strdown(str, at - str); |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
386 | if (slash) { |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
387 | jid->domain = g_ascii_strdown(at + 1, slash - (at + 1)); |
|
28414
5093c1a49d5c
jabber: Use a better method for dealing with terminating slashes in JIDs.
Paul Aurich <darkrain42@pidgin.im>
parents:
28336
diff
changeset
|
388 | if (*(slash + 1)) |
|
5093c1a49d5c
jabber: Use a better method for dealing with terminating slashes in JIDs.
Paul Aurich <darkrain42@pidgin.im>
parents:
28336
diff
changeset
|
389 | jid->resource = g_strdup(slash + 1); |
|
27713
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
390 | } else { |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
391 | jid->domain = g_ascii_strdown(at + 1, -1); |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
392 | } |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
393 | } else { |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
394 | if (slash) { |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
395 | jid->domain = g_ascii_strdown(str, slash - str); |
|
28414
5093c1a49d5c
jabber: Use a better method for dealing with terminating slashes in JIDs.
Paul Aurich <darkrain42@pidgin.im>
parents:
28336
diff
changeset
|
396 | if (*(slash + 1)) |
|
5093c1a49d5c
jabber: Use a better method for dealing with terminating slashes in JIDs.
Paul Aurich <darkrain42@pidgin.im>
parents:
28336
diff
changeset
|
397 | jid->resource = g_strdup(slash + 1); |
|
27713
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
398 | } else { |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
399 | jid->domain = g_ascii_strdown(str, -1); |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
400 | } |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
401 | } |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
402 | return jid; |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
403 | } |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
404 | |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
405 | /* |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
406 | * If we get here, there are some non-ASCII chars in the string, so |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
407 | * we'll need to validate it, normalize, and finally do a full jabber |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
408 | * nodeprep on the jid. |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
409 | */ |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
410 | |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
411 | if (!g_utf8_validate(str, -1, NULL)) |
| 7014 | 412 | return NULL; |
| 2086 | 413 | |
|
27849
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
414 | #ifdef USE_IDN |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
415 | return jabber_idn_validate(str, at, slash, c /* points to the null */); |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
416 | #else /* USE_IDN */ |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
417 | |
| 7014 | 418 | jid = g_new0(JabberID, 1); |
| 419 | ||
|
27713
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
420 | /* normalization */ |
| 7014 | 421 | if(at) { |
|
27849
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
422 | node = g_utf8_casefold(str, at-str); |
| 7014 | 423 | if(slash) { |
|
27849
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
424 | domain = g_utf8_casefold(at+1, slash-(at+1)); |
|
28414
5093c1a49d5c
jabber: Use a better method for dealing with terminating slashes in JIDs.
Paul Aurich <darkrain42@pidgin.im>
parents:
28336
diff
changeset
|
425 | if (*(slash + 1)) |
|
5093c1a49d5c
jabber: Use a better method for dealing with terminating slashes in JIDs.
Paul Aurich <darkrain42@pidgin.im>
parents:
28336
diff
changeset
|
426 | jid->resource = g_utf8_normalize(slash+1, -1, G_NORMALIZE_NFKC); |
| 7014 | 427 | } else { |
|
27849
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
428 | domain = g_utf8_casefold(at+1, -1); |
| 7014 | 429 | } |
| 430 | } else { | |
| 431 | if(slash) { | |
|
27849
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
432 | domain = g_utf8_casefold(str, slash-str); |
|
28414
5093c1a49d5c
jabber: Use a better method for dealing with terminating slashes in JIDs.
Paul Aurich <darkrain42@pidgin.im>
parents:
28336
diff
changeset
|
433 | if (*(slash + 1)) |
|
5093c1a49d5c
jabber: Use a better method for dealing with terminating slashes in JIDs.
Paul Aurich <darkrain42@pidgin.im>
parents:
28336
diff
changeset
|
434 | jid->resource = g_utf8_normalize(slash+1, -1, G_NORMALIZE_NFKC); |
| 7014 | 435 | } else { |
|
27849
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
436 | domain = g_utf8_casefold(str, -1); |
| 7306 | 437 | } |
| 438 | } | |
| 439 | ||
|
27130
9cb09f3df8c7
jabber_id_new() needs to be case-folding the node and domain.
Paul Aurich <darkrain42@pidgin.im>
parents:
25110
diff
changeset
|
440 | if (node) { |
|
27819
48b1ba24def3
For JIDs, do strdown before normalization.
Paul Aurich <darkrain42@pidgin.im>
parents:
27731
diff
changeset
|
441 | jid->node = g_utf8_normalize(node, -1, G_NORMALIZE_NFKC); |
|
27130
9cb09f3df8c7
jabber_id_new() needs to be case-folding the node and domain.
Paul Aurich <darkrain42@pidgin.im>
parents:
25110
diff
changeset
|
442 | g_free(node); |
|
9cb09f3df8c7
jabber_id_new() needs to be case-folding the node and domain.
Paul Aurich <darkrain42@pidgin.im>
parents:
25110
diff
changeset
|
443 | } |
|
9cb09f3df8c7
jabber_id_new() needs to be case-folding the node and domain.
Paul Aurich <darkrain42@pidgin.im>
parents:
25110
diff
changeset
|
444 | |
|
9cb09f3df8c7
jabber_id_new() needs to be case-folding the node and domain.
Paul Aurich <darkrain42@pidgin.im>
parents:
25110
diff
changeset
|
445 | if (domain) { |
|
27819
48b1ba24def3
For JIDs, do strdown before normalization.
Paul Aurich <darkrain42@pidgin.im>
parents:
27731
diff
changeset
|
446 | jid->domain = g_utf8_normalize(domain, -1, G_NORMALIZE_NFKC); |
|
27130
9cb09f3df8c7
jabber_id_new() needs to be case-folding the node and domain.
Paul Aurich <darkrain42@pidgin.im>
parents:
25110
diff
changeset
|
447 | g_free(domain); |
|
9cb09f3df8c7
jabber_id_new() needs to be case-folding the node and domain.
Paul Aurich <darkrain42@pidgin.im>
parents:
25110
diff
changeset
|
448 | } |
| 7306 | 449 | |
|
27713
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
450 | /* and finally the jabber nodeprep */ |
| 7310 | 451 | if(!jabber_nodeprep_validate(jid->node) || |
|
27728
03b2a20ba465
Validate IPv6 identifiers in the domain portion of a JID.
Paul Aurich <darkrain42@pidgin.im>
parents:
27723
diff
changeset
|
452 | !jabber_domain_validate(jid->domain) || |
| 7310 | 453 | !jabber_resourceprep_validate(jid->resource)) { |
| 7306 | 454 | jabber_id_free(jid); |
| 455 | return NULL; | |
| 456 | } | |
| 457 | ||
| 7014 | 458 | return jid; |
|
27849
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
459 | #endif /* USE_IDN */ |
| 2086 | 460 | } |
| 461 | ||
| 7014 | 462 | void |
| 463 | jabber_id_free(JabberID *jid) | |
| 2086 | 464 | { |
| 7014 | 465 | if(jid) { |
| 466 | if(jid->node) | |
| 467 | g_free(jid->node); | |
| 468 | if(jid->domain) | |
| 469 | g_free(jid->domain); | |
| 470 | if(jid->resource) | |
| 471 | g_free(jid->resource); | |
| 472 | g_free(jid); | |
| 473 | } | |
| 2086 | 474 | } |
| 475 | ||
| 7014 | 476 | |
| 7306 | 477 | char *jabber_get_resource(const char *in) |
| 7014 | 478 | { |
| 7306 | 479 | JabberID *jid = jabber_id_new(in); |
| 480 | char *out; | |
| 7014 | 481 | |
| 7306 | 482 | if(!jid) |
| 7014 | 483 | return NULL; |
| 7306 | 484 | |
| 485 | out = g_strdup(jid->resource); | |
| 486 | jabber_id_free(jid); | |
| 487 | ||
| 488 | return out; | |
| 7014 | 489 | } |
| 490 | ||
|
28431
8450418b5abd
jabber: Properly handle adding buddies that contain a resource. Closes #10151.
Paul Aurich <darkrain42@pidgin.im>
parents:
28414
diff
changeset
|
491 | char * |
|
8450418b5abd
jabber: Properly handle adding buddies that contain a resource. Closes #10151.
Paul Aurich <darkrain42@pidgin.im>
parents:
28414
diff
changeset
|
492 | jabber_get_bare_jid(const char *in) |
| 7014 | 493 | { |
| 7306 | 494 | JabberID *jid = jabber_id_new(in); |
| 495 | char *out; | |
| 7014 | 496 | |
|
28431
8450418b5abd
jabber: Properly handle adding buddies that contain a resource. Closes #10151.
Paul Aurich <darkrain42@pidgin.im>
parents:
28414
diff
changeset
|
497 | if (!jid) |
| 7306 | 498 | return NULL; |
|
28431
8450418b5abd
jabber: Properly handle adding buddies that contain a resource. Closes #10151.
Paul Aurich <darkrain42@pidgin.im>
parents:
28414
diff
changeset
|
499 | out = jabber_id_get_bare_jid(jid); |
| 7306 | 500 | jabber_id_free(jid); |
| 501 | ||
| 502 | return out; | |
| 7014 | 503 | } |
| 7261 | 504 | |
|
28431
8450418b5abd
jabber: Properly handle adding buddies that contain a resource. Closes #10151.
Paul Aurich <darkrain42@pidgin.im>
parents:
28414
diff
changeset
|
505 | char * |
|
8450418b5abd
jabber: Properly handle adding buddies that contain a resource. Closes #10151.
Paul Aurich <darkrain42@pidgin.im>
parents:
28414
diff
changeset
|
506 | jabber_id_get_bare_jid(const JabberID *jid) |
|
8450418b5abd
jabber: Properly handle adding buddies that contain a resource. Closes #10151.
Paul Aurich <darkrain42@pidgin.im>
parents:
28414
diff
changeset
|
507 | { |
|
8450418b5abd
jabber: Properly handle adding buddies that contain a resource. Closes #10151.
Paul Aurich <darkrain42@pidgin.im>
parents:
28414
diff
changeset
|
508 | g_return_val_if_fail(jid != NULL, NULL); |
|
8450418b5abd
jabber: Properly handle adding buddies that contain a resource. Closes #10151.
Paul Aurich <darkrain42@pidgin.im>
parents:
28414
diff
changeset
|
509 | |
|
8450418b5abd
jabber: Properly handle adding buddies that contain a resource. Closes #10151.
Paul Aurich <darkrain42@pidgin.im>
parents:
28414
diff
changeset
|
510 | return g_strconcat(jid->node ? jid->node : "", |
|
8450418b5abd
jabber: Properly handle adding buddies that contain a resource. Closes #10151.
Paul Aurich <darkrain42@pidgin.im>
parents:
28414
diff
changeset
|
511 | jid->node ? "@" : "", |
|
8450418b5abd
jabber: Properly handle adding buddies that contain a resource. Closes #10151.
Paul Aurich <darkrain42@pidgin.im>
parents:
28414
diff
changeset
|
512 | jid->domain, |
|
8450418b5abd
jabber: Properly handle adding buddies that contain a resource. Closes #10151.
Paul Aurich <darkrain42@pidgin.im>
parents:
28414
diff
changeset
|
513 | NULL); |
|
8450418b5abd
jabber: Properly handle adding buddies that contain a resource. Closes #10151.
Paul Aurich <darkrain42@pidgin.im>
parents:
28414
diff
changeset
|
514 | } |
|
8450418b5abd
jabber: Properly handle adding buddies that contain a resource. Closes #10151.
Paul Aurich <darkrain42@pidgin.im>
parents:
28414
diff
changeset
|
515 | |
|
28414
5093c1a49d5c
jabber: Use a better method for dealing with terminating slashes in JIDs.
Paul Aurich <darkrain42@pidgin.im>
parents:
28336
diff
changeset
|
516 | JabberID * |
|
5093c1a49d5c
jabber: Use a better method for dealing with terminating slashes in JIDs.
Paul Aurich <darkrain42@pidgin.im>
parents:
28336
diff
changeset
|
517 | jabber_id_new(const char *str) |
|
5093c1a49d5c
jabber: Use a better method for dealing with terminating slashes in JIDs.
Paul Aurich <darkrain42@pidgin.im>
parents:
28336
diff
changeset
|
518 | { |
|
5093c1a49d5c
jabber: Use a better method for dealing with terminating slashes in JIDs.
Paul Aurich <darkrain42@pidgin.im>
parents:
28336
diff
changeset
|
519 | return jabber_id_new_internal(str, FALSE); |
|
5093c1a49d5c
jabber: Use a better method for dealing with terminating slashes in JIDs.
Paul Aurich <darkrain42@pidgin.im>
parents:
28336
diff
changeset
|
520 | } |
|
5093c1a49d5c
jabber: Use a better method for dealing with terminating slashes in JIDs.
Paul Aurich <darkrain42@pidgin.im>
parents:
28336
diff
changeset
|
521 | |
| 15884 | 522 | const char *jabber_normalize(const PurpleAccount *account, const char *in) |
| 7261 | 523 | { |
| 15884 | 524 | PurpleConnection *gc = account ? account->gc : NULL; |
| 7322 | 525 | JabberStream *js = gc ? gc->proto_data : NULL; |
| 526 | static char buf[3072]; /* maximum legal length of a jabber jid */ | |
| 527 | JabberID *jid; | |
| 7261 | 528 | |
|
28414
5093c1a49d5c
jabber: Use a better method for dealing with terminating slashes in JIDs.
Paul Aurich <darkrain42@pidgin.im>
parents:
28336
diff
changeset
|
529 | jid = jabber_id_new_internal(in, TRUE); |
| 7322 | 530 | if(!jid) |
| 7310 | 531 | return NULL; |
| 532 | ||
|
27130
9cb09f3df8c7
jabber_id_new() needs to be case-folding the node and domain.
Paul Aurich <darkrain42@pidgin.im>
parents:
25110
diff
changeset
|
533 | if(js && jid->node && jid->resource && |
|
9cb09f3df8c7
jabber_id_new() needs to be case-folding the node and domain.
Paul Aurich <darkrain42@pidgin.im>
parents:
25110
diff
changeset
|
534 | jabber_chat_find(js, jid->node, jid->domain)) |
|
9cb09f3df8c7
jabber_id_new() needs to be case-folding the node and domain.
Paul Aurich <darkrain42@pidgin.im>
parents:
25110
diff
changeset
|
535 | g_snprintf(buf, sizeof(buf), "%s@%s/%s", jid->node, jid->domain, |
| 7322 | 536 | jid->resource); |
| 537 | else | |
|
27130
9cb09f3df8c7
jabber_id_new() needs to be case-folding the node and domain.
Paul Aurich <darkrain42@pidgin.im>
parents:
25110
diff
changeset
|
538 | g_snprintf(buf, sizeof(buf), "%s%s%s", jid->node ? jid->node : "", |
|
9cb09f3df8c7
jabber_id_new() needs to be case-folding the node and domain.
Paul Aurich <darkrain42@pidgin.im>
parents:
25110
diff
changeset
|
539 | jid->node ? "@" : "", jid->domain); |
| 7322 | 540 | |
| 7429 | 541 | jabber_id_free(jid); |
| 542 | ||
| 7261 | 543 | return buf; |
| 544 | } | |
| 7306 | 545 | |
|
27163
398d47149e2f
Add two helper functions useful for matching the 'from' attribute on packets to either our server or our account.
Paul Aurich <darkrain42@pidgin.im>
parents:
27130
diff
changeset
|
546 | gboolean |
|
398d47149e2f
Add two helper functions useful for matching the 'from' attribute on packets to either our server or our account.
Paul Aurich <darkrain42@pidgin.im>
parents:
27130
diff
changeset
|
547 | jabber_is_own_server(JabberStream *js, const char *str) |
|
398d47149e2f
Add two helper functions useful for matching the 'from' attribute on packets to either our server or our account.
Paul Aurich <darkrain42@pidgin.im>
parents:
27130
diff
changeset
|
548 | { |
|
398d47149e2f
Add two helper functions useful for matching the 'from' attribute on packets to either our server or our account.
Paul Aurich <darkrain42@pidgin.im>
parents:
27130
diff
changeset
|
549 | JabberID *jid; |
|
398d47149e2f
Add two helper functions useful for matching the 'from' attribute on packets to either our server or our account.
Paul Aurich <darkrain42@pidgin.im>
parents:
27130
diff
changeset
|
550 | gboolean equal; |
|
398d47149e2f
Add two helper functions useful for matching the 'from' attribute on packets to either our server or our account.
Paul Aurich <darkrain42@pidgin.im>
parents:
27130
diff
changeset
|
551 | |
|
398d47149e2f
Add two helper functions useful for matching the 'from' attribute on packets to either our server or our account.
Paul Aurich <darkrain42@pidgin.im>
parents:
27130
diff
changeset
|
552 | if (str == NULL) |
|
398d47149e2f
Add two helper functions useful for matching the 'from' attribute on packets to either our server or our account.
Paul Aurich <darkrain42@pidgin.im>
parents:
27130
diff
changeset
|
553 | return FALSE; |
|
398d47149e2f
Add two helper functions useful for matching the 'from' attribute on packets to either our server or our account.
Paul Aurich <darkrain42@pidgin.im>
parents:
27130
diff
changeset
|
554 | |
|
398d47149e2f
Add two helper functions useful for matching the 'from' attribute on packets to either our server or our account.
Paul Aurich <darkrain42@pidgin.im>
parents:
27130
diff
changeset
|
555 | g_return_val_if_fail(*str != '\0', FALSE); |
|
398d47149e2f
Add two helper functions useful for matching the 'from' attribute on packets to either our server or our account.
Paul Aurich <darkrain42@pidgin.im>
parents:
27130
diff
changeset
|
556 | |
|
398d47149e2f
Add two helper functions useful for matching the 'from' attribute on packets to either our server or our account.
Paul Aurich <darkrain42@pidgin.im>
parents:
27130
diff
changeset
|
557 | jid = jabber_id_new(str); |
|
398d47149e2f
Add two helper functions useful for matching the 'from' attribute on packets to either our server or our account.
Paul Aurich <darkrain42@pidgin.im>
parents:
27130
diff
changeset
|
558 | if (!jid) |
|
398d47149e2f
Add two helper functions useful for matching the 'from' attribute on packets to either our server or our account.
Paul Aurich <darkrain42@pidgin.im>
parents:
27130
diff
changeset
|
559 | return FALSE; |
|
398d47149e2f
Add two helper functions useful for matching the 'from' attribute on packets to either our server or our account.
Paul Aurich <darkrain42@pidgin.im>
parents:
27130
diff
changeset
|
560 | |
|
398d47149e2f
Add two helper functions useful for matching the 'from' attribute on packets to either our server or our account.
Paul Aurich <darkrain42@pidgin.im>
parents:
27130
diff
changeset
|
561 | equal = (jid->node == NULL && |
|
398d47149e2f
Add two helper functions useful for matching the 'from' attribute on packets to either our server or our account.
Paul Aurich <darkrain42@pidgin.im>
parents:
27130
diff
changeset
|
562 | g_str_equal(jid->domain, js->user->domain) && |
|
398d47149e2f
Add two helper functions useful for matching the 'from' attribute on packets to either our server or our account.
Paul Aurich <darkrain42@pidgin.im>
parents:
27130
diff
changeset
|
563 | jid->resource == NULL); |
|
398d47149e2f
Add two helper functions useful for matching the 'from' attribute on packets to either our server or our account.
Paul Aurich <darkrain42@pidgin.im>
parents:
27130
diff
changeset
|
564 | jabber_id_free(jid); |
|
398d47149e2f
Add two helper functions useful for matching the 'from' attribute on packets to either our server or our account.
Paul Aurich <darkrain42@pidgin.im>
parents:
27130
diff
changeset
|
565 | return equal; |
|
398d47149e2f
Add two helper functions useful for matching the 'from' attribute on packets to either our server or our account.
Paul Aurich <darkrain42@pidgin.im>
parents:
27130
diff
changeset
|
566 | } |
|
398d47149e2f
Add two helper functions useful for matching the 'from' attribute on packets to either our server or our account.
Paul Aurich <darkrain42@pidgin.im>
parents:
27130
diff
changeset
|
567 | |
|
398d47149e2f
Add two helper functions useful for matching the 'from' attribute on packets to either our server or our account.
Paul Aurich <darkrain42@pidgin.im>
parents:
27130
diff
changeset
|
568 | gboolean |
|
398d47149e2f
Add two helper functions useful for matching the 'from' attribute on packets to either our server or our account.
Paul Aurich <darkrain42@pidgin.im>
parents:
27130
diff
changeset
|
569 | jabber_is_own_account(JabberStream *js, const char *str) |
|
398d47149e2f
Add two helper functions useful for matching the 'from' attribute on packets to either our server or our account.
Paul Aurich <darkrain42@pidgin.im>
parents:
27130
diff
changeset
|
570 | { |
|
398d47149e2f
Add two helper functions useful for matching the 'from' attribute on packets to either our server or our account.
Paul Aurich <darkrain42@pidgin.im>
parents:
27130
diff
changeset
|
571 | JabberID *jid; |
|
398d47149e2f
Add two helper functions useful for matching the 'from' attribute on packets to either our server or our account.
Paul Aurich <darkrain42@pidgin.im>
parents:
27130
diff
changeset
|
572 | gboolean equal; |
|
398d47149e2f
Add two helper functions useful for matching the 'from' attribute on packets to either our server or our account.
Paul Aurich <darkrain42@pidgin.im>
parents:
27130
diff
changeset
|
573 | |
|
398d47149e2f
Add two helper functions useful for matching the 'from' attribute on packets to either our server or our account.
Paul Aurich <darkrain42@pidgin.im>
parents:
27130
diff
changeset
|
574 | if (str == NULL) |
|
398d47149e2f
Add two helper functions useful for matching the 'from' attribute on packets to either our server or our account.
Paul Aurich <darkrain42@pidgin.im>
parents:
27130
diff
changeset
|
575 | return TRUE; |
|
398d47149e2f
Add two helper functions useful for matching the 'from' attribute on packets to either our server or our account.
Paul Aurich <darkrain42@pidgin.im>
parents:
27130
diff
changeset
|
576 | |
|
398d47149e2f
Add two helper functions useful for matching the 'from' attribute on packets to either our server or our account.
Paul Aurich <darkrain42@pidgin.im>
parents:
27130
diff
changeset
|
577 | g_return_val_if_fail(*str != '\0', FALSE); |
|
398d47149e2f
Add two helper functions useful for matching the 'from' attribute on packets to either our server or our account.
Paul Aurich <darkrain42@pidgin.im>
parents:
27130
diff
changeset
|
578 | |
|
398d47149e2f
Add two helper functions useful for matching the 'from' attribute on packets to either our server or our account.
Paul Aurich <darkrain42@pidgin.im>
parents:
27130
diff
changeset
|
579 | jid = jabber_id_new(str); |
|
398d47149e2f
Add two helper functions useful for matching the 'from' attribute on packets to either our server or our account.
Paul Aurich <darkrain42@pidgin.im>
parents:
27130
diff
changeset
|
580 | if (!jid) |
|
398d47149e2f
Add two helper functions useful for matching the 'from' attribute on packets to either our server or our account.
Paul Aurich <darkrain42@pidgin.im>
parents:
27130
diff
changeset
|
581 | return FALSE; |
|
398d47149e2f
Add two helper functions useful for matching the 'from' attribute on packets to either our server or our account.
Paul Aurich <darkrain42@pidgin.im>
parents:
27130
diff
changeset
|
582 | |
|
27191
09b3a16e7330
Allow incoming stanzas to match 'our account' if they come from our resource.
Paul Aurich <darkrain42@pidgin.im>
parents:
27163
diff
changeset
|
583 | equal = (purple_strequal(jid->node, js->user->node) && |
|
27163
398d47149e2f
Add two helper functions useful for matching the 'from' attribute on packets to either our server or our account.
Paul Aurich <darkrain42@pidgin.im>
parents:
27130
diff
changeset
|
584 | g_str_equal(jid->domain, js->user->domain) && |
|
27191
09b3a16e7330
Allow incoming stanzas to match 'our account' if they come from our resource.
Paul Aurich <darkrain42@pidgin.im>
parents:
27163
diff
changeset
|
585 | (jid->resource == NULL || |
|
09b3a16e7330
Allow incoming stanzas to match 'our account' if they come from our resource.
Paul Aurich <darkrain42@pidgin.im>
parents:
27163
diff
changeset
|
586 | g_str_equal(jid->resource, js->user->resource))); |
|
27163
398d47149e2f
Add two helper functions useful for matching the 'from' attribute on packets to either our server or our account.
Paul Aurich <darkrain42@pidgin.im>
parents:
27130
diff
changeset
|
587 | jabber_id_free(jid); |
|
398d47149e2f
Add two helper functions useful for matching the 'from' attribute on packets to either our server or our account.
Paul Aurich <darkrain42@pidgin.im>
parents:
27130
diff
changeset
|
588 | return equal; |
|
398d47149e2f
Add two helper functions useful for matching the 'from' attribute on packets to either our server or our account.
Paul Aurich <darkrain42@pidgin.im>
parents:
27130
diff
changeset
|
589 | } |
|
398d47149e2f
Add two helper functions useful for matching the 'from' attribute on packets to either our server or our account.
Paul Aurich <darkrain42@pidgin.im>
parents:
27130
diff
changeset
|
590 | |
| 15884 | 591 | PurpleConversation * |
| 592 | jabber_find_unnormalized_conv(const char *name, PurpleAccount *account) | |
| 8043 | 593 | { |
| 15884 | 594 | PurpleConversation *c = NULL; |
| 8043 | 595 | GList *cnv; |
| 596 | ||
| 597 | g_return_val_if_fail(name != NULL, NULL); | |
| 598 | ||
| 15884 | 599 | for(cnv = purple_get_conversations(); cnv; cnv = cnv->next) { |
| 600 | c = (PurpleConversation*)cnv->data; | |
| 601 | if(purple_conversation_get_type(c) == PURPLE_CONV_TYPE_IM && | |
| 602 | !purple_utf8_strcasecmp(name, purple_conversation_get_name(c)) && | |
| 603 | account == purple_conversation_get_account(c)) | |
| 8043 | 604 | return c; |
| 605 | } | |
| 606 | ||
| 607 | return NULL; | |
| 608 | } | |
| 8401 | 609 | |
|
25110
40b3fffdb00b
Fix up the XMPP User Avatar SHA1 hashing so that we don't mess up the checksum
Paul Aurich <darkrain42@pidgin.im>
parents:
19859
diff
changeset
|
610 | /* The same as purple_util_get_image_checksum, but guaranteed to remain SHA1 */ |
|
40b3fffdb00b
Fix up the XMPP User Avatar SHA1 hashing so that we don't mess up the checksum
Paul Aurich <darkrain42@pidgin.im>
parents:
19859
diff
changeset
|
611 | char * |
|
40b3fffdb00b
Fix up the XMPP User Avatar SHA1 hashing so that we don't mess up the checksum
Paul Aurich <darkrain42@pidgin.im>
parents:
19859
diff
changeset
|
612 | jabber_calculate_data_sha1sum(gconstpointer data, size_t len) |
|
40b3fffdb00b
Fix up the XMPP User Avatar SHA1 hashing so that we don't mess up the checksum
Paul Aurich <darkrain42@pidgin.im>
parents:
19859
diff
changeset
|
613 | { |
|
40b3fffdb00b
Fix up the XMPP User Avatar SHA1 hashing so that we don't mess up the checksum
Paul Aurich <darkrain42@pidgin.im>
parents:
19859
diff
changeset
|
614 | PurpleCipherContext *context; |
|
40b3fffdb00b
Fix up the XMPP User Avatar SHA1 hashing so that we don't mess up the checksum
Paul Aurich <darkrain42@pidgin.im>
parents:
19859
diff
changeset
|
615 | static gchar digest[41]; |
|
40b3fffdb00b
Fix up the XMPP User Avatar SHA1 hashing so that we don't mess up the checksum
Paul Aurich <darkrain42@pidgin.im>
parents:
19859
diff
changeset
|
616 | |
|
40b3fffdb00b
Fix up the XMPP User Avatar SHA1 hashing so that we don't mess up the checksum
Paul Aurich <darkrain42@pidgin.im>
parents:
19859
diff
changeset
|
617 | context = purple_cipher_context_new_by_name("sha1", NULL); |
|
40b3fffdb00b
Fix up the XMPP User Avatar SHA1 hashing so that we don't mess up the checksum
Paul Aurich <darkrain42@pidgin.im>
parents:
19859
diff
changeset
|
618 | if (context == NULL) |
|
40b3fffdb00b
Fix up the XMPP User Avatar SHA1 hashing so that we don't mess up the checksum
Paul Aurich <darkrain42@pidgin.im>
parents:
19859
diff
changeset
|
619 | { |
|
40b3fffdb00b
Fix up the XMPP User Avatar SHA1 hashing so that we don't mess up the checksum
Paul Aurich <darkrain42@pidgin.im>
parents:
19859
diff
changeset
|
620 | purple_debug_error("jabber", "Could not find sha1 cipher\n"); |
|
40b3fffdb00b
Fix up the XMPP User Avatar SHA1 hashing so that we don't mess up the checksum
Paul Aurich <darkrain42@pidgin.im>
parents:
19859
diff
changeset
|
621 | g_return_val_if_reached(NULL); |
|
40b3fffdb00b
Fix up the XMPP User Avatar SHA1 hashing so that we don't mess up the checksum
Paul Aurich <darkrain42@pidgin.im>
parents:
19859
diff
changeset
|
622 | } |
|
40b3fffdb00b
Fix up the XMPP User Avatar SHA1 hashing so that we don't mess up the checksum
Paul Aurich <darkrain42@pidgin.im>
parents:
19859
diff
changeset
|
623 | |
|
40b3fffdb00b
Fix up the XMPP User Avatar SHA1 hashing so that we don't mess up the checksum
Paul Aurich <darkrain42@pidgin.im>
parents:
19859
diff
changeset
|
624 | /* Hash the data */ |
|
40b3fffdb00b
Fix up the XMPP User Avatar SHA1 hashing so that we don't mess up the checksum
Paul Aurich <darkrain42@pidgin.im>
parents:
19859
diff
changeset
|
625 | purple_cipher_context_append(context, data, len); |
|
40b3fffdb00b
Fix up the XMPP User Avatar SHA1 hashing so that we don't mess up the checksum
Paul Aurich <darkrain42@pidgin.im>
parents:
19859
diff
changeset
|
626 | if (!purple_cipher_context_digest_to_str(context, sizeof(digest), digest, NULL)) |
|
40b3fffdb00b
Fix up the XMPP User Avatar SHA1 hashing so that we don't mess up the checksum
Paul Aurich <darkrain42@pidgin.im>
parents:
19859
diff
changeset
|
627 | { |
|
40b3fffdb00b
Fix up the XMPP User Avatar SHA1 hashing so that we don't mess up the checksum
Paul Aurich <darkrain42@pidgin.im>
parents:
19859
diff
changeset
|
628 | purple_debug_error("jabber", "Failed to get SHA-1 digest.\n"); |
|
40b3fffdb00b
Fix up the XMPP User Avatar SHA1 hashing so that we don't mess up the checksum
Paul Aurich <darkrain42@pidgin.im>
parents:
19859
diff
changeset
|
629 | g_return_val_if_reached(NULL); |
|
40b3fffdb00b
Fix up the XMPP User Avatar SHA1 hashing so that we don't mess up the checksum
Paul Aurich <darkrain42@pidgin.im>
parents:
19859
diff
changeset
|
630 | } |
|
40b3fffdb00b
Fix up the XMPP User Avatar SHA1 hashing so that we don't mess up the checksum
Paul Aurich <darkrain42@pidgin.im>
parents:
19859
diff
changeset
|
631 | purple_cipher_context_destroy(context); |
|
40b3fffdb00b
Fix up the XMPP User Avatar SHA1 hashing so that we don't mess up the checksum
Paul Aurich <darkrain42@pidgin.im>
parents:
19859
diff
changeset
|
632 | |
|
40b3fffdb00b
Fix up the XMPP User Avatar SHA1 hashing so that we don't mess up the checksum
Paul Aurich <darkrain42@pidgin.im>
parents:
19859
diff
changeset
|
633 | return g_strdup(digest); |
|
40b3fffdb00b
Fix up the XMPP User Avatar SHA1 hashing so that we don't mess up the checksum
Paul Aurich <darkrain42@pidgin.im>
parents:
19859
diff
changeset
|
634 | } |
|
40b3fffdb00b
Fix up the XMPP User Avatar SHA1 hashing so that we don't mess up the checksum
Paul Aurich <darkrain42@pidgin.im>
parents:
19859
diff
changeset
|
635 |