Mercurial > ~mikael > mcabber > hg
annotate mcabber/mcabber/xmpp_helper.c @ 1984:b0470ef8669b
XEP 184: don't send receipts to buddies that have no presence subscription
In order to not leak our presence, do not send message delivery receipts to
senders who are not authorized to view our presence. (XEP-0184, section 8)
author | Mikael Berthe <mikael@lilotux.net> |
---|---|
date | Sun, 27 Mar 2011 12:45:41 +0200 |
parents | 45f0f0f60656 |
children | 51f032d5ca22 |
rev | line source |
---|---|
1598 | 1 /* |
1599 | 2 * xmpp_helper.c -- Jabber protocol helper functions |
1598 | 3 * |
1901
84bb3e893586
Update some file headers
Mikael Berthe <mikael@lilotux.net>
parents:
1896
diff
changeset
|
4 * Copyright (C) 2008-2010 Frank Zschockelt <mcabber@freakysoft.de> |
84bb3e893586
Update some file headers
Mikael Berthe <mikael@lilotux.net>
parents:
1896
diff
changeset
|
5 * Copyright (C) 2005-2010 Mikael Berthe <mikael@lilotux.net> |
1598 | 6 * |
7 * This program is free software; you can redistribute it and/or modify | |
8 * it under the terms of the GNU General Public License as published by | |
9 * the Free Software Foundation; either version 2 of the License, or (at | |
10 * your option) any later version. | |
11 * | |
12 * This program is distributed in the hope that it will be useful, but | |
13 * WITHOUT ANY WARRANTY; without even the implied warranty of | |
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
15 * General Public License for more details. | |
16 * | |
17 * You should have received a copy of the GNU General Public License | |
18 * along with this program; if not, write to the Free Software | |
19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 | |
20 * USA | |
21 */ | |
22 | |
1604
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
23 #include <string.h> |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
24 #include <stdlib.h> |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
25 |
1598 | 26 #include "xmpp_helper.h" |
1604
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
27 #include "settings.h" |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
28 #include "utils.h" |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
29 #include "caps.h" |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
30 #include "logprint.h" |
1607 | 31 #include "config.h" |
1598 | 32 |
33 time_t iqlast; // last message/status change time | |
34 | |
1604
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
35 extern char *imstatus_showmap[]; |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
36 |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
37 struct xmpp_error xmpp_errors[] = { |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
38 {XMPP_ERROR_REDIRECT, "302", |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
39 "Redirect", "redirect", "modify"}, |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
40 {XMPP_ERROR_BAD_REQUEST, "400", |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
41 "Bad Request", "bad-request", "modify"}, |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
42 {XMPP_ERROR_NOT_AUTHORIZED, "401", |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
43 "Not Authorized", "not-authorized", "auth"}, |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
44 {XMPP_ERROR_PAYMENT_REQUIRED, "402", |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
45 "Payment Required", "payment-required", "auth"}, |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
46 {XMPP_ERROR_FORBIDDEN, "403", |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
47 "Forbidden", "forbidden", "auth"}, |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
48 {XMPP_ERROR_NOT_FOUND, "404", |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
49 "Not Found", "item-not-found", "cancel"}, |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
50 {XMPP_ERROR_NOT_ALLOWED, "405", |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
51 "Not Allowed", "not-allowed", "cancel"}, |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
52 {XMPP_ERROR_NOT_ACCEPTABLE, "406", |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
53 "Not Acceptable", "not-acceptable", "modify"}, |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
54 {XMPP_ERROR_REGISTRATION_REQUIRED, "407", |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
55 "Registration required", "registration-required", "auth"}, |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
56 {XMPP_ERROR_REQUEST_TIMEOUT, "408", |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
57 "Request Timeout", "remote-server-timeout", "wait"}, |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
58 {XMPP_ERROR_CONFLICT, "409", |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
59 "Conflict", "conflict", "cancel"}, |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
60 {XMPP_ERROR_INTERNAL_SERVER_ERROR, "500", |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
61 "Internal Server Error", "internal-server-error", "wait"}, |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
62 {XMPP_ERROR_NOT_IMPLEMENTED, "501", |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
63 "Not Implemented", "feature-not-implemented", "cancel"}, |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
64 {XMPP_ERROR_REMOTE_SERVER_ERROR, "502", |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
65 "Remote Server Error", "service-unavailable", "wait"}, |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
66 {XMPP_ERROR_SERVICE_UNAVAILABLE, "503", |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
67 "Service Unavailable", "service-unavailable", "cancel"}, |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
68 {XMPP_ERROR_REMOTE_SERVER_TIMEOUT, "504", |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
69 "Remote Server Timeout", "remote-server-timeout", "wait"}, |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
70 {XMPP_ERROR_DISCONNECTED, "510", |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
71 "Disconnected", "service-unavailable", "cancel"}, |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
72 {0, NULL, NULL, NULL, NULL} |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
73 }; |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
74 |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
75 |
1607 | 76 #ifdef MODULES_ENABLE |
77 static GSList *xmpp_additional_features = NULL; | |
78 static char *ver, *ver_notavail; | |
79 | |
1857
189c2a5a4e66
Fix coding style in xmpp_helper
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1811
diff
changeset
|
80 void xmpp_add_feature(const char *xmlns) |
1607 | 81 { |
82 if (xmlns) { | |
83 ver = NULL; | |
84 ver_notavail = NULL; | |
85 xmpp_additional_features = g_slist_append(xmpp_additional_features, | |
1857
189c2a5a4e66
Fix coding style in xmpp_helper
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1811
diff
changeset
|
86 g_strdup(xmlns)); |
1607 | 87 } |
88 } | |
89 | |
1857
189c2a5a4e66
Fix coding style in xmpp_helper
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1811
diff
changeset
|
90 void xmpp_del_feature(const char *xmlns) |
1607 | 91 { |
92 GSList *feature = xmpp_additional_features; | |
93 while (feature) { | |
94 if (!strcmp(feature->data, xmlns)) { | |
95 ver = NULL; | |
96 ver_notavail = NULL; | |
1857
189c2a5a4e66
Fix coding style in xmpp_helper
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1811
diff
changeset
|
97 g_free(feature->data); |
1607 | 98 xmpp_additional_features = g_slist_delete_link(xmpp_additional_features, |
99 feature); | |
100 return; | |
101 } | |
1857
189c2a5a4e66
Fix coding style in xmpp_helper
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1811
diff
changeset
|
102 feature = g_slist_next(feature); |
1607 | 103 } |
104 } | |
105 #endif | |
106 | |
1598 | 107 const gchar* lm_message_node_get_child_value(LmMessageNode *node, |
108 const gchar *child) | |
109 { | |
110 LmMessageNode *tmp; | |
111 tmp = lm_message_node_find_child(node, child); | |
1896
c5ab9cf3819a
[MUC] Fix handling of empty room topic
Mikael Berthe <mikael@lilotux.net>
parents:
1857
diff
changeset
|
112 if (tmp) { |
c5ab9cf3819a
[MUC] Fix handling of empty room topic
Mikael Berthe <mikael@lilotux.net>
parents:
1857
diff
changeset
|
113 const gchar *val = lm_message_node_get_value(tmp); |
c5ab9cf3819a
[MUC] Fix handling of empty room topic
Mikael Berthe <mikael@lilotux.net>
parents:
1857
diff
changeset
|
114 return (val ? val : ""); |
c5ab9cf3819a
[MUC] Fix handling of empty room topic
Mikael Berthe <mikael@lilotux.net>
parents:
1857
diff
changeset
|
115 } |
c5ab9cf3819a
[MUC] Fix handling of empty room topic
Mikael Berthe <mikael@lilotux.net>
parents:
1857
diff
changeset
|
116 return NULL; |
1598 | 117 } |
118 | |
119 static LmMessageNode *hidden = NULL; | |
120 | |
121 void lm_message_node_hide(LmMessageNode *node) | |
122 { | |
123 LmMessageNode *parent = node->parent, *prev_sibling = node->prev; | |
124 | |
125 if (hidden) { | |
126 hidden->children = hidden->next = hidden->prev = hidden->parent = NULL; | |
127 lm_message_node_unref(hidden); | |
128 } | |
129 | |
130 if (parent->children == node) | |
131 parent->children = node->next; | |
132 if (prev_sibling) | |
133 prev_sibling->next = node->next; | |
134 if (node->next) | |
135 node->next->prev = prev_sibling; | |
136 } | |
137 | |
1729
e6e89b1d7831
Minor style and header updates
Mikael Berthe <mikael@lilotux.net>
parents:
1704
diff
changeset
|
138 // Maybe not a good idea, because it uses internals of loudmouth... |
e6e89b1d7831
Minor style and header updates
Mikael Berthe <mikael@lilotux.net>
parents:
1704
diff
changeset
|
139 // It's used for rosternotes/bookmarks |
1598 | 140 LmMessageNode *lm_message_node_new(const gchar *name, const gchar *xmlns) |
141 { | |
142 LmMessageNode *node; | |
143 | |
144 node = g_new0 (LmMessageNode, 1); | |
145 node->name = g_strdup (name); | |
146 node->value = NULL; | |
147 node->raw_mode = FALSE; | |
148 node->attributes = NULL; | |
149 node->next = NULL; | |
150 node->prev = NULL; | |
151 node->parent = NULL; | |
152 node->children = NULL; | |
153 | |
154 node->ref_count = 1; | |
155 lm_message_node_set_attribute(node, "xmlns", xmlns); | |
156 return node; | |
157 } | |
158 | |
159 void lm_message_node_insert_childnode(LmMessageNode *node, | |
160 LmMessageNode *child) | |
161 { | |
162 LmMessageNode *x; | |
163 lm_message_node_deep_ref(child); | |
164 | |
165 if (node->children == NULL) | |
166 node->children = child; | |
167 else { | |
168 for (x = node->children; x->next; x = x->next) | |
169 ; | |
170 x->next = child; | |
171 } | |
172 } | |
173 | |
174 void lm_message_node_deep_ref(LmMessageNode *node) | |
175 { | |
176 if (node == NULL) | |
177 return; | |
178 lm_message_node_ref(node); | |
179 lm_message_node_deep_ref(node->next); | |
180 lm_message_node_deep_ref(node->children); | |
181 } | |
182 | |
183 const gchar* lm_message_get_from(LmMessage *m) | |
184 { | |
185 return lm_message_node_get_attribute(m->node, "from"); | |
186 } | |
187 | |
188 const gchar* lm_message_get_id(LmMessage *m) | |
189 { | |
190 return lm_message_node_get_attribute(m->node, "id"); | |
191 } | |
192 | |
1604
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
193 LmMessage *lm_message_new_iq_from_query(LmMessage *m, |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
194 LmMessageSubType type) |
1598 | 195 { |
196 LmMessage *new; | |
197 const char *from = lm_message_node_get_attribute(m->node, "from"); | |
198 const char *id = lm_message_node_get_attribute(m->node, "id"); | |
199 | |
200 new = lm_message_new_with_sub_type(from, LM_MESSAGE_TYPE_IQ, | |
201 type); | |
202 if (id) | |
203 lm_message_node_set_attribute(new->node, "id", id); | |
204 | |
205 return new; | |
206 } | |
207 | |
1600 | 208 // entity_version(enum imstatus status) |
1598 | 209 // Return a static version string for Entity Capabilities. |
210 // It should be specific to the client version, please change the id | |
211 // if you alter mcabber's disco support (or add something to the version | |
212 // number) so that it doesn't conflict with the official client. | |
1600 | 213 const char *entity_version(enum imstatus status) |
1598 | 214 { |
1607 | 215 #ifndef MODULES_ENABLE |
1600 | 216 static char *ver, *ver_notavail; |
1607 | 217 #endif |
1598 | 218 |
1600 | 219 if (ver && (status != notavail)) |
1598 | 220 return ver; |
1600 | 221 if (ver_notavail) |
222 return ver_notavail; | |
1598 | 223 |
1600 | 224 caps_add(""); |
225 caps_set_identity("", "client", PACKAGE_STRING, "pc"); | |
226 caps_add_feature("", NS_DISCO_INFO); | |
227 caps_add_feature("", NS_MUC); | |
228 // advertise ChatStates only if they aren't disabled | |
229 if (!settings_opt_get_int("disable_chatstates")) | |
1857
189c2a5a4e66
Fix coding style in xmpp_helper
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1811
diff
changeset
|
230 caps_add_feature("", NS_CHATSTATES); |
1600 | 231 caps_add_feature("", NS_TIME); |
232 caps_add_feature("", NS_XMPP_TIME); | |
233 caps_add_feature("", NS_VERSION); | |
234 caps_add_feature("", NS_PING); | |
235 caps_add_feature("", NS_COMMANDS); | |
1602 | 236 caps_add_feature("", NS_RECEIPTS); |
1951
1a01a7ef4e43
Add support for XEP-0249 / Direct MUC Invitations (Myhailo Danylenko)
Mikael Berthe <mikael@lilotux.net>
parents:
1901
diff
changeset
|
237 caps_add_feature("", NS_X_CONFERENCE); |
1600 | 238 if (!settings_opt_get_int("iq_last_disable") && |
239 (!settings_opt_get_int("iq_last_disable_when_notavail") || | |
240 status != notavail)) | |
1857
189c2a5a4e66
Fix coding style in xmpp_helper
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1811
diff
changeset
|
241 caps_add_feature("", NS_LAST); |
1607 | 242 #ifdef MODULES_ENABLE |
243 { | |
244 GSList *el = xmpp_additional_features; | |
245 while (el) { | |
246 caps_add_feature("", el->data); | |
1857
189c2a5a4e66
Fix coding style in xmpp_helper
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1811
diff
changeset
|
247 el = g_slist_next(el); |
1607 | 248 } |
249 } | |
250 #endif | |
1598 | 251 |
1600 | 252 if (status == notavail) { |
253 ver_notavail = caps_generate(); | |
254 return ver_notavail; | |
255 } | |
256 | |
257 ver = caps_generate(); | |
1598 | 258 return ver; |
259 } | |
260 | |
1604
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
261 LmMessageNode *lm_message_node_find_xmlns(LmMessageNode *node, |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
262 const char *xmlns) |
1598 | 263 { |
264 LmMessageNode *x; | |
265 const char *p; | |
266 | |
267 for (x = node->children ; x; x = x->next) { | |
268 if ((p = lm_message_node_get_attribute(x, "xmlns")) && !strcmp(p, xmlns)) | |
269 break; | |
270 } | |
271 return x; | |
272 } | |
273 | |
1604
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
274 time_t lm_message_node_get_timestamp(LmMessageNode *node) |
1598 | 275 { |
276 LmMessageNode *x; | |
277 const char *p; | |
278 | |
279 x = lm_message_node_find_xmlns(node, NS_XMPP_DELAY); | |
280 if (x && (!strcmp(x->name, "delay")) && | |
281 (p = lm_message_node_get_attribute(x, "stamp")) != NULL) | |
282 return from_iso8601(p, 1); | |
283 x = lm_message_node_find_xmlns(node, NS_DELAY); | |
284 if (x && (p = lm_message_node_get_attribute(x, "stamp")) != NULL) | |
285 return from_iso8601(p, 1); | |
286 return 0; | |
287 } | |
288 | |
289 // lm_message_new_presence(status, recipient, message) | |
290 // Create an xmlnode with default presence attributes | |
291 // Note: the caller must free the node after use | |
1604
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
292 LmMessage *lm_message_new_presence(enum imstatus st, |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
293 const char *recipient, |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
294 const char *msg) |
1598 | 295 { |
296 unsigned int prio; | |
297 LmMessage *x = lm_message_new(recipient, LM_MESSAGE_TYPE_PRESENCE); | |
298 | |
299 switch(st) { | |
300 case away: | |
301 case notavail: | |
302 case dontdisturb: | |
303 case freeforchat: | |
304 lm_message_node_add_child(x->node, "show", imstatus_showmap[st]); | |
305 break; | |
306 | |
1972
45f0f0f60656
Remove deprecated status invisible
Mikael Berthe <mikael@lilotux.net>
parents:
1951
diff
changeset
|
307 #ifdef WITH_DEPRECATED_STATUS_INVISIBLE |
1598 | 308 case invisible: |
309 lm_message_node_set_attribute(x->node, "type", "invisible"); | |
310 break; | |
1972
45f0f0f60656
Remove deprecated status invisible
Mikael Berthe <mikael@lilotux.net>
parents:
1951
diff
changeset
|
311 #endif |
1598 | 312 |
313 case offline: | |
314 lm_message_node_set_attribute(x->node, "type", "unavailable"); | |
315 break; | |
316 | |
317 default: | |
318 break; | |
319 } | |
320 | |
321 if (st == away || st == notavail) | |
322 prio = settings_opt_get_int("priority_away"); | |
323 else | |
324 prio = settings_opt_get_int("priority"); | |
325 | |
326 if (prio) { | |
327 char strprio[8]; | |
328 snprintf(strprio, 8, "%d", (int)prio); | |
329 lm_message_node_add_child(x->node, "priority", strprio); | |
330 } | |
331 | |
332 if (msg) | |
333 lm_message_node_add_child(x->node, "status", msg); | |
334 | |
335 return x; | |
336 } | |
337 | |
338 static const char *defaulterrormsg(guint code) | |
339 { | |
1604
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
340 int i; |
1598 | 341 |
342 for (i = 0; xmpp_errors[i].code; ++i) { | |
343 if (xmpp_errors[i].code == code) | |
344 return xmpp_errors[i].meaning; | |
345 } | |
346 return NULL; | |
347 } | |
348 | |
349 // display_server_error(x) | |
350 // Display the error to the user | |
351 // x: error tag xmlnode pointer | |
1800
d2747442918a
When displaying a server error, show the sender JID
Mikael Berthe <mikael@lilotux.net>
parents:
1729
diff
changeset
|
352 void display_server_error(LmMessageNode *x, const char *from) |
1598 | 353 { |
1800
d2747442918a
When displaying a server error, show the sender JID
Mikael Berthe <mikael@lilotux.net>
parents:
1729
diff
changeset
|
354 const char *desc = NULL, *errname = NULL, *s; |
1598 | 355 char *sdesc, *tmp; |
356 | |
357 if (!x) return; | |
358 | |
359 /* RFC3920: | |
360 * The <error/> element: | |
361 * o MUST contain a child element corresponding to one of the defined | |
362 * stanza error conditions specified below; this element MUST be | |
363 * qualified by the 'urn:ietf:params:xml:ns:xmpp-stanzas' namespace. | |
364 */ | |
365 if (x->children) | |
1704
ab502d645378
Update display_server_error()
Mikael Berthe <mikael@lilotux.net>
parents:
1697
diff
changeset
|
366 errname = x->children->name; |
1800
d2747442918a
When displaying a server error, show the sender JID
Mikael Berthe <mikael@lilotux.net>
parents:
1729
diff
changeset
|
367 |
d2747442918a
When displaying a server error, show the sender JID
Mikael Berthe <mikael@lilotux.net>
parents:
1729
diff
changeset
|
368 if (from) |
d2747442918a
When displaying a server error, show the sender JID
Mikael Berthe <mikael@lilotux.net>
parents:
1729
diff
changeset
|
369 scr_LogPrint(LPRINT_LOGNORM, "Received error packet [%s] from <%s>", |
d2747442918a
When displaying a server error, show the sender JID
Mikael Berthe <mikael@lilotux.net>
parents:
1729
diff
changeset
|
370 (errname ? errname : ""), from); |
d2747442918a
When displaying a server error, show the sender JID
Mikael Berthe <mikael@lilotux.net>
parents:
1729
diff
changeset
|
371 else |
d2747442918a
When displaying a server error, show the sender JID
Mikael Berthe <mikael@lilotux.net>
parents:
1729
diff
changeset
|
372 scr_LogPrint(LPRINT_LOGNORM, "Received error packet [%s]", |
d2747442918a
When displaying a server error, show the sender JID
Mikael Berthe <mikael@lilotux.net>
parents:
1729
diff
changeset
|
373 (errname ? errname : "")); |
1598 | 374 |
375 // For backward compatibility | |
1704
ab502d645378
Update display_server_error()
Mikael Berthe <mikael@lilotux.net>
parents:
1697
diff
changeset
|
376 if (!errname && ((s = lm_message_node_get_attribute(x, "code")) != NULL)) { |
1598 | 377 // Default message |
1704
ab502d645378
Update display_server_error()
Mikael Berthe <mikael@lilotux.net>
parents:
1697
diff
changeset
|
378 desc = defaulterrormsg(atoi(s)); |
1598 | 379 } |
380 | |
381 // Error tag data is better, if available | |
382 s = lm_message_node_get_value(x); | |
383 if (s && *s) desc = s; | |
384 | |
385 // And sometimes there is a text message | |
386 s = lm_message_node_get_child_value(x, "text"); | |
387 | |
388 if (s && *s) desc = s; | |
389 | |
390 // If we still have no description, let's give up | |
1704
ab502d645378
Update display_server_error()
Mikael Berthe <mikael@lilotux.net>
parents:
1697
diff
changeset
|
391 if (!desc || !*desc) |
1598 | 392 return; |
393 | |
394 // Strip trailing newlines | |
395 sdesc = g_strdup(desc); | |
396 for (tmp = sdesc; *tmp; tmp++) ; | |
397 if (tmp > sdesc) | |
398 tmp--; | |
399 while (tmp >= sdesc && (*tmp == '\n' || *tmp == '\r')) | |
400 *tmp-- = '\0'; | |
401 | |
1704
ab502d645378
Update display_server_error()
Mikael Berthe <mikael@lilotux.net>
parents:
1697
diff
changeset
|
402 if (*sdesc) |
ab502d645378
Update display_server_error()
Mikael Berthe <mikael@lilotux.net>
parents:
1697
diff
changeset
|
403 scr_LogPrint(LPRINT_LOGNORM, "Error message from server: %s", sdesc); |
1598 | 404 g_free(sdesc); |
405 } | |
406 | |
1811 | 407 /* vim: set et cindent cinoptions=>2\:2(0 ts=2 sw=2: For Vim users... */ |