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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
1 /*
1599
dcd5d4c75199 Update/Add headers
Mikael Berthe <mikael@lilotux.net>
parents: 1598
diff changeset
2 * xmpp_helper.c -- Jabber protocol helper functions
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
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
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
6 *
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
7 * This program is free software; you can redistribute it and/or modify
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
8 * it under the terms of the GNU General Public License as published by
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
9 * the Free Software Foundation; either version 2 of the License, or (at
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
10 * your option) any later version.
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
11 *
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
12 * This program is distributed in the hope that it will be useful, but
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
13 * WITHOUT ANY WARRANTY; without even the implied warranty of
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
15 * General Public License for more details.
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
16 *
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
17 * You should have received a copy of the GNU General Public License
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
18 * along with this program; if not, write to the Free Software
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
20 * USA
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
21 */
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
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
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
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
14690e624e9d Add modules
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1604
diff changeset
31 #include "config.h"
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
32
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
33 time_t iqlast; // last message/status change time
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
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
14690e624e9d Add modules
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1604
diff changeset
76 #ifdef MODULES_ENABLE
14690e624e9d Add modules
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1604
diff changeset
77 static GSList *xmpp_additional_features = NULL;
14690e624e9d Add modules
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1604
diff changeset
78 static char *ver, *ver_notavail;
14690e624e9d Add modules
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1604
diff changeset
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
14690e624e9d Add modules
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1604
diff changeset
81 {
14690e624e9d Add modules
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1604
diff changeset
82 if (xmlns) {
14690e624e9d Add modules
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1604
diff changeset
83 ver = NULL;
14690e624e9d Add modules
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1604
diff changeset
84 ver_notavail = NULL;
14690e624e9d Add modules
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1604
diff changeset
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
14690e624e9d Add modules
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1604
diff changeset
87 }
14690e624e9d Add modules
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1604
diff changeset
88 }
14690e624e9d Add modules
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1604
diff changeset
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
14690e624e9d Add modules
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1604
diff changeset
91 {
14690e624e9d Add modules
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1604
diff changeset
92 GSList *feature = xmpp_additional_features;
14690e624e9d Add modules
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1604
diff changeset
93 while (feature) {
14690e624e9d Add modules
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1604
diff changeset
94 if (!strcmp(feature->data, xmlns)) {
14690e624e9d Add modules
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1604
diff changeset
95 ver = NULL;
14690e624e9d Add modules
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1604
diff changeset
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
14690e624e9d Add modules
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1604
diff changeset
98 xmpp_additional_features = g_slist_delete_link(xmpp_additional_features,
14690e624e9d Add modules
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1604
diff changeset
99 feature);
14690e624e9d Add modules
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1604
diff changeset
100 return;
14690e624e9d Add modules
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1604
diff changeset
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
14690e624e9d Add modules
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1604
diff changeset
103 }
14690e624e9d Add modules
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1604
diff changeset
104 }
14690e624e9d Add modules
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1604
diff changeset
105 #endif
14690e624e9d Add modules
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1604
diff changeset
106
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
107 const gchar* lm_message_node_get_child_value(LmMessageNode *node,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
108 const gchar *child)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
109 {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
110 LmMessageNode *tmp;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
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
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
117 }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
118
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
119 static LmMessageNode *hidden = NULL;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
120
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
121 void lm_message_node_hide(LmMessageNode *node)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
122 {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
123 LmMessageNode *parent = node->parent, *prev_sibling = node->prev;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
124
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
125 if (hidden) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
126 hidden->children = hidden->next = hidden->prev = hidden->parent = NULL;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
127 lm_message_node_unref(hidden);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
128 }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
129
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
130 if (parent->children == node)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
131 parent->children = node->next;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
132 if (prev_sibling)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
133 prev_sibling->next = node->next;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
134 if (node->next)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
135 node->next->prev = prev_sibling;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
136 }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
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
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
140 LmMessageNode *lm_message_node_new(const gchar *name, const gchar *xmlns)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
141 {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
142 LmMessageNode *node;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
143
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
144 node = g_new0 (LmMessageNode, 1);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
145 node->name = g_strdup (name);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
146 node->value = NULL;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
147 node->raw_mode = FALSE;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
148 node->attributes = NULL;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
149 node->next = NULL;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
150 node->prev = NULL;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
151 node->parent = NULL;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
152 node->children = NULL;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
153
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
154 node->ref_count = 1;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
155 lm_message_node_set_attribute(node, "xmlns", xmlns);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
156 return node;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
157 }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
158
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
159 void lm_message_node_insert_childnode(LmMessageNode *node,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
160 LmMessageNode *child)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
161 {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
162 LmMessageNode *x;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
163 lm_message_node_deep_ref(child);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
164
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
165 if (node->children == NULL)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
166 node->children = child;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
167 else {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
168 for (x = node->children; x->next; x = x->next)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
169 ;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
170 x->next = child;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
171 }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
172 }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
173
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
174 void lm_message_node_deep_ref(LmMessageNode *node)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
175 {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
176 if (node == NULL)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
177 return;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
178 lm_message_node_ref(node);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
179 lm_message_node_deep_ref(node->next);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
180 lm_message_node_deep_ref(node->children);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
181 }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
182
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
183 const gchar* lm_message_get_from(LmMessage *m)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
184 {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
185 return lm_message_node_get_attribute(m->node, "from");
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
186 }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
187
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
188 const gchar* lm_message_get_id(LmMessage *m)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
189 {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
190 return lm_message_node_get_attribute(m->node, "id");
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
191 }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
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
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
195 {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
196 LmMessage *new;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
197 const char *from = lm_message_node_get_attribute(m->node, "from");
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
198 const char *id = lm_message_node_get_attribute(m->node, "id");
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
199
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
200 new = lm_message_new_with_sub_type(from, LM_MESSAGE_TYPE_IQ,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
201 type);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
202 if (id)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
203 lm_message_node_set_attribute(new->node, "id", id);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
204
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
205 return new;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
206 }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
207
1600
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
208 // entity_version(enum imstatus status)
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
209 // Return a static version string for Entity Capabilities.
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
210 // It should be specific to the client version, please change the id
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
211 // if you alter mcabber's disco support (or add something to the version
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
212 // number) so that it doesn't conflict with the official client.
1600
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
213 const char *entity_version(enum imstatus status)
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
214 {
1607
14690e624e9d Add modules
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1604
diff changeset
215 #ifndef MODULES_ENABLE
1600
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
216 static char *ver, *ver_notavail;
1607
14690e624e9d Add modules
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1604
diff changeset
217 #endif
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
218
1600
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
219 if (ver && (status != notavail))
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
220 return ver;
1600
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
221 if (ver_notavail)
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
222 return ver_notavail;
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
223
1600
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
224 caps_add("");
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
225 caps_set_identity("", "client", PACKAGE_STRING, "pc");
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
226 caps_add_feature("", NS_DISCO_INFO);
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
227 caps_add_feature("", NS_MUC);
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
228 // advertise ChatStates only if they aren't disabled
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
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
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
231 caps_add_feature("", NS_TIME);
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
232 caps_add_feature("", NS_XMPP_TIME);
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
233 caps_add_feature("", NS_VERSION);
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
234 caps_add_feature("", NS_PING);
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
235 caps_add_feature("", NS_COMMANDS);
1602
f4a2c6f767d1 Message Receipts support (XEP-0184)
franky
parents: 1600
diff changeset
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
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
238 if (!settings_opt_get_int("iq_last_disable") &&
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
239 (!settings_opt_get_int("iq_last_disable_when_notavail") ||
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
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
14690e624e9d Add modules
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1604
diff changeset
242 #ifdef MODULES_ENABLE
14690e624e9d Add modules
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1604
diff changeset
243 {
14690e624e9d Add modules
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1604
diff changeset
244 GSList *el = xmpp_additional_features;
14690e624e9d Add modules
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1604
diff changeset
245 while (el) {
14690e624e9d Add modules
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1604
diff changeset
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
14690e624e9d Add modules
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1604
diff changeset
248 }
14690e624e9d Add modules
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1604
diff changeset
249 }
14690e624e9d Add modules
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1604
diff changeset
250 #endif
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
251
1600
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
252 if (status == notavail) {
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
253 ver_notavail = caps_generate();
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
254 return ver_notavail;
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
255 }
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
256
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
257 ver = caps_generate();
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
258 return ver;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
259 }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
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
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
263 {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
264 LmMessageNode *x;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
265 const char *p;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
266
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
267 for (x = node->children ; x; x = x->next) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
268 if ((p = lm_message_node_get_attribute(x, "xmlns")) && !strcmp(p, xmlns))
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
269 break;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
270 }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
271 return x;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
272 }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
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
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
275 {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
276 LmMessageNode *x;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
277 const char *p;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
278
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
279 x = lm_message_node_find_xmlns(node, NS_XMPP_DELAY);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
280 if (x && (!strcmp(x->name, "delay")) &&
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
281 (p = lm_message_node_get_attribute(x, "stamp")) != NULL)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
282 return from_iso8601(p, 1);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
283 x = lm_message_node_find_xmlns(node, NS_DELAY);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
284 if (x && (p = lm_message_node_get_attribute(x, "stamp")) != NULL)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
285 return from_iso8601(p, 1);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
286 return 0;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
287 }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
288
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
289 // lm_message_new_presence(status, recipient, message)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
290 // Create an xmlnode with default presence attributes
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
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
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
295 {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
296 unsigned int prio;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
297 LmMessage *x = lm_message_new(recipient, LM_MESSAGE_TYPE_PRESENCE);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
298
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
299 switch(st) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
300 case away:
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
301 case notavail:
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
302 case dontdisturb:
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
303 case freeforchat:
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
304 lm_message_node_add_child(x->node, "show", imstatus_showmap[st]);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
305 break;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
306
1972
45f0f0f60656 Remove deprecated status invisible
Mikael Berthe <mikael@lilotux.net>
parents: 1951
diff changeset
307 #ifdef WITH_DEPRECATED_STATUS_INVISIBLE
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
308 case invisible:
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
309 lm_message_node_set_attribute(x->node, "type", "invisible");
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
310 break;
1972
45f0f0f60656 Remove deprecated status invisible
Mikael Berthe <mikael@lilotux.net>
parents: 1951
diff changeset
311 #endif
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
312
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
313 case offline:
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
314 lm_message_node_set_attribute(x->node, "type", "unavailable");
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
315 break;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
316
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
317 default:
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
318 break;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
319 }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
320
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
321 if (st == away || st == notavail)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
322 prio = settings_opt_get_int("priority_away");
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
323 else
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
324 prio = settings_opt_get_int("priority");
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
325
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
326 if (prio) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
327 char strprio[8];
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
328 snprintf(strprio, 8, "%d", (int)prio);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
329 lm_message_node_add_child(x->node, "priority", strprio);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
330 }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
331
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
332 if (msg)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
333 lm_message_node_add_child(x->node, "status", msg);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
334
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
335 return x;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
336 }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
337
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
338 static const char *defaulterrormsg(guint code)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
339 {
1604
351427ef0b4b Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents: 1602
diff changeset
340 int i;
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
341
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
342 for (i = 0; xmpp_errors[i].code; ++i) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
343 if (xmpp_errors[i].code == code)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
344 return xmpp_errors[i].meaning;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
345 }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
346 return NULL;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
347 }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
348
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
349 // display_server_error(x)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
350 // Display the error to the user
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
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
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
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
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
355 char *sdesc, *tmp;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
356
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
357 if (!x) return;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
358
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
359 /* RFC3920:
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
360 * The <error/> element:
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
361 * o MUST contain a child element corresponding to one of the defined
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
362 * stanza error conditions specified below; this element MUST be
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
363 * qualified by the 'urn:ietf:params:xml:ns:xmpp-stanzas' namespace.
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
364 */
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
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
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
374
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
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
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
377 // Default message
1704
ab502d645378 Update display_server_error()
Mikael Berthe <mikael@lilotux.net>
parents: 1697
diff changeset
378 desc = defaulterrormsg(atoi(s));
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
379 }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
380
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
381 // Error tag data is better, if available
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
382 s = lm_message_node_get_value(x);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
383 if (s && *s) desc = s;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
384
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
385 // And sometimes there is a text message
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
386 s = lm_message_node_get_child_value(x, "text");
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
387
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
388 if (s && *s) desc = s;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
389
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
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
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
392 return;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
393
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
394 // Strip trailing newlines
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
395 sdesc = g_strdup(desc);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
396 for (tmp = sdesc; *tmp; tmp++) ;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
397 if (tmp > sdesc)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
398 tmp--;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
399 while (tmp >= sdesc && (*tmp == '\n' || *tmp == '\r'))
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
400 *tmp-- = '\0';
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
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
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
404 g_free(sdesc);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
405 }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents:
diff changeset
406
1811
e6d355e50d7a Update Vim modelines
Mikael Berthe <mikael@lilotux.net>
parents: 1800
diff changeset
407 /* vim: set et cindent cinoptions=>2\:2(0 ts=2 sw=2: For Vim users... */