Mercurial > ~mikael > mcabber > hg
annotate mcabber/mcabber/xmpp_iq.c @ 2223:965e0282c128
Backed out changeset fa516ef22145
Turns out that in this hash the value pointer is the same as the
key pointer, so there's no need to free both the key and the value.
author | Mikael Berthe <mikael@lilotux.net> |
---|---|
date | Fri, 06 Nov 2015 22:31:40 +0100 |
parents | ea90906cb691 |
children | f5402d705f67 |
rev | line source |
---|---|
1599 | 1 /* |
2 * xmpp_iq.c -- Jabber protocol IQ-related stuff | |
3 * | |
1729
e6e89b1d7831
Minor style and header updates
Mikael Berthe <mikael@lilotux.net>
parents:
1701
diff
changeset
|
4 * Copyright (C) 2008-2010 Frank Zschockelt <mcabber@freakysoft.de> |
e6e89b1d7831
Minor style and header updates
Mikael Berthe <mikael@lilotux.net>
parents:
1701
diff
changeset
|
5 * Copyright (C) 2005-2010 Mikael Berthe <mikael@lilotux.net> |
1599 | 6 * Parts come from the centericq project: |
7 * Copyright (C) 2002-2005 by Konstantin Klyagin <konst@konst.org.ua> | |
8 * Some small parts come from the Pidgin project <http://pidgin.im/> | |
9 * | |
10 * This program is free software; you can redistribute it and/or modify | |
11 * it under the terms of the GNU General Public License as published by | |
12 * the Free Software Foundation; either version 2 of the License, or (at | |
13 * your option) any later version. | |
14 * | |
15 * This program is distributed in the hope that it will be useful, but | |
16 * WITHOUT ANY WARRANTY; without even the implied warranty of | |
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
18 * General Public License for more details. | |
19 * | |
20 * You should have received a copy of the GNU General Public License | |
21 * along with this program; if not, write to the Free Software | |
22 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 | |
23 * USA | |
24 */ | |
1598 | 25 |
1604
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1600
diff
changeset
|
26 #include <string.h> |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1600
diff
changeset
|
27 #include <sys/utsname.h> |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1600
diff
changeset
|
28 |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1600
diff
changeset
|
29 #include "xmpp_helper.h" |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1600
diff
changeset
|
30 #include "commands.h" |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1600
diff
changeset
|
31 #include "screen.h" |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1600
diff
changeset
|
32 #include "utils.h" |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1600
diff
changeset
|
33 #include "logprint.h" |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1600
diff
changeset
|
34 #include "settings.h" |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1600
diff
changeset
|
35 #include "caps.h" |
1653
fca9a4c17432
Improve UI latency and CPU usage
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1652
diff
changeset
|
36 #include "main.h" |
1604
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1600
diff
changeset
|
37 |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1600
diff
changeset
|
38 extern struct xmpp_error xmpp_errors[]; |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1600
diff
changeset
|
39 |
1598 | 40 static LmHandlerResult handle_iq_command_set_status(LmMessageHandler *h, |
41 LmConnection *c, | |
42 LmMessage *m, | |
43 gpointer ud); | |
29 | 44 |
1598 | 45 static LmHandlerResult handle_iq_command_leave_groupchats(LmMessageHandler *h, |
46 LmConnection *c, | |
47 LmMessage *m, | |
48 gpointer ud); | |
29 | 49 |
1598 | 50 inline double seconds_since_last_use(void); |
29 | 51 |
1598 | 52 struct adhoc_command { |
53 char *name; | |
54 char *description; | |
55 bool only_for_self; | |
56 LmHandleMessageFunction callback; | |
1378 | 57 }; |
58 | |
1598 | 59 const struct adhoc_command adhoc_command_list[] = { |
60 { "http://jabber.org/protocol/rc#set-status", | |
61 "Change client status", | |
62 1, | |
63 &handle_iq_command_set_status }, | |
64 { "http://jabber.org/protocol/rc#leave-groupchats", | |
65 "Leave groupchat(s)", | |
66 1, | |
67 &handle_iq_command_leave_groupchats }, | |
68 { NULL, NULL, 0, NULL }, | |
69 }; | |
1383 | 70 |
1598 | 71 struct adhoc_status { |
72 char *name; // the name used by adhoc | |
73 char *description; | |
74 char *status; // the string, used by setstus | |
75 }; | |
76 // It has to match imstatus of roster.h! | |
77 const struct adhoc_status adhoc_status_list[] = { | |
78 {"offline", "Offline", "offline"}, | |
79 {"online", "Online", "avail"}, | |
80 {"chat", "Chat", "free"}, | |
81 {"dnd", "Do not disturb", "dnd"}, | |
2083
ec0a361f3ff1
Fix typo in form field value for set-status remote command
Myhailo Danylenko <isbear@ukrpost.net>
parents:
2067
diff
changeset
|
82 {"xa", "Extended away", "notavail"}, |
1598 | 83 {"away", "Away", "away"}, |
2002
a0437e179b35
Remove invisible status from remote command form
Hermitifier
parents:
1999
diff
changeset
|
84 #ifdef WITH_DEPRECATED_STATUS_INVISIBLE |
1598 | 85 {"invisible", "Invisible", "invisible"}, |
2002
a0437e179b35
Remove invisible status from remote command form
Hermitifier
parents:
1999
diff
changeset
|
86 #endif |
1598 | 87 {NULL, NULL, NULL}, |
88 }; | |
298
35cda94e570d
Add /connect and /disconnect commands
Mikael Berthe <mikael@lilotux.net>
parents:
294
diff
changeset
|
89 |
1598 | 90 static char *generate_session_id(char *prefix) |
29 | 91 { |
1598 | 92 char *result; |
93 static int counter = 0; | |
94 counter++; | |
95 // TODO better use timestamp? | |
96 result = g_strdup_printf("%s-%i", prefix, counter); | |
97 return result; | |
29 | 98 } |
99 | |
1598 | 100 static LmMessage *lm_message_new_iq_error(LmMessage *m, guint error) |
29 | 101 { |
1598 | 102 LmMessage *r; |
103 LmMessageNode *err; | |
104 int i; | |
105 | |
2210 | 106 if (G_UNLIKELY(!m)) return NULL; |
107 | |
1598 | 108 for (i = 0; xmpp_errors[i].code; ++i) |
109 if (xmpp_errors[i].code == error) | |
110 break; | |
111 g_return_val_if_fail(xmpp_errors[i].code > 0, NULL); | |
298
35cda94e570d
Add /connect and /disconnect commands
Mikael Berthe <mikael@lilotux.net>
parents:
294
diff
changeset
|
112 |
1598 | 113 r = lm_message_new_iq_from_query(m, LM_MESSAGE_SUB_TYPE_ERROR); |
114 err = lm_message_node_add_child(r->node, "error", NULL); | |
115 lm_message_node_set_attribute(err, "code", xmpp_errors[i].code_str); | |
116 lm_message_node_set_attribute(err, "type", xmpp_errors[i].type); | |
117 lm_message_node_set_attribute | |
118 (lm_message_node_add_child(err, | |
119 xmpp_errors[i].condition, NULL), | |
120 "xmlns", NS_XMPP_STANZAS); | |
634
f3c05d5fe459
Send "</stream:stream>" when disconnecting from the server
Mikael Berthe <mikael@lilotux.net>
parents:
633
diff
changeset
|
121 |
1598 | 122 return r; |
436 | 123 } |
124 | |
1604
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1600
diff
changeset
|
125 void send_iq_error(LmConnection *c, LmMessage *m, guint error) |
1001
dff25377c11f
Auto-reconnect after a network/server failure
Mikael Berthe <mikael@lilotux.net>
parents:
999
diff
changeset
|
126 { |
1598 | 127 LmMessage *r; |
128 r = lm_message_new_iq_error(m, error); | |
2210 | 129 if (r) { |
130 lm_connection_send(c, r, NULL); | |
131 lm_message_unref(r); | |
132 } | |
1001
dff25377c11f
Auto-reconnect after a network/server failure
Mikael Berthe <mikael@lilotux.net>
parents:
999
diff
changeset
|
133 } |
dff25377c11f
Auto-reconnect after a network/server failure
Mikael Berthe <mikael@lilotux.net>
parents:
999
diff
changeset
|
134 |
1598 | 135 static void lm_message_node_add_dataform_result(LmMessageNode *node, |
136 const char *message) | |
29 | 137 { |
1598 | 138 LmMessageNode *x, *field; |
939
12fa2ae6445d
Get rid of "busy-waiting" (Christof Meerwald)
Mikael Berthe <mikael@lilotux.net>
parents:
924
diff
changeset
|
139 |
1598 | 140 x = lm_message_node_add_child(node, "x", NULL); |
141 lm_message_node_set_attributes(x, | |
142 "type", "result", | |
143 "xmlns", "jabber:x:data", | |
144 NULL); | |
145 field = lm_message_node_add_child(x, "field", NULL); | |
146 lm_message_node_set_attributes(field, | |
147 "type", "text-single", | |
148 "var", "message", | |
149 NULL); | |
150 lm_message_node_add_child(field, "value", message); | |
151 } | |
1439
fd09c95bc2b5
Wake up less often when not connected to the server
Mikael Berthe <mikael@lilotux.net>
parents:
1435
diff
changeset
|
152 |
1701
44e023ad99ed
Add dummy handler for roster manipulation IQ responses
Mikael Berthe <mikael@lilotux.net>
parents:
1668
diff
changeset
|
153 // Dummy handler to ignore IQ response |
44e023ad99ed
Add dummy handler for roster manipulation IQ responses
Mikael Berthe <mikael@lilotux.net>
parents:
1668
diff
changeset
|
154 LmHandlerResult handle_iq_dummy(LmMessageHandler *h, LmConnection *c, |
44e023ad99ed
Add dummy handler for roster manipulation IQ responses
Mikael Berthe <mikael@lilotux.net>
parents:
1668
diff
changeset
|
155 LmMessage *m, gpointer ud) |
44e023ad99ed
Add dummy handler for roster manipulation IQ responses
Mikael Berthe <mikael@lilotux.net>
parents:
1668
diff
changeset
|
156 { |
44e023ad99ed
Add dummy handler for roster manipulation IQ responses
Mikael Berthe <mikael@lilotux.net>
parents:
1668
diff
changeset
|
157 LmMessageSubType mstype = lm_message_get_sub_type(m); |
44e023ad99ed
Add dummy handler for roster manipulation IQ responses
Mikael Berthe <mikael@lilotux.net>
parents:
1668
diff
changeset
|
158 if (mstype == LM_MESSAGE_SUB_TYPE_ERROR) { |
1800
d2747442918a
When displaying a server error, show the sender JID
Mikael Berthe <mikael@lilotux.net>
parents:
1780
diff
changeset
|
159 display_server_error(lm_message_node_get_child(m->node, "error"), |
d2747442918a
When displaying a server error, show the sender JID
Mikael Berthe <mikael@lilotux.net>
parents:
1780
diff
changeset
|
160 lm_message_get_from(m)); |
1701
44e023ad99ed
Add dummy handler for roster manipulation IQ responses
Mikael Berthe <mikael@lilotux.net>
parents:
1668
diff
changeset
|
161 } |
44e023ad99ed
Add dummy handler for roster manipulation IQ responses
Mikael Berthe <mikael@lilotux.net>
parents:
1668
diff
changeset
|
162 return LM_HANDLER_RESULT_REMOVE_MESSAGE; |
44e023ad99ed
Add dummy handler for roster manipulation IQ responses
Mikael Berthe <mikael@lilotux.net>
parents:
1668
diff
changeset
|
163 } |
44e023ad99ed
Add dummy handler for roster manipulation IQ responses
Mikael Berthe <mikael@lilotux.net>
parents:
1668
diff
changeset
|
164 |
1598 | 165 static LmHandlerResult handle_iq_commands_list(LmMessageHandler *h, |
166 LmConnection *c, | |
167 LmMessage *m, gpointer ud) | |
168 { | |
169 LmMessage *iq; | |
170 LmMessageNode *query; | |
171 const char *requester_jid; | |
172 const struct adhoc_command *command; | |
173 const char *node; | |
174 gboolean from_self; | |
940 | 175 |
1598 | 176 iq = lm_message_new_iq_from_query(m, LM_MESSAGE_SUB_TYPE_RESULT); |
177 query = lm_message_node_add_child(iq->node, "query", NULL); | |
1667
8af0e0ad20ad
Fix some more xmlns attributes in IQ responses
Mikael Berthe <mikael@lilotux.net>
parents:
1666
diff
changeset
|
178 lm_message_node_set_attribute(query, "xmlns", NS_COMMANDS); |
1598 | 179 node = lm_message_node_get_attribute |
180 (lm_message_node_get_child(m->node, "query"), | |
181 "node"); | |
182 if (node) | |
183 lm_message_node_set_attribute(query, "node", node); | |
29 | 184 |
1598 | 185 requester_jid = lm_message_get_from(m); |
186 from_self = jid_equal(lm_connection_get_jid(c), requester_jid); | |
686
98de2d166a11
Use the new IQ system for authentication
Mikael Berthe <mikael@lilotux.net>
parents:
684
diff
changeset
|
187 |
1598 | 188 for (command = adhoc_command_list ; command->name ; command++) { |
189 if (!command->only_for_self || from_self) { | |
190 lm_message_node_set_attributes | |
191 (lm_message_node_add_child(query, "item", NULL), | |
192 "node", command->name, | |
193 "name", command->description, | |
194 "jid", lm_connection_get_jid(c), | |
195 NULL); | |
29 | 196 } |
197 } | |
198 | |
1598 | 199 lm_connection_send(c, iq, NULL); |
200 lm_message_unref(iq); | |
201 return LM_HANDLER_RESULT_REMOVE_MESSAGE; | |
534 | 202 } |
203 | |
1598 | 204 static LmHandlerResult handle_iq_command_set_status(LmMessageHandler *h, |
205 LmConnection *c, | |
206 LmMessage *m, gpointer ud) | |
988
6e2bfd1ffded
Add ids to message stanzas if needed
Mikael Berthe <mikael@lilotux.net>
parents:
987
diff
changeset
|
207 { |
1598 | 208 const char *action, *node; |
209 char *sessionid; | |
210 LmMessage *iq; | |
211 LmMessageNode *command, *x, *y; | |
212 const struct adhoc_status *s; | |
213 | |
214 x = lm_message_node_get_child(m->node, "command"); | |
215 action = lm_message_node_get_attribute(x, "action"); | |
216 node = lm_message_node_get_attribute(x, "node"); | |
217 sessionid = (char *)lm_message_node_get_attribute(x, "sessionid"); | |
218 | |
219 iq = lm_message_new_iq_from_query(m, LM_MESSAGE_SUB_TYPE_RESULT); | |
220 command = lm_message_node_add_child(iq->node, "command", NULL); | |
221 lm_message_node_set_attribute(command, "node", node); | |
222 lm_message_node_set_attribute(command, "xmlns", NS_COMMANDS); | |
223 | |
224 if (!sessionid) { | |
225 sessionid = generate_session_id("set-status"); | |
226 lm_message_node_set_attribute(command, "sessionid", sessionid); | |
227 g_free(sessionid); | |
228 sessionid = NULL; | |
229 lm_message_node_set_attribute(command, "status", "executing"); | |
988
6e2bfd1ffded
Add ids to message stanzas if needed
Mikael Berthe <mikael@lilotux.net>
parents:
987
diff
changeset
|
230 |
1598 | 231 x = lm_message_node_add_child(command, "x", NULL); |
232 lm_message_node_set_attribute(x, "type", "form"); | |
233 lm_message_node_set_attribute(x, "xmlns", "jabber:x:data"); | |
234 | |
235 lm_message_node_add_child(x, "title", "Change Status"); | |
236 | |
237 lm_message_node_add_child(x, "instructions", | |
238 "Choose the status and status message"); | |
447
03bb57383cea
Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents:
444
diff
changeset
|
239 |
1598 | 240 // TODO see if factorisation is possible |
241 y = lm_message_node_add_child(x, "field", NULL); | |
242 lm_message_node_set_attribute(y, "type", "hidden"); | |
243 lm_message_node_set_attribute(y, "var", "FORM_TYPE"); | |
244 | |
245 lm_message_node_add_child(y, "value", "http://jabber.org/protocol/rc"); | |
1055
6eb1efea75d0
PGP: Visual encryption flag
Mikael Berthe <mikael@lilotux.net>
parents:
1053
diff
changeset
|
246 |
1598 | 247 y = lm_message_node_add_child(x, "field", NULL); |
248 lm_message_node_set_attributes(y, | |
249 "type", "list-single", | |
250 "var", "status", | |
251 "label", "Status", | |
252 NULL); | |
253 lm_message_node_add_child(y, "required", NULL); | |
472
75442262c082
Disable some commands when not connected
Mikael Berthe <mikael@lilotux.net>
parents:
470
diff
changeset
|
254 |
1598 | 255 // XXX: ugly |
256 lm_message_node_add_child(y, "value", | |
257 adhoc_status_list[xmpp_getstatus()].name); | |
258 for (s = adhoc_status_list; s->name; s++) { | |
259 LmMessageNode *option = lm_message_node_add_child(y, "option", NULL); | |
260 lm_message_node_add_child(option, "value", s->name); | |
261 lm_message_node_set_attribute(option, "label", s->description); | |
1299
3b338a5c01fc
OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
1290
diff
changeset
|
262 } |
1598 | 263 // TODO add priority ? |
264 // I do not think this is useful, user should not have to care of the | |
265 // priority like gossip and gajim do (misc) | |
266 lm_message_node_set_attributes | |
267 (lm_message_node_add_child(x, "field", NULL), | |
268 "type", "text-multi", | |
269 "var", "status-message", | |
270 "label", "Message", | |
271 NULL); | |
272 } else if (action && !strcmp(action, "cancel")) { | |
273 lm_message_node_set_attribute(command, "status", "canceled"); | |
274 } else { // (if sessionid and not canceled) | |
275 y = lm_message_node_find_xmlns(x, "jabber:x:data"); //x?xmlns=jabber:x:data | |
276 if (y) { | |
277 const char *value=NULL, *message=NULL; | |
278 LmMessageNode *fields, *field; | |
279 field = fields = lm_message_node_get_child(y, "field"); //field?var=status | |
280 while (field && strcmp("status", | |
281 lm_message_node_get_attribute(field, "var"))) | |
282 field = field->next; | |
283 field = lm_message_node_get_child(field, "value"); | |
284 if (field) | |
285 value = lm_message_node_get_value(field); | |
286 field = fields; //field?var=status-message | |
287 while (field && strcmp("status-message", | |
288 lm_message_node_get_attribute(field, "var"))) | |
289 field = field->next; | |
290 field = lm_message_node_get_child(field, "value"); | |
291 if (field) | |
292 message = lm_message_node_get_value(field); | |
293 if (value) { | |
294 for (s = adhoc_status_list; !s->name || strcmp(s->name, value); s++); | |
295 if (s->name) { | |
296 char *status = g_strdup_printf("%s %s", s->status, | |
297 message ? message : ""); | |
298 cmd_setstatus(NULL, status); | |
299 g_free(status); | |
300 lm_message_node_set_attribute(command, "status", "completed"); | |
301 lm_message_node_add_dataform_result(command, | |
302 "Status has been changed"); | |
1197 | 303 } |
1067
a5dc85fdebde
Add key comparison for signatures & use user-provided PGP keys for encryption
Mikael Berthe <mikael@lilotux.net>
parents:
1065
diff
changeset
|
304 } |
1065
230dca34dbea
Extand pgp_data structure
Mikael Berthe <mikael@lilotux.net>
parents:
1058
diff
changeset
|
305 } |
1044
52cfe9bf9840
Encryption support for outgoing messages
Mikael Berthe <mikael@lilotux.net>
parents:
1043
diff
changeset
|
306 } |
1598 | 307 if (sessionid) |
308 lm_message_node_set_attribute(command, "sessionid", sessionid); | |
309 lm_connection_send(c, iq, NULL); | |
310 lm_message_unref(iq); | |
311 return LM_HANDLER_RESULT_REMOVE_MESSAGE; | |
312 } | |
1067
a5dc85fdebde
Add key comparison for signatures & use user-provided PGP keys for encryption
Mikael Berthe <mikael@lilotux.net>
parents:
1065
diff
changeset
|
313 |
1598 | 314 static void _callback_foreach_buddy_groupchat(gpointer rosterdata, void *param) |
315 { | |
1665
1a4890514eb9
Clean up some dead assignments/dead variables
Ulrich Spörlein
parents:
1653
diff
changeset
|
316 LmMessageNode *field, *option; |
1598 | 317 const char *room_jid, *nickname; |
318 char *desc; | |
319 | |
320 room_jid = buddy_getjid(rosterdata); | |
321 if (!room_jid) return; | |
322 nickname = buddy_getnickname(rosterdata); | |
323 if (!nickname) return; | |
324 field = param; | |
1044
52cfe9bf9840
Encryption support for outgoing messages
Mikael Berthe <mikael@lilotux.net>
parents:
1043
diff
changeset
|
325 |
1598 | 326 option = lm_message_node_add_child(field, "option", NULL); |
1665
1a4890514eb9
Clean up some dead assignments/dead variables
Ulrich Spörlein
parents:
1653
diff
changeset
|
327 lm_message_node_add_child(option, "value", room_jid); |
1598 | 328 desc = g_strdup_printf("%s on %s", nickname, room_jid); |
329 lm_message_node_set_attribute(option, "label", desc); | |
330 g_free(desc); | |
331 } | |
1044
52cfe9bf9840
Encryption support for outgoing messages
Mikael Berthe <mikael@lilotux.net>
parents:
1043
diff
changeset
|
332 |
1598 | 333 static LmHandlerResult handle_iq_command_leave_groupchats(LmMessageHandler *h, |
334 LmConnection *c, | |
335 LmMessage *m, | |
336 gpointer ud) | |
337 { | |
338 const char *action, *node; | |
339 char *sessionid; | |
340 LmMessage *iq; | |
341 LmMessageNode *command, *x; | |
1044
52cfe9bf9840
Encryption support for outgoing messages
Mikael Berthe <mikael@lilotux.net>
parents:
1043
diff
changeset
|
342 |
1598 | 343 x = lm_message_node_get_child(m->node, "command"); |
2210 | 344 if (!x) |
345 return LM_HANDLER_RESULT_REMOVE_MESSAGE; | |
346 | |
1598 | 347 action = lm_message_node_get_attribute(x, "action"); |
348 node = lm_message_node_get_attribute(x, "node"); | |
349 sessionid = (char*)lm_message_node_get_attribute(x, "sessionid"); | |
350 | |
351 iq = lm_message_new_iq_from_query(m, LM_MESSAGE_SUB_TYPE_RESULT); | |
352 command = lm_message_node_add_child(iq->node, "command", NULL); | |
353 lm_message_node_set_attributes(command, | |
354 "node", node, | |
355 "xmlns", NS_COMMANDS, | |
356 NULL); | |
357 | |
358 if (!sessionid) { | |
359 LmMessageNode *field; | |
986
ed697234bd39
Chat states receival (Alexis Hildebrandt)
Mikael Berthe <mikael@lilotux.net>
parents:
977
diff
changeset
|
360 |
1598 | 361 sessionid = generate_session_id("leave-groupchats"); |
362 lm_message_node_set_attribute(command, "sessionid", sessionid); | |
363 g_free(sessionid); | |
364 sessionid = NULL; | |
365 lm_message_node_set_attribute(command, "status", "executing"); | |
366 | |
367 x = lm_message_node_add_child(command, "x", NULL); | |
368 lm_message_node_set_attributes(x, | |
369 "type", "form", | |
370 "xmlns", "jabber:x:data", | |
371 NULL); | |
372 | |
373 lm_message_node_add_child(x, "title", "Leave groupchat(s)"); | |
374 | |
375 lm_message_node_add_child(x, "instructions", | |
376 "What groupchats do you want to leave?"); | |
377 | |
378 field = lm_message_node_add_child(x, "field", NULL); | |
379 lm_message_node_set_attributes(field, | |
380 "type", "hidden", | |
381 "var", "FORM_TYPE", | |
382 NULL); | |
383 | |
384 lm_message_node_add_child(field, "value", | |
385 "http://jabber.org/protocol/rc"); | |
988
6e2bfd1ffded
Add ids to message stanzas if needed
Mikael Berthe <mikael@lilotux.net>
parents:
987
diff
changeset
|
386 |
1598 | 387 field = lm_message_node_add_child(x, "field", NULL); |
388 lm_message_node_set_attributes(field, | |
389 "type", "list-multi", | |
390 "var", "groupchats", | |
391 "label", "Groupchats: ", | |
392 NULL); | |
393 lm_message_node_add_child(field, "required", NULL); | |
394 | |
395 foreach_buddy(ROSTER_TYPE_ROOM, &_callback_foreach_buddy_groupchat, field); | |
1729
e6e89b1d7831
Minor style and header updates
Mikael Berthe <mikael@lilotux.net>
parents:
1701
diff
changeset
|
396 // TODO: return an error if we are not connected to groupchats |
1598 | 397 } else if (action && !strcmp(action, "cancel")) { |
398 lm_message_node_set_attribute(command, "status", "canceled"); | |
399 } else { // (if sessionid and not canceled) | |
1729
e6e89b1d7831
Minor style and header updates
Mikael Berthe <mikael@lilotux.net>
parents:
1701
diff
changeset
|
400 LmMessageNode *form = lm_message_node_find_xmlns(x, "jabber:x:data");// TODO |
1598 | 401 if (form) { |
402 LmMessageNode *field; | |
990
35e7913affb7
Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents:
989
diff
changeset
|
403 |
1598 | 404 lm_message_node_set_attribute(command, "status", "completed"); |
1729
e6e89b1d7831
Minor style and header updates
Mikael Berthe <mikael@lilotux.net>
parents:
1701
diff
changeset
|
405 // TODO: implement sth. like "field?var=groupchats" in xmlnode... |
1598 | 406 field = lm_message_node_get_child(form, "field"); |
407 while (field && strcmp("groupchats", | |
408 lm_message_node_get_attribute(field, "var"))) | |
409 field = field->next; | |
410 | |
1652
8036750d0169
Fix leave_groupchats remote command
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1636
diff
changeset
|
411 if (field) |
8036750d0169
Fix leave_groupchats remote command
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1636
diff
changeset
|
412 for (x = field->children ; x ; x = x->next) |
8036750d0169
Fix leave_groupchats remote command
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1636
diff
changeset
|
413 { |
8036750d0169
Fix leave_groupchats remote command
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1636
diff
changeset
|
414 if (!strcmp (x->name, "value")) { |
8036750d0169
Fix leave_groupchats remote command
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1636
diff
changeset
|
415 GList* b = buddy_search_jid(lm_message_node_get_value(x)); |
8036750d0169
Fix leave_groupchats remote command
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1636
diff
changeset
|
416 if (b) |
8036750d0169
Fix leave_groupchats remote command
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1636
diff
changeset
|
417 cmd_room_leave(b->data, "Requested by remote command"); |
8036750d0169
Fix leave_groupchats remote command
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1636
diff
changeset
|
418 } |
1598 | 419 } |
420 lm_message_node_add_dataform_result(command, | |
421 "Groupchats have been left"); | |
988
6e2bfd1ffded
Add ids to message stanzas if needed
Mikael Berthe <mikael@lilotux.net>
parents:
987
diff
changeset
|
422 } |
987
f47e312560af
Improve JEP22 + JEP85 support
Mikael Berthe <mikael@lilotux.net>
parents:
986
diff
changeset
|
423 } |
1598 | 424 if (sessionid) |
425 lm_message_node_set_attribute(command, "sessionid", sessionid); | |
426 lm_connection_send(c, iq, NULL); | |
427 lm_message_unref(iq); | |
428 return LM_HANDLER_RESULT_REMOVE_MESSAGE; | |
429 } | |
986
ed697234bd39
Chat states receival (Alexis Hildebrandt)
Mikael Berthe <mikael@lilotux.net>
parents:
977
diff
changeset
|
430 |
1604
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1600
diff
changeset
|
431 LmHandlerResult handle_iq_commands(LmMessageHandler *h, |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1600
diff
changeset
|
432 LmConnection *c, |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1600
diff
changeset
|
433 LmMessage *m, gpointer ud) |
1598 | 434 { |
435 const char *requester_jid = NULL; | |
436 LmMessageNode *cmd; | |
437 const struct adhoc_command *command; | |
438 | |
439 // mcabber has only partial XEP-0146 support... | |
440 if (LM_MESSAGE_SUB_TYPE_SET != lm_message_get_sub_type(m)) | |
441 return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS; | |
442 | |
443 requester_jid = lm_message_get_from(m); | |
988
6e2bfd1ffded
Add ids to message stanzas if needed
Mikael Berthe <mikael@lilotux.net>
parents:
987
diff
changeset
|
444 |
1598 | 445 cmd = lm_message_node_get_child(m->node, "command"); |
2210 | 446 if (!cmd) { |
447 //send_iq_error(c, m, XMPP_ERROR_BAD_REQUEST); | |
448 return LM_HANDLER_RESULT_REMOVE_MESSAGE; | |
449 } | |
1598 | 450 if (jid_equal(lm_connection_get_jid(c), requester_jid)) { |
451 const char *action, *node; | |
452 action = lm_message_node_get_attribute(cmd, "action"); | |
453 node = lm_message_node_get_attribute(cmd, "node"); | |
454 // action can be NULL, in which case it seems to take the default, | |
455 // ie execute | |
456 if (!action || !strcmp(action, "execute") || !strcmp(action, "cancel") | |
457 || !strcmp(action, "next") || !strcmp(action, "complete")) { | |
458 for (command = adhoc_command_list; command->name; command++) { | |
459 if (!strcmp(node, command->name)) | |
460 command->callback(h, c, m, ud); | |
461 } | |
462 // "prev" action will get there, as we do not implement it, | |
463 // and do not authorize it | |
464 } else { | |
465 LmMessage *r; | |
466 LmMessageNode *err; | |
467 r = lm_message_new_iq_error(m, XMPP_ERROR_BAD_REQUEST); | |
2210 | 468 if (r) { |
469 err = lm_message_node_get_child(r->node, "error"); | |
470 lm_message_node_set_attribute | |
471 (lm_message_node_add_child(err, "malformed-action", NULL), | |
472 "xmlns", NS_COMMANDS); | |
473 lm_connection_send(c, r, NULL); | |
474 lm_message_unref(r); | |
475 } | |
1598 | 476 } |
477 } else { | |
478 send_iq_error(c, m, XMPP_ERROR_FORBIDDEN); | |
479 } | |
480 return LM_HANDLER_RESULT_REMOVE_MESSAGE; | |
35 | 481 } |
482 | |
990
35e7913affb7
Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents:
989
diff
changeset
|
483 |
1604
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1600
diff
changeset
|
484 LmHandlerResult handle_iq_disco_items(LmMessageHandler *h, |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1600
diff
changeset
|
485 LmConnection *c, |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1600
diff
changeset
|
486 LmMessage *m, gpointer ud) |
990
35e7913affb7
Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents:
989
diff
changeset
|
487 { |
1598 | 488 LmMessageNode *query; |
2210 | 489 const char *node = NULL; |
1598 | 490 query = lm_message_node_get_child(m->node, "query"); |
2210 | 491 if (query) |
492 node = lm_message_node_get_attribute(query, "node"); | |
1598 | 493 if (node) { |
494 if (!strcmp(node, NS_COMMANDS)) { | |
495 return handle_iq_commands_list(NULL, c, m, ud); | |
496 } else { | |
497 send_iq_error(c, m, XMPP_ERROR_NOT_IMPLEMENTED); | |
1091
10f9d6fcfeab
JEP85: Reset composing/paused state when a resource with higher prio comes up
Mikael Berthe <mikael@lilotux.net>
parents:
1072
diff
changeset
|
498 } |
1598 | 499 } else { |
500 // not sure about this one | |
501 send_iq_error(c, m, XMPP_ERROR_NOT_IMPLEMENTED); | |
205 | 502 } |
1598 | 503 return LM_HANDLER_RESULT_REMOVE_MESSAGE; |
1395
d431cd75eb53
Use bookmarked nickname when manually joining a room
Mikael Berthe <mikael@lilotux.net>
parents:
1385
diff
changeset
|
504 } |
d431cd75eb53
Use bookmarked nickname when manually joining a room
Mikael Berthe <mikael@lilotux.net>
parents:
1385
diff
changeset
|
505 |
d431cd75eb53
Use bookmarked nickname when manually joining a room
Mikael Berthe <mikael@lilotux.net>
parents:
1385
diff
changeset
|
506 |
1600 | 507 void _disco_add_feature_helper(gpointer data, gpointer user_data) |
1163
2913310a7be6
Make /roster bookmark in the status buffer show all bookmarks
Mikael Berthe <mikael@lilotux.net>
parents:
1161
diff
changeset
|
508 { |
1600 | 509 LmMessageNode *node = user_data; |
510 lm_message_node_set_attribute | |
511 (lm_message_node_add_child(node, "feature", NULL), "var", data); | |
1016 | 512 } |
513 | |
1600 | 514 // disco_info_set_caps(ansquery, entitycaps) |
515 // Add features attributes to ansquery. entitycaps should either be a | |
516 // valid capabilities hash or NULL. If it is NULL, the node attribute won't | |
517 // be added to the query child and Entity Capabilities will be announced | |
518 // as a feature. | |
1598 | 519 // Please change the entity version string if you modify mcabber disco |
520 // source code, so that it doesn't conflict with the upstream client. | |
1600 | 521 static void disco_info_set_caps(LmMessageNode *ansquery, |
522 const char *entitycaps) | |
1016 | 523 { |
1600 | 524 if (entitycaps) { |
525 char *eversion; | |
526 eversion = g_strdup_printf("%s#%s", MCABBER_CAPS_NODE, entitycaps); | |
527 lm_message_node_set_attribute(ansquery, "node", eversion); | |
528 g_free(eversion); | |
529 } | |
1016 | 530 |
1600 | 531 lm_message_node_set_attributes |
532 (lm_message_node_add_child(ansquery, "identity", NULL), | |
533 "category", "client", | |
534 "name", PACKAGE_STRING, | |
535 "type", "pc", | |
536 NULL); | |
1016 | 537 |
1600 | 538 if (entitycaps) |
539 caps_foreach_feature(entitycaps, _disco_add_feature_helper, ansquery); | |
1999
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1919
diff
changeset
|
540 else |
1600 | 541 caps_foreach_feature(entity_version(xmpp_getstatus()), |
542 _disco_add_feature_helper, | |
543 ansquery); | |
1016 | 544 } |
545 | |
1604
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1600
diff
changeset
|
546 LmHandlerResult handle_iq_disco_info(LmMessageHandler *h, |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1600
diff
changeset
|
547 LmConnection *c, |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1600
diff
changeset
|
548 LmMessage *m, gpointer ud) |
1043
ebbde723614b
Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents:
1042
diff
changeset
|
549 { |
1598 | 550 LmMessage *r; |
551 LmMessageNode *query, *tmp; | |
552 const char *node = NULL; | |
1600 | 553 const char *param = NULL; |
1043
ebbde723614b
Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents:
1042
diff
changeset
|
554 |
1636
e38300775548
Do not reply to disco "result" IQ messages
Mikael Berthe <mikael@lilotux.net>
parents:
1615
diff
changeset
|
555 if (lm_message_get_sub_type(m) == LM_MESSAGE_SUB_TYPE_RESULT) |
e38300775548
Do not reply to disco "result" IQ messages
Mikael Berthe <mikael@lilotux.net>
parents:
1615
diff
changeset
|
556 return LM_HANDLER_RESULT_REMOVE_MESSAGE; |
e38300775548
Do not reply to disco "result" IQ messages
Mikael Berthe <mikael@lilotux.net>
parents:
1615
diff
changeset
|
557 |
1598 | 558 r = lm_message_new_iq_from_query(m, LM_MESSAGE_SUB_TYPE_RESULT); |
559 query = lm_message_node_add_child(r->node, "query", NULL); | |
560 lm_message_node_set_attribute(query, "xmlns", NS_DISCO_INFO); | |
561 tmp = lm_message_node_find_child(m->node, "query"); | |
1600 | 562 if (tmp) { |
1598 | 563 node = lm_message_node_get_attribute(tmp, "node"); |
1600 | 564 param = node+strlen(MCABBER_CAPS_NODE)+1; |
565 } | |
566 if (node && startswith(node, MCABBER_CAPS_NODE "#", FALSE)) | |
567 disco_info_set_caps(query, param); // client#version | |
568 else | |
1598 | 569 // Basic discovery request |
1600 | 570 disco_info_set_caps(query, NULL); |
1347
07816313073b
Add an option 'otr' to enable OTR support in the configuration file
Mikael Berthe <mikael@lilotux.net>
parents:
1344
diff
changeset
|
571 |
1598 | 572 lm_connection_send(c, r, NULL); |
573 lm_message_unref(r); | |
574 return LM_HANDLER_RESULT_REMOVE_MESSAGE; | |
625
028c01940490
Show presence timestamps in "/info" and "/room whois"
Mikael Berthe <mikael@lilotux.net>
parents:
624
diff
changeset
|
575 } |
028c01940490
Show presence timestamps in "/info" and "/room whois"
Mikael Berthe <mikael@lilotux.net>
parents:
624
diff
changeset
|
576 |
1604
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1600
diff
changeset
|
577 LmHandlerResult handle_iq_roster(LmMessageHandler *h, LmConnection *c, |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1600
diff
changeset
|
578 LmMessage *m, gpointer ud) |
579
0c67755e0fa7
Introduce a handle_presence_muc() function
Mikael Berthe <mikael@lilotux.net>
parents:
578
diff
changeset
|
579 { |
1598 | 580 LmMessageNode *y; |
581 const char *fjid, *name, *group, *sub, *ask; | |
582 char *cleanalias; | |
583 enum subscr esub; | |
584 int need_refresh = FALSE; | |
585 guint roster_type; | |
581
ad07c868ff43
Tell the user when he or she has been kicked/banned
Mikael Berthe <mikael@lilotux.net>
parents:
580
diff
changeset
|
586 |
1701
44e023ad99ed
Add dummy handler for roster manipulation IQ responses
Mikael Berthe <mikael@lilotux.net>
parents:
1668
diff
changeset
|
587 y = lm_message_node_find_child(lm_message_node_find_xmlns(m->node, NS_ROSTER), |
44e023ad99ed
Add dummy handler for roster manipulation IQ responses
Mikael Berthe <mikael@lilotux.net>
parents:
1668
diff
changeset
|
588 "item"); |
44e023ad99ed
Add dummy handler for roster manipulation IQ responses
Mikael Berthe <mikael@lilotux.net>
parents:
1668
diff
changeset
|
589 for ( ; y; y = y->next) { |
1598 | 590 char *name_tmp = NULL; |
864
a7b3409df6bc
MUC: Work around user server restart
Mikael Berthe <mikael@lilotux.net>
parents:
862
diff
changeset
|
591 |
1598 | 592 fjid = lm_message_node_get_attribute(y, "jid"); |
593 name = lm_message_node_get_attribute(y, "name"); | |
594 sub = lm_message_node_get_attribute(y, "subscription"); | |
595 ask = lm_message_node_get_attribute(y, "ask"); | |
581
ad07c868ff43
Tell the user when he or she has been kicked/banned
Mikael Berthe <mikael@lilotux.net>
parents:
580
diff
changeset
|
596 |
1598 | 597 if (lm_message_node_find_child(y, "group")) |
598 group = lm_message_node_get_value(lm_message_node_find_child(y, "group")); | |
599 else | |
600 group = NULL; | |
1396
8f9928839a36
Automatically unlock new rooms (suggested by Michael Weiser)
Mikael Berthe <mikael@lilotux.net>
parents:
1395
diff
changeset
|
601 |
1598 | 602 if (!fjid) |
603 continue; | |
604 | |
605 cleanalias = jidtodisp(fjid); | |
579
0c67755e0fa7
Introduce a handle_presence_muc() function
Mikael Berthe <mikael@lilotux.net>
parents:
578
diff
changeset
|
606 |
1598 | 607 esub = sub_none; |
608 if (sub) { | |
609 if (!strcmp(sub, "to")) esub = sub_to; | |
610 else if (!strcmp(sub, "from")) esub = sub_from; | |
611 else if (!strcmp(sub, "both")) esub = sub_both; | |
612 else if (!strcmp(sub, "remove")) esub = sub_remove; | |
583
32ae027a3238
MUC: clean up departure message code
Mikael Berthe <mikael@lilotux.net>
parents:
581
diff
changeset
|
613 } |
581
ad07c868ff43
Tell the user when he or she has been kicked/banned
Mikael Berthe <mikael@lilotux.net>
parents:
580
diff
changeset
|
614 |
1598 | 615 if (esub == sub_remove) { |
616 roster_del_user(cleanalias); | |
617 scr_LogPrint(LPRINT_LOGNORM, "Buddy <%s> has been removed " | |
618 "from the roster", cleanalias); | |
619 g_free(cleanalias); | |
620 need_refresh = TRUE; | |
621 continue; | |
622 } | |
583
32ae027a3238
MUC: clean up departure message code
Mikael Berthe <mikael@lilotux.net>
parents:
581
diff
changeset
|
623 |
1598 | 624 if (ask && !strcmp(ask, "subscribe")) |
625 esub |= sub_pending; | |
626 | |
627 if (!name) { | |
628 if (!settings_opt_get_int("roster_hide_domain")) { | |
629 name = cleanalias; | |
583
32ae027a3238
MUC: clean up departure message code
Mikael Berthe <mikael@lilotux.net>
parents:
581
diff
changeset
|
630 } else { |
1598 | 631 char *p; |
632 name = name_tmp = g_strdup(cleanalias); | |
633 p = strchr(name_tmp, JID_DOMAIN_SEPARATOR); | |
634 if (p) *p = '\0'; | |
581
ad07c868ff43
Tell the user when he or she has been kicked/banned
Mikael Berthe <mikael@lilotux.net>
parents:
580
diff
changeset
|
635 } |
583
32ae027a3238
MUC: clean up departure message code
Mikael Berthe <mikael@lilotux.net>
parents:
581
diff
changeset
|
636 } |
32ae027a3238
MUC: clean up departure message code
Mikael Berthe <mikael@lilotux.net>
parents:
581
diff
changeset
|
637 |
1598 | 638 // Tricky... :-\ My guess is that if there is no JID_DOMAIN_SEPARATOR, |
639 // this is an agent. | |
640 if (strchr(cleanalias, JID_DOMAIN_SEPARATOR)) | |
641 roster_type = ROSTER_TYPE_USER; | |
642 else | |
643 roster_type = ROSTER_TYPE_AGENT; | |
1377
cd9182f0b5c7
Add /room setopt {print_status,auto_whois}
Mikael Berthe <mikael@lilotux.net>
parents:
1365
diff
changeset
|
644 |
1598 | 645 roster_add_user(cleanalias, name, group, roster_type, esub, 1); |
579
0c67755e0fa7
Introduce a handle_presence_muc() function
Mikael Berthe <mikael@lilotux.net>
parents:
578
diff
changeset
|
646 |
1598 | 647 g_free(name_tmp); |
648 g_free(cleanalias); | |
1446
49c8be874344
Add option 'ignore_self_presence'
Mikael Berthe <mikael@lilotux.net>
parents:
1439
diff
changeset
|
649 } |
49c8be874344
Add option 'ignore_self_presence'
Mikael Berthe <mikael@lilotux.net>
parents:
1439
diff
changeset
|
650 |
1919
fba12c1f6386
Send a result message when we receive a roster push
Mikael Berthe <mikael@lilotux.net>
parents:
1811
diff
changeset
|
651 // Acknowledge IQ message |
fba12c1f6386
Send a result message when we receive a roster push
Mikael Berthe <mikael@lilotux.net>
parents:
1811
diff
changeset
|
652 if (lm_message_get_sub_type(m) == LM_MESSAGE_SUB_TYPE_SET) { |
fba12c1f6386
Send a result message when we receive a roster push
Mikael Berthe <mikael@lilotux.net>
parents:
1811
diff
changeset
|
653 LmMessage *result; |
fba12c1f6386
Send a result message when we receive a roster push
Mikael Berthe <mikael@lilotux.net>
parents:
1811
diff
changeset
|
654 result = lm_message_new_iq_from_query(m, LM_MESSAGE_SUB_TYPE_RESULT); |
fba12c1f6386
Send a result message when we receive a roster push
Mikael Berthe <mikael@lilotux.net>
parents:
1811
diff
changeset
|
655 lm_connection_send(c, result, NULL); |
fba12c1f6386
Send a result message when we receive a roster push
Mikael Berthe <mikael@lilotux.net>
parents:
1811
diff
changeset
|
656 lm_message_unref(result); |
fba12c1f6386
Send a result message when we receive a roster push
Mikael Berthe <mikael@lilotux.net>
parents:
1811
diff
changeset
|
657 } |
fba12c1f6386
Send a result message when we receive a roster push
Mikael Berthe <mikael@lilotux.net>
parents:
1811
diff
changeset
|
658 |
1598 | 659 buddylist_build(); |
660 update_roster = TRUE; | |
661 if (need_refresh) | |
1780
e4378fbab5d7
Major API cleanup - bump API to 4
Mikael Berthe <mikael@lilotux.net>
parents:
1729
diff
changeset
|
662 scr_update_buddy_window(); |
1598 | 663 return LM_HANDLER_RESULT_REMOVE_MESSAGE; |
664 } | |
644
68fb0c1dfb15
MUC: better nickname check when entering a room
Mikael Berthe <mikael@lilotux.net>
parents:
643
diff
changeset
|
665 |
1604
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1600
diff
changeset
|
666 LmHandlerResult handle_iq_ping(LmMessageHandler *h, LmConnection *c, |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1600
diff
changeset
|
667 LmMessage *m, gpointer ud) |
1598 | 668 { |
669 LmMessage *r; | |
644
68fb0c1dfb15
MUC: better nickname check when entering a room
Mikael Berthe <mikael@lilotux.net>
parents:
643
diff
changeset
|
670 |
1598 | 671 r = lm_message_new_iq_from_query(m, LM_MESSAGE_SUB_TYPE_RESULT); |
672 lm_connection_send(c, r, NULL); | |
673 lm_message_unref(r); | |
674 return LM_HANDLER_RESULT_REMOVE_MESSAGE; | |
675 } | |
676 | |
677 double seconds_since_last_use(void) | |
678 { | |
679 return difftime(time(NULL), iqlast); | |
680 } | |
644
68fb0c1dfb15
MUC: better nickname check when entering a room
Mikael Berthe <mikael@lilotux.net>
parents:
643
diff
changeset
|
681 |
1604
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1600
diff
changeset
|
682 LmHandlerResult handle_iq_last(LmMessageHandler *h, LmConnection *c, |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1600
diff
changeset
|
683 LmMessage *m, gpointer ud) |
1598 | 684 { |
685 LmMessage *r; | |
686 LmMessageNode *query; | |
687 char *seconds; | |
547
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
688 |
1598 | 689 if (!settings_opt_get_int("iq_hide_requests")) { |
690 scr_LogPrint(LPRINT_LOGNORM, "Received an IQ last time request from <%s>", | |
691 lm_message_get_from(m)); | |
547
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
692 } |
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
693 |
1598 | 694 if (settings_opt_get_int("iq_last_disable") || |
695 (settings_opt_get_int("iq_last_disable_when_notavail") && | |
696 xmpp_getstatus() == notavail)) | |
697 { | |
698 send_iq_error(c, m, XMPP_ERROR_SERVICE_UNAVAILABLE); | |
699 return LM_HANDLER_RESULT_REMOVE_MESSAGE; | |
547
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
700 } |
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
701 |
1598 | 702 r = lm_message_new_iq_from_query(m, LM_MESSAGE_SUB_TYPE_RESULT); |
703 query = lm_message_node_add_child(r->node, "query", NULL); | |
1667
8af0e0ad20ad
Fix some more xmlns attributes in IQ responses
Mikael Berthe <mikael@lilotux.net>
parents:
1666
diff
changeset
|
704 lm_message_node_set_attribute(query, "xmlns", NS_LAST); |
1598 | 705 seconds = g_strdup_printf("%.0f", seconds_since_last_use()); |
706 lm_message_node_set_attribute(query, "seconds", seconds); | |
707 g_free(seconds); | |
1236
f7b35b1c343d
Fix a roster bug when receiving a MUC invitation
Mikael Berthe <mikael@lilotux.net>
parents:
1215
diff
changeset
|
708 |
1598 | 709 lm_connection_send(c, r, NULL); |
710 lm_message_unref(r); | |
711 return LM_HANDLER_RESULT_REMOVE_MESSAGE; | |
1128 | 712 } |
713 | |
1604
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1600
diff
changeset
|
714 LmHandlerResult handle_iq_version(LmMessageHandler *h, LmConnection *c, |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1600
diff
changeset
|
715 LmMessage *m, gpointer ud) |
1128 | 716 { |
1598 | 717 LmMessage *r; |
718 LmMessageNode *query; | |
1128 | 719 |
1598 | 720 if (!settings_opt_get_int("iq_hide_requests")) { |
721 scr_LogPrint(LPRINT_LOGNORM, "Received an IQ version request from <%s>", | |
722 lm_message_get_from(m)); | |
723 } | |
2066
69699ba3010f
Add 'iq_version_hide', 'iq_version_hide_version'
Mikael Berthe <mikael@lilotux.net>
parents:
2065
diff
changeset
|
724 |
69699ba3010f
Add 'iq_version_hide', 'iq_version_hide_version'
Mikael Berthe <mikael@lilotux.net>
parents:
2065
diff
changeset
|
725 if (settings_opt_get_int("iq_version_hide")) { |
69699ba3010f
Add 'iq_version_hide', 'iq_version_hide_version'
Mikael Berthe <mikael@lilotux.net>
parents:
2065
diff
changeset
|
726 send_iq_error(c, m, XMPP_ERROR_SERVICE_UNAVAILABLE); |
69699ba3010f
Add 'iq_version_hide', 'iq_version_hide_version'
Mikael Berthe <mikael@lilotux.net>
parents:
2065
diff
changeset
|
727 return LM_HANDLER_RESULT_REMOVE_MESSAGE; |
1128 | 728 } |
1598 | 729 |
730 r = lm_message_new_iq_from_query(m, LM_MESSAGE_SUB_TYPE_RESULT); | |
731 | |
732 query = lm_message_node_add_child(r->node, "query", NULL); | |
1666
68c57f52d05a
Fix iq version reply (issue #42, patch from foxfell)
Mikael Berthe <mikael@lilotux.net>
parents:
1665
diff
changeset
|
733 lm_message_node_set_attribute(query, "xmlns", NS_VERSION); |
1598 | 734 |
735 lm_message_node_add_child(query, "name", PACKAGE_NAME); | |
2066
69699ba3010f
Add 'iq_version_hide', 'iq_version_hide_version'
Mikael Berthe <mikael@lilotux.net>
parents:
2065
diff
changeset
|
736 |
69699ba3010f
Add 'iq_version_hide', 'iq_version_hide_version'
Mikael Berthe <mikael@lilotux.net>
parents:
2065
diff
changeset
|
737 // MCabber version |
69699ba3010f
Add 'iq_version_hide', 'iq_version_hide_version'
Mikael Berthe <mikael@lilotux.net>
parents:
2065
diff
changeset
|
738 if (!settings_opt_get_int("iq_version_hide_version")) { |
69699ba3010f
Add 'iq_version_hide', 'iq_version_hide_version'
Mikael Berthe <mikael@lilotux.net>
parents:
2065
diff
changeset
|
739 char *ver = mcabber_version(); |
69699ba3010f
Add 'iq_version_hide', 'iq_version_hide_version'
Mikael Berthe <mikael@lilotux.net>
parents:
2065
diff
changeset
|
740 lm_message_node_add_child(query, "version", ver); |
69699ba3010f
Add 'iq_version_hide', 'iq_version_hide_version'
Mikael Berthe <mikael@lilotux.net>
parents:
2065
diff
changeset
|
741 g_free(ver); |
69699ba3010f
Add 'iq_version_hide', 'iq_version_hide_version'
Mikael Berthe <mikael@lilotux.net>
parents:
2065
diff
changeset
|
742 } |
69699ba3010f
Add 'iq_version_hide', 'iq_version_hide_version'
Mikael Berthe <mikael@lilotux.net>
parents:
2065
diff
changeset
|
743 |
69699ba3010f
Add 'iq_version_hide', 'iq_version_hide_version'
Mikael Berthe <mikael@lilotux.net>
parents:
2065
diff
changeset
|
744 // OS details |
69699ba3010f
Add 'iq_version_hide', 'iq_version_hide_version'
Mikael Berthe <mikael@lilotux.net>
parents:
2065
diff
changeset
|
745 if (!settings_opt_get_int("iq_version_hide_os")) { |
69699ba3010f
Add 'iq_version_hide', 'iq_version_hide_version'
Mikael Berthe <mikael@lilotux.net>
parents:
2065
diff
changeset
|
746 char *os; |
69699ba3010f
Add 'iq_version_hide', 'iq_version_hide_version'
Mikael Berthe <mikael@lilotux.net>
parents:
2065
diff
changeset
|
747 struct utsname osinfo; |
69699ba3010f
Add 'iq_version_hide', 'iq_version_hide_version'
Mikael Berthe <mikael@lilotux.net>
parents:
2065
diff
changeset
|
748 uname(&osinfo); |
69699ba3010f
Add 'iq_version_hide', 'iq_version_hide_version'
Mikael Berthe <mikael@lilotux.net>
parents:
2065
diff
changeset
|
749 os = g_strdup_printf("%s %s %s", osinfo.sysname, osinfo.release, |
69699ba3010f
Add 'iq_version_hide', 'iq_version_hide_version'
Mikael Berthe <mikael@lilotux.net>
parents:
2065
diff
changeset
|
750 osinfo.machine); |
1598 | 751 lm_message_node_add_child(query, "os", os); |
752 g_free(os); | |
753 } | |
754 | |
755 lm_connection_send(c, r, NULL); | |
756 lm_message_unref(r); | |
757 return LM_HANDLER_RESULT_REMOVE_MESSAGE; | |
1128 | 758 } |
759 | |
1598 | 760 // This function borrows some code from the Pidgin project |
1604
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1600
diff
changeset
|
761 LmHandlerResult handle_iq_time(LmMessageHandler *h, LmConnection *c, |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1600
diff
changeset
|
762 LmMessage *m, gpointer ud) |
547
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
763 { |
1598 | 764 LmMessage *r; |
765 LmMessageNode *query; | |
766 char *buf, *utf8_buf; | |
767 time_t now_t; | |
768 struct tm *now; | |
1528
4b4b3948420c
MUC fix: the topic couldn't be cleared
Mikael Berthe <mikael@lilotux.net>
parents:
1525
diff
changeset
|
769 |
1598 | 770 time(&now_t); |
771 | |
772 if (!settings_opt_get_int("iq_hide_requests")) { | |
773 scr_LogPrint(LPRINT_LOGNORM, "Received an IQ time request from <%s>", | |
774 lm_message_get_from(m)); | |
547
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
775 } |
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
776 |
2067
79659eb4f66f
Rename 'iq_version_hide_time' to 'iq_time_hide'
Mikael Berthe <mikael@lilotux.net>
parents:
2066
diff
changeset
|
777 if (settings_opt_get_int("iq_time_hide")) { |
2065
c09fc3834c69
Add option 'iq_version_hide_time'
Mikael Berthe <mikael@lilotux.net>
parents:
2002
diff
changeset
|
778 send_iq_error(c, m, XMPP_ERROR_SERVICE_UNAVAILABLE); |
c09fc3834c69
Add option 'iq_version_hide_time'
Mikael Berthe <mikael@lilotux.net>
parents:
2002
diff
changeset
|
779 return LM_HANDLER_RESULT_REMOVE_MESSAGE; |
c09fc3834c69
Add option 'iq_version_hide_time'
Mikael Berthe <mikael@lilotux.net>
parents:
2002
diff
changeset
|
780 } |
c09fc3834c69
Add option 'iq_version_hide_time'
Mikael Berthe <mikael@lilotux.net>
parents:
2002
diff
changeset
|
781 |
1598 | 782 buf = g_new0(char, 512); |
783 | |
784 r = lm_message_new_iq_from_query(m, LM_MESSAGE_SUB_TYPE_RESULT); | |
785 query = lm_message_node_add_child(r->node, "query", NULL); | |
1667
8af0e0ad20ad
Fix some more xmlns attributes in IQ responses
Mikael Berthe <mikael@lilotux.net>
parents:
1666
diff
changeset
|
786 lm_message_node_set_attribute(query, "xmlns", NS_TIME); |
547
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
787 |
1598 | 788 now = gmtime(&now_t); |
1128 | 789 |
1598 | 790 strftime(buf, 512, "%Y%m%dT%T", now); |
791 lm_message_node_add_child(query, "utc", buf); | |
547
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
792 |
1598 | 793 now = localtime(&now_t); |
987
f47e312560af
Improve JEP22 + JEP85 support
Mikael Berthe <mikael@lilotux.net>
parents:
986
diff
changeset
|
794 |
1598 | 795 strftime(buf, 512, "%Z", now); |
796 if ((utf8_buf = to_utf8(buf))) { | |
797 lm_message_node_add_child(query, "tz", utf8_buf); | |
798 g_free(utf8_buf); | |
799 } | |
987
f47e312560af
Improve JEP22 + JEP85 support
Mikael Berthe <mikael@lilotux.net>
parents:
986
diff
changeset
|
800 |
1598 | 801 strftime(buf, 512, "%d %b %Y %T", now); |
802 if ((utf8_buf = to_utf8(buf))) { | |
803 lm_message_node_add_child(query, "display", utf8_buf); | |
804 g_free(utf8_buf); | |
987
f47e312560af
Improve JEP22 + JEP85 support
Mikael Berthe <mikael@lilotux.net>
parents:
986
diff
changeset
|
805 } |
986
ed697234bd39
Chat states receival (Alexis Hildebrandt)
Mikael Berthe <mikael@lilotux.net>
parents:
977
diff
changeset
|
806 |
1598 | 807 lm_connection_send(c, r, NULL); |
808 lm_message_unref(r); | |
809 g_free(buf); | |
810 return LM_HANDLER_RESULT_REMOVE_MESSAGE; | |
811 } | |
986
ed697234bd39
Chat states receival (Alexis Hildebrandt)
Mikael Berthe <mikael@lilotux.net>
parents:
977
diff
changeset
|
812 |
1598 | 813 // This function borrows some code from the Pidgin project |
1604
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1600
diff
changeset
|
814 LmHandlerResult handle_iq_time202(LmMessageHandler *h, LmConnection *c, |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1600
diff
changeset
|
815 LmMessage *m, gpointer ud) |
1598 | 816 { |
817 LmMessage *r; | |
818 LmMessageNode *query; | |
819 char *buf, *utf8_buf; | |
820 time_t now_t; | |
821 struct tm *now; | |
822 char const *sign; | |
823 int diff = 0; | |
987
f47e312560af
Improve JEP22 + JEP85 support
Mikael Berthe <mikael@lilotux.net>
parents:
986
diff
changeset
|
824 |
1598 | 825 time(&now_t); |
826 | |
827 if (!settings_opt_get_int("iq_hide_requests")) { | |
828 scr_LogPrint(LPRINT_LOGNORM, "Received an IQ time request from <%s>", | |
829 lm_message_get_from(m)); | |
986
ed697234bd39
Chat states receival (Alexis Hildebrandt)
Mikael Berthe <mikael@lilotux.net>
parents:
977
diff
changeset
|
830 } |
ed697234bd39
Chat states receival (Alexis Hildebrandt)
Mikael Berthe <mikael@lilotux.net>
parents:
977
diff
changeset
|
831 |
2067
79659eb4f66f
Rename 'iq_version_hide_time' to 'iq_time_hide'
Mikael Berthe <mikael@lilotux.net>
parents:
2066
diff
changeset
|
832 if (settings_opt_get_int("iq_time_hide")) { |
2065
c09fc3834c69
Add option 'iq_version_hide_time'
Mikael Berthe <mikael@lilotux.net>
parents:
2002
diff
changeset
|
833 send_iq_error(c, m, XMPP_ERROR_SERVICE_UNAVAILABLE); |
c09fc3834c69
Add option 'iq_version_hide_time'
Mikael Berthe <mikael@lilotux.net>
parents:
2002
diff
changeset
|
834 return LM_HANDLER_RESULT_REMOVE_MESSAGE; |
c09fc3834c69
Add option 'iq_version_hide_time'
Mikael Berthe <mikael@lilotux.net>
parents:
2002
diff
changeset
|
835 } |
c09fc3834c69
Add option 'iq_version_hide_time'
Mikael Berthe <mikael@lilotux.net>
parents:
2002
diff
changeset
|
836 |
1598 | 837 buf = g_new0(char, 512); |
987
f47e312560af
Improve JEP22 + JEP85 support
Mikael Berthe <mikael@lilotux.net>
parents:
986
diff
changeset
|
838 |
1598 | 839 r = lm_message_new_iq_from_query(m, LM_MESSAGE_SUB_TYPE_RESULT); |
840 query = lm_message_node_add_child(r->node, "time", NULL); | |
841 lm_message_node_set_attribute(query, "xmlns", NS_XMPP_TIME); | |
987
f47e312560af
Improve JEP22 + JEP85 support
Mikael Berthe <mikael@lilotux.net>
parents:
986
diff
changeset
|
842 |
1598 | 843 now = localtime(&now_t); |
987
f47e312560af
Improve JEP22 + JEP85 support
Mikael Berthe <mikael@lilotux.net>
parents:
986
diff
changeset
|
844 |
1598 | 845 if (now->tm_isdst >= 0) { |
846 #if defined HAVE_TM_GMTOFF | |
847 diff = now->tm_gmtoff; | |
848 #elif defined HAVE_TIMEZONE | |
849 tzset(); | |
850 diff = -timezone; | |
989
859ab76e5093
Send JEP-22 delivered messages
Mikael Berthe <mikael@lilotux.net>
parents:
988
diff
changeset
|
851 #endif |
986
ed697234bd39
Chat states receival (Alexis Hildebrandt)
Mikael Berthe <mikael@lilotux.net>
parents:
977
diff
changeset
|
852 } |
ed697234bd39
Chat states receival (Alexis Hildebrandt)
Mikael Berthe <mikael@lilotux.net>
parents:
977
diff
changeset
|
853 |
1598 | 854 if (diff < 0) { |
855 sign = "-"; | |
856 diff = -diff; | |
749
6c633adaae10
Use events system for subscription requests
Mikael Berthe <mikael@lilotux.net>
parents:
745
diff
changeset
|
857 } else { |
1598 | 858 sign = "+"; |
749
6c633adaae10
Use events system for subscription requests
Mikael Berthe <mikael@lilotux.net>
parents:
745
diff
changeset
|
859 } |
1598 | 860 diff /= 60; |
861 snprintf(buf, 512, "%c%02d:%02d", *sign, diff / 60, diff % 60); | |
862 if ((utf8_buf = to_utf8(buf))) { | |
863 lm_message_node_add_child(query, "tzo", utf8_buf); | |
864 g_free(utf8_buf); | |
1128 | 865 } |
866 | |
1598 | 867 now = gmtime(&now_t); |
818
55cd45481a07
Fix a buddylist bug when receiving a subscription request
Mikael Berthe <mikael@lilotux.net>
parents:
793
diff
changeset
|
868 |
1598 | 869 strftime(buf, 512, "%Y-%m-%dT%TZ", now); |
870 lm_message_node_add_child(query, "utc", buf); | |
611
ad737139a144
Improve subscription management
Mikael Berthe <mikael@lilotux.net>
parents:
610
diff
changeset
|
871 |
1598 | 872 lm_connection_send(c, r, NULL); |
873 lm_message_unref(r); | |
874 g_free(buf); | |
875 return LM_HANDLER_RESULT_REMOVE_MESSAGE; | |
547
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
876 } |
1599 | 877 |
1615
171ae5a258fa
Add dummy vcard IQ handler
Mikael Berthe <mikael@lilotux.net>
parents:
1604
diff
changeset
|
878 LmHandlerResult handle_iq_vcard(LmMessageHandler *h, LmConnection *c, |
171ae5a258fa
Add dummy vcard IQ handler
Mikael Berthe <mikael@lilotux.net>
parents:
1604
diff
changeset
|
879 LmMessage *m, gpointer ud) |
171ae5a258fa
Add dummy vcard IQ handler
Mikael Berthe <mikael@lilotux.net>
parents:
1604
diff
changeset
|
880 { |
171ae5a258fa
Add dummy vcard IQ handler
Mikael Berthe <mikael@lilotux.net>
parents:
1604
diff
changeset
|
881 send_iq_error(c, m, XMPP_ERROR_SERVICE_UNAVAILABLE); |
171ae5a258fa
Add dummy vcard IQ handler
Mikael Berthe <mikael@lilotux.net>
parents:
1604
diff
changeset
|
882 return LM_HANDLER_RESULT_REMOVE_MESSAGE; |
171ae5a258fa
Add dummy vcard IQ handler
Mikael Berthe <mikael@lilotux.net>
parents:
1604
diff
changeset
|
883 } |
171ae5a258fa
Add dummy vcard IQ handler
Mikael Berthe <mikael@lilotux.net>
parents:
1604
diff
changeset
|
884 |
1811 | 885 /* vim: set et cindent cinoptions=>2\:2(0 ts=2 sw=2: For Vim users... */ |