Sun, 16 Jun 2013 05:59:31 +0530
Refactor the codebase to use PurpleHash
| 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" |
|
c087855dc551
Re-arrange #includes so 'make check' stands a chance of passing during
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
15884
diff
changeset
|
25 | #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
|
26 | #include "debug.h" |
| 7014 | 27 | #include "server.h" |
| 8043 | 28 | #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
|
29 | #include "xmlnode.h" |
| 7014 | 30 | |
| 7322 | 31 | #include "chat.h" |
| 7014 | 32 | #include "presence.h" |
| 33 | #include "jutil.h" | |
| 3127 | 34 | |
|
34567
ea5103f66b0e
Refactor the codebase to use PurpleHash
Ankit Vani <a@nevitus.org>
parents:
34556
diff
changeset
|
35 | #include "ciphers/md4hash.h" |
|
ea5103f66b0e
Refactor the codebase to use PurpleHash
Ankit Vani <a@nevitus.org>
parents:
34556
diff
changeset
|
36 | #include "ciphers/md5hash.h" |
|
ea5103f66b0e
Refactor the codebase to use PurpleHash
Ankit Vani <a@nevitus.org>
parents:
34556
diff
changeset
|
37 | #include "ciphers/sha1hash.h" |
|
34556
087db73b115d
Refactored protocols bonjour, gg, jabber to use the GObject-based PurpleCipher
Ankit Vani <a@nevitus.org>
parents:
33909
diff
changeset
|
38 | |
|
27849
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
39 | #ifdef USE_IDN |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
40 | #include <idna.h> |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
41 | #include <stringprep.h> |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
42 | 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
|
43 | #endif |
|
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 | #ifdef USE_IDN |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
46 | 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
|
47 | { |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
48 | 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
|
49 | } |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
50 | |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
51 | 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
|
52 | { |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
53 | 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
|
54 | } |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
55 | |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
56 | static JabberID* |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
57 | 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
|
58 | const char *null) |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
59 | { |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
60 | 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
|
61 | 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
|
62 | 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
|
63 | 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
|
64 | 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
|
65 | 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
|
66 | char *out; |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
67 | JabberID *jid; |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
68 | |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
69 | /* 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
|
70 | if (at) { |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
71 | node = str; |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
72 | 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
|
73 | |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
74 | domain = at + 1; |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
75 | if (slash) { |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
76 | 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
|
77 | resource = slash + 1; |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
78 | 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
|
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_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
|
81 | } |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
82 | } else { |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
83 | domain = str; |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
84 | |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
85 | if (slash) { |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
86 | 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
|
87 | resource = slash; |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
88 | 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
|
89 | } else { |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
90 | 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
|
91 | } |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
92 | } |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
93 | |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
94 | 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
|
95 | return NULL; |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
96 | 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
|
97 | return NULL; |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
98 | 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
|
99 | return NULL; |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
100 | |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
101 | 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
|
102 | |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
103 | if (node) { |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
104 | 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
|
105 | 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
|
106 | |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
107 | 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
|
108 | 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
|
109 | jid = NULL; |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
110 | goto out; |
|
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 | 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
|
114 | } |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
115 | |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
116 | /* 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
|
117 | 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
|
118 | 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
|
119 | 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
|
120 | gboolean valid = FALSE; |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
121 | |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
122 | 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
|
123 | 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
|
124 | 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
|
125 | } |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
126 | |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
127 | if (!valid) { |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
128 | 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
|
129 | jid = NULL; |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
130 | goto out; |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
131 | } |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
132 | } else { |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
133 | /* Apply nameprep */ |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
134 | 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
|
135 | 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
|
136 | jid = NULL; |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
137 | goto out; |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
138 | } |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
139 | |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
140 | /* And now ToASCII */ |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
141 | 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
|
142 | 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
|
143 | jid = NULL; |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
144 | goto out; |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
145 | } |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
146 | |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
147 | /* 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
|
148 | free(out); |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
149 | 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
|
150 | } |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
151 | |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
152 | if (resource) { |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
153 | 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
|
154 | 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
|
155 | |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
156 | 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
|
157 | 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
|
158 | 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
|
159 | 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
|
160 | } else |
|
2c150600a9e9
Fix a crash when attempting to validate a JID with an invalid resource.
Paul Aurich <darkrain42@pidgin.im>
parents:
28431
diff
changeset
|
161 | 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
|
162 | } |
|
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 | out: |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
165 | return jid; |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
166 | } |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
167 | |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
168 | #endif /* USE_IDN */ |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
169 | |
| 7310 | 170 | gboolean jabber_nodeprep_validate(const char *str) |
| 171 | { | |
|
27849
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
172 | #ifdef USE_IDN |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
173 | gboolean result; |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
174 | #else |
| 7310 | 175 | 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
|
176 | #endif |
| 7310 | 177 | |
| 178 | if(!str) | |
| 179 | return TRUE; | |
| 180 | ||
| 181 | if(strlen(str) > 1023) | |
| 182 | return FALSE; | |
| 183 | ||
|
27849
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
184 | #ifdef USE_IDN |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
185 | 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
|
186 | 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
|
187 | 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
|
188 | return result; |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
189 | #else /* USE_IDN */ |
| 7310 | 190 | c = str; |
| 191 | while(c && *c) { | |
| 192 | gunichar ch = g_utf8_get_char(c); | |
| 193 | if(ch == '\"' || ch == '&' || ch == '\'' || ch == '/' || ch == ':' || | |
| 194 | ch == '<' || ch == '>' || ch == '@' || !g_unichar_isgraph(ch)) { | |
| 195 | return FALSE; | |
| 196 | } | |
| 197 | c = g_utf8_next_char(c); | |
| 198 | } | |
| 199 | ||
| 200 | return TRUE; | |
|
27849
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
201 | #endif /* USE_IDN */ |
| 7310 | 202 | } |
| 203 | ||
|
27728
03b2a20ba465
Validate IPv6 identifiers in the domain portion of a JID.
Paul Aurich <darkrain42@pidgin.im>
parents:
27723
diff
changeset
|
204 | gboolean jabber_domain_validate(const char *str) |
| 7310 | 205 | { |
| 206 | const char *c; | |
|
27731
53ddfbc48e11
Save one traversal of the domain for IPv6 validation.
Paul Aurich <darkrain42@pidgin.im>
parents:
27728
diff
changeset
|
207 | size_t len; |
| 7310 | 208 | |
| 209 | if(!str) | |
| 210 | return TRUE; | |
| 211 | ||
|
27731
53ddfbc48e11
Save one traversal of the domain for IPv6 validation.
Paul Aurich <darkrain42@pidgin.im>
parents:
27728
diff
changeset
|
212 | len = strlen(str); |
|
53ddfbc48e11
Save one traversal of the domain for IPv6 validation.
Paul Aurich <darkrain42@pidgin.im>
parents:
27728
diff
changeset
|
213 | if (len > 1023) |
| 7310 | 214 | return FALSE; |
| 215 | ||
| 216 | c = str; | |
|
27728
03b2a20ba465
Validate IPv6 identifiers in the domain portion of a JID.
Paul Aurich <darkrain42@pidgin.im>
parents:
27723
diff
changeset
|
217 | |
|
03b2a20ba465
Validate IPv6 identifiers in the domain portion of a JID.
Paul Aurich <darkrain42@pidgin.im>
parents:
27723
diff
changeset
|
218 | if (*c == '[') { |
|
03b2a20ba465
Validate IPv6 identifiers in the domain portion of a JID.
Paul Aurich <darkrain42@pidgin.im>
parents:
27723
diff
changeset
|
219 | /* 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
|
220 | gboolean valid = FALSE; |
|
03b2a20ba465
Validate IPv6 identifiers in the domain portion of a JID.
Paul Aurich <darkrain42@pidgin.im>
parents:
27723
diff
changeset
|
221 | |
|
27731
53ddfbc48e11
Save one traversal of the domain for IPv6 validation.
Paul Aurich <darkrain42@pidgin.im>
parents:
27728
diff
changeset
|
222 | 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
|
223 | return FALSE; |
|
03b2a20ba465
Validate IPv6 identifiers in the domain portion of a JID.
Paul Aurich <darkrain42@pidgin.im>
parents:
27723
diff
changeset
|
224 | |
|
03b2a20ba465
Validate IPv6 identifiers in the domain portion of a JID.
Paul Aurich <darkrain42@pidgin.im>
parents:
27723
diff
changeset
|
225 | /* Ugly, but in-place */ |
|
27731
53ddfbc48e11
Save one traversal of the domain for IPv6 validation.
Paul Aurich <darkrain42@pidgin.im>
parents:
27728
diff
changeset
|
226 | *(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
|
227 | 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
|
228 | *(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
|
229 | |
|
03b2a20ba465
Validate IPv6 identifiers in the domain portion of a JID.
Paul Aurich <darkrain42@pidgin.im>
parents:
27723
diff
changeset
|
230 | return valid; |
|
03b2a20ba465
Validate IPv6 identifiers in the domain portion of a JID.
Paul Aurich <darkrain42@pidgin.im>
parents:
27723
diff
changeset
|
231 | } |
|
03b2a20ba465
Validate IPv6 identifiers in the domain portion of a JID.
Paul Aurich <darkrain42@pidgin.im>
parents:
27723
diff
changeset
|
232 | |
| 7310 | 233 | while(c && *c) { |
| 234 | 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
|
235 | /* 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
|
236 | 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
|
237 | || (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
|
238 | || (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
|
239 | || ch == '.' |
|
27722
3f93427031cd
XMPP allows for internationalized domain names.
Paul Aurich <darkrain42@pidgin.im>
parents:
27721
diff
changeset
|
240 | || ch == '-' )) || (ch >= 0x80 && !g_unichar_isgraph(ch))) |
| 7310 | 241 | return FALSE; |
| 242 | ||
| 243 | c = g_utf8_next_char(c); | |
| 244 | } | |
| 245 | ||
| 246 | return TRUE; | |
| 247 | } | |
| 248 | ||
| 249 | gboolean jabber_resourceprep_validate(const char *str) | |
| 250 | { | |
|
27849
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
251 | #ifdef USE_IDN |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
252 | gboolean result; |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
253 | #else |
| 7310 | 254 | 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
|
255 | #endif |
| 7310 | 256 | |
| 257 | if(!str) | |
| 258 | return TRUE; | |
| 259 | ||
| 260 | if(strlen(str) > 1023) | |
| 261 | return FALSE; | |
| 262 | ||
|
27849
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
263 | #ifdef USE_IDN |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
264 | 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
|
265 | 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
|
266 | 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
|
267 | return result; |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
268 | #else /* USE_IDN */ |
| 7310 | 269 | c = str; |
| 270 | while(c && *c) { | |
| 271 | gunichar ch = g_utf8_get_char(c); | |
| 7419 | 272 | if(!g_unichar_isgraph(ch) && ch != ' ') |
| 7310 | 273 | return FALSE; |
| 274 | ||
| 275 | c = g_utf8_next_char(c); | |
| 276 | } | |
| 277 | ||
| 278 | return TRUE; | |
|
27849
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
279 | #endif /* USE_IDN */ |
| 7310 | 280 | } |
| 281 | ||
|
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
|
282 | 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
|
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 | #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
|
285 | 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
|
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 | 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
|
288 | 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
|
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 | 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
|
291 | 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
|
292 | |
|
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 | 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
|
294 | 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
|
295 | 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
|
296 | 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
|
297 | } |
|
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 | |
|
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 | 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
|
300 | 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
|
301 | 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
|
302 | #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
|
303 | /* 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
|
304 | /* 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
|
305 | 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
|
306 | |
|
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 = (const guchar *)in; |
|
29830
ad339cd679d1
jabber: Oops. Make jabber_saslprep have a hope of not locking the program if built without IDN support.
Paul Aurich <darkrain42@pidgin.im>
parents:
29386
diff
changeset
|
308 | for ( ; *c; ++c) { |
|
30455
8fa81888c974
jabber: Exclude ASCII 127 (Delete) from allowed SASLprep characters
Paul Aurich <darkrain42@pidgin.im>
parents:
29911
diff
changeset
|
309 | if (*c > 0x7f || /* Non-ASCII characters */ |
|
8fa81888c974
jabber: Exclude ASCII 127 (Delete) from allowed SASLprep characters
Paul Aurich <darkrain42@pidgin.im>
parents:
29911
diff
changeset
|
310 | *c == 0x7f || /* ASCII Delete character */ |
|
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
|
311 | (*c < 0x20 && *c != '\t' && *c != '\n' && *c != '\r')) |
|
30455
8fa81888c974
jabber: Exclude ASCII 127 (Delete) from allowed SASLprep characters
Paul Aurich <darkrain42@pidgin.im>
parents:
29911
diff
changeset
|
312 | /* ASCII control characters */ |
|
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
|
313 | 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
|
314 | } |
|
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
|
315 | |
|
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
|
316 | 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
|
317 | #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
|
318 | } |
|
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
|
319 | |
|
28414
5093c1a49d5c
jabber: Use a better method for dealing with terminating slashes in JIDs.
Paul Aurich <darkrain42@pidgin.im>
parents:
28336
diff
changeset
|
320 | static JabberID* |
|
5093c1a49d5c
jabber: Use a better method for dealing with terminating slashes in JIDs.
Paul Aurich <darkrain42@pidgin.im>
parents:
28336
diff
changeset
|
321 | jabber_id_new_internal(const char *str, gboolean allow_terminating_slash) |
| 2086 | 322 | { |
|
27713
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
323 | 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
|
324 | 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
|
325 | 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
|
326 | 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
|
327 | #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
|
328 | 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
|
329 | #endif |
|
27849
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
330 | #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
|
331 | 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
|
332 | char *domain; |
|
27849
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
333 | #endif |
| 7014 | 334 | JabberID *jid; |
| 2086 | 335 | |
|
27713
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
336 | 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
|
337 | 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
|
338 | |
|
27714
c86eb4fefae2
Change jabber_id_new() to iterate byte by byte instead of character
Mark Doliner <markdoliner@pidgin.im>
parents:
27713
diff
changeset
|
339 | 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
|
340 | { |
|
27714
c86eb4fefae2
Change jabber_id_new() to iterate byte by byte instead of character
Mark Doliner <markdoliner@pidgin.im>
parents:
27713
diff
changeset
|
341 | 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
|
342 | case '@': |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
343 | if (!slash) { |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
344 | 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
|
345 | /* 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
|
346 | 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
|
347 | } |
|
27714
c86eb4fefae2
Change jabber_id_new() to iterate byte by byte instead of character
Mark Doliner <markdoliner@pidgin.im>
parents:
27713
diff
changeset
|
348 | 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
|
349 | /* 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
|
350 | 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
|
351 | } |
|
27714
c86eb4fefae2
Change jabber_id_new() to iterate byte by byte instead of character
Mark Doliner <markdoliner@pidgin.im>
parents:
27713
diff
changeset
|
352 | 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
|
353 | /* 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
|
354 | 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
|
355 | } |
|
27714
c86eb4fefae2
Change jabber_id_new() to iterate byte by byte instead of character
Mark Doliner <markdoliner@pidgin.im>
parents:
27713
diff
changeset
|
356 | 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
|
357 | } |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
358 | break; |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
359 | |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
360 | case '/': |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
361 | 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
|
362 | 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
|
363 | /* 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
|
364 | 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
|
365 | } |
|
28414
5093c1a49d5c
jabber: Use a better method for dealing with terminating slashes in JIDs.
Paul Aurich <darkrain42@pidgin.im>
parents:
28336
diff
changeset
|
366 | 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
|
367 | /* 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
|
368 | 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
|
369 | } |
|
27714
c86eb4fefae2
Change jabber_id_new() to iterate byte by byte instead of character
Mark Doliner <markdoliner@pidgin.im>
parents:
27713
diff
changeset
|
370 | 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
|
371 | } |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
372 | break; |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
373 | |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
374 | default: |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
375 | /* characters allowed everywhere */ |
|
27719
cc4aea1fd74c
Of course, these should be >= and <=
Mark Doliner <markdoliner@pidgin.im>
parents:
27714
diff
changeset
|
376 | if ((*c >= 'a' && *c <= 'z') |
|
cc4aea1fd74c
Of course, these should be >= and <=
Mark Doliner <markdoliner@pidgin.im>
parents:
27714
diff
changeset
|
377 | || (*c >= '0' && *c <= '9') |
|
cc4aea1fd74c
Of course, these should be >= and <=
Mark Doliner <markdoliner@pidgin.im>
parents:
27714
diff
changeset
|
378 | || (*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
|
379 | || *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
|
380 | /* 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
|
381 | break; |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
382 | |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
383 | #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
|
384 | 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
|
385 | /* 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
|
386 | 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
|
387 | /* 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
|
388 | break; |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
389 | } |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
390 | |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
391 | /* 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
|
392 | 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
|
393 | /* |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
394 | * 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
|
395 | * 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
|
396 | * 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
|
397 | * 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
|
398 | * 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
|
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 | 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
|
401 | break; |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
402 | } |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
403 | #endif |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
404 | |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
405 | /* |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
406 | * 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
|
407 | * 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
|
408 | * 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
|
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 | 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
|
411 | break; |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
412 | } |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
413 | } |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
414 | |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
415 | #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
|
416 | 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
|
417 | /* 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
|
418 | 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
|
419 | #endif |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
420 | |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
421 | 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
|
422 | /* 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
|
423 | 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
|
424 | |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
425 | 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
|
426 | 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
|
427 | 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
|
428 | 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
|
429 | 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
|
430 | 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
|
431 | } else { |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
432 | 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
|
433 | } |
|
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 | 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
|
436 | 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
|
437 | 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
|
438 | 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
|
439 | } else { |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
440 | 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
|
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 | } |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
443 | 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
|
444 | } |
|
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 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
|
448 | * 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
|
449 | * 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
|
450 | */ |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
451 | |
|
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
452 | if (!g_utf8_validate(str, -1, NULL)) |
| 7014 | 453 | return NULL; |
| 2086 | 454 | |
|
27849
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
455 | #ifdef USE_IDN |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
456 | 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
|
457 | #else /* USE_IDN */ |
|
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
458 | |
| 7014 | 459 | jid = g_new0(JabberID, 1); |
| 460 | ||
|
27713
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
461 | /* normalization */ |
| 7014 | 462 | if(at) { |
|
27849
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
463 | node = g_utf8_casefold(str, at-str); |
| 7014 | 464 | if(slash) { |
|
27849
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
465 | 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
|
466 | 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
|
467 | jid->resource = g_utf8_normalize(slash+1, -1, G_NORMALIZE_NFKC); |
| 7014 | 468 | } else { |
|
27849
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
469 | domain = g_utf8_casefold(at+1, -1); |
| 7014 | 470 | } |
| 471 | } else { | |
| 472 | if(slash) { | |
|
27849
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
473 | 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
|
474 | 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
|
475 | jid->resource = g_utf8_normalize(slash+1, -1, G_NORMALIZE_NFKC); |
| 7014 | 476 | } else { |
|
27849
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
477 | domain = g_utf8_casefold(str, -1); |
| 7306 | 478 | } |
| 479 | } | |
| 480 | ||
|
27130
9cb09f3df8c7
jabber_id_new() needs to be case-folding the node and domain.
Paul Aurich <darkrain42@pidgin.im>
parents:
25110
diff
changeset
|
481 | if (node) { |
|
27819
48b1ba24def3
For JIDs, do strdown before normalization.
Paul Aurich <darkrain42@pidgin.im>
parents:
27731
diff
changeset
|
482 | 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
|
483 | 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
|
484 | } |
|
9cb09f3df8c7
jabber_id_new() needs to be case-folding the node and domain.
Paul Aurich <darkrain42@pidgin.im>
parents:
25110
diff
changeset
|
485 | |
|
9cb09f3df8c7
jabber_id_new() needs to be case-folding the node and domain.
Paul Aurich <darkrain42@pidgin.im>
parents:
25110
diff
changeset
|
486 | if (domain) { |
|
27819
48b1ba24def3
For JIDs, do strdown before normalization.
Paul Aurich <darkrain42@pidgin.im>
parents:
27731
diff
changeset
|
487 | 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
|
488 | 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
|
489 | } |
| 7306 | 490 | |
|
27713
9985f2f358c9
Check in a version of jabber_id_new() that is hopefully more efficient.
Mark Doliner <markdoliner@pidgin.im>
parents:
27689
diff
changeset
|
491 | /* and finally the jabber nodeprep */ |
| 7310 | 492 | 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
|
493 | !jabber_domain_validate(jid->domain) || |
| 7310 | 494 | !jabber_resourceprep_validate(jid->resource)) { |
| 7306 | 495 | jabber_id_free(jid); |
| 496 | return NULL; | |
| 497 | } | |
| 498 | ||
| 7014 | 499 | return jid; |
|
27849
7f7428cb8309
When GNU Libidn is available, use it for XMPP stringprep operations.
Paul Aurich <darkrain42@pidgin.im>
parents:
27819
diff
changeset
|
500 | #endif /* USE_IDN */ |
| 2086 | 501 | } |
| 502 | ||
| 7014 | 503 | void |
| 504 | jabber_id_free(JabberID *jid) | |
| 2086 | 505 | { |
| 7014 | 506 | if(jid) { |
|
31509
992ad686ba0b
jabber: if (foo) g_free(foo) -> g_free(foo)
Paul Aurich <darkrain42@pidgin.im>
parents:
31294
diff
changeset
|
507 | g_free(jid->node); |
|
992ad686ba0b
jabber: if (foo) g_free(foo) -> g_free(foo)
Paul Aurich <darkrain42@pidgin.im>
parents:
31294
diff
changeset
|
508 | g_free(jid->domain); |
|
992ad686ba0b
jabber: if (foo) g_free(foo) -> g_free(foo)
Paul Aurich <darkrain42@pidgin.im>
parents:
31294
diff
changeset
|
509 | g_free(jid->resource); |
| 7014 | 510 | g_free(jid); |
| 511 | } | |
| 2086 | 512 | } |
| 513 | ||
|
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
|
514 | 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
|
515 | { |
|
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 | 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
|
517 | 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
|
518 | |
|
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 | 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
|
520 | 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
|
521 | |
|
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 | 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
|
523 | 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
|
524 | |
|
f245c5e9e9f3
jabber: When getting info on a "bare" domain JID, interpret the value of "last"
Marcus Lundblad <malu@pidgin.im>
parents:
28535
diff
changeset
|
525 | 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
|
526 | } |
| 7014 | 527 | |
| 7306 | 528 | char *jabber_get_resource(const char *in) |
| 7014 | 529 | { |
| 7306 | 530 | JabberID *jid = jabber_id_new(in); |
| 531 | char *out; | |
| 7014 | 532 | |
| 7306 | 533 | if(!jid) |
| 7014 | 534 | return NULL; |
| 7306 | 535 | |
| 536 | out = g_strdup(jid->resource); | |
| 537 | jabber_id_free(jid); | |
| 538 | ||
| 539 | return out; | |
| 7014 | 540 | } |
| 541 | ||
|
28431
8450418b5abd
jabber: Properly handle adding buddies that contain a resource. Closes #10151.
Paul Aurich <darkrain42@pidgin.im>
parents:
28414
diff
changeset
|
542 | char * |
|
8450418b5abd
jabber: Properly handle adding buddies that contain a resource. Closes #10151.
Paul Aurich <darkrain42@pidgin.im>
parents:
28414
diff
changeset
|
543 | jabber_get_bare_jid(const char *in) |
| 7014 | 544 | { |
| 7306 | 545 | JabberID *jid = jabber_id_new(in); |
| 546 | char *out; | |
| 7014 | 547 | |
|
28431
8450418b5abd
jabber: Properly handle adding buddies that contain a resource. Closes #10151.
Paul Aurich <darkrain42@pidgin.im>
parents:
28414
diff
changeset
|
548 | if (!jid) |
| 7306 | 549 | return NULL; |
|
28431
8450418b5abd
jabber: Properly handle adding buddies that contain a resource. Closes #10151.
Paul Aurich <darkrain42@pidgin.im>
parents:
28414
diff
changeset
|
550 | out = jabber_id_get_bare_jid(jid); |
| 7306 | 551 | jabber_id_free(jid); |
| 552 | ||
| 553 | return out; | |
| 7014 | 554 | } |
| 7261 | 555 | |
|
28431
8450418b5abd
jabber: Properly handle adding buddies that contain a resource. Closes #10151.
Paul Aurich <darkrain42@pidgin.im>
parents:
28414
diff
changeset
|
556 | char * |
|
8450418b5abd
jabber: Properly handle adding buddies that contain a resource. Closes #10151.
Paul Aurich <darkrain42@pidgin.im>
parents:
28414
diff
changeset
|
557 | 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
|
558 | { |
|
8450418b5abd
jabber: Properly handle adding buddies that contain a resource. Closes #10151.
Paul Aurich <darkrain42@pidgin.im>
parents:
28414
diff
changeset
|
559 | 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
|
560 | |
|
8450418b5abd
jabber: Properly handle adding buddies that contain a resource. Closes #10151.
Paul Aurich <darkrain42@pidgin.im>
parents:
28414
diff
changeset
|
561 | 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
|
562 | jid->node ? "@" : "", |
|
8450418b5abd
jabber: Properly handle adding buddies that contain a resource. Closes #10151.
Paul Aurich <darkrain42@pidgin.im>
parents:
28414
diff
changeset
|
563 | jid->domain, |
|
8450418b5abd
jabber: Properly handle adding buddies that contain a resource. Closes #10151.
Paul Aurich <darkrain42@pidgin.im>
parents:
28414
diff
changeset
|
564 | NULL); |
|
8450418b5abd
jabber: Properly handle adding buddies that contain a resource. Closes #10151.
Paul Aurich <darkrain42@pidgin.im>
parents:
28414
diff
changeset
|
565 | } |
|
8450418b5abd
jabber: Properly handle adding buddies that contain a resource. Closes #10151.
Paul Aurich <darkrain42@pidgin.im>
parents:
28414
diff
changeset
|
566 | |
|
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
|
567 | 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
|
568 | 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
|
569 | { |
|
29097
0834410aa178
Tighter scoping and slightly less memory usage.
Paul Aurich <darkrain42@pidgin.im>
parents:
29085
diff
changeset
|
570 | 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
|
571 | |
|
29097
0834410aa178
Tighter scoping and slightly less memory usage.
Paul Aurich <darkrain42@pidgin.im>
parents:
29085
diff
changeset
|
572 | for (c = jid; *c; ++c) { |
|
0834410aa178
Tighter scoping and slightly less memory usage.
Paul Aurich <darkrain42@pidgin.im>
parents:
29085
diff
changeset
|
573 | if (*c == '@' || *c == '/') |
|
0834410aa178
Tighter scoping and slightly less memory usage.
Paul Aurich <darkrain42@pidgin.im>
parents:
29085
diff
changeset
|
574 | return FALSE; |
|
0834410aa178
Tighter scoping and slightly less memory usage.
Paul Aurich <darkrain42@pidgin.im>
parents:
29085
diff
changeset
|
575 | } |
|
0834410aa178
Tighter scoping and slightly less memory usage.
Paul Aurich <darkrain42@pidgin.im>
parents:
29085
diff
changeset
|
576 | |
|
0834410aa178
Tighter scoping and slightly less memory usage.
Paul Aurich <darkrain42@pidgin.im>
parents:
29085
diff
changeset
|
577 | 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
|
578 | } |
|
f245c5e9e9f3
jabber: When getting info on a "bare" domain JID, interpret the value of "last"
Marcus Lundblad <malu@pidgin.im>
parents:
28535
diff
changeset
|
579 | |
|
f245c5e9e9f3
jabber: When getting info on a "bare" domain JID, interpret the value of "last"
Marcus Lundblad <malu@pidgin.im>
parents:
28535
diff
changeset
|
580 | |
|
28414
5093c1a49d5c
jabber: Use a better method for dealing with terminating slashes in JIDs.
Paul Aurich <darkrain42@pidgin.im>
parents:
28336
diff
changeset
|
581 | JabberID * |
|
5093c1a49d5c
jabber: Use a better method for dealing with terminating slashes in JIDs.
Paul Aurich <darkrain42@pidgin.im>
parents:
28336
diff
changeset
|
582 | 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
|
583 | { |
|
5093c1a49d5c
jabber: Use a better method for dealing with terminating slashes in JIDs.
Paul Aurich <darkrain42@pidgin.im>
parents:
28336
diff
changeset
|
584 | 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
|
585 | } |
|
5093c1a49d5c
jabber: Use a better method for dealing with terminating slashes in JIDs.
Paul Aurich <darkrain42@pidgin.im>
parents:
28336
diff
changeset
|
586 | |
| 15884 | 587 | const char *jabber_normalize(const PurpleAccount *account, const char *in) |
| 7261 | 588 | { |
|
32277
97f16af01a05
Convert jabber prpl to use accessor functions purple_connection_get_protocol_data() and purple_connection_set_protocol_data().
Andrew Victor <andrew.victor@mxit.com>
parents:
31509
diff
changeset
|
589 | PurpleConnection *gc = NULL; |
|
97f16af01a05
Convert jabber prpl to use accessor functions purple_connection_get_protocol_data() and purple_connection_set_protocol_data().
Andrew Victor <andrew.victor@mxit.com>
parents:
31509
diff
changeset
|
590 | JabberStream *js = NULL; |
| 7322 | 591 | static char buf[3072]; /* maximum legal length of a jabber jid */ |
| 592 | JabberID *jid; | |
| 7261 | 593 | |
|
32277
97f16af01a05
Convert jabber prpl to use accessor functions purple_connection_get_protocol_data() and purple_connection_set_protocol_data().
Andrew Victor <andrew.victor@mxit.com>
parents:
31509
diff
changeset
|
594 | if (account) |
|
97f16af01a05
Convert jabber prpl to use accessor functions purple_connection_get_protocol_data() and purple_connection_set_protocol_data().
Andrew Victor <andrew.victor@mxit.com>
parents:
31509
diff
changeset
|
595 | gc = purple_account_get_connection(account); |
|
97f16af01a05
Convert jabber prpl to use accessor functions purple_connection_get_protocol_data() and purple_connection_set_protocol_data().
Andrew Victor <andrew.victor@mxit.com>
parents:
31509
diff
changeset
|
596 | if (gc) |
|
97f16af01a05
Convert jabber prpl to use accessor functions purple_connection_get_protocol_data() and purple_connection_set_protocol_data().
Andrew Victor <andrew.victor@mxit.com>
parents:
31509
diff
changeset
|
597 | js = purple_connection_get_protocol_data(gc); |
|
97f16af01a05
Convert jabber prpl to use accessor functions purple_connection_get_protocol_data() and purple_connection_set_protocol_data().
Andrew Victor <andrew.victor@mxit.com>
parents:
31509
diff
changeset
|
598 | |
|
28414
5093c1a49d5c
jabber: Use a better method for dealing with terminating slashes in JIDs.
Paul Aurich <darkrain42@pidgin.im>
parents:
28336
diff
changeset
|
599 | jid = jabber_id_new_internal(in, TRUE); |
| 7322 | 600 | if(!jid) |
| 7310 | 601 | return NULL; |
| 602 | ||
|
27130
9cb09f3df8c7
jabber_id_new() needs to be case-folding the node and domain.
Paul Aurich <darkrain42@pidgin.im>
parents:
25110
diff
changeset
|
603 | 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
|
604 | 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
|
605 | g_snprintf(buf, sizeof(buf), "%s@%s/%s", jid->node, jid->domain, |
| 7322 | 606 | jid->resource); |
| 607 | else | |
|
27130
9cb09f3df8c7
jabber_id_new() needs to be case-folding the node and domain.
Paul Aurich <darkrain42@pidgin.im>
parents:
25110
diff
changeset
|
608 | 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
|
609 | jid->node ? "@" : "", jid->domain); |
| 7322 | 610 | |
| 7429 | 611 | jabber_id_free(jid); |
| 612 | ||
| 7261 | 613 | return buf; |
| 614 | } | |
| 7306 | 615 | |
|
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
|
616 | 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
|
617 | 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
|
618 | { |
|
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 | 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
|
620 | 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
|
621 | |
|
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 | 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
|
623 | 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
|
624 | |
|
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_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
|
626 | |
|
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 | 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
|
628 | 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
|
629 | 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
|
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 | 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
|
632 | 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
|
633 | 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
|
634 | 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
|
635 | 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
|
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 | |
|
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 | 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
|
639 | 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
|
640 | { |
|
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 | 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
|
642 | 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
|
643 | |
|
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 | 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
|
645 | 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
|
646 | |
|
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_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
|
648 | |
|
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
|
649 | 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
|
650 | 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
|
651 | 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
|
652 | |
|
27191
09b3a16e7330
Allow incoming stanzas to match 'our account' if they come from our resource.
Paul Aurich <darkrain42@pidgin.im>
parents:
27163
diff
changeset
|
653 | 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
|
654 | 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
|
655 | (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
|
656 | 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
|
657 | 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
|
658 | 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
|
659 | } |
|
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
|
660 | |
|
29384
b7b6be8f77fd
jabber: Move those functions to jutil.[ch]
Paul Aurich <darkrain42@pidgin.im>
parents:
29336
diff
changeset
|
661 | static const struct { |
|
b7b6be8f77fd
jabber: Move those functions to jutil.[ch]
Paul Aurich <darkrain42@pidgin.im>
parents:
29336
diff
changeset
|
662 | const char *status_id; /* link to core */ |
|
b7b6be8f77fd
jabber: Move those functions to jutil.[ch]
Paul Aurich <darkrain42@pidgin.im>
parents:
29336
diff
changeset
|
663 | const char *show; /* The show child's cdata in a presence stanza */ |
|
b7b6be8f77fd
jabber: Move those functions to jutil.[ch]
Paul Aurich <darkrain42@pidgin.im>
parents:
29336
diff
changeset
|
664 | const char *readable; /* readable representation */ |
|
b7b6be8f77fd
jabber: Move those functions to jutil.[ch]
Paul Aurich <darkrain42@pidgin.im>
parents:
29336
diff
changeset
|
665 | JabberBuddyState state; |
|
b7b6be8f77fd
jabber: Move those functions to jutil.[ch]
Paul Aurich <darkrain42@pidgin.im>
parents:
29336
diff
changeset
|
666 | } jabber_statuses[] = { |
|
b7b6be8f77fd
jabber: Move those functions to jutil.[ch]
Paul Aurich <darkrain42@pidgin.im>
parents:
29336
diff
changeset
|
667 | { "offline", NULL, N_("Offline"), JABBER_BUDDY_STATE_UNAVAILABLE }, |
|
b7b6be8f77fd
jabber: Move those functions to jutil.[ch]
Paul Aurich <darkrain42@pidgin.im>
parents:
29336
diff
changeset
|
668 | { "available", NULL, N_("Available"), JABBER_BUDDY_STATE_ONLINE}, |
|
b7b6be8f77fd
jabber: Move those functions to jutil.[ch]
Paul Aurich <darkrain42@pidgin.im>
parents:
29336
diff
changeset
|
669 | { "freeforchat", "chat", N_("Chatty"), JABBER_BUDDY_STATE_CHAT }, |
|
b7b6be8f77fd
jabber: Move those functions to jutil.[ch]
Paul Aurich <darkrain42@pidgin.im>
parents:
29336
diff
changeset
|
670 | { "away", "away", N_("Away"), JABBER_BUDDY_STATE_AWAY }, |
|
b7b6be8f77fd
jabber: Move those functions to jutil.[ch]
Paul Aurich <darkrain42@pidgin.im>
parents:
29336
diff
changeset
|
671 | { "extended_away", "xa", N_("Extended Away"), JABBER_BUDDY_STATE_XA }, |
|
b7b6be8f77fd
jabber: Move those functions to jutil.[ch]
Paul Aurich <darkrain42@pidgin.im>
parents:
29336
diff
changeset
|
672 | { "dnd", "dnd", N_("Do Not Disturb"), JABBER_BUDDY_STATE_DND }, |
|
b7b6be8f77fd
jabber: Move those functions to jutil.[ch]
Paul Aurich <darkrain42@pidgin.im>
parents:
29336
diff
changeset
|
673 | { "error", NULL, N_("Error"), JABBER_BUDDY_STATE_ERROR } |
|
b7b6be8f77fd
jabber: Move those functions to jutil.[ch]
Paul Aurich <darkrain42@pidgin.im>
parents:
29336
diff
changeset
|
674 | }; |
|
b7b6be8f77fd
jabber: Move those functions to jutil.[ch]
Paul Aurich <darkrain42@pidgin.im>
parents:
29336
diff
changeset
|
675 | |
|
b7b6be8f77fd
jabber: Move those functions to jutil.[ch]
Paul Aurich <darkrain42@pidgin.im>
parents:
29336
diff
changeset
|
676 | const char * |
|
b7b6be8f77fd
jabber: Move those functions to jutil.[ch]
Paul Aurich <darkrain42@pidgin.im>
parents:
29336
diff
changeset
|
677 | jabber_buddy_state_get_name(const JabberBuddyState state) |
|
b7b6be8f77fd
jabber: Move those functions to jutil.[ch]
Paul Aurich <darkrain42@pidgin.im>
parents:
29336
diff
changeset
|
678 | { |
|
b7b6be8f77fd
jabber: Move those functions to jutil.[ch]
Paul Aurich <darkrain42@pidgin.im>
parents:
29336
diff
changeset
|
679 | int i; |
|
b7b6be8f77fd
jabber: Move those functions to jutil.[ch]
Paul Aurich <darkrain42@pidgin.im>
parents:
29336
diff
changeset
|
680 | for (i = 0; i < G_N_ELEMENTS(jabber_statuses); ++i) |
|
b7b6be8f77fd
jabber: Move those functions to jutil.[ch]
Paul Aurich <darkrain42@pidgin.im>
parents:
29336
diff
changeset
|
681 | if (jabber_statuses[i].state == state) |
|
b7b6be8f77fd
jabber: Move those functions to jutil.[ch]
Paul Aurich <darkrain42@pidgin.im>
parents:
29336
diff
changeset
|
682 | return _(jabber_statuses[i].readable); |
|
b7b6be8f77fd
jabber: Move those functions to jutil.[ch]
Paul Aurich <darkrain42@pidgin.im>
parents:
29336
diff
changeset
|
683 | |
|
b7b6be8f77fd
jabber: Move those functions to jutil.[ch]
Paul Aurich <darkrain42@pidgin.im>
parents:
29336
diff
changeset
|
684 | return _("Unknown"); |
|
b7b6be8f77fd
jabber: Move those functions to jutil.[ch]
Paul Aurich <darkrain42@pidgin.im>
parents:
29336
diff
changeset
|
685 | } |
|
b7b6be8f77fd
jabber: Move those functions to jutil.[ch]
Paul Aurich <darkrain42@pidgin.im>
parents:
29336
diff
changeset
|
686 | |
|
b7b6be8f77fd
jabber: Move those functions to jutil.[ch]
Paul Aurich <darkrain42@pidgin.im>
parents:
29336
diff
changeset
|
687 | JabberBuddyState |
|
b7b6be8f77fd
jabber: Move those functions to jutil.[ch]
Paul Aurich <darkrain42@pidgin.im>
parents:
29336
diff
changeset
|
688 | jabber_buddy_status_id_get_state(const char *id) |
|
b7b6be8f77fd
jabber: Move those functions to jutil.[ch]
Paul Aurich <darkrain42@pidgin.im>
parents:
29336
diff
changeset
|
689 | { |
|
b7b6be8f77fd
jabber: Move those functions to jutil.[ch]
Paul Aurich <darkrain42@pidgin.im>
parents:
29336
diff
changeset
|
690 | int i; |
|
b7b6be8f77fd
jabber: Move those functions to jutil.[ch]
Paul Aurich <darkrain42@pidgin.im>
parents:
29336
diff
changeset
|
691 | if (!id) |
|
b7b6be8f77fd
jabber: Move those functions to jutil.[ch]
Paul Aurich <darkrain42@pidgin.im>
parents:
29336
diff
changeset
|
692 | return JABBER_BUDDY_STATE_UNKNOWN; |
|
b7b6be8f77fd
jabber: Move those functions to jutil.[ch]
Paul Aurich <darkrain42@pidgin.im>
parents:
29336
diff
changeset
|
693 | |
|
b7b6be8f77fd
jabber: Move those functions to jutil.[ch]
Paul Aurich <darkrain42@pidgin.im>
parents:
29336
diff
changeset
|
694 | for (i = 0; i < G_N_ELEMENTS(jabber_statuses); ++i) |
|
b7b6be8f77fd
jabber: Move those functions to jutil.[ch]
Paul Aurich <darkrain42@pidgin.im>
parents:
29336
diff
changeset
|
695 | if (g_str_equal(id, jabber_statuses[i].status_id)) |
|
b7b6be8f77fd
jabber: Move those functions to jutil.[ch]
Paul Aurich <darkrain42@pidgin.im>
parents:
29336
diff
changeset
|
696 | return jabber_statuses[i].state; |
|
b7b6be8f77fd
jabber: Move those functions to jutil.[ch]
Paul Aurich <darkrain42@pidgin.im>
parents:
29336
diff
changeset
|
697 | |
|
b7b6be8f77fd
jabber: Move those functions to jutil.[ch]
Paul Aurich <darkrain42@pidgin.im>
parents:
29336
diff
changeset
|
698 | return JABBER_BUDDY_STATE_UNKNOWN; |
|
b7b6be8f77fd
jabber: Move those functions to jutil.[ch]
Paul Aurich <darkrain42@pidgin.im>
parents:
29336
diff
changeset
|
699 | } |
|
b7b6be8f77fd
jabber: Move those functions to jutil.[ch]
Paul Aurich <darkrain42@pidgin.im>
parents:
29336
diff
changeset
|
700 | |
|
b7b6be8f77fd
jabber: Move those functions to jutil.[ch]
Paul Aurich <darkrain42@pidgin.im>
parents:
29336
diff
changeset
|
701 | JabberBuddyState jabber_buddy_show_get_state(const char *id) |
|
b7b6be8f77fd
jabber: Move those functions to jutil.[ch]
Paul Aurich <darkrain42@pidgin.im>
parents:
29336
diff
changeset
|
702 | { |
|
b7b6be8f77fd
jabber: Move those functions to jutil.[ch]
Paul Aurich <darkrain42@pidgin.im>
parents:
29336
diff
changeset
|
703 | int i; |
|
b7b6be8f77fd
jabber: Move those functions to jutil.[ch]
Paul Aurich <darkrain42@pidgin.im>
parents:
29336
diff
changeset
|
704 | |
|
b7b6be8f77fd
jabber: Move those functions to jutil.[ch]
Paul Aurich <darkrain42@pidgin.im>
parents:
29336
diff
changeset
|
705 | g_return_val_if_fail(id != NULL, JABBER_BUDDY_STATE_UNKNOWN); |
|
b7b6be8f77fd
jabber: Move those functions to jutil.[ch]
Paul Aurich <darkrain42@pidgin.im>
parents:
29336
diff
changeset
|
706 | |
|
b7b6be8f77fd
jabber: Move those functions to jutil.[ch]
Paul Aurich <darkrain42@pidgin.im>
parents:
29336
diff
changeset
|
707 | for (i = 0; i < G_N_ELEMENTS(jabber_statuses); ++i) |
|
29386
960464383e78
jabber: Oops, crashing bad.
Paul Aurich <darkrain42@pidgin.im>
parents:
29384
diff
changeset
|
708 | if (jabber_statuses[i].show && g_str_equal(id, jabber_statuses[i].show)) |
|
29384
b7b6be8f77fd
jabber: Move those functions to jutil.[ch]
Paul Aurich <darkrain42@pidgin.im>
parents:
29336
diff
changeset
|
709 | return jabber_statuses[i].state; |
|
b7b6be8f77fd
jabber: Move those functions to jutil.[ch]
Paul Aurich <darkrain42@pidgin.im>
parents:
29336
diff
changeset
|
710 | |
|
b7b6be8f77fd
jabber: Move those functions to jutil.[ch]
Paul Aurich <darkrain42@pidgin.im>
parents:
29336
diff
changeset
|
711 | purple_debug_warning("jabber", "Invalid value of presence <show/> " |
|
b7b6be8f77fd
jabber: Move those functions to jutil.[ch]
Paul Aurich <darkrain42@pidgin.im>
parents:
29336
diff
changeset
|
712 | "attribute: %s\n", id); |
|
b7b6be8f77fd
jabber: Move those functions to jutil.[ch]
Paul Aurich <darkrain42@pidgin.im>
parents:
29336
diff
changeset
|
713 | return JABBER_BUDDY_STATE_UNKNOWN; |
|
b7b6be8f77fd
jabber: Move those functions to jutil.[ch]
Paul Aurich <darkrain42@pidgin.im>
parents:
29336
diff
changeset
|
714 | } |
|
b7b6be8f77fd
jabber: Move those functions to jutil.[ch]
Paul Aurich <darkrain42@pidgin.im>
parents:
29336
diff
changeset
|
715 | |
|
b7b6be8f77fd
jabber: Move those functions to jutil.[ch]
Paul Aurich <darkrain42@pidgin.im>
parents:
29336
diff
changeset
|
716 | const char * |
|
b7b6be8f77fd
jabber: Move those functions to jutil.[ch]
Paul Aurich <darkrain42@pidgin.im>
parents:
29336
diff
changeset
|
717 | jabber_buddy_state_get_show(JabberBuddyState state) |
|
b7b6be8f77fd
jabber: Move those functions to jutil.[ch]
Paul Aurich <darkrain42@pidgin.im>
parents:
29336
diff
changeset
|
718 | { |
|
b7b6be8f77fd
jabber: Move those functions to jutil.[ch]
Paul Aurich <darkrain42@pidgin.im>
parents:
29336
diff
changeset
|
719 | int i; |
|
b7b6be8f77fd
jabber: Move those functions to jutil.[ch]
Paul Aurich <darkrain42@pidgin.im>
parents:
29336
diff
changeset
|
720 | for (i = 0; i < G_N_ELEMENTS(jabber_statuses); ++i) |
|
b7b6be8f77fd
jabber: Move those functions to jutil.[ch]
Paul Aurich <darkrain42@pidgin.im>
parents:
29336
diff
changeset
|
721 | if (state == jabber_statuses[i].state) |
|
b7b6be8f77fd
jabber: Move those functions to jutil.[ch]
Paul Aurich <darkrain42@pidgin.im>
parents:
29336
diff
changeset
|
722 | return jabber_statuses[i].show; |
|
b7b6be8f77fd
jabber: Move those functions to jutil.[ch]
Paul Aurich <darkrain42@pidgin.im>
parents:
29336
diff
changeset
|
723 | |
|
b7b6be8f77fd
jabber: Move those functions to jutil.[ch]
Paul Aurich <darkrain42@pidgin.im>
parents:
29336
diff
changeset
|
724 | return NULL; |
|
b7b6be8f77fd
jabber: Move those functions to jutil.[ch]
Paul Aurich <darkrain42@pidgin.im>
parents:
29336
diff
changeset
|
725 | } |
|
b7b6be8f77fd
jabber: Move those functions to jutil.[ch]
Paul Aurich <darkrain42@pidgin.im>
parents:
29336
diff
changeset
|
726 | |
|
b7b6be8f77fd
jabber: Move those functions to jutil.[ch]
Paul Aurich <darkrain42@pidgin.im>
parents:
29336
diff
changeset
|
727 | const char * |
|
b7b6be8f77fd
jabber: Move those functions to jutil.[ch]
Paul Aurich <darkrain42@pidgin.im>
parents:
29336
diff
changeset
|
728 | jabber_buddy_state_get_status_id(JabberBuddyState state) |
|
b7b6be8f77fd
jabber: Move those functions to jutil.[ch]
Paul Aurich <darkrain42@pidgin.im>
parents:
29336
diff
changeset
|
729 | { |
|
b7b6be8f77fd
jabber: Move those functions to jutil.[ch]
Paul Aurich <darkrain42@pidgin.im>
parents:
29336
diff
changeset
|
730 | int i; |
|
b7b6be8f77fd
jabber: Move those functions to jutil.[ch]
Paul Aurich <darkrain42@pidgin.im>
parents:
29336
diff
changeset
|
731 | for (i = 0; i < G_N_ELEMENTS(jabber_statuses); ++i) |
|
b7b6be8f77fd
jabber: Move those functions to jutil.[ch]
Paul Aurich <darkrain42@pidgin.im>
parents:
29336
diff
changeset
|
732 | if (state == jabber_statuses[i].state) |
|
b7b6be8f77fd
jabber: Move those functions to jutil.[ch]
Paul Aurich <darkrain42@pidgin.im>
parents:
29336
diff
changeset
|
733 | return jabber_statuses[i].status_id; |
|
b7b6be8f77fd
jabber: Move those functions to jutil.[ch]
Paul Aurich <darkrain42@pidgin.im>
parents:
29336
diff
changeset
|
734 | |
|
b7b6be8f77fd
jabber: Move those functions to jutil.[ch]
Paul Aurich <darkrain42@pidgin.im>
parents:
29336
diff
changeset
|
735 | return NULL; |
|
b7b6be8f77fd
jabber: Move those functions to jutil.[ch]
Paul Aurich <darkrain42@pidgin.im>
parents:
29336
diff
changeset
|
736 | } |
|
b7b6be8f77fd
jabber: Move those functions to jutil.[ch]
Paul Aurich <darkrain42@pidgin.im>
parents:
29336
diff
changeset
|
737 | |
|
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
|
738 | char * |
|
31294
73607ab89c6f
Remove trailing whitespace
Richard Laager <rlaager@pidgin.im>
parents:
30455
diff
changeset
|
739 | jabber_calculate_data_hash(gconstpointer data, size_t len, |
|
29910
f1c6e586e5c1
jabber: Validate the hash on incoming BoB objects (in case the CID is on the
Marcus Lundblad <malu@pidgin.im>
parents:
29830
diff
changeset
|
740 | const gchar *hash_algo) |
|
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
|
741 | { |
|
34567
ea5103f66b0e
Refactor the codebase to use PurpleHash
Ankit Vani <a@nevitus.org>
parents:
34556
diff
changeset
|
742 | PurpleHash *hash = NULL; |
|
29911
bce23fcd5c7d
jabber: Use a 129 byte buffer to fit the hex output of SHA-512 (including \0)
Marcus Lundblad <malu@pidgin.im>
parents:
29910
diff
changeset
|
743 | static gchar digest[129]; /* 512 bits hex + \0 */ |
|
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
|
744 | |
|
34556
087db73b115d
Refactored protocols bonjour, gg, jabber to use the GObject-based PurpleCipher
Ankit Vani <a@nevitus.org>
parents:
33909
diff
changeset
|
745 | /* FIXME: Check the source of this change and what we need here... */ |
|
087db73b115d
Refactored protocols bonjour, gg, jabber to use the GObject-based PurpleCipher
Ankit Vani <a@nevitus.org>
parents:
33909
diff
changeset
|
746 | if (g_str_equal(hash_algo, "sha1")) |
|
34567
ea5103f66b0e
Refactor the codebase to use PurpleHash
Ankit Vani <a@nevitus.org>
parents:
34556
diff
changeset
|
747 | hash = purple_sha1_hash_new(); |
|
34556
087db73b115d
Refactored protocols bonjour, gg, jabber to use the GObject-based PurpleCipher
Ankit Vani <a@nevitus.org>
parents:
33909
diff
changeset
|
748 | else if (g_str_equal(hash_algo, "md4")) |
|
34567
ea5103f66b0e
Refactor the codebase to use PurpleHash
Ankit Vani <a@nevitus.org>
parents:
34556
diff
changeset
|
749 | hash = purple_md4_hash_new(); |
|
34556
087db73b115d
Refactored protocols bonjour, gg, jabber to use the GObject-based PurpleCipher
Ankit Vani <a@nevitus.org>
parents:
33909
diff
changeset
|
750 | else if (g_str_equal(hash_algo, "md5")) |
|
34567
ea5103f66b0e
Refactor the codebase to use PurpleHash
Ankit Vani <a@nevitus.org>
parents:
34556
diff
changeset
|
751 | hash = purple_md5_hash_new(); |
|
34556
087db73b115d
Refactored protocols bonjour, gg, jabber to use the GObject-based PurpleCipher
Ankit Vani <a@nevitus.org>
parents:
33909
diff
changeset
|
752 | if (hash == NULL) |
|
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
|
753 | { |
|
29910
f1c6e586e5c1
jabber: Validate the hash on incoming BoB objects (in case the CID is on the
Marcus Lundblad <malu@pidgin.im>
parents:
29830
diff
changeset
|
754 | purple_debug_error("jabber", "Could not find %s cipher\n", hash_algo); |
|
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
|
755 | 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
|
756 | } |
|
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
|
757 | |
|
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
|
758 | /* Hash the data */ |
|
34567
ea5103f66b0e
Refactor the codebase to use PurpleHash
Ankit Vani <a@nevitus.org>
parents:
34556
diff
changeset
|
759 | purple_hash_append(hash, data, len); |
|
ea5103f66b0e
Refactor the codebase to use PurpleHash
Ankit Vani <a@nevitus.org>
parents:
34556
diff
changeset
|
760 | if (!purple_hash_digest_to_str(hash, digest, sizeof(digest))) |
|
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
|
761 | { |
|
29910
f1c6e586e5c1
jabber: Validate the hash on incoming BoB objects (in case the CID is on the
Marcus Lundblad <malu@pidgin.im>
parents:
29830
diff
changeset
|
762 | purple_debug_error("jabber", "Failed to get digest for %s cipher.\n", |
|
f1c6e586e5c1
jabber: Validate the hash on incoming BoB objects (in case the CID is on the
Marcus Lundblad <malu@pidgin.im>
parents:
29830
diff
changeset
|
763 | hash_algo); |
|
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
|
764 | 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
|
765 | } |
|
34556
087db73b115d
Refactored protocols bonjour, gg, jabber to use the GObject-based PurpleCipher
Ankit Vani <a@nevitus.org>
parents:
33909
diff
changeset
|
766 | g_object_unref(G_OBJECT(hash)); |
|
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
|
767 | |
|
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
|
768 | 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
|
769 | } |
|
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
|
770 |