Thu, 10 Dec 2009 03:15:26 +0000
jabber: Fix removing a self-contact.
Need to check for subscription="remove" before checking if it's a self-contact.
| 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 | ||
|
29027
6af29b140195
jabber: Add SASLprep and the username substitution called for in draft-ietf-sasl-scram-10 5.1.
Paul Aurich <darkrain42@pidgin.im>
parents:
28535
diff
changeset
|
279 | char *jabber_saslprep(const char *in) |
|
6af29b140195
jabber: Add SASLprep and the username substitution called for in draft-ietf-sasl-scram-10 5.1.
Paul Aurich <darkrain42@pidgin.im>
parents:
28535
diff
changeset
|
280 | { |
|
6af29b140195
jabber: Add SASLprep and the username substitution called for in draft-ietf-sasl-scram-10 5.1.
Paul Aurich <darkrain42@pidgin.im>
parents:
28535
diff
changeset
|
281 | #ifdef USE_IDN |
|
6af29b140195
jabber: Add SASLprep and the username substitution called for in draft-ietf-sasl-scram-10 5.1.
Paul Aurich <darkrain42@pidgin.im>
parents:
28535
diff
changeset
|
282 | char *out; |
|
6af29b140195
jabber: Add SASLprep and the username substitution called for in draft-ietf-sasl-scram-10 5.1.
Paul Aurich <darkrain42@pidgin.im>
parents:
28535
diff
changeset
|
283 | |
|
6af29b140195
jabber: Add SASLprep and the username substitution called for in draft-ietf-sasl-scram-10 5.1.
Paul Aurich <darkrain42@pidgin.im>
parents:
28535
diff
changeset
|
284 | g_return_val_if_fail(in != NULL, NULL); |
|
6af29b140195
jabber: Add SASLprep and the username substitution called for in draft-ietf-sasl-scram-10 5.1.
Paul Aurich <darkrain42@pidgin.im>
parents:
28535
diff
changeset
|
285 | g_return_val_if_fail(strlen(in) <= sizeof(idn_buffer) - 1, NULL); |
|
6af29b140195
jabber: Add SASLprep and the username substitution called for in draft-ietf-sasl-scram-10 5.1.
Paul Aurich <darkrain42@pidgin.im>
parents:
28535
diff
changeset
|
286 | |
|
6af29b140195
jabber: Add SASLprep and the username substitution called for in draft-ietf-sasl-scram-10 5.1.
Paul Aurich <darkrain42@pidgin.im>
parents:
28535
diff
changeset
|
287 | strncpy(idn_buffer, in, sizeof(idn_buffer) - 1); |
|
6af29b140195
jabber: Add SASLprep and the username substitution called for in draft-ietf-sasl-scram-10 5.1.
Paul Aurich <darkrain42@pidgin.im>
parents:
28535
diff
changeset
|
288 | idn_buffer[sizeof(idn_buffer) - 1] = '\0'; |
|
6af29b140195
jabber: Add SASLprep and the username substitution called for in draft-ietf-sasl-scram-10 5.1.
Paul Aurich <darkrain42@pidgin.im>
parents:
28535
diff
changeset
|
289 | |
|
6af29b140195
jabber: Add SASLprep and the username substitution called for in draft-ietf-sasl-scram-10 5.1.
Paul Aurich <darkrain42@pidgin.im>
parents:
28535
diff
changeset
|
290 | if (STRINGPREP_OK != stringprep(idn_buffer, sizeof(idn_buffer), 0, |
|
6af29b140195
jabber: Add SASLprep and the username substitution called for in draft-ietf-sasl-scram-10 5.1.
Paul Aurich <darkrain42@pidgin.im>
parents:
28535
diff
changeset
|
291 | stringprep_saslprep)) { |
|
6af29b140195
jabber: Add SASLprep and the username substitution called for in draft-ietf-sasl-scram-10 5.1.
Paul Aurich <darkrain42@pidgin.im>
parents:
28535
diff
changeset
|
292 | memset(idn_buffer, 0, sizeof(idn_buffer)); |
|
6af29b140195
jabber: Add SASLprep and the username substitution called for in draft-ietf-sasl-scram-10 5.1.
Paul Aurich <darkrain42@pidgin.im>
parents:
28535
diff
changeset
|
293 | return NULL; |
|
6af29b140195
jabber: Add SASLprep and the username substitution called for in draft-ietf-sasl-scram-10 5.1.
Paul Aurich <darkrain42@pidgin.im>
parents:
28535
diff
changeset
|
294 | } |
|
6af29b140195
jabber: Add SASLprep and the username substitution called for in draft-ietf-sasl-scram-10 5.1.
Paul Aurich <darkrain42@pidgin.im>
parents:
28535
diff
changeset
|
295 | |
|
6af29b140195
jabber: Add SASLprep and the username substitution called for in draft-ietf-sasl-scram-10 5.1.
Paul Aurich <darkrain42@pidgin.im>
parents:
28535
diff
changeset
|
296 | out = g_strdup(idn_buffer); |
|
6af29b140195
jabber: Add SASLprep and the username substitution called for in draft-ietf-sasl-scram-10 5.1.
Paul Aurich <darkrain42@pidgin.im>
parents:
28535
diff
changeset
|
297 | memset(idn_buffer, 0, sizeof(idn_buffer)); |
|
6af29b140195
jabber: Add SASLprep and the username substitution called for in draft-ietf-sasl-scram-10 5.1.
Paul Aurich <darkrain42@pidgin.im>
parents:
28535
diff
changeset
|
298 | return out; |
|
6af29b140195
jabber: Add SASLprep and the username substitution called for in draft-ietf-sasl-scram-10 5.1.
Paul Aurich <darkrain42@pidgin.im>
parents:
28535
diff
changeset
|
299 | #else /* USE_IDN */ |
|
6af29b140195
jabber: Add SASLprep and the username substitution called for in draft-ietf-sasl-scram-10 5.1.
Paul Aurich <darkrain42@pidgin.im>
parents:
28535
diff
changeset
|
300 | /* TODO: Something better than disallowing all non-ASCII characters */ |
|
6af29b140195
jabber: Add SASLprep and the username substitution called for in draft-ietf-sasl-scram-10 5.1.
Paul Aurich <darkrain42@pidgin.im>
parents:
28535
diff
changeset
|
301 | /* TODO: Is this even correct? */ |
|
6af29b140195
jabber: Add SASLprep and the username substitution called for in draft-ietf-sasl-scram-10 5.1.
Paul Aurich <darkrain42@pidgin.im>
parents:
28535
diff
changeset
|
302 | const guchar *c; |
|
6af29b140195
jabber: Add SASLprep and the username substitution called for in draft-ietf-sasl-scram-10 5.1.
Paul Aurich <darkrain42@pidgin.im>
parents:
28535
diff
changeset
|
303 | |
|
6af29b140195
jabber: Add SASLprep and the username substitution called for in draft-ietf-sasl-scram-10 5.1.
Paul Aurich <darkrain42@pidgin.im>
parents:
28535
diff
changeset
|
304 | c = (const guchar *)in; |
|
6af29b140195
jabber: Add SASLprep and the username substitution called for in draft-ietf-sasl-scram-10 5.1.
Paul Aurich <darkrain42@pidgin.im>
parents:
28535
diff
changeset
|
305 | while (*c) { |
|
6af29b140195
jabber: Add SASLprep and the username substitution called for in draft-ietf-sasl-scram-10 5.1.
Paul Aurich <darkrain42@pidgin.im>
parents:
28535
diff
changeset
|
306 | if (*c > 0x7f || |
|
6af29b140195
jabber: Add SASLprep and the username substitution called for in draft-ietf-sasl-scram-10 5.1.
Paul Aurich <darkrain42@pidgin.im>
parents:
28535
diff
changeset
|
307 | (*c < 0x20 && *c != '\t' && *c != '\n' && *c != '\r')) |
|
6af29b140195
jabber: Add SASLprep and the username substitution called for in draft-ietf-sasl-scram-10 5.1.
Paul Aurich <darkrain42@pidgin.im>
parents:
28535
diff
changeset
|
308 | return NULL; |
|
6af29b140195
jabber: Add SASLprep and the username substitution called for in draft-ietf-sasl-scram-10 5.1.
Paul Aurich <darkrain42@pidgin.im>
parents:
28535
diff
changeset
|
309 | } |
|
6af29b140195
jabber: Add SASLprep and the username substitution called for in draft-ietf-sasl-scram-10 5.1.
Paul Aurich <darkrain42@pidgin.im>
parents:
28535
diff
changeset
|
310 | |
|
6af29b140195
jabber: Add SASLprep and the username substitution called for in draft-ietf-sasl-scram-10 5.1.
Paul Aurich <darkrain42@pidgin.im>
parents:
28535
diff
changeset
|
311 | return g_strdup(in); |
|
6af29b140195
jabber: Add SASLprep and the username substitution called for in draft-ietf-sasl-scram-10 5.1.
Paul Aurich <darkrain42@pidgin.im>
parents:
28535
diff
changeset
|
312 | #endif /* USE_IDN */ |
|
6af29b140195
jabber: Add SASLprep and the username substitution called for in draft-ietf-sasl-scram-10 5.1.
Paul Aurich <darkrain42@pidgin.im>
parents:
28535
diff
changeset
|
313 | } |
|
6af29b140195
jabber: Add SASLprep and the username substitution called for in draft-ietf-sasl-scram-10 5.1.
Paul Aurich <darkrain42@pidgin.im>
parents:
28535
diff
changeset
|
314 | |
|
28414
5093c1a49d5c
jabber: Use a better method for dealing with terminating slashes in JIDs.
Paul Aurich <darkrain42@pidgin.im>
parents:
28336
diff
changeset
|
315 | static JabberID* |
|
5093c1a49d5c
jabber: Use a better method for dealing with terminating slashes in JIDs.
Paul Aurich <darkrain42@pidgin.im>
parents:
28336
diff
changeset
|
316 | jabber_id_new_internal(const char *str, gboolean allow_terminating_slash) |
| 2086 | 317 | { |
|
27713
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
318 | 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
|
319 | 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
|
320 | 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
|
321 | 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
|
322 | #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
|
323 | 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
|
324 | #endif |
|
27849
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
325 | #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
|
326 | 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
|
327 | char *domain; |
|
27849
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
328 | #endif |
| 7014 | 329 | JabberID *jid; |
| 2086 | 330 | |
|
27713
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
331 | 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
|
332 | 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
|
333 | |
|
27714
c86eb4fefae2
Change jabber_id_new() to iterate byte by byte instead of character
Mark Doliner <markdoliner@pidgin.im>
parents:
27713
diff
changeset
|
334 | 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
|
335 | { |
|
27714
c86eb4fefae2
Change jabber_id_new() to iterate byte by byte instead of character
Mark Doliner <markdoliner@pidgin.im>
parents:
27713
diff
changeset
|
336 | 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
|
337 | case '@': |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
338 | 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
|
339 | 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
|
340 | /* 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
|
341 | 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
|
342 | } |
|
27714
c86eb4fefae2
Change jabber_id_new() to iterate byte by byte instead of character
Mark Doliner <markdoliner@pidgin.im>
parents:
27713
diff
changeset
|
343 | 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
|
344 | /* 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
|
345 | 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
|
346 | } |
|
27714
c86eb4fefae2
Change jabber_id_new() to iterate byte by byte instead of character
Mark Doliner <markdoliner@pidgin.im>
parents:
27713
diff
changeset
|
347 | 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
|
348 | /* 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
|
349 | 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
|
350 | } |
|
27714
c86eb4fefae2
Change jabber_id_new() to iterate byte by byte instead of character
Mark Doliner <markdoliner@pidgin.im>
parents:
27713
diff
changeset
|
351 | 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
|
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 | break; |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
354 | |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
355 | case '/': |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
356 | 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
|
357 | 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
|
358 | /* 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
|
359 | 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
|
360 | } |
|
28414
5093c1a49d5c
jabber: Use a better method for dealing with terminating slashes in JIDs.
Paul Aurich <darkrain42@pidgin.im>
parents:
28336
diff
changeset
|
361 | 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
|
362 | /* 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
|
363 | 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
|
364 | } |
|
27714
c86eb4fefae2
Change jabber_id_new() to iterate byte by byte instead of character
Mark Doliner <markdoliner@pidgin.im>
parents:
27713
diff
changeset
|
365 | 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
|
366 | } |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
367 | break; |
|
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 | default: |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
370 | /* characters allowed everywhere */ |
|
27719
cc4aea1fd74c
Of course, these should be >= and <=
Mark Doliner <markdoliner@pidgin.im>
parents:
27714
diff
changeset
|
371 | if ((*c >= 'a' && *c <= 'z') |
|
cc4aea1fd74c
Of course, these should be >= and <=
Mark Doliner <markdoliner@pidgin.im>
parents:
27714
diff
changeset
|
372 | || (*c >= '0' && *c <= '9') |
|
cc4aea1fd74c
Of course, these should be >= and <=
Mark Doliner <markdoliner@pidgin.im>
parents:
27714
diff
changeset
|
373 | || (*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
|
374 | || *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
|
375 | /* 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
|
376 | break; |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
377 | |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
378 | #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
|
379 | 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
|
380 | /* 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
|
381 | 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
|
382 | /* 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
|
383 | break; |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
384 | } |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
385 | |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
386 | /* 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
|
387 | 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
|
388 | /* |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
389 | * 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
|
390 | * 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
|
391 | * 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
|
392 | * 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
|
393 | * 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
|
394 | */ |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
395 | 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
|
396 | break; |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
397 | } |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
398 | #endif |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
399 | |
|
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 | * 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
|
402 | * 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
|
403 | * 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
|
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 | 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
|
406 | break; |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
407 | } |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
408 | } |
|
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 | #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
|
411 | 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
|
412 | /* 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
|
413 | 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
|
414 | #endif |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
415 | |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
416 | 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
|
417 | /* 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
|
418 | 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
|
419 | |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
420 | 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
|
421 | 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
|
422 | 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
|
423 | 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
|
424 | 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
|
425 | 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
|
426 | } else { |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
427 | 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
|
428 | } |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
429 | } else { |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
430 | 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
|
431 | 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
|
432 | 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
|
433 | 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
|
434 | } else { |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
435 | 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
|
436 | } |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
437 | } |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
438 | 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
|
439 | } |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
440 | |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
441 | /* |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
442 | * 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
|
443 | * 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
|
444 | * 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
|
445 | */ |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
446 | |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
447 | if (!g_utf8_validate(str, -1, NULL)) |
| 7014 | 448 | return NULL; |
| 2086 | 449 | |
|
27849
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
450 | #ifdef USE_IDN |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
451 | 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
|
452 | #else /* USE_IDN */ |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
453 | |
| 7014 | 454 | jid = g_new0(JabberID, 1); |
| 455 | ||
|
27713
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
456 | /* normalization */ |
| 7014 | 457 | if(at) { |
|
27849
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
458 | node = g_utf8_casefold(str, at-str); |
| 7014 | 459 | if(slash) { |
|
27849
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
460 | 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
|
461 | 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
|
462 | jid->resource = g_utf8_normalize(slash+1, -1, G_NORMALIZE_NFKC); |
| 7014 | 463 | } else { |
|
27849
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
464 | domain = g_utf8_casefold(at+1, -1); |
| 7014 | 465 | } |
| 466 | } else { | |
| 467 | if(slash) { | |
|
27849
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
468 | 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
|
469 | 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
|
470 | jid->resource = g_utf8_normalize(slash+1, -1, G_NORMALIZE_NFKC); |
| 7014 | 471 | } else { |
|
27849
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
472 | domain = g_utf8_casefold(str, -1); |
| 7306 | 473 | } |
| 474 | } | |
| 475 | ||
|
27130
9cb09f3df8c7
jabber_id_new() needs to be case-folding the node and domain.
Paul Aurich <darkrain42@pidgin.im>
parents:
25110
diff
changeset
|
476 | if (node) { |
|
27819
48b1ba24def3
For JIDs, do strdown before normalization.
Paul Aurich <darkrain42@pidgin.im>
parents:
27731
diff
changeset
|
477 | 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
|
478 | 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
|
479 | } |
|
9cb09f3df8c7
jabber_id_new() needs to be case-folding the node and domain.
Paul Aurich <darkrain42@pidgin.im>
parents:
25110
diff
changeset
|
480 | |
|
9cb09f3df8c7
jabber_id_new() needs to be case-folding the node and domain.
Paul Aurich <darkrain42@pidgin.im>
parents:
25110
diff
changeset
|
481 | if (domain) { |
|
27819
48b1ba24def3
For JIDs, do strdown before normalization.
Paul Aurich <darkrain42@pidgin.im>
parents:
27731
diff
changeset
|
482 | 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
|
483 | 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
|
484 | } |
| 7306 | 485 | |
|
27713
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
486 | /* and finally the jabber nodeprep */ |
| 7310 | 487 | 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
|
488 | !jabber_domain_validate(jid->domain) || |
| 7310 | 489 | !jabber_resourceprep_validate(jid->resource)) { |
| 7306 | 490 | jabber_id_free(jid); |
| 491 | return NULL; | |
| 492 | } | |
| 493 | ||
| 7014 | 494 | return jid; |
|
27849
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
495 | #endif /* USE_IDN */ |
| 2086 | 496 | } |
| 497 | ||
| 7014 | 498 | void |
| 499 | jabber_id_free(JabberID *jid) | |
| 2086 | 500 | { |
| 7014 | 501 | if(jid) { |
| 502 | if(jid->node) | |
| 503 | g_free(jid->node); | |
| 504 | if(jid->domain) | |
| 505 | g_free(jid->domain); | |
| 506 | if(jid->resource) | |
| 507 | g_free(jid->resource); | |
| 508 | g_free(jid); | |
| 509 | } | |
| 2086 | 510 | } |
| 511 | ||
|
29063
f245c5e9e9f3
jabber: When getting info on a "bare" domain JID, interpret the value of "last"
Marcus Lundblad <malu@pidgin.im>
parents:
28535
diff
changeset
|
512 | char *jabber_get_domain(const char *in) |
|
f245c5e9e9f3
jabber: When getting info on a "bare" domain JID, interpret the value of "last"
Marcus Lundblad <malu@pidgin.im>
parents:
28535
diff
changeset
|
513 | { |
|
f245c5e9e9f3
jabber: When getting info on a "bare" domain JID, interpret the value of "last"
Marcus Lundblad <malu@pidgin.im>
parents:
28535
diff
changeset
|
514 | JabberID *jid = jabber_id_new(in); |
|
f245c5e9e9f3
jabber: When getting info on a "bare" domain JID, interpret the value of "last"
Marcus Lundblad <malu@pidgin.im>
parents:
28535
diff
changeset
|
515 | char *out; |
|
f245c5e9e9f3
jabber: When getting info on a "bare" domain JID, interpret the value of "last"
Marcus Lundblad <malu@pidgin.im>
parents:
28535
diff
changeset
|
516 | |
|
f245c5e9e9f3
jabber: When getting info on a "bare" domain JID, interpret the value of "last"
Marcus Lundblad <malu@pidgin.im>
parents:
28535
diff
changeset
|
517 | if (!jid) |
|
f245c5e9e9f3
jabber: When getting info on a "bare" domain JID, interpret the value of "last"
Marcus Lundblad <malu@pidgin.im>
parents:
28535
diff
changeset
|
518 | return NULL; |
|
f245c5e9e9f3
jabber: When getting info on a "bare" domain JID, interpret the value of "last"
Marcus Lundblad <malu@pidgin.im>
parents:
28535
diff
changeset
|
519 | |
|
f245c5e9e9f3
jabber: When getting info on a "bare" domain JID, interpret the value of "last"
Marcus Lundblad <malu@pidgin.im>
parents:
28535
diff
changeset
|
520 | out = g_strdup(jid->domain); |
|
f245c5e9e9f3
jabber: When getting info on a "bare" domain JID, interpret the value of "last"
Marcus Lundblad <malu@pidgin.im>
parents:
28535
diff
changeset
|
521 | jabber_id_free(jid); |
|
f245c5e9e9f3
jabber: When getting info on a "bare" domain JID, interpret the value of "last"
Marcus Lundblad <malu@pidgin.im>
parents:
28535
diff
changeset
|
522 | |
|
f245c5e9e9f3
jabber: When getting info on a "bare" domain JID, interpret the value of "last"
Marcus Lundblad <malu@pidgin.im>
parents:
28535
diff
changeset
|
523 | return out; |
|
f245c5e9e9f3
jabber: When getting info on a "bare" domain JID, interpret the value of "last"
Marcus Lundblad <malu@pidgin.im>
parents:
28535
diff
changeset
|
524 | } |
| 7014 | 525 | |
| 7306 | 526 | char *jabber_get_resource(const char *in) |
| 7014 | 527 | { |
| 7306 | 528 | JabberID *jid = jabber_id_new(in); |
| 529 | char *out; | |
| 7014 | 530 | |
| 7306 | 531 | if(!jid) |
| 7014 | 532 | return NULL; |
| 7306 | 533 | |
| 534 | out = g_strdup(jid->resource); | |
| 535 | jabber_id_free(jid); | |
| 536 | ||
| 537 | return out; | |
| 7014 | 538 | } |
| 539 | ||
|
28431
8450418b5abd
jabber: Properly handle adding buddies that contain a resource. Closes #10151.
Paul Aurich <darkrain42@pidgin.im>
parents:
28414
diff
changeset
|
540 | char * |
|
8450418b5abd
jabber: Properly handle adding buddies that contain a resource. Closes #10151.
Paul Aurich <darkrain42@pidgin.im>
parents:
28414
diff
changeset
|
541 | jabber_get_bare_jid(const char *in) |
| 7014 | 542 | { |
| 7306 | 543 | JabberID *jid = jabber_id_new(in); |
| 544 | char *out; | |
| 7014 | 545 | |
|
28431
8450418b5abd
jabber: Properly handle adding buddies that contain a resource. Closes #10151.
Paul Aurich <darkrain42@pidgin.im>
parents:
28414
diff
changeset
|
546 | if (!jid) |
| 7306 | 547 | return NULL; |
|
28431
8450418b5abd
jabber: Properly handle adding buddies that contain a resource. Closes #10151.
Paul Aurich <darkrain42@pidgin.im>
parents:
28414
diff
changeset
|
548 | out = jabber_id_get_bare_jid(jid); |
| 7306 | 549 | jabber_id_free(jid); |
| 550 | ||
| 551 | return out; | |
| 7014 | 552 | } |
| 7261 | 553 | |
|
28431
8450418b5abd
jabber: Properly handle adding buddies that contain a resource. Closes #10151.
Paul Aurich <darkrain42@pidgin.im>
parents:
28414
diff
changeset
|
554 | char * |
|
8450418b5abd
jabber: Properly handle adding buddies that contain a resource. Closes #10151.
Paul Aurich <darkrain42@pidgin.im>
parents:
28414
diff
changeset
|
555 | 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
|
556 | { |
|
8450418b5abd
jabber: Properly handle adding buddies that contain a resource. Closes #10151.
Paul Aurich <darkrain42@pidgin.im>
parents:
28414
diff
changeset
|
557 | 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
|
558 | |
|
8450418b5abd
jabber: Properly handle adding buddies that contain a resource. Closes #10151.
Paul Aurich <darkrain42@pidgin.im>
parents:
28414
diff
changeset
|
559 | 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
|
560 | jid->node ? "@" : "", |
|
8450418b5abd
jabber: Properly handle adding buddies that contain a resource. Closes #10151.
Paul Aurich <darkrain42@pidgin.im>
parents:
28414
diff
changeset
|
561 | jid->domain, |
|
8450418b5abd
jabber: Properly handle adding buddies that contain a resource. Closes #10151.
Paul Aurich <darkrain42@pidgin.im>
parents:
28414
diff
changeset
|
562 | NULL); |
|
8450418b5abd
jabber: Properly handle adding buddies that contain a resource. Closes #10151.
Paul Aurich <darkrain42@pidgin.im>
parents:
28414
diff
changeset
|
563 | } |
|
8450418b5abd
jabber: Properly handle adding buddies that contain a resource. Closes #10151.
Paul Aurich <darkrain42@pidgin.im>
parents:
28414
diff
changeset
|
564 | |
|
29063
f245c5e9e9f3
jabber: When getting info on a "bare" domain JID, interpret the value of "last"
Marcus Lundblad <malu@pidgin.im>
parents:
28535
diff
changeset
|
565 | gboolean |
|
f245c5e9e9f3
jabber: When getting info on a "bare" domain JID, interpret the value of "last"
Marcus Lundblad <malu@pidgin.im>
parents:
28535
diff
changeset
|
566 | jabber_jid_is_domain(const char *jid) |
|
f245c5e9e9f3
jabber: When getting info on a "bare" domain JID, interpret the value of "last"
Marcus Lundblad <malu@pidgin.im>
parents:
28535
diff
changeset
|
567 | { |
|
29097
0834410aa178
Tighter scoping and slightly less memory usage.
Paul Aurich <darkrain42@pidgin.im>
parents:
29085
diff
changeset
|
568 | const char *c; |
|
29063
f245c5e9e9f3
jabber: When getting info on a "bare" domain JID, interpret the value of "last"
Marcus Lundblad <malu@pidgin.im>
parents:
28535
diff
changeset
|
569 | |
|
29097
0834410aa178
Tighter scoping and slightly less memory usage.
Paul Aurich <darkrain42@pidgin.im>
parents:
29085
diff
changeset
|
570 | for (c = jid; *c; ++c) { |
|
0834410aa178
Tighter scoping and slightly less memory usage.
Paul Aurich <darkrain42@pidgin.im>
parents:
29085
diff
changeset
|
571 | if (*c == '@' || *c == '/') |
|
0834410aa178
Tighter scoping and slightly less memory usage.
Paul Aurich <darkrain42@pidgin.im>
parents:
29085
diff
changeset
|
572 | return FALSE; |
|
0834410aa178
Tighter scoping and slightly less memory usage.
Paul Aurich <darkrain42@pidgin.im>
parents:
29085
diff
changeset
|
573 | } |
|
0834410aa178
Tighter scoping and slightly less memory usage.
Paul Aurich <darkrain42@pidgin.im>
parents:
29085
diff
changeset
|
574 | |
|
0834410aa178
Tighter scoping and slightly less memory usage.
Paul Aurich <darkrain42@pidgin.im>
parents:
29085
diff
changeset
|
575 | return TRUE; |
|
29063
f245c5e9e9f3
jabber: When getting info on a "bare" domain JID, interpret the value of "last"
Marcus Lundblad <malu@pidgin.im>
parents:
28535
diff
changeset
|
576 | } |
|
f245c5e9e9f3
jabber: When getting info on a "bare" domain JID, interpret the value of "last"
Marcus Lundblad <malu@pidgin.im>
parents:
28535
diff
changeset
|
577 | |
|
f245c5e9e9f3
jabber: When getting info on a "bare" domain JID, interpret the value of "last"
Marcus Lundblad <malu@pidgin.im>
parents:
28535
diff
changeset
|
578 | |
|
28414
5093c1a49d5c
jabber: Use a better method for dealing with terminating slashes in JIDs.
Paul Aurich <darkrain42@pidgin.im>
parents:
28336
diff
changeset
|
579 | JabberID * |
|
5093c1a49d5c
jabber: Use a better method for dealing with terminating slashes in JIDs.
Paul Aurich <darkrain42@pidgin.im>
parents:
28336
diff
changeset
|
580 | 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
|
581 | { |
|
5093c1a49d5c
jabber: Use a better method for dealing with terminating slashes in JIDs.
Paul Aurich <darkrain42@pidgin.im>
parents:
28336
diff
changeset
|
582 | 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
|
583 | } |
|
5093c1a49d5c
jabber: Use a better method for dealing with terminating slashes in JIDs.
Paul Aurich <darkrain42@pidgin.im>
parents:
28336
diff
changeset
|
584 | |
| 15884 | 585 | const char *jabber_normalize(const PurpleAccount *account, const char *in) |
| 7261 | 586 | { |
| 15884 | 587 | PurpleConnection *gc = account ? account->gc : NULL; |
| 7322 | 588 | JabberStream *js = gc ? gc->proto_data : NULL; |
| 589 | static char buf[3072]; /* maximum legal length of a jabber jid */ | |
| 590 | JabberID *jid; | |
| 7261 | 591 | |
|
28414
5093c1a49d5c
jabber: Use a better method for dealing with terminating slashes in JIDs.
Paul Aurich <darkrain42@pidgin.im>
parents:
28336
diff
changeset
|
592 | jid = jabber_id_new_internal(in, TRUE); |
| 7322 | 593 | if(!jid) |
| 7310 | 594 | return NULL; |
| 595 | ||
|
27130
9cb09f3df8c7
jabber_id_new() needs to be case-folding the node and domain.
Paul Aurich <darkrain42@pidgin.im>
parents:
25110
diff
changeset
|
596 | 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
|
597 | 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
|
598 | g_snprintf(buf, sizeof(buf), "%s@%s/%s", jid->node, jid->domain, |
| 7322 | 599 | jid->resource); |
| 600 | else | |
|
27130
9cb09f3df8c7
jabber_id_new() needs to be case-folding the node and domain.
Paul Aurich <darkrain42@pidgin.im>
parents:
25110
diff
changeset
|
601 | 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
|
602 | jid->node ? "@" : "", jid->domain); |
| 7322 | 603 | |
| 7429 | 604 | jabber_id_free(jid); |
| 605 | ||
| 7261 | 606 | return buf; |
| 607 | } | |
| 7306 | 608 | |
|
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
|
609 | 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
|
610 | 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
|
611 | { |
|
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
|
612 | 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
|
613 | 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
|
614 | |
|
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
|
615 | 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
|
616 | 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
|
617 | |
|
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
|
618 | 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
|
619 | |
|
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
|
620 | 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
|
621 | 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
|
622 | 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
|
623 | |
|
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
|
624 | 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
|
625 | 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
|
626 | 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
|
627 | 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
|
628 | 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
|
629 | } |
|
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
|
630 | |
|
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
|
631 | 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
|
632 | 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
|
633 | { |
|
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
|
634 | 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
|
635 | 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
|
636 | |
|
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
|
637 | 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
|
638 | 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
|
639 | |
|
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
|
640 | 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
|
641 | |
|
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
|
642 | 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
|
643 | 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
|
644 | 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
|
645 | |
|
27191
09b3a16e7330
Allow incoming stanzas to match 'our account' if they come from our resource.
Paul Aurich <darkrain42@pidgin.im>
parents:
27163
diff
changeset
|
646 | 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
|
647 | 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
|
648 | (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
|
649 | 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
|
650 | 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
|
651 | 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
|
652 | } |
|
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
|
653 | |
| 15884 | 654 | PurpleConversation * |
| 655 | jabber_find_unnormalized_conv(const char *name, PurpleAccount *account) | |
| 8043 | 656 | { |
| 15884 | 657 | PurpleConversation *c = NULL; |
| 8043 | 658 | GList *cnv; |
| 659 | ||
| 660 | g_return_val_if_fail(name != NULL, NULL); | |
| 661 | ||
| 15884 | 662 | for(cnv = purple_get_conversations(); cnv; cnv = cnv->next) { |
| 663 | c = (PurpleConversation*)cnv->data; | |
| 664 | if(purple_conversation_get_type(c) == PURPLE_CONV_TYPE_IM && | |
| 665 | !purple_utf8_strcasecmp(name, purple_conversation_get_name(c)) && | |
| 666 | account == purple_conversation_get_account(c)) | |
| 8043 | 667 | return c; |
| 668 | } | |
| 669 | ||
| 670 | return NULL; | |
| 671 | } | |
| 8401 | 672 | |
|
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
|
673 | /* 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
|
674 | 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
|
675 | 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
|
676 | { |
|
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
|
677 | 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
|
678 | 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
|
679 | |
|
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
|
680 | 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
|
681 | 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
|
682 | { |
|
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
|
683 | 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
|
684 | 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
|
685 | } |
|
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
|
686 | |
|
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
|
687 | /* 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
|
688 | 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
|
689 | 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
|
690 | { |
|
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
|
691 | 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
|
692 | 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
|
693 | } |
|
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
|
694 | 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
|
695 | |
|
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
|
696 | 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
|
697 | } |
|
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
|
698 |