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