Mercurial > ~mikael > mcabber > hg
annotate mcabber/mcabber/xmpp.c @ 2023:26edaf6ea10b
xmpp_setstatus: send presence to MUC rooms before the global presence
It only matters (AFAICS) when going offline. We want the presence
to be sent by mcabber and not by the server, especially if we're
using PGP.
author | Mikael Berthe <mikael@lilotux.net> |
---|---|
date | Mon, 30 Jul 2012 22:39:17 +0200 |
parents | 87049d55e34f |
children | 107d39cd968b |
rev | line source |
---|---|
29 | 1 /* |
1599 | 2 * xmpp.c -- Jabber protocol handling |
393 | 3 * |
1729
e6e89b1d7831
Minor style and header updates
Mikael Berthe <mikael@lilotux.net>
parents:
1728
diff
changeset
|
4 * Copyright (C) 2008-2010 Frank Zschockelt <mcabber@freakysoft.de> |
e6e89b1d7831
Minor style and header updates
Mikael Berthe <mikael@lilotux.net>
parents:
1728
diff
changeset
|
5 * Copyright (C) 2005-2010 Mikael Berthe <mikael@lilotux.net> |
29 | 6 * Parts come from the centericq project: |
7 * Copyright (C) 2002-2005 by Konstantin Klyagin <konst@konst.org.ua> | |
8 * | |
9 * This program is free software; you can redistribute it and/or modify | |
10 * it under the terms of the GNU General Public License as published by | |
11 * the Free Software Foundation; either version 2 of the License, or (at | |
12 * your option) any later version. | |
13 * | |
14 * This program is distributed in the hope that it will be useful, but | |
15 * WITHOUT ANY WARRANTY; without even the implied warranty of | |
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
17 * General Public License for more details. | |
18 * | |
19 * You should have received a copy of the GNU General Public License | |
20 * along with this program; if not, write to the Free Software | |
21 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 | |
22 * USA | |
23 */ | |
1598 | 24 #include <stdlib.h> |
25 #include <string.h> | |
29 | 26 |
1604
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
27 #include "xmpp.h" |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
28 #include "xmpp_helper.h" |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
29 #include "xmpp_iq.h" |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
30 #include "xmpp_iqrequest.h" |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
31 #include "xmpp_muc.h" |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
32 #include "xmpp_s10n.h" |
1600 | 33 #include "caps.h" |
1598 | 34 #include "events.h" |
35 #include "histolog.h" | |
36 #include "hooks.h" | |
37 #include "otr.h" | |
81 | 38 #include "roster.h" |
29 | 39 #include "screen.h" |
1598 | 40 #include "settings.h" |
29 | 41 #include "utils.h" |
1653
fca9a4c17432
Improve UI latency and CPU usage
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1647
diff
changeset
|
42 #include "main.h" |
29 | 43 |
1001
dff25377c11f
Auto-reconnect after a network/server failure
Mikael Berthe <mikael@lilotux.net>
parents:
999
diff
changeset
|
44 #define RECONNECTION_TIMEOUT 60L |
dff25377c11f
Auto-reconnect after a network/server failure
Mikael Berthe <mikael@lilotux.net>
parents:
999
diff
changeset
|
45 |
1682
d1e8fb14ce2d
Destroy lm connection object on disconnect
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1668
diff
changeset
|
46 LmConnection* lconnection = NULL; |
1598 | 47 static guint AutoConnection; |
48 | |
49 inline void update_last_use(void); | |
50 inline gboolean xmpp_reconnect(); | |
51 | |
1604
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
52 enum imstatus mystatus = offline; |
1598 | 53 static enum imstatus mywantedstatus = available; |
1604
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
54 gchar *mystatusmsg; |
29 | 55 |
353
3fe43f6daa5a
Make imstatus2char a null-terminated string
Mikael Berthe <mikael@lilotux.net>
parents:
325
diff
changeset
|
56 char imstatus2char[imstatus_size+1] = { |
1311
0dda8238af21
Implement "/roster display"
Mikael Berthe <mikael@lilotux.net>
parents:
1310
diff
changeset
|
57 '_', 'o', 'f', 'd', 'n', 'a', 'i', '\0' |
46 | 58 }; |
59 | |
1604
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
60 char *imstatus_showmap[] = { |
1378 | 61 "", |
62 "", | |
63 "chat", | |
64 "dnd", | |
65 "xa", | |
66 "away", | |
67 "" | |
68 }; | |
69 | |
1604
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
70 LmMessageNode *bookmarks = NULL; |
351427ef0b4b
Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents:
1602
diff
changeset
|
71 LmMessageNode *rosternotes = NULL; |
29 | 72 |
1598 | 73 static struct IqHandlers |
116 | 74 { |
1598 | 75 const gchar *xmlns; |
76 LmHandleMessageFunction handler; | |
77 } iq_handlers[] = { | |
78 {NS_PING, &handle_iq_ping}, | |
79 {NS_VERSION, &handle_iq_version}, | |
80 {NS_TIME, &handle_iq_time}, | |
81 {NS_ROSTER, &handle_iq_roster}, | |
82 {NS_XMPP_TIME, &handle_iq_time202}, | |
83 {NS_LAST, &handle_iq_last}, | |
84 {NS_DISCO_INFO, &handle_iq_disco_info}, | |
85 {NS_DISCO_ITEMS,&handle_iq_disco_items}, | |
86 {NS_COMMANDS, &handle_iq_commands}, | |
1615
171ae5a258fa
Add dummy vcard IQ handler
Mikael Berthe <mikael@lilotux.net>
parents:
1614
diff
changeset
|
87 {NS_VCARD, &handle_iq_vcard}, |
1598 | 88 {NULL, NULL} |
89 }; | |
519
5c338d31de56
Show current global status message in "/status"
Mikael Berthe <mikael@lilotux.net>
parents:
513
diff
changeset
|
90 |
1558
3df441efb7c2
Fix gcc warnings related to inline/static uses
Mikael Berthe <mikael@lilotux.net>
parents:
1546
diff
changeset
|
91 void update_last_use(void) |
1254
401639413340
More jabber:iq:last support... (misc)
Mikael Berthe <mikael@lilotux.net>
parents:
1244
diff
changeset
|
92 { |
401639413340
More jabber:iq:last support... (misc)
Mikael Berthe <mikael@lilotux.net>
parents:
1244
diff
changeset
|
93 iqlast = time(NULL); |
401639413340
More jabber:iq:last support... (misc)
Mikael Berthe <mikael@lilotux.net>
parents:
1244
diff
changeset
|
94 } |
401639413340
More jabber:iq:last support... (misc)
Mikael Berthe <mikael@lilotux.net>
parents:
1244
diff
changeset
|
95 |
1684
95df4ea512c8
Provide xmpp_is_online()
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1683
diff
changeset
|
96 gboolean xmpp_is_online(void) |
95df4ea512c8
Provide xmpp_is_online()
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1683
diff
changeset
|
97 { |
95df4ea512c8
Provide xmpp_is_online()
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1683
diff
changeset
|
98 if (lconnection && lm_connection_is_authenticated(lconnection)) |
95df4ea512c8
Provide xmpp_is_online()
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1683
diff
changeset
|
99 return TRUE; |
95df4ea512c8
Provide xmpp_is_online()
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1683
diff
changeset
|
100 else |
95df4ea512c8
Provide xmpp_is_online()
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1683
diff
changeset
|
101 return FALSE; |
95df4ea512c8
Provide xmpp_is_online()
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1683
diff
changeset
|
102 } |
95df4ea512c8
Provide xmpp_is_online()
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1683
diff
changeset
|
103 |
1598 | 104 // Note: the caller should check the jid is correct |
105 void xmpp_addbuddy(const char *bjid, const char *name, const char *group) | |
1215
80c095886fb5
Entity Capabilities support (XEP-0115)
Mikael Berthe <mikael@lilotux.net>
parents:
1213
diff
changeset
|
106 { |
1598 | 107 LmMessageNode *query, *y; |
108 LmMessage *iq; | |
1701
44e023ad99ed
Add dummy handler for roster manipulation IQ responses
Mikael Berthe <mikael@lilotux.net>
parents:
1693
diff
changeset
|
109 LmMessageHandler *handler; |
1598 | 110 char *cleanjid; |
1255
ceada40bbe20
Update Entity Capabilities (add iq:last)
Mikael Berthe <mikael@lilotux.net>
parents:
1254
diff
changeset
|
111 |
1684
95df4ea512c8
Provide xmpp_is_online()
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1683
diff
changeset
|
112 if (!xmpp_is_online()) |
1682
d1e8fb14ce2d
Destroy lm connection object on disconnect
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1668
diff
changeset
|
113 return; |
1598 | 114 |
115 cleanjid = jidtodisp(bjid); // Stripping resource, just in case... | |
116 | |
117 // We don't check if the jabber user already exists in the roster, | |
118 // because it allows to re-ask for notification. | |
1215
80c095886fb5
Entity Capabilities support (XEP-0115)
Mikael Berthe <mikael@lilotux.net>
parents:
1213
diff
changeset
|
119 |
1598 | 120 iq = lm_message_new_with_sub_type(NULL, LM_MESSAGE_TYPE_IQ, |
121 LM_MESSAGE_SUB_TYPE_SET); | |
122 query = lm_message_node_add_child(iq->node, "query", NULL); | |
123 lm_message_node_set_attribute(query, "xmlns", NS_ROSTER); | |
124 y = lm_message_node_add_child(query, "item", NULL); | |
125 lm_message_node_set_attribute(y, "jid", cleanjid); | |
126 | |
127 if (name) | |
128 lm_message_node_set_attribute(y, "name", name); | |
1215
80c095886fb5
Entity Capabilities support (XEP-0115)
Mikael Berthe <mikael@lilotux.net>
parents:
1213
diff
changeset
|
129 |
1598 | 130 if (group) |
131 lm_message_node_add_child(y, "group", group); | |
132 | |
1701
44e023ad99ed
Add dummy handler for roster manipulation IQ responses
Mikael Berthe <mikael@lilotux.net>
parents:
1693
diff
changeset
|
133 handler = lm_message_handler_new(handle_iq_dummy, NULL, FALSE); |
44e023ad99ed
Add dummy handler for roster manipulation IQ responses
Mikael Berthe <mikael@lilotux.net>
parents:
1693
diff
changeset
|
134 lm_connection_send_with_reply(lconnection, iq, handler, NULL); |
44e023ad99ed
Add dummy handler for roster manipulation IQ responses
Mikael Berthe <mikael@lilotux.net>
parents:
1693
diff
changeset
|
135 lm_message_handler_unref(handler); |
1598 | 136 lm_message_unref(iq); |
532
2ac8d8e49e81
Send status changes to chatrooms
Mikael Berthe <mikael@lilotux.net>
parents:
531
diff
changeset
|
137 |
1598 | 138 xmpp_send_s10n(cleanjid, LM_MESSAGE_SUB_TYPE_SUBSCRIBE); |
532
2ac8d8e49e81
Send status changes to chatrooms
Mikael Berthe <mikael@lilotux.net>
parents:
531
diff
changeset
|
139 |
1598 | 140 roster_add_user(cleanjid, name, group, ROSTER_TYPE_USER, sub_pending, -1); |
141 g_free(cleanjid); | |
142 buddylist_build(); | |
532
2ac8d8e49e81
Send status changes to chatrooms
Mikael Berthe <mikael@lilotux.net>
parents:
531
diff
changeset
|
143 |
1598 | 144 update_roster = TRUE; |
532
2ac8d8e49e81
Send status changes to chatrooms
Mikael Berthe <mikael@lilotux.net>
parents:
531
diff
changeset
|
145 } |
2ac8d8e49e81
Send status changes to chatrooms
Mikael Berthe <mikael@lilotux.net>
parents:
531
diff
changeset
|
146 |
1598 | 147 void xmpp_updatebuddy(const char *bjid, const char *name, const char *group) |
29 | 148 { |
1598 | 149 LmMessage *iq; |
1701
44e023ad99ed
Add dummy handler for roster manipulation IQ responses
Mikael Berthe <mikael@lilotux.net>
parents:
1693
diff
changeset
|
150 LmMessageHandler *handler; |
1598 | 151 LmMessageNode *x; |
152 char *cleanjid; | |
29 | 153 |
1684
95df4ea512c8
Provide xmpp_is_online()
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1683
diff
changeset
|
154 if (!xmpp_is_online()) |
1682
d1e8fb14ce2d
Destroy lm connection object on disconnect
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1668
diff
changeset
|
155 return; |
444 | 156 |
1598 | 157 // XXX We should check name's and group's correctness |
158 | |
159 cleanjid = jidtodisp(bjid); // Stripping resource, just in case... | |
29 | 160 |
1598 | 161 iq = lm_message_new_with_sub_type(NULL, LM_MESSAGE_TYPE_IQ, |
162 LM_MESSAGE_SUB_TYPE_SET); | |
163 x = lm_message_node_add_child(iq->node, "query", NULL); | |
164 lm_message_node_set_attribute(x, "xmlns", NS_ROSTER); | |
165 x = lm_message_node_add_child(x, "item", NULL); | |
1937
118524e9d7b6
Fix "/rename -" (Hermitifier)
Mikael Berthe <mikael@lilotux.net>
parents:
1920
diff
changeset
|
166 lm_message_node_set_attribute(x, "jid", cleanjid); |
118524e9d7b6
Fix "/rename -" (Hermitifier)
Mikael Berthe <mikael@lilotux.net>
parents:
1920
diff
changeset
|
167 if (name) |
118524e9d7b6
Fix "/rename -" (Hermitifier)
Mikael Berthe <mikael@lilotux.net>
parents:
1920
diff
changeset
|
168 lm_message_node_set_attribute(x, "name", name); |
29 | 169 |
1598 | 170 if (group) |
171 lm_message_node_add_child(x, "group", group); | |
1419
fb438482b28e
New option to customize the away/notavail priority (Michael Gehring)
Mikael Berthe <mikael@lilotux.net>
parents:
1415
diff
changeset
|
172 |
1701
44e023ad99ed
Add dummy handler for roster manipulation IQ responses
Mikael Berthe <mikael@lilotux.net>
parents:
1693
diff
changeset
|
173 handler = lm_message_handler_new(handle_iq_dummy, NULL, FALSE); |
44e023ad99ed
Add dummy handler for roster manipulation IQ responses
Mikael Berthe <mikael@lilotux.net>
parents:
1693
diff
changeset
|
174 lm_connection_send_with_reply(lconnection, iq, handler, NULL); |
44e023ad99ed
Add dummy handler for roster manipulation IQ responses
Mikael Berthe <mikael@lilotux.net>
parents:
1693
diff
changeset
|
175 lm_message_handler_unref(handler); |
1598 | 176 lm_message_unref(iq); |
177 g_free(cleanjid); | |
534 | 178 } |
179 | |
1598 | 180 void xmpp_delbuddy(const char *bjid) |
534 | 181 { |
1598 | 182 LmMessageNode *y, *z; |
183 LmMessage *iq; | |
1701
44e023ad99ed
Add dummy handler for roster manipulation IQ responses
Mikael Berthe <mikael@lilotux.net>
parents:
1693
diff
changeset
|
184 LmMessageHandler *handler; |
1598 | 185 char *cleanjid; |
186 | |
1684
95df4ea512c8
Provide xmpp_is_online()
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1683
diff
changeset
|
187 if (!xmpp_is_online()) |
1682
d1e8fb14ce2d
Destroy lm connection object on disconnect
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1668
diff
changeset
|
188 return; |
1598 | 189 |
190 cleanjid = jidtodisp(bjid); // Stripping resource, just in case... | |
534 | 191 |
1598 | 192 // If the current buddy is an agent, unsubscribe from it |
193 if (roster_gettype(cleanjid) == ROSTER_TYPE_AGENT) { | |
194 scr_LogPrint(LPRINT_LOGNORM, "Unregistering from the %s agent", cleanjid); | |
29 | 195 |
1598 | 196 iq = lm_message_new_with_sub_type(cleanjid, LM_MESSAGE_TYPE_IQ, |
197 LM_MESSAGE_SUB_TYPE_SET); | |
198 y = lm_message_node_add_child(iq->node, "query", NULL); | |
199 lm_message_node_set_attribute(y, "xmlns", NS_REGISTER); | |
200 lm_message_node_add_child(y, "remove", NULL); | |
1994
024bdd1c6418
Add a dummy handler for some unhandled IQ replies
Mikael Berthe <mikael@lilotux.net>
parents:
1984
diff
changeset
|
201 handler = lm_message_handler_new(handle_iq_dummy, NULL, FALSE); |
024bdd1c6418
Add a dummy handler for some unhandled IQ replies
Mikael Berthe <mikael@lilotux.net>
parents:
1984
diff
changeset
|
202 lm_connection_send_with_reply(lconnection, iq, handler, NULL); |
024bdd1c6418
Add a dummy handler for some unhandled IQ replies
Mikael Berthe <mikael@lilotux.net>
parents:
1984
diff
changeset
|
203 lm_message_handler_unref(handler); |
1598 | 204 lm_message_unref(iq); |
1014
99c5278bf6b8
Keep the status and status messages when we're disconnected
Mikael Berthe <mikael@lilotux.net>
parents:
1013
diff
changeset
|
205 } |
29 | 206 |
1598 | 207 // Cancel the subscriptions |
1729
e6e89b1d7831
Minor style and header updates
Mikael Berthe <mikael@lilotux.net>
parents:
1728
diff
changeset
|
208 xmpp_send_s10n(cleanjid, LM_MESSAGE_SUB_TYPE_UNSUBSCRIBED); // cancel "from" |
e6e89b1d7831
Minor style and header updates
Mikael Berthe <mikael@lilotux.net>
parents:
1728
diff
changeset
|
209 xmpp_send_s10n(cleanjid, LM_MESSAGE_SUB_TYPE_UNSUBSCRIBE); // cancel "to" |
1598 | 210 |
211 // Ask for removal from roster | |
212 iq = lm_message_new_with_sub_type(NULL, LM_MESSAGE_TYPE_IQ, | |
213 LM_MESSAGE_SUB_TYPE_SET); | |
444 | 214 |
1598 | 215 y = lm_message_node_add_child(iq->node, "query", NULL); |
216 lm_message_node_set_attribute(y, "xmlns", NS_ROSTER); | |
217 z = lm_message_node_add_child(y, "item", NULL); | |
218 lm_message_node_set_attributes(z, | |
219 "jid", cleanjid, | |
220 "subscription", "remove", | |
221 NULL); | |
1701
44e023ad99ed
Add dummy handler for roster manipulation IQ responses
Mikael Berthe <mikael@lilotux.net>
parents:
1693
diff
changeset
|
222 handler = lm_message_handler_new(handle_iq_dummy, NULL, FALSE); |
44e023ad99ed
Add dummy handler for roster manipulation IQ responses
Mikael Berthe <mikael@lilotux.net>
parents:
1693
diff
changeset
|
223 lm_connection_send_with_reply(lconnection, iq, handler, NULL); |
44e023ad99ed
Add dummy handler for roster manipulation IQ responses
Mikael Berthe <mikael@lilotux.net>
parents:
1693
diff
changeset
|
224 lm_message_handler_unref(handler); |
1598 | 225 lm_message_unref(iq); |
226 | |
227 roster_del_user(cleanjid); | |
228 g_free(cleanjid); | |
229 buddylist_build(); | |
230 | |
231 update_roster = TRUE; | |
232 } | |
1365 | 233 |
1598 | 234 void xmpp_request(const char *fjid, enum iqreq_type reqtype) |
235 { | |
236 GSList *resources, *p_res; | |
237 GSList *roster_elt; | |
238 const char *strreqtype, *xmlns; | |
1722
b18142457ca9
Fix vCard requests in MUC rooms
Mikael Berthe <mikael@lilotux.net>
parents:
1721
diff
changeset
|
239 gboolean vcard2user; |
1365 | 240 |
1598 | 241 if (reqtype == iqreq_version) { |
242 xmlns = NS_VERSION; | |
243 strreqtype = "version"; | |
244 } else if (reqtype == iqreq_time) { | |
2017 | 245 xmlns = NS_XMPP_TIME; |
1598 | 246 strreqtype = "time"; |
247 } else if (reqtype == iqreq_last) { | |
248 xmlns = NS_LAST; | |
249 strreqtype = "last"; | |
1705
ac881b5f9248
Add /request ping (XEP-0199), by merging isbear's module
Mikael Berthe <mikael@lilotux.net>
parents:
1701
diff
changeset
|
250 } else if (reqtype == iqreq_ping) { |
ac881b5f9248
Add /request ping (XEP-0199), by merging isbear's module
Mikael Berthe <mikael@lilotux.net>
parents:
1701
diff
changeset
|
251 xmlns = NS_PING; |
1711 | 252 strreqtype = "ping"; |
1598 | 253 } else if (reqtype == iqreq_vcard) { |
254 xmlns = NS_VCARD; | |
255 strreqtype = "vCard"; | |
256 } else | |
257 return; | |
1365 | 258 |
1722
b18142457ca9
Fix vCard requests in MUC rooms
Mikael Berthe <mikael@lilotux.net>
parents:
1721
diff
changeset
|
259 // Is it a vCard request to a regular user? |
b18142457ca9
Fix vCard requests in MUC rooms
Mikael Berthe <mikael@lilotux.net>
parents:
1721
diff
changeset
|
260 // (vCard requests are sent to bare JIDs, except in MUC rooms...) |
b18142457ca9
Fix vCard requests in MUC rooms
Mikael Berthe <mikael@lilotux.net>
parents:
1721
diff
changeset
|
261 vcard2user = (reqtype == iqreq_vcard && |
b18142457ca9
Fix vCard requests in MUC rooms
Mikael Berthe <mikael@lilotux.net>
parents:
1721
diff
changeset
|
262 !roster_find(fjid, jidsearch, ROSTER_TYPE_ROOM)); |
b18142457ca9
Fix vCard requests in MUC rooms
Mikael Berthe <mikael@lilotux.net>
parents:
1721
diff
changeset
|
263 |
b18142457ca9
Fix vCard requests in MUC rooms
Mikael Berthe <mikael@lilotux.net>
parents:
1721
diff
changeset
|
264 if (strchr(fjid, JID_RESOURCE_SEPARATOR) || vcard2user) { |
b18142457ca9
Fix vCard requests in MUC rooms
Mikael Berthe <mikael@lilotux.net>
parents:
1721
diff
changeset
|
265 // This is a full JID or a vCard request to a contact |
1598 | 266 xmpp_iq_request(fjid, xmlns); |
267 scr_LogPrint(LPRINT_NORMAL, "Sent %s request to <%s>", strreqtype, fjid); | |
268 return; | |
521 | 269 } |
713 | 270 |
1598 | 271 // The resource has not been specified |
272 roster_elt = roster_find(fjid, jidsearch, ROSTER_TYPE_USER|ROSTER_TYPE_ROOM); | |
273 if (!roster_elt) { | |
274 scr_LogPrint(LPRINT_NORMAL, "No known resource for <%s>...", fjid); | |
275 xmpp_iq_request(fjid, xmlns); // Let's send a request anyway... | |
276 scr_LogPrint(LPRINT_NORMAL, "Sent %s request to <%s>", strreqtype, fjid); | |
277 return; | |
278 } | |
1254
401639413340
More jabber:iq:last support... (misc)
Mikael Berthe <mikael@lilotux.net>
parents:
1244
diff
changeset
|
279 |
1598 | 280 // Send a request to each resource |
281 resources = buddy_getresources(roster_elt->data); | |
282 if (!resources) { | |
283 scr_LogPrint(LPRINT_NORMAL, "No known resource for <%s>...", fjid); | |
284 xmpp_iq_request(fjid, xmlns); // Let's send a request anyway... | |
285 scr_LogPrint(LPRINT_NORMAL, "Sent %s request to <%s>", strreqtype, fjid); | |
286 } | |
287 for (p_res = resources ; p_res ; p_res = g_slist_next(p_res)) { | |
288 gchar *fulljid; | |
289 fulljid = g_strdup_printf("%s/%s", fjid, (char*)p_res->data); | |
290 xmpp_iq_request(fulljid, xmlns); | |
291 scr_LogPrint(LPRINT_NORMAL, "Sent %s request to <%s>", strreqtype, fulljid); | |
292 g_free(fulljid); | |
293 g_free(p_res->data); | |
294 } | |
295 g_slist_free(resources); | |
1014
99c5278bf6b8
Keep the status and status messages when we're disconnected
Mikael Berthe <mikael@lilotux.net>
parents:
1013
diff
changeset
|
296 } |
99c5278bf6b8
Keep the status and status messages when we're disconnected
Mikael Berthe <mikael@lilotux.net>
parents:
1013
diff
changeset
|
297 |
1602 | 298 static LmHandlerResult cb_xep184(LmMessageHandler *h, LmConnection *c, |
299 LmMessage *m, gpointer user_data) | |
300 { | |
301 char *from = jidtodisp(lm_message_get_from(m)); | |
1780
e4378fbab5d7
Major API cleanup - bump API to 4
Mikael Berthe <mikael@lilotux.net>
parents:
1747
diff
changeset
|
302 scr_remove_receipt_flag(from, h); |
1602 | 303 g_free(from); |
304 return LM_HANDLER_RESULT_REMOVE_MESSAGE; | |
305 } | |
306 | |
1598 | 307 // xmpp_send_msg(jid, text, type, subject, |
308 // otrinject, *encrypted, type_overwrite) | |
1197 | 309 // When encrypted is not NULL, the function set *encrypted to 1 if the |
310 // message has been PGP-encrypted. If encryption enforcement is set and | |
311 // encryption fails, *encrypted is set to -1. | |
1598 | 312 void xmpp_send_msg(const char *fjid, const char *text, int type, |
313 const char *subject, gboolean otrinject, gint *encrypted, | |
1602 | 314 LmMessageSubType type_overwrite, gpointer *xep184) |
35 | 315 { |
1598 | 316 LmMessage *x; |
317 LmMessageSubType subtype; | |
1304 | 318 #ifdef HAVE_LIBOTR |
1299
3b338a5c01fc
OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
1290
diff
changeset
|
319 int otr_msg = 0; |
1304 | 320 #endif |
1999
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1998
diff
changeset
|
321 char *barejid; |
1691 | 322 #if defined HAVE_GPGME || defined XEP0022 || defined XEP0085 |
1999
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1998
diff
changeset
|
323 char *rname; |
1044
52cfe9bf9840
Encryption support for outgoing messages
Mikael Berthe <mikael@lilotux.net>
parents:
1043
diff
changeset
|
324 GSList *sl_buddy; |
52cfe9bf9840
Encryption support for outgoing messages
Mikael Berthe <mikael@lilotux.net>
parents:
1043
diff
changeset
|
325 #endif |
1691 | 326 #if defined XEP0022 || defined XEP0085 |
1598 | 327 LmMessageNode *event; |
1998
41667bc02883
Fix GCC warnings (variables set but not used)
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1994
diff
changeset
|
328 struct xep0085 *xep85 = NULL; |
41667bc02883
Fix GCC warnings (variables set but not used)
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1994
diff
changeset
|
329 #if defined XEP0022 |
1866 | 330 guint use_xep85 = 0; |
1998
41667bc02883
Fix GCC warnings (variables set but not used)
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1994
diff
changeset
|
331 #endif |
987
f47e312560af
Improve JEP22 + JEP85 support
Mikael Berthe <mikael@lilotux.net>
parents:
986
diff
changeset
|
332 #endif |
1044
52cfe9bf9840
Encryption support for outgoing messages
Mikael Berthe <mikael@lilotux.net>
parents:
1043
diff
changeset
|
333 gchar *enc = NULL; |
447
03bb57383cea
Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents:
444
diff
changeset
|
334 |
1055
6eb1efea75d0
PGP: Visual encryption flag
Mikael Berthe <mikael@lilotux.net>
parents:
1053
diff
changeset
|
335 if (encrypted) |
1197 | 336 *encrypted = 0; |
1055
6eb1efea75d0
PGP: Visual encryption flag
Mikael Berthe <mikael@lilotux.net>
parents:
1053
diff
changeset
|
337 |
1684
95df4ea512c8
Provide xmpp_is_online()
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1683
diff
changeset
|
338 if (!xmpp_is_online()) |
1435
9bf7f3ddff10
Do not send a groupchat-style message when changing a MUC room topic
Mikael Berthe <mikael@lilotux.net>
parents:
1426
diff
changeset
|
339 return; |
9bf7f3ddff10
Do not send a groupchat-style message when changing a MUC room topic
Mikael Berthe <mikael@lilotux.net>
parents:
1426
diff
changeset
|
340 |
9bf7f3ddff10
Do not send a groupchat-style message when changing a MUC room topic
Mikael Berthe <mikael@lilotux.net>
parents:
1426
diff
changeset
|
341 if (!text && type == ROSTER_TYPE_USER) |
9bf7f3ddff10
Do not send a groupchat-style message when changing a MUC room topic
Mikael Berthe <mikael@lilotux.net>
parents:
1426
diff
changeset
|
342 return; |
472
75442262c082
Disable some commands when not connected
Mikael Berthe <mikael@lilotux.net>
parents:
470
diff
changeset
|
343 |
1598 | 344 if (type_overwrite != LM_MESSAGE_SUB_TYPE_NOT_SET) |
345 subtype = type_overwrite; | |
1305
9bc68473f8a3
-n and -f flags to message-sending commands
Michal 'vorner' Vaner <vorner@ucw.cz>
parents:
1304
diff
changeset
|
346 else { |
9bc68473f8a3
-n and -f flags to message-sending commands
Michal 'vorner' Vaner <vorner@ucw.cz>
parents:
1304
diff
changeset
|
347 if (type == ROSTER_TYPE_ROOM) |
1598 | 348 subtype = LM_MESSAGE_SUB_TYPE_GROUPCHAT; |
1305
9bc68473f8a3
-n and -f flags to message-sending commands
Michal 'vorner' Vaner <vorner@ucw.cz>
parents:
1304
diff
changeset
|
349 else |
1598 | 350 subtype = LM_MESSAGE_SUB_TYPE_CHAT; |
1305
9bc68473f8a3
-n and -f flags to message-sending commands
Michal 'vorner' Vaner <vorner@ucw.cz>
parents:
1304
diff
changeset
|
351 } |
447
03bb57383cea
Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents:
444
diff
changeset
|
352 |
1999
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1998
diff
changeset
|
353 barejid = jidtodisp(fjid); |
1598 | 354 #if defined HAVE_GPGME || defined HAVE_LIBOTR || \ |
1691 | 355 defined XEP0022 || defined XEP0085 |
1058 | 356 rname = strchr(fjid, JID_RESOURCE_SEPARATOR); |
987
f47e312560af
Improve JEP22 + JEP85 support
Mikael Berthe <mikael@lilotux.net>
parents:
986
diff
changeset
|
357 sl_buddy = roster_find(barejid, jidsearch, ROSTER_TYPE_USER); |
f47e312560af
Improve JEP22 + JEP85 support
Mikael Berthe <mikael@lilotux.net>
parents:
986
diff
changeset
|
358 |
f47e312560af
Improve JEP22 + JEP85 support
Mikael Berthe <mikael@lilotux.net>
parents:
986
diff
changeset
|
359 // If we can get a resource name, we use it. Else we use NULL, |
f47e312560af
Improve JEP22 + JEP85 support
Mikael Berthe <mikael@lilotux.net>
parents:
986
diff
changeset
|
360 // which hopefully will give us the most likely resource. |
f47e312560af
Improve JEP22 + JEP85 support
Mikael Berthe <mikael@lilotux.net>
parents:
986
diff
changeset
|
361 if (rname) |
f47e312560af
Improve JEP22 + JEP85 support
Mikael Berthe <mikael@lilotux.net>
parents:
986
diff
changeset
|
362 rname++; |
1044
52cfe9bf9840
Encryption support for outgoing messages
Mikael Berthe <mikael@lilotux.net>
parents:
1043
diff
changeset
|
363 |
1299
3b338a5c01fc
OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
1290
diff
changeset
|
364 #ifdef HAVE_LIBOTR |
1598 | 365 if (otr_enabled() && !otrinject) { |
366 if (type == ROSTER_TYPE_USER) { | |
1347
07816313073b
Add an option 'otr' to enable OTR support in the configuration file
Mikael Berthe <mikael@lilotux.net>
parents:
1344
diff
changeset
|
367 otr_msg = otr_send((char **)&text, barejid); |
07816313073b
Add an option 'otr' to enable OTR support in the configuration file
Mikael Berthe <mikael@lilotux.net>
parents:
1344
diff
changeset
|
368 if (!text) { |
07816313073b
Add an option 'otr' to enable OTR support in the configuration file
Mikael Berthe <mikael@lilotux.net>
parents:
1344
diff
changeset
|
369 g_free(barejid); |
07816313073b
Add an option 'otr' to enable OTR support in the configuration file
Mikael Berthe <mikael@lilotux.net>
parents:
1344
diff
changeset
|
370 if (encrypted) |
07816313073b
Add an option 'otr' to enable OTR support in the configuration file
Mikael Berthe <mikael@lilotux.net>
parents:
1344
diff
changeset
|
371 *encrypted = -1; |
07816313073b
Add an option 'otr' to enable OTR support in the configuration file
Mikael Berthe <mikael@lilotux.net>
parents:
1344
diff
changeset
|
372 return; |
07816313073b
Add an option 'otr' to enable OTR support in the configuration file
Mikael Berthe <mikael@lilotux.net>
parents:
1344
diff
changeset
|
373 } |
1299
3b338a5c01fc
OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
1290
diff
changeset
|
374 } |
1484
7b36b91a4388
New UI message flag (O) when OTR is used
Mikael Berthe <mikael@lilotux.net>
parents:
1476
diff
changeset
|
375 if (otr_msg && encrypted) |
7b36b91a4388
New UI message flag (O) when OTR is used
Mikael Berthe <mikael@lilotux.net>
parents:
1476
diff
changeset
|
376 *encrypted = ENCRYPTED_OTR; |
1299
3b338a5c01fc
OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
1290
diff
changeset
|
377 } |
3b338a5c01fc
OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
1290
diff
changeset
|
378 #endif |
3b338a5c01fc
OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
1290
diff
changeset
|
379 |
1044
52cfe9bf9840
Encryption support for outgoing messages
Mikael Berthe <mikael@lilotux.net>
parents:
1043
diff
changeset
|
380 #ifdef HAVE_GPGME |
52cfe9bf9840
Encryption support for outgoing messages
Mikael Berthe <mikael@lilotux.net>
parents:
1043
diff
changeset
|
381 if (type == ROSTER_TYPE_USER && sl_buddy && gpg_enabled()) { |
1197 | 382 if (!settings_pgp_getdisabled(barejid)) { // not disabled for this contact? |
383 guint force; | |
1065
230dca34dbea
Extand pgp_data structure
Mikael Berthe <mikael@lilotux.net>
parents:
1058
diff
changeset
|
384 struct pgp_data *res_pgpdata; |
1197 | 385 force = settings_pgp_getforce(barejid); |
1065
230dca34dbea
Extand pgp_data structure
Mikael Berthe <mikael@lilotux.net>
parents:
1058
diff
changeset
|
386 res_pgpdata = buddy_resource_pgp(sl_buddy->data, rname); |
1197 | 387 if (force || (res_pgpdata && res_pgpdata->sign_keyid)) { |
388 /* Remote client has PGP support (we have a signature) | |
389 * OR encryption is enforced (force = TRUE). | |
1067
a5dc85fdebde
Add key comparison for signatures & use user-provided PGP keys for encryption
Mikael Berthe <mikael@lilotux.net>
parents:
1065
diff
changeset
|
390 * If the contact has a specific KeyId, we'll use it; |
a5dc85fdebde
Add key comparison for signatures & use user-provided PGP keys for encryption
Mikael Berthe <mikael@lilotux.net>
parents:
1065
diff
changeset
|
391 * if not, we'll use the key used for the signature. |
a5dc85fdebde
Add key comparison for signatures & use user-provided PGP keys for encryption
Mikael Berthe <mikael@lilotux.net>
parents:
1065
diff
changeset
|
392 * Both keys should match, in theory (cf. XEP-0027). */ |
a5dc85fdebde
Add key comparison for signatures & use user-provided PGP keys for encryption
Mikael Berthe <mikael@lilotux.net>
parents:
1065
diff
changeset
|
393 const char *key; |
a5dc85fdebde
Add key comparison for signatures & use user-provided PGP keys for encryption
Mikael Berthe <mikael@lilotux.net>
parents:
1065
diff
changeset
|
394 key = settings_pgp_getkeyid(barejid); |
1197 | 395 if (!key && res_pgpdata) |
1067
a5dc85fdebde
Add key comparison for signatures & use user-provided PGP keys for encryption
Mikael Berthe <mikael@lilotux.net>
parents:
1065
diff
changeset
|
396 key = res_pgpdata->sign_keyid; |
1197 | 397 if (key) |
398 enc = gpg_encrypt(text, key); | |
399 if (!enc && force) { | |
400 if (encrypted) | |
401 *encrypted = -1; | |
402 g_free(barejid); | |
403 return; | |
404 } | |
1067
a5dc85fdebde
Add key comparison for signatures & use user-provided PGP keys for encryption
Mikael Berthe <mikael@lilotux.net>
parents:
1065
diff
changeset
|
405 } |
1065
230dca34dbea
Extand pgp_data structure
Mikael Berthe <mikael@lilotux.net>
parents:
1058
diff
changeset
|
406 } |
1044
52cfe9bf9840
Encryption support for outgoing messages
Mikael Berthe <mikael@lilotux.net>
parents:
1043
diff
changeset
|
407 } |
1067
a5dc85fdebde
Add key comparison for signatures & use user-provided PGP keys for encryption
Mikael Berthe <mikael@lilotux.net>
parents:
1065
diff
changeset
|
408 #endif // HAVE_GPGME |
a5dc85fdebde
Add key comparison for signatures & use user-provided PGP keys for encryption
Mikael Berthe <mikael@lilotux.net>
parents:
1065
diff
changeset
|
409 |
1691 | 410 #endif // HAVE_GPGME || defined XEP0022 || defined XEP0085 |
1044
52cfe9bf9840
Encryption support for outgoing messages
Mikael Berthe <mikael@lilotux.net>
parents:
1043
diff
changeset
|
411 |
1598 | 412 x = lm_message_new_with_sub_type(fjid, LM_MESSAGE_TYPE_MESSAGE, subtype); |
413 lm_message_node_add_child(x->node, "body", | |
414 enc ? "This message is PGP-encrypted." : text); | |
415 | |
416 if (subject) | |
417 lm_message_node_add_child(x->node, "subject", subject); | |
418 | |
1044
52cfe9bf9840
Encryption support for outgoing messages
Mikael Berthe <mikael@lilotux.net>
parents:
1043
diff
changeset
|
419 if (enc) { |
1598 | 420 LmMessageNode *y; |
421 y = lm_message_node_add_child(x->node, "x", enc); | |
422 lm_message_node_set_attribute(y, "xmlns", NS_ENCRYPTED); | |
1055
6eb1efea75d0
PGP: Visual encryption flag
Mikael Berthe <mikael@lilotux.net>
parents:
1053
diff
changeset
|
423 if (encrypted) |
1484
7b36b91a4388
New UI message flag (O) when OTR is used
Mikael Berthe <mikael@lilotux.net>
parents:
1476
diff
changeset
|
424 *encrypted = ENCRYPTED_PGP; |
1044
52cfe9bf9840
Encryption support for outgoing messages
Mikael Berthe <mikael@lilotux.net>
parents:
1043
diff
changeset
|
425 g_free(enc); |
52cfe9bf9840
Encryption support for outgoing messages
Mikael Berthe <mikael@lilotux.net>
parents:
1043
diff
changeset
|
426 } |
52cfe9bf9840
Encryption support for outgoing messages
Mikael Berthe <mikael@lilotux.net>
parents:
1043
diff
changeset
|
427 |
1729
e6e89b1d7831
Minor style and header updates
Mikael Berthe <mikael@lilotux.net>
parents:
1728
diff
changeset
|
428 // XEP-0184: Message Receipts |
1730
860b58a0e8da
Update XEP-0184 support
Mikael Berthe <mikael@lilotux.net>
parents:
1729
diff
changeset
|
429 if (sl_buddy && xep184 && |
1602 | 430 caps_has_feature(buddy_resource_getcaps(sl_buddy->data, rname), |
1999
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1998
diff
changeset
|
431 NS_RECEIPTS, barejid)) { |
1602 | 432 lm_message_node_set_attribute |
433 (lm_message_node_add_child(x->node, "request", NULL), | |
434 "xmlns", NS_RECEIPTS); | |
435 *xep184 = lm_message_handler_new(cb_xep184, NULL, NULL); | |
436 } | |
1999
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1998
diff
changeset
|
437 g_free(barejid); |
1602 | 438 |
1691 | 439 #if defined XEP0022 || defined XEP0085 |
1044
52cfe9bf9840
Encryption support for outgoing messages
Mikael Berthe <mikael@lilotux.net>
parents:
1043
diff
changeset
|
440 // If typing notifications are disabled, we can skip all this stuff... |
52cfe9bf9840
Encryption support for outgoing messages
Mikael Berthe <mikael@lilotux.net>
parents:
1043
diff
changeset
|
441 if (chatstates_disabled || type == ROSTER_TYPE_ROOM) |
1598 | 442 goto xmpp_send_msg_no_chatstates; |
1044
52cfe9bf9840
Encryption support for outgoing messages
Mikael Berthe <mikael@lilotux.net>
parents:
1043
diff
changeset
|
443 |
987
f47e312560af
Improve JEP22 + JEP85 support
Mikael Berthe <mikael@lilotux.net>
parents:
986
diff
changeset
|
444 if (sl_buddy) |
1866 | 445 xep85 = buddy_resource_xep85(sl_buddy->data, rname); |
986
ed697234bd39
Chat states receival (Alexis Hildebrandt)
Mikael Berthe <mikael@lilotux.net>
parents:
977
diff
changeset
|
446 #endif |
ed697234bd39
Chat states receival (Alexis Hildebrandt)
Mikael Berthe <mikael@lilotux.net>
parents:
977
diff
changeset
|
447 |
1691 | 448 #ifdef XEP0085 |
449 /* XEP-0085 5.1 | |
987
f47e312560af
Improve JEP22 + JEP85 support
Mikael Berthe <mikael@lilotux.net>
parents:
986
diff
changeset
|
450 * "Until receiving a reply to the initial content message (or a standalone |
f47e312560af
Improve JEP22 + JEP85 support
Mikael Berthe <mikael@lilotux.net>
parents:
986
diff
changeset
|
451 * notification) from the Contact, the User MUST NOT send subsequent chat |
f47e312560af
Improve JEP22 + JEP85 support
Mikael Berthe <mikael@lilotux.net>
parents:
986
diff
changeset
|
452 * state notifications to the Contact." |
1378 | 453 * In our implementation support is initially "unknown", then it's "probed" |
987
f47e312560af
Improve JEP22 + JEP85 support
Mikael Berthe <mikael@lilotux.net>
parents:
986
diff
changeset
|
454 * and can become "ok". |
f47e312560af
Improve JEP22 + JEP85 support
Mikael Berthe <mikael@lilotux.net>
parents:
986
diff
changeset
|
455 */ |
1866 | 456 if (xep85 && (xep85->support == CHATSTATES_SUPPORT_OK || |
457 xep85->support == CHATSTATES_SUPPORT_UNKNOWN)) { | |
1598 | 458 event = lm_message_node_add_child(x->node, "active", NULL); |
459 lm_message_node_set_attribute(event, "xmlns", NS_CHATSTATES); | |
1866 | 460 if (xep85->support == CHATSTATES_SUPPORT_UNKNOWN) |
461 xep85->support = CHATSTATES_SUPPORT_PROBED; | |
1998
41667bc02883
Fix GCC warnings (variables set but not used)
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1994
diff
changeset
|
462 #ifdef XEP0022 |
987
f47e312560af
Improve JEP22 + JEP85 support
Mikael Berthe <mikael@lilotux.net>
parents:
986
diff
changeset
|
463 else |
1866 | 464 use_xep85 = 1; |
1998
41667bc02883
Fix GCC warnings (variables set but not used)
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1994
diff
changeset
|
465 #endif |
1866 | 466 xep85->last_state_sent = ROSTER_EVENT_ACTIVE; |
987
f47e312560af
Improve JEP22 + JEP85 support
Mikael Berthe <mikael@lilotux.net>
parents:
986
diff
changeset
|
467 } |
f47e312560af
Improve JEP22 + JEP85 support
Mikael Berthe <mikael@lilotux.net>
parents:
986
diff
changeset
|
468 #endif |
1691 | 469 #ifdef XEP0022 |
470 /* XEP-22 | |
471 * If the Contact supports XEP-0085, we do not use XEP-0022. | |
472 * If not, we try to fall back to XEP-0022. | |
987
f47e312560af
Improve JEP22 + JEP85 support
Mikael Berthe <mikael@lilotux.net>
parents:
986
diff
changeset
|
473 */ |
1866 | 474 if (!use_xep85) { |
475 struct xep0022 *xep22 = NULL; | |
1598 | 476 event = lm_message_node_add_child(x->node, "x", NULL); |
477 lm_message_node_set_attribute(event, "xmlns", NS_EVENT); | |
478 lm_message_node_add_child(event, "composing", NULL); | |
988
6e2bfd1ffded
Add ids to message stanzas if needed
Mikael Berthe <mikael@lilotux.net>
parents:
987
diff
changeset
|
479 |
990
35e7913affb7
Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents:
989
diff
changeset
|
480 if (sl_buddy) |
1866 | 481 xep22 = buddy_resource_xep22(sl_buddy->data, rname); |
482 if (xep22) | |
483 xep22->last_state_sent = ROSTER_EVENT_ACTIVE; | |
990
35e7913affb7
Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents:
989
diff
changeset
|
484 |
1691 | 485 // An id is mandatory when using XEP-0022. |
1598 | 486 if (text || subject) { |
487 const gchar *msgid = lm_message_get_id(x); | |
989
859ab76e5093
Send JEP-22 delivered messages
Mikael Berthe <mikael@lilotux.net>
parents:
988
diff
changeset
|
488 // Let's update last_msgid_sent |
1866 | 489 if (xep22) { |
490 g_free(xep22->last_msgid_sent); | |
491 xep22->last_msgid_sent = g_strdup(msgid); | |
989
859ab76e5093
Send JEP-22 delivered messages
Mikael Berthe <mikael@lilotux.net>
parents:
988
diff
changeset
|
492 } |
988
6e2bfd1ffded
Add ids to message stanzas if needed
Mikael Berthe <mikael@lilotux.net>
parents:
987
diff
changeset
|
493 } |
987
f47e312560af
Improve JEP22 + JEP85 support
Mikael Berthe <mikael@lilotux.net>
parents:
986
diff
changeset
|
494 } |
f47e312560af
Improve JEP22 + JEP85 support
Mikael Berthe <mikael@lilotux.net>
parents:
986
diff
changeset
|
495 #endif |
986
ed697234bd39
Chat states receival (Alexis Hildebrandt)
Mikael Berthe <mikael@lilotux.net>
parents:
977
diff
changeset
|
496 |
1598 | 497 xmpp_send_msg_no_chatstates: |
1972
45f0f0f60656
Remove deprecated status invisible
Mikael Berthe <mikael@lilotux.net>
parents:
1963
diff
changeset
|
498 #ifdef WITH_DEPRECATED_STATUS_INVISIBLE |
1254
401639413340
More jabber:iq:last support... (misc)
Mikael Berthe <mikael@lilotux.net>
parents:
1244
diff
changeset
|
499 if (mystatus != invisible) |
1972
45f0f0f60656
Remove deprecated status invisible
Mikael Berthe <mikael@lilotux.net>
parents:
1963
diff
changeset
|
500 #endif |
1254
401639413340
More jabber:iq:last support... (misc)
Mikael Berthe <mikael@lilotux.net>
parents:
1244
diff
changeset
|
501 update_last_use(); |
1602 | 502 if (xep184 && *xep184) { |
503 lm_connection_send_with_reply(lconnection, x, *xep184, NULL); | |
504 lm_message_handler_unref(*xep184); | |
505 } else | |
506 lm_connection_send(lconnection, x, NULL); | |
1598 | 507 lm_message_unref(x); |
35 | 508 } |
509 | |
1691 | 510 #ifdef XEP0085 |
1866 | 511 // xmpp_send_xep85_chatstate() |
1691 | 512 // Send a XEP-85 chatstate. |
1866 | 513 static void xmpp_send_xep85_chatstate(const char *bjid, const char *resname, |
1598 | 514 guint state) |
990
35e7913affb7
Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents:
989
diff
changeset
|
515 { |
1598 | 516 LmMessage *m; |
517 LmMessageNode *event; | |
990
35e7913affb7
Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents:
989
diff
changeset
|
518 GSList *sl_buddy; |
35e7913affb7
Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents:
989
diff
changeset
|
519 const char *chattag; |
1091
10f9d6fcfeab
JEP85: Reset composing/paused state when a resource with higher prio comes up
Mikael Berthe <mikael@lilotux.net>
parents:
1072
diff
changeset
|
520 char *rjid, *fjid = NULL; |
1866 | 521 struct xep0085 *xep85 = NULL; |
990
35e7913affb7
Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents:
989
diff
changeset
|
522 |
1684
95df4ea512c8
Provide xmpp_is_online()
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1683
diff
changeset
|
523 if (!xmpp_is_online()) |
1682
d1e8fb14ce2d
Destroy lm connection object on disconnect
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1668
diff
changeset
|
524 return; |
990
35e7913affb7
Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents:
989
diff
changeset
|
525 |
1091
10f9d6fcfeab
JEP85: Reset composing/paused state when a resource with higher prio comes up
Mikael Berthe <mikael@lilotux.net>
parents:
1072
diff
changeset
|
526 sl_buddy = roster_find(bjid, jidsearch, ROSTER_TYPE_USER); |
990
35e7913affb7
Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents:
989
diff
changeset
|
527 |
1091
10f9d6fcfeab
JEP85: Reset composing/paused state when a resource with higher prio comes up
Mikael Berthe <mikael@lilotux.net>
parents:
1072
diff
changeset
|
528 // If we have a resource name, we use it. Else we use NULL, |
990
35e7913affb7
Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents:
989
diff
changeset
|
529 // which hopefully will give us the most likely resource. |
35e7913affb7
Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents:
989
diff
changeset
|
530 if (sl_buddy) |
1866 | 531 xep85 = buddy_resource_xep85(sl_buddy->data, resname); |
990
35e7913affb7
Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents:
989
diff
changeset
|
532 |
1866 | 533 if (!xep85 || (xep85->support != CHATSTATES_SUPPORT_OK)) |
990
35e7913affb7
Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents:
989
diff
changeset
|
534 return; |
35e7913affb7
Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents:
989
diff
changeset
|
535 |
1866 | 536 if (state == xep85->last_state_sent) |
990
35e7913affb7
Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents:
989
diff
changeset
|
537 return; |
35e7913affb7
Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents:
989
diff
changeset
|
538 |
35e7913affb7
Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents:
989
diff
changeset
|
539 if (state == ROSTER_EVENT_ACTIVE) |
35e7913affb7
Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents:
989
diff
changeset
|
540 chattag = "active"; |
35e7913affb7
Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents:
989
diff
changeset
|
541 else if (state == ROSTER_EVENT_COMPOSING) |
35e7913affb7
Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents:
989
diff
changeset
|
542 chattag = "composing"; |
35e7913affb7
Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents:
989
diff
changeset
|
543 else if (state == ROSTER_EVENT_PAUSED) |
35e7913affb7
Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents:
989
diff
changeset
|
544 chattag = "paused"; |
35e7913affb7
Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents:
989
diff
changeset
|
545 else { |
1691 | 546 scr_LogPrint(LPRINT_LOGNORM, "Error: unsupported XEP-85 state (%d)", state); |
990
35e7913affb7
Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents:
989
diff
changeset
|
547 return; |
35e7913affb7
Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents:
989
diff
changeset
|
548 } |
35e7913affb7
Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents:
989
diff
changeset
|
549 |
1866 | 550 xep85->last_state_sent = state; |
990
35e7913affb7
Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents:
989
diff
changeset
|
551 |
1091
10f9d6fcfeab
JEP85: Reset composing/paused state when a resource with higher prio comes up
Mikael Berthe <mikael@lilotux.net>
parents:
1072
diff
changeset
|
552 if (resname) |
10f9d6fcfeab
JEP85: Reset composing/paused state when a resource with higher prio comes up
Mikael Berthe <mikael@lilotux.net>
parents:
1072
diff
changeset
|
553 fjid = g_strdup_printf("%s/%s", bjid, resname); |
10f9d6fcfeab
JEP85: Reset composing/paused state when a resource with higher prio comes up
Mikael Berthe <mikael@lilotux.net>
parents:
1072
diff
changeset
|
554 |
10f9d6fcfeab
JEP85: Reset composing/paused state when a resource with higher prio comes up
Mikael Berthe <mikael@lilotux.net>
parents:
1072
diff
changeset
|
555 rjid = resname ? fjid : (char*)bjid; |
1598 | 556 m = lm_message_new_with_sub_type(rjid, LM_MESSAGE_TYPE_MESSAGE, |
557 LM_MESSAGE_SUB_TYPE_CHAT); | |
990
35e7913affb7
Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents:
989
diff
changeset
|
558 |
1598 | 559 event = lm_message_node_add_child(m->node, chattag, NULL); |
560 lm_message_node_set_attribute(event, "xmlns", NS_CHATSTATES); | |
990
35e7913affb7
Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents:
989
diff
changeset
|
561 |
1598 | 562 lm_connection_send(lconnection, m, NULL); |
563 lm_message_unref(m); | |
990
35e7913affb7
Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents:
989
diff
changeset
|
564 |
1091
10f9d6fcfeab
JEP85: Reset composing/paused state when a resource with higher prio comes up
Mikael Berthe <mikael@lilotux.net>
parents:
1072
diff
changeset
|
565 g_free(fjid); |
990
35e7913affb7
Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents:
989
diff
changeset
|
566 } |
35e7913affb7
Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents:
989
diff
changeset
|
567 #endif |
35e7913affb7
Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents:
989
diff
changeset
|
568 |
1691 | 569 #ifdef XEP0022 |
1866 | 570 // xmpp_send_xep22_event() |
1691 | 571 // Send a XEP-22 message event (delivered, composing...). |
1866 | 572 static void xmpp_send_xep22_event(const char *fjid, guint type) |
989
859ab76e5093
Send JEP-22 delivered messages
Mikael Berthe <mikael@lilotux.net>
parents:
988
diff
changeset
|
573 { |
1598 | 574 LmMessage *x; |
575 LmMessageNode *event; | |
989
859ab76e5093
Send JEP-22 delivered messages
Mikael Berthe <mikael@lilotux.net>
parents:
988
diff
changeset
|
576 const char *msgid; |
859ab76e5093
Send JEP-22 delivered messages
Mikael Berthe <mikael@lilotux.net>
parents:
988
diff
changeset
|
577 char *rname, *barejid; |
859ab76e5093
Send JEP-22 delivered messages
Mikael Berthe <mikael@lilotux.net>
parents:
988
diff
changeset
|
578 GSList *sl_buddy; |
1866 | 579 struct xep0022 *xep22 = NULL; |
580 guint xep22_state; | |
989
859ab76e5093
Send JEP-22 delivered messages
Mikael Berthe <mikael@lilotux.net>
parents:
988
diff
changeset
|
581 |
1684
95df4ea512c8
Provide xmpp_is_online()
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1683
diff
changeset
|
582 if (!xmpp_is_online()) |
1682
d1e8fb14ce2d
Destroy lm connection object on disconnect
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1668
diff
changeset
|
583 return; |
989
859ab76e5093
Send JEP-22 delivered messages
Mikael Berthe <mikael@lilotux.net>
parents:
988
diff
changeset
|
584 |
1058 | 585 rname = strchr(fjid, JID_RESOURCE_SEPARATOR); |
586 barejid = jidtodisp(fjid); | |
989
859ab76e5093
Send JEP-22 delivered messages
Mikael Berthe <mikael@lilotux.net>
parents:
988
diff
changeset
|
587 sl_buddy = roster_find(barejid, jidsearch, ROSTER_TYPE_USER); |
859ab76e5093
Send JEP-22 delivered messages
Mikael Berthe <mikael@lilotux.net>
parents:
988
diff
changeset
|
588 g_free(barejid); |
859ab76e5093
Send JEP-22 delivered messages
Mikael Berthe <mikael@lilotux.net>
parents:
988
diff
changeset
|
589 |
859ab76e5093
Send JEP-22 delivered messages
Mikael Berthe <mikael@lilotux.net>
parents:
988
diff
changeset
|
590 // If we can get a resource name, we use it. Else we use NULL, |
859ab76e5093
Send JEP-22 delivered messages
Mikael Berthe <mikael@lilotux.net>
parents:
988
diff
changeset
|
591 // which hopefully will give us the most likely resource. |
859ab76e5093
Send JEP-22 delivered messages
Mikael Berthe <mikael@lilotux.net>
parents:
988
diff
changeset
|
592 if (rname) |
859ab76e5093
Send JEP-22 delivered messages
Mikael Berthe <mikael@lilotux.net>
parents:
988
diff
changeset
|
593 rname++; |
859ab76e5093
Send JEP-22 delivered messages
Mikael Berthe <mikael@lilotux.net>
parents:
988
diff
changeset
|
594 if (sl_buddy) |
1866 | 595 xep22 = buddy_resource_xep22(sl_buddy->data, rname); |
989
859ab76e5093
Send JEP-22 delivered messages
Mikael Berthe <mikael@lilotux.net>
parents:
988
diff
changeset
|
596 |
1866 | 597 if (!xep22) |
990
35e7913affb7
Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents:
989
diff
changeset
|
598 return; // XXX Maybe we could try harder (other resources?) |
35e7913affb7
Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents:
989
diff
changeset
|
599 |
1866 | 600 msgid = xep22->last_msgid_rcvd; |
990
35e7913affb7
Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents:
989
diff
changeset
|
601 |
35e7913affb7
Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents:
989
diff
changeset
|
602 // For composing events (composing, active, inactive, paused...), |
1691 | 603 // XEP22 only has 2 states; we'll use composing and active. |
990
35e7913affb7
Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents:
989
diff
changeset
|
604 if (type == ROSTER_EVENT_COMPOSING) |
1866 | 605 xep22_state = ROSTER_EVENT_COMPOSING; |
990
35e7913affb7
Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents:
989
diff
changeset
|
606 else if (type == ROSTER_EVENT_ACTIVE || |
35e7913affb7
Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents:
989
diff
changeset
|
607 type == ROSTER_EVENT_PAUSED) |
1866 | 608 xep22_state = ROSTER_EVENT_ACTIVE; |
990
35e7913affb7
Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents:
989
diff
changeset
|
609 else |
1866 | 610 xep22_state = 0; // ROSTER_EVENT_NONE |
990
35e7913affb7
Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents:
989
diff
changeset
|
611 |
1866 | 612 if (xep22_state) { |
990
35e7913affb7
Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents:
989
diff
changeset
|
613 // Do not re-send a same event |
1866 | 614 if (xep22_state == xep22->last_state_sent) |
990
35e7913affb7
Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents:
989
diff
changeset
|
615 return; |
1866 | 616 xep22->last_state_sent = xep22_state; |
990
35e7913affb7
Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents:
989
diff
changeset
|
617 } |
989
859ab76e5093
Send JEP-22 delivered messages
Mikael Berthe <mikael@lilotux.net>
parents:
988
diff
changeset
|
618 |
1598 | 619 x = lm_message_new_with_sub_type(fjid, LM_MESSAGE_TYPE_MESSAGE, |
620 LM_MESSAGE_SUB_TYPE_CHAT); | |
989
859ab76e5093
Send JEP-22 delivered messages
Mikael Berthe <mikael@lilotux.net>
parents:
988
diff
changeset
|
621 |
1598 | 622 event = lm_message_node_add_child(x->node, "x", NULL); |
623 lm_message_node_set_attribute(event, "xmlns", NS_EVENT); | |
989
859ab76e5093
Send JEP-22 delivered messages
Mikael Berthe <mikael@lilotux.net>
parents:
988
diff
changeset
|
624 if (type == ROSTER_EVENT_DELIVERED) |
1598 | 625 lm_message_node_add_child(event, "delivered", NULL); |
989
859ab76e5093
Send JEP-22 delivered messages
Mikael Berthe <mikael@lilotux.net>
parents:
988
diff
changeset
|
626 else if (type == ROSTER_EVENT_COMPOSING) |
1598 | 627 lm_message_node_add_child(event, "composing", NULL); |
628 lm_message_node_add_child(event, "id", msgid); | |
989
859ab76e5093
Send JEP-22 delivered messages
Mikael Berthe <mikael@lilotux.net>
parents:
988
diff
changeset
|
629 |
1598 | 630 lm_connection_send(lconnection, x, NULL); |
631 lm_message_unref(x); | |
989
859ab76e5093
Send JEP-22 delivered messages
Mikael Berthe <mikael@lilotux.net>
parents:
988
diff
changeset
|
632 } |
859ab76e5093
Send JEP-22 delivered messages
Mikael Berthe <mikael@lilotux.net>
parents:
988
diff
changeset
|
633 #endif |
859ab76e5093
Send JEP-22 delivered messages
Mikael Berthe <mikael@lilotux.net>
parents:
988
diff
changeset
|
634 |
1598 | 635 // xmpp_send_chatstate(buddy, state) |
1691 | 636 // Send a chatstate or event (XEP-22/85) according to the buddy's capabilities. |
997 | 637 // The message is sent to one of the resources with the highest priority. |
1691 | 638 #if defined XEP0022 || defined XEP0085 |
1598 | 639 void xmpp_send_chatstate(gpointer buddy, guint chatstate) |
990
35e7913affb7
Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents:
989
diff
changeset
|
640 { |
1058 | 641 const char *bjid; |
2013
8dc418af3e72
Allow to select to which buddy resource messages go. Closes issue #55
Hermitifier
parents:
2010
diff
changeset
|
642 const char *activeres; |
1691 | 643 #ifdef XEP0085 |
1091
10f9d6fcfeab
JEP85: Reset composing/paused state when a resource with higher prio comes up
Mikael Berthe <mikael@lilotux.net>
parents:
1072
diff
changeset
|
644 GSList *resources, *p_res, *p_next; |
1866 | 645 struct xep0085 *xep85 = NULL; |
1091
10f9d6fcfeab
JEP85: Reset composing/paused state when a resource with higher prio comes up
Mikael Berthe <mikael@lilotux.net>
parents:
1072
diff
changeset
|
646 #endif |
1691 | 647 #ifdef XEP0022 |
1866 | 648 struct xep0022 *xep22; |
1091
10f9d6fcfeab
JEP85: Reset composing/paused state when a resource with higher prio comes up
Mikael Berthe <mikael@lilotux.net>
parents:
1072
diff
changeset
|
649 #endif |
990
35e7913affb7
Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents:
989
diff
changeset
|
650 |
1058 | 651 bjid = buddy_getjid(buddy); |
652 if (!bjid) return; | |
2013
8dc418af3e72
Allow to select to which buddy resource messages go. Closes issue #55
Hermitifier
parents:
2010
diff
changeset
|
653 activeres = buddy_getactiveresource(buddy); |
990
35e7913affb7
Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents:
989
diff
changeset
|
654 |
1691 | 655 #ifdef XEP0085 |
1091
10f9d6fcfeab
JEP85: Reset composing/paused state when a resource with higher prio comes up
Mikael Berthe <mikael@lilotux.net>
parents:
1072
diff
changeset
|
656 /* Send the chatstate to the last resource (which should have the highest |
10f9d6fcfeab
JEP85: Reset composing/paused state when a resource with higher prio comes up
Mikael Berthe <mikael@lilotux.net>
parents:
1072
diff
changeset
|
657 priority). |
10f9d6fcfeab
JEP85: Reset composing/paused state when a resource with higher prio comes up
Mikael Berthe <mikael@lilotux.net>
parents:
1072
diff
changeset
|
658 If chatstate is "active", send an "active" state to all resources |
10f9d6fcfeab
JEP85: Reset composing/paused state when a resource with higher prio comes up
Mikael Berthe <mikael@lilotux.net>
parents:
1072
diff
changeset
|
659 which do not curently have this state. |
10f9d6fcfeab
JEP85: Reset composing/paused state when a resource with higher prio comes up
Mikael Berthe <mikael@lilotux.net>
parents:
1072
diff
changeset
|
660 */ |
10f9d6fcfeab
JEP85: Reset composing/paused state when a resource with higher prio comes up
Mikael Berthe <mikael@lilotux.net>
parents:
1072
diff
changeset
|
661 resources = buddy_getresources(buddy); |
10f9d6fcfeab
JEP85: Reset composing/paused state when a resource with higher prio comes up
Mikael Berthe <mikael@lilotux.net>
parents:
1072
diff
changeset
|
662 for (p_res = resources ; p_res ; p_res = p_next) { |
10f9d6fcfeab
JEP85: Reset composing/paused state when a resource with higher prio comes up
Mikael Berthe <mikael@lilotux.net>
parents:
1072
diff
changeset
|
663 p_next = g_slist_next(p_res); |
1866 | 664 xep85 = buddy_resource_xep85(buddy, p_res->data); |
665 if (xep85 && xep85->support == CHATSTATES_SUPPORT_OK) { | |
1091
10f9d6fcfeab
JEP85: Reset composing/paused state when a resource with higher prio comes up
Mikael Berthe <mikael@lilotux.net>
parents:
1072
diff
changeset
|
666 // If p_next is NULL, this is the highest (prio) resource, i.e. |
2013
8dc418af3e72
Allow to select to which buddy resource messages go. Closes issue #55
Hermitifier
parents:
2010
diff
changeset
|
667 // the one we are probably writing to - unless there is defined an |
8dc418af3e72
Allow to select to which buddy resource messages go. Closes issue #55
Hermitifier
parents:
2010
diff
changeset
|
668 // active resource |
8dc418af3e72
Allow to select to which buddy resource messages go. Closes issue #55
Hermitifier
parents:
2010
diff
changeset
|
669 if (!g_strcmp0(p_res->data, activeres) || (!p_next && !activeres) || |
8dc418af3e72
Allow to select to which buddy resource messages go. Closes issue #55
Hermitifier
parents:
2010
diff
changeset
|
670 (xep85->last_state_sent != ROSTER_EVENT_ACTIVE && |
8dc418af3e72
Allow to select to which buddy resource messages go. Closes issue #55
Hermitifier
parents:
2010
diff
changeset
|
671 chatstate == ROSTER_EVENT_ACTIVE)) |
1866 | 672 xmpp_send_xep85_chatstate(bjid, p_res->data, chatstate); |
1091
10f9d6fcfeab
JEP85: Reset composing/paused state when a resource with higher prio comes up
Mikael Berthe <mikael@lilotux.net>
parents:
1072
diff
changeset
|
673 } |
10f9d6fcfeab
JEP85: Reset composing/paused state when a resource with higher prio comes up
Mikael Berthe <mikael@lilotux.net>
parents:
1072
diff
changeset
|
674 g_free(p_res->data); |
990
35e7913affb7
Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents:
989
diff
changeset
|
675 } |
1091
10f9d6fcfeab
JEP85: Reset composing/paused state when a resource with higher prio comes up
Mikael Berthe <mikael@lilotux.net>
parents:
1072
diff
changeset
|
676 g_slist_free(resources); |
1099
7804dbac3875
Fix a potential JEP22/85 issue introduced by changeset 10f9d6fcfeab
Mikael Berthe <mikael@lilotux.net>
parents:
1091
diff
changeset
|
677 // If the last resource had chatstates support when can return now, |
1691 | 678 // we don't want to send a XEP22 event. |
1866 | 679 if (xep85 && xep85->support == CHATSTATES_SUPPORT_OK) |
1099
7804dbac3875
Fix a potential JEP22/85 issue introduced by changeset 10f9d6fcfeab
Mikael Berthe <mikael@lilotux.net>
parents:
1091
diff
changeset
|
680 return; |
990
35e7913affb7
Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents:
989
diff
changeset
|
681 #endif |
1691 | 682 #ifdef XEP0022 |
2013
8dc418af3e72
Allow to select to which buddy resource messages go. Closes issue #55
Hermitifier
parents:
2010
diff
changeset
|
683 xep22 = buddy_resource_xep22(buddy, activeres); |
1866 | 684 if (xep22 && xep22->support == CHATSTATES_SUPPORT_OK) { |
685 xmpp_send_xep22_event(bjid, chatstate); | |
990
35e7913affb7
Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents:
989
diff
changeset
|
686 } |
35e7913affb7
Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents:
989
diff
changeset
|
687 #endif |
35e7913affb7
Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents:
989
diff
changeset
|
688 } |
35e7913affb7
Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents:
989
diff
changeset
|
689 #endif |
35e7913affb7
Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents:
989
diff
changeset
|
690 |
1598 | 691 |
999
9687ecc59303
Redo chat states detection if we receive a message error packet from a contact
Mikael Berthe <mikael@lilotux.net>
parents:
998
diff
changeset
|
692 // chatstates_reset_probed(fulljid) |
1691 | 693 // If the XEP has been probed for this contact, set it back to unknown so |
999
9687ecc59303
Redo chat states detection if we receive a message error packet from a contact
Mikael Berthe <mikael@lilotux.net>
parents:
998
diff
changeset
|
694 // that we probe it again. The parameter must be a full jid (w/ resource). |
1691 | 695 #if defined XEP0022 || defined XEP0085 |
999
9687ecc59303
Redo chat states detection if we receive a message error packet from a contact
Mikael Berthe <mikael@lilotux.net>
parents:
998
diff
changeset
|
696 static void chatstates_reset_probed(const char *fulljid) |
9687ecc59303
Redo chat states detection if we receive a message error packet from a contact
Mikael Berthe <mikael@lilotux.net>
parents:
998
diff
changeset
|
697 { |
9687ecc59303
Redo chat states detection if we receive a message error packet from a contact
Mikael Berthe <mikael@lilotux.net>
parents:
998
diff
changeset
|
698 char *rname, *barejid; |
9687ecc59303
Redo chat states detection if we receive a message error packet from a contact
Mikael Berthe <mikael@lilotux.net>
parents:
998
diff
changeset
|
699 GSList *sl_buddy; |
1866 | 700 struct xep0085 *xep85; |
701 struct xep0022 *xep22; | |
999
9687ecc59303
Redo chat states detection if we receive a message error packet from a contact
Mikael Berthe <mikael@lilotux.net>
parents:
998
diff
changeset
|
702 |
9687ecc59303
Redo chat states detection if we receive a message error packet from a contact
Mikael Berthe <mikael@lilotux.net>
parents:
998
diff
changeset
|
703 rname = strchr(fulljid, JID_RESOURCE_SEPARATOR); |
9687ecc59303
Redo chat states detection if we receive a message error packet from a contact
Mikael Berthe <mikael@lilotux.net>
parents:
998
diff
changeset
|
704 if (!rname++) |
9687ecc59303
Redo chat states detection if we receive a message error packet from a contact
Mikael Berthe <mikael@lilotux.net>
parents:
998
diff
changeset
|
705 return; |
9687ecc59303
Redo chat states detection if we receive a message error packet from a contact
Mikael Berthe <mikael@lilotux.net>
parents:
998
diff
changeset
|
706 |
9687ecc59303
Redo chat states detection if we receive a message error packet from a contact
Mikael Berthe <mikael@lilotux.net>
parents:
998
diff
changeset
|
707 barejid = jidtodisp(fulljid); |
9687ecc59303
Redo chat states detection if we receive a message error packet from a contact
Mikael Berthe <mikael@lilotux.net>
parents:
998
diff
changeset
|
708 sl_buddy = roster_find(barejid, jidsearch, ROSTER_TYPE_USER); |
9687ecc59303
Redo chat states detection if we receive a message error packet from a contact
Mikael Berthe <mikael@lilotux.net>
parents:
998
diff
changeset
|
709 g_free(barejid); |
9687ecc59303
Redo chat states detection if we receive a message error packet from a contact
Mikael Berthe <mikael@lilotux.net>
parents:
998
diff
changeset
|
710 |
9687ecc59303
Redo chat states detection if we receive a message error packet from a contact
Mikael Berthe <mikael@lilotux.net>
parents:
998
diff
changeset
|
711 if (!sl_buddy) |
9687ecc59303
Redo chat states detection if we receive a message error packet from a contact
Mikael Berthe <mikael@lilotux.net>
parents:
998
diff
changeset
|
712 return; |
9687ecc59303
Redo chat states detection if we receive a message error packet from a contact
Mikael Berthe <mikael@lilotux.net>
parents:
998
diff
changeset
|
713 |
1866 | 714 xep85 = buddy_resource_xep85(sl_buddy->data, rname); |
715 xep22 = buddy_resource_xep22(sl_buddy->data, rname); | |
999
9687ecc59303
Redo chat states detection if we receive a message error packet from a contact
Mikael Berthe <mikael@lilotux.net>
parents:
998
diff
changeset
|
716 |
1866 | 717 if (xep85 && xep85->support == CHATSTATES_SUPPORT_PROBED) |
718 xep85->support = CHATSTATES_SUPPORT_UNKNOWN; | |
719 if (xep22 && xep22->support == CHATSTATES_SUPPORT_PROBED) | |
720 xep22->support = CHATSTATES_SUPPORT_UNKNOWN; | |
999
9687ecc59303
Redo chat states detection if we receive a message error packet from a contact
Mikael Berthe <mikael@lilotux.net>
parents:
998
diff
changeset
|
721 } |
9687ecc59303
Redo chat states detection if we receive a message error packet from a contact
Mikael Berthe <mikael@lilotux.net>
parents:
998
diff
changeset
|
722 #endif |
9687ecc59303
Redo chat states detection if we receive a message error packet from a contact
Mikael Berthe <mikael@lilotux.net>
parents:
998
diff
changeset
|
723 |
1194
03d8fafe8104
Remove a warning when gpgme is disabled
Mikael Berthe <mikael@lilotux.net>
parents:
1166
diff
changeset
|
724 #ifdef HAVE_GPGME |
1104
382972712208
Allow short key format in check_signature()
Mikael Berthe <mikael@lilotux.net>
parents:
1099
diff
changeset
|
725 // keys_mismatch(key, expectedkey) |
382972712208
Allow short key format in check_signature()
Mikael Berthe <mikael@lilotux.net>
parents:
1099
diff
changeset
|
726 // Return TRUE if both keys are non-null and "expectedkey" doesn't match |
382972712208
Allow short key format in check_signature()
Mikael Berthe <mikael@lilotux.net>
parents:
1099
diff
changeset
|
727 // the end of "key". |
382972712208
Allow short key format in check_signature()
Mikael Berthe <mikael@lilotux.net>
parents:
1099
diff
changeset
|
728 // If one of the keys is null, return FALSE. |
382972712208
Allow short key format in check_signature()
Mikael Berthe <mikael@lilotux.net>
parents:
1099
diff
changeset
|
729 // If expectedkey is less than 8 bytes long, return TRUE. |
382972712208
Allow short key format in check_signature()
Mikael Berthe <mikael@lilotux.net>
parents:
1099
diff
changeset
|
730 // |
382972712208
Allow short key format in check_signature()
Mikael Berthe <mikael@lilotux.net>
parents:
1099
diff
changeset
|
731 // Example: keys_mismatch("C9940A9BB0B92210", "B0B92210") will return FALSE. |
382972712208
Allow short key format in check_signature()
Mikael Berthe <mikael@lilotux.net>
parents:
1099
diff
changeset
|
732 static bool keys_mismatch(const char *key, const char *expectedkey) |
382972712208
Allow short key format in check_signature()
Mikael Berthe <mikael@lilotux.net>
parents:
1099
diff
changeset
|
733 { |
382972712208
Allow short key format in check_signature()
Mikael Berthe <mikael@lilotux.net>
parents:
1099
diff
changeset
|
734 int lk, lek; |
382972712208
Allow short key format in check_signature()
Mikael Berthe <mikael@lilotux.net>
parents:
1099
diff
changeset
|
735 |
382972712208
Allow short key format in check_signature()
Mikael Berthe <mikael@lilotux.net>
parents:
1099
diff
changeset
|
736 if (!expectedkey || !key) |
382972712208
Allow short key format in check_signature()
Mikael Berthe <mikael@lilotux.net>
parents:
1099
diff
changeset
|
737 return FALSE; |
382972712208
Allow short key format in check_signature()
Mikael Berthe <mikael@lilotux.net>
parents:
1099
diff
changeset
|
738 |
382972712208
Allow short key format in check_signature()
Mikael Berthe <mikael@lilotux.net>
parents:
1099
diff
changeset
|
739 lk = strlen(key); |
382972712208
Allow short key format in check_signature()
Mikael Berthe <mikael@lilotux.net>
parents:
1099
diff
changeset
|
740 lek = strlen(expectedkey); |
382972712208
Allow short key format in check_signature()
Mikael Berthe <mikael@lilotux.net>
parents:
1099
diff
changeset
|
741 |
382972712208
Allow short key format in check_signature()
Mikael Berthe <mikael@lilotux.net>
parents:
1099
diff
changeset
|
742 // If the expectedkey is less than 8 bytes long, this is probably a |
382972712208
Allow short key format in check_signature()
Mikael Berthe <mikael@lilotux.net>
parents:
1099
diff
changeset
|
743 // user mistake so we consider it's a mismatch. |
382972712208
Allow short key format in check_signature()
Mikael Berthe <mikael@lilotux.net>
parents:
1099
diff
changeset
|
744 if (lek < 8) |
382972712208
Allow short key format in check_signature()
Mikael Berthe <mikael@lilotux.net>
parents:
1099
diff
changeset
|
745 return TRUE; |
382972712208
Allow short key format in check_signature()
Mikael Berthe <mikael@lilotux.net>
parents:
1099
diff
changeset
|
746 |
382972712208
Allow short key format in check_signature()
Mikael Berthe <mikael@lilotux.net>
parents:
1099
diff
changeset
|
747 if (lek < lk) |
382972712208
Allow short key format in check_signature()
Mikael Berthe <mikael@lilotux.net>
parents:
1099
diff
changeset
|
748 key += lk - lek; |
382972712208
Allow short key format in check_signature()
Mikael Berthe <mikael@lilotux.net>
parents:
1099
diff
changeset
|
749 |
382972712208
Allow short key format in check_signature()
Mikael Berthe <mikael@lilotux.net>
parents:
1099
diff
changeset
|
750 return strcasecmp(key, expectedkey); |
382972712208
Allow short key format in check_signature()
Mikael Berthe <mikael@lilotux.net>
parents:
1099
diff
changeset
|
751 } |
1194
03d8fafe8104
Remove a warning when gpgme is disabled
Mikael Berthe <mikael@lilotux.net>
parents:
1166
diff
changeset
|
752 #endif |
1104
382972712208
Allow short key format in check_signature()
Mikael Berthe <mikael@lilotux.net>
parents:
1099
diff
changeset
|
753 |
1043
ebbde723614b
Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents:
1042
diff
changeset
|
754 // check_signature(barejid, resourcename, xmldata, text) |
ebbde723614b
Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents:
1042
diff
changeset
|
755 // Verify the signature (in xmldata) of "text" for the contact |
ebbde723614b
Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents:
1042
diff
changeset
|
756 // barejid/resourcename. |
ebbde723614b
Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents:
1042
diff
changeset
|
757 // xmldata is the 'jabber:x:signed' stanza. |
ebbde723614b
Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents:
1042
diff
changeset
|
758 // If the key id is found, the contact's PGP data are updated. |
ebbde723614b
Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents:
1042
diff
changeset
|
759 static void check_signature(const char *barejid, const char *rname, |
1598 | 760 LmMessageNode *node, const char *text) |
1043
ebbde723614b
Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents:
1042
diff
changeset
|
761 { |
ebbde723614b
Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents:
1042
diff
changeset
|
762 #ifdef HAVE_GPGME |
1598 | 763 const char *p, *key; |
1043
ebbde723614b
Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents:
1042
diff
changeset
|
764 GSList *sl_buddy; |
ebbde723614b
Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents:
1042
diff
changeset
|
765 struct pgp_data *res_pgpdata; |
ebbde723614b
Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents:
1042
diff
changeset
|
766 gpgme_sigsum_t sigsum; |
ebbde723614b
Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents:
1042
diff
changeset
|
767 |
ebbde723614b
Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents:
1042
diff
changeset
|
768 // All parameters must be valid |
1598 | 769 if (!(node && barejid && rname && text)) |
1043
ebbde723614b
Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents:
1042
diff
changeset
|
770 return; |
ebbde723614b
Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents:
1042
diff
changeset
|
771 |
ebbde723614b
Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents:
1042
diff
changeset
|
772 if (!gpg_enabled()) |
ebbde723614b
Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents:
1042
diff
changeset
|
773 return; |
ebbde723614b
Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents:
1042
diff
changeset
|
774 |
ebbde723614b
Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents:
1042
diff
changeset
|
775 // Get the resource PGP data structure |
ebbde723614b
Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents:
1042
diff
changeset
|
776 sl_buddy = roster_find(barejid, jidsearch, ROSTER_TYPE_USER); |
ebbde723614b
Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents:
1042
diff
changeset
|
777 if (!sl_buddy) |
ebbde723614b
Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents:
1042
diff
changeset
|
778 return; |
ebbde723614b
Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents:
1042
diff
changeset
|
779 res_pgpdata = buddy_resource_pgp(sl_buddy->data, rname); |
ebbde723614b
Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents:
1042
diff
changeset
|
780 if (!res_pgpdata) |
ebbde723614b
Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents:
1042
diff
changeset
|
781 return; |
ebbde723614b
Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents:
1042
diff
changeset
|
782 |
1729
e6e89b1d7831
Minor style and header updates
Mikael Berthe <mikael@lilotux.net>
parents:
1728
diff
changeset
|
783 if (!node->name || strcmp(node->name, "x")) // XXX: probably useless |
1043
ebbde723614b
Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents:
1042
diff
changeset
|
784 return; // We expect "<x xmlns='jabber:x:signed'>" |
ebbde723614b
Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents:
1042
diff
changeset
|
785 |
ebbde723614b
Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents:
1042
diff
changeset
|
786 // Get signature |
1598 | 787 p = lm_message_node_get_value(node); |
1043
ebbde723614b
Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents:
1042
diff
changeset
|
788 if (!p) |
ebbde723614b
Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents:
1042
diff
changeset
|
789 return; |
ebbde723614b
Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents:
1042
diff
changeset
|
790 |
ebbde723614b
Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents:
1042
diff
changeset
|
791 key = gpg_verify(p, text, &sigsum); |
ebbde723614b
Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents:
1042
diff
changeset
|
792 if (key) { |
1067
a5dc85fdebde
Add key comparison for signatures & use user-provided PGP keys for encryption
Mikael Berthe <mikael@lilotux.net>
parents:
1065
diff
changeset
|
793 const char *expectedkey; |
a5dc85fdebde
Add key comparison for signatures & use user-provided PGP keys for encryption
Mikael Berthe <mikael@lilotux.net>
parents:
1065
diff
changeset
|
794 char *buf; |
1043
ebbde723614b
Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents:
1042
diff
changeset
|
795 g_free(res_pgpdata->sign_keyid); |
1598 | 796 res_pgpdata->sign_keyid = (char *)key; |
1043
ebbde723614b
Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents:
1042
diff
changeset
|
797 res_pgpdata->last_sigsum = sigsum; |
1046
a3748bd3d010
Tell the user when a signature is bad
Mikael Berthe <mikael@lilotux.net>
parents:
1045
diff
changeset
|
798 if (sigsum & GPGME_SIGSUM_RED) { |
1067
a5dc85fdebde
Add key comparison for signatures & use user-provided PGP keys for encryption
Mikael Berthe <mikael@lilotux.net>
parents:
1065
diff
changeset
|
799 buf = g_strdup_printf("Bad signature from <%s/%s>", barejid, rname); |
1290
e42f48103609
Drawing the MUC nicks by a different color
Michal 'vorner' Vaner <vorner@ucw.cz>
parents:
1282
diff
changeset
|
800 scr_WriteIncomingMessage(barejid, buf, 0, HBB_PREFIX_INFO, 0); |
1067
a5dc85fdebde
Add key comparison for signatures & use user-provided PGP keys for encryption
Mikael Berthe <mikael@lilotux.net>
parents:
1065
diff
changeset
|
801 scr_LogPrint(LPRINT_LOGNORM, "%s", buf); |
a5dc85fdebde
Add key comparison for signatures & use user-provided PGP keys for encryption
Mikael Berthe <mikael@lilotux.net>
parents:
1065
diff
changeset
|
802 g_free(buf); |
a5dc85fdebde
Add key comparison for signatures & use user-provided PGP keys for encryption
Mikael Berthe <mikael@lilotux.net>
parents:
1065
diff
changeset
|
803 } |
a5dc85fdebde
Add key comparison for signatures & use user-provided PGP keys for encryption
Mikael Berthe <mikael@lilotux.net>
parents:
1065
diff
changeset
|
804 // Verify that the key id is the one we expect. |
a5dc85fdebde
Add key comparison for signatures & use user-provided PGP keys for encryption
Mikael Berthe <mikael@lilotux.net>
parents:
1065
diff
changeset
|
805 expectedkey = settings_pgp_getkeyid(barejid); |
1104
382972712208
Allow short key format in check_signature()
Mikael Berthe <mikael@lilotux.net>
parents:
1099
diff
changeset
|
806 if (keys_mismatch(key, expectedkey)) { |
1067
a5dc85fdebde
Add key comparison for signatures & use user-provided PGP keys for encryption
Mikael Berthe <mikael@lilotux.net>
parents:
1065
diff
changeset
|
807 buf = g_strdup_printf("Warning: The KeyId from <%s/%s> doesn't match " |
a5dc85fdebde
Add key comparison for signatures & use user-provided PGP keys for encryption
Mikael Berthe <mikael@lilotux.net>
parents:
1065
diff
changeset
|
808 "the key you set up", barejid, rname); |
1290
e42f48103609
Drawing the MUC nicks by a different color
Michal 'vorner' Vaner <vorner@ucw.cz>
parents:
1282
diff
changeset
|
809 scr_WriteIncomingMessage(barejid, buf, 0, HBB_PREFIX_INFO, 0); |
1046
a3748bd3d010
Tell the user when a signature is bad
Mikael Berthe <mikael@lilotux.net>
parents:
1045
diff
changeset
|
810 scr_LogPrint(LPRINT_LOGNORM, "%s", buf); |
a3748bd3d010
Tell the user when a signature is bad
Mikael Berthe <mikael@lilotux.net>
parents:
1045
diff
changeset
|
811 g_free(buf); |
a3748bd3d010
Tell the user when a signature is bad
Mikael Berthe <mikael@lilotux.net>
parents:
1045
diff
changeset
|
812 } |
1043
ebbde723614b
Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents:
1042
diff
changeset
|
813 } |
ebbde723614b
Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents:
1042
diff
changeset
|
814 #endif |
ebbde723614b
Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents:
1042
diff
changeset
|
815 } |
ebbde723614b
Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents:
1042
diff
changeset
|
816 |
1598 | 817 static LmSSLResponse ssl_cb(LmSSL *ssl, LmSSLStatus status, gpointer ud) |
818 { | |
819 switch (status) { | |
820 case LM_SSL_STATUS_NO_CERT_FOUND: | |
821 scr_LogPrint(LPRINT_LOGNORM, "No certificate found!"); | |
822 break; | |
823 case LM_SSL_STATUS_UNTRUSTED_CERT: | |
824 scr_LogPrint(LPRINT_LOGNORM, "Certificate is not trusted!"); | |
825 break; | |
826 case LM_SSL_STATUS_CERT_EXPIRED: | |
827 scr_LogPrint(LPRINT_LOGNORM, "Certificate has expired!"); | |
828 break; | |
829 case LM_SSL_STATUS_CERT_NOT_ACTIVATED: | |
830 scr_LogPrint(LPRINT_LOGNORM, "Certificate has not been activated!"); | |
831 break; | |
832 case LM_SSL_STATUS_CERT_HOSTNAME_MISMATCH: | |
833 scr_LogPrint(LPRINT_LOGNORM, | |
834 "Certificate hostname does not match expected hostname!"); | |
835 break; | |
836 case LM_SSL_STATUS_CERT_FINGERPRINT_MISMATCH: { | |
837 char fpr[49]; | |
838 fingerprint_to_hex((const unsigned char*)lm_ssl_get_fingerprint(ssl), | |
839 fpr); | |
840 scr_LogPrint(LPRINT_LOGNORM, | |
841 "Certificate fingerprint does not match expected fingerprint!"); | |
842 scr_LogPrint(LPRINT_LOGNORM, "Remote fingerprint: %s", fpr); | |
843 | |
844 scr_LogPrint(LPRINT_LOGNORM, "Expected fingerprint: %s", | |
845 settings_opt_get("ssl_fingerprint")); | |
846 | |
847 return LM_SSL_RESPONSE_STOP; | |
848 break; | |
849 } | |
850 case LM_SSL_STATUS_GENERIC_ERROR: | |
851 scr_LogPrint(LPRINT_LOGNORM, "Generic SSL error!"); | |
852 break; | |
1911
baa52ea32b47
Only print the ssl status as an integer if we don't understand it
franky
parents:
1910
diff
changeset
|
853 default: |
baa52ea32b47
Only print the ssl status as an integer if we don't understand it
franky
parents:
1910
diff
changeset
|
854 scr_LogPrint(LPRINT_LOGNORM, "SSL error:%d", status); |
1598 | 855 } |
856 | |
1656
fbab3c1300d5
Update fix for ssl_ignore_checks option (changeset 8effa82ae593)
franky
parents:
1655
diff
changeset
|
857 if (settings_opt_get_int("ssl_ignore_checks")) |
1598 | 858 return LM_SSL_RESPONSE_CONTINUE; |
859 return LM_SSL_RESPONSE_STOP; | |
860 } | |
861 | |
862 static void connection_auth_cb(LmConnection *connection, gboolean success, | |
863 gpointer user_data) | |
864 { | |
865 if (success) { | |
1731 | 866 |
867 xmpp_iq_request(NULL, NS_ROSTER); | |
868 xmpp_request_storage("storage:bookmarks"); | |
869 xmpp_request_storage("storage:rosternotes"); | |
870 | |
871 /* XXX Not needed before xmpp_setprevstatus() | |
1598 | 872 LmMessage *m; |
873 m = lm_message_new_with_sub_type(NULL, LM_MESSAGE_TYPE_PRESENCE, | |
874 LM_MESSAGE_SUB_TYPE_AVAILABLE); | |
875 lm_connection_send(connection, m, NULL); | |
1731 | 876 lm_message_unref(m); |
877 */ | |
1598 | 878 |
879 xmpp_setprevstatus(); | |
880 | |
881 AutoConnection = TRUE; | |
882 } else | |
883 scr_LogPrint(LPRINT_LOGNORM, "Authentication failed"); | |
884 } | |
885 | |
886 gboolean xmpp_reconnect() | |
887 { | |
1682
d1e8fb14ce2d
Destroy lm connection object on disconnect
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1668
diff
changeset
|
888 if (!lconnection) |
1598 | 889 xmpp_connect(); |
890 return FALSE; | |
891 } | |
892 | |
893 static void _try_to_reconnect(void) | |
894 { | |
1682
d1e8fb14ce2d
Destroy lm connection object on disconnect
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1668
diff
changeset
|
895 xmpp_disconnect(); |
1598 | 896 if (AutoConnection) |
1747
c4f67e2e675f
Randomize reconnection delay
Mikael Berthe <mikael@lilotux.net>
parents:
1746
diff
changeset
|
897 g_timeout_add_seconds(RECONNECTION_TIMEOUT + (random() % 90L), |
c4f67e2e675f
Randomize reconnection delay
Mikael Berthe <mikael@lilotux.net>
parents:
1746
diff
changeset
|
898 xmpp_reconnect, NULL); |
1598 | 899 } |
900 | |
901 static void connection_open_cb(LmConnection *connection, gboolean success, | |
902 gpointer user_data) | |
903 { | |
1663
dcb0b4522ded
Fix GError handling
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1656
diff
changeset
|
904 GError *error = NULL; |
1598 | 905 |
906 if (success) { | |
1613 | 907 const char *password, *resource; |
908 char *username; | |
1611
f9bf561e54d0
Use the username for authentication, added jid_get_username() to utils.c
franky
parents:
1610
diff
changeset
|
909 username = jid_get_username(settings_opt_get("jid")); |
1598 | 910 password = settings_opt_get("password"); |
911 resource = strchr(lm_connection_get_jid(connection), | |
912 JID_RESOURCE_SEPARATOR); | |
913 if (resource) | |
914 resource++; | |
915 | |
1611
f9bf561e54d0
Use the username for authentication, added jid_get_username() to utils.c
franky
parents:
1610
diff
changeset
|
916 if (!lm_connection_authenticate(lconnection, username, password, resource, |
1598 | 917 connection_auth_cb, NULL, FALSE, &error)) { |
1717
c12455fec611
Remove extra newlines in scr_LogPrint() calls
Mikael Berthe <mikael@lilotux.net>
parents:
1716
diff
changeset
|
918 scr_LogPrint(LPRINT_LOGNORM, "Failed to authenticate: %s", |
1598 | 919 error->message); |
1663
dcb0b4522ded
Fix GError handling
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1656
diff
changeset
|
920 g_error_free (error); |
1598 | 921 _try_to_reconnect(); |
922 } | |
1611
f9bf561e54d0
Use the username for authentication, added jid_get_username() to utils.c
franky
parents:
1610
diff
changeset
|
923 g_free(username); |
1598 | 924 } else { |
925 scr_LogPrint(LPRINT_LOGNORM, "There was an error while connecting."); | |
926 _try_to_reconnect(); | |
927 } | |
928 } | |
929 | |
930 static void connection_close_cb(LmConnection *connection, | |
931 LmDisconnectReason reason, | |
932 gpointer user_data) | |
933 { | |
934 const char *str; | |
935 | |
936 switch (reason) { | |
937 case LM_DISCONNECT_REASON_OK: | |
938 str = "LM_DISCONNECT_REASON_OK"; | |
939 break; | |
940 case LM_DISCONNECT_REASON_PING_TIME_OUT: | |
941 str = "LM_DISCONNECT_REASON_PING_TIME_OUT"; | |
942 break; | |
943 case LM_DISCONNECT_REASON_HUP: | |
944 str = "LM_DISCONNECT_REASON_HUP"; | |
945 break; | |
946 case LM_DISCONNECT_REASON_ERROR: | |
947 str = "LM_DISCONNECT_REASON_ERROR"; | |
948 break; | |
949 case LM_DISCONNECT_REASON_UNKNOWN: | |
950 default: | |
951 str = "LM_DISCONNECT_REASON_UNKNOWN"; | |
952 break; | |
953 } | |
954 | |
955 if (reason != LM_DISCONNECT_REASON_OK) | |
956 _try_to_reconnect(); | |
957 | |
958 // Free bookmarks | |
959 if (bookmarks) | |
960 lm_message_node_unref(bookmarks); | |
961 bookmarks = NULL; | |
962 // Free roster | |
963 roster_free(); | |
964 if (rosternotes) | |
965 lm_message_node_unref(rosternotes); | |
966 rosternotes = NULL; | |
967 // Update display | |
968 update_roster = TRUE; | |
1780
e4378fbab5d7
Major API cleanup - bump API to 4
Mikael Berthe <mikael@lilotux.net>
parents:
1747
diff
changeset
|
969 scr_update_buddy_window(); |
1598 | 970 |
1715
1b6a04703fa0
Do not display Loudmouth's disconnection value when disconnected normally
Mikael Berthe <mikael@lilotux.net>
parents:
1711
diff
changeset
|
971 if (!reason) |
1b6a04703fa0
Do not display Loudmouth's disconnection value when disconnected normally
Mikael Berthe <mikael@lilotux.net>
parents:
1711
diff
changeset
|
972 scr_LogPrint(LPRINT_LOGNORM, "Disconnected."); |
1b6a04703fa0
Do not display Loudmouth's disconnection value when disconnected normally
Mikael Berthe <mikael@lilotux.net>
parents:
1711
diff
changeset
|
973 else |
1b6a04703fa0
Do not display Loudmouth's disconnection value when disconnected normally
Mikael Berthe <mikael@lilotux.net>
parents:
1711
diff
changeset
|
974 scr_LogPrint(LPRINT_NORMAL, "Disconnected, reason: %d->'%s'", reason, str); |
1b6a04703fa0
Do not display Loudmouth's disconnection value when disconnected normally
Mikael Berthe <mikael@lilotux.net>
parents:
1711
diff
changeset
|
975 |
1693
32c6d81bd1ef
Update status when unexpectedly disconnected from server
Mikael Berthe <mikael@lilotux.net>
parents:
1691
diff
changeset
|
976 xmpp_setstatus(offline, NULL, mystatusmsg, TRUE); |
1598 | 977 } |
978 | |
979 static void handle_state_events(const char *from, LmMessageNode *node) | |
980 { | |
1691 | 981 #if defined XEP0022 || defined XEP0085 |
1598 | 982 LmMessageNode *state_ns = NULL; |
983 char *rname, *bjid; | |
984 GSList *sl_buddy; | |
985 guint events; | |
1866 | 986 struct xep0022 *xep22 = NULL; |
987 struct xep0085 *xep85 = NULL; | |
1598 | 988 enum { |
1691 | 989 XEP_none, |
990 XEP_85, | |
991 XEP_22 | |
1866 | 992 } which_xep = XEP_none; |
1598 | 993 |
994 rname = strchr(from, JID_RESOURCE_SEPARATOR); | |
995 if (rname) | |
996 ++rname; | |
997 else | |
998 rname = (char *)from + strlen(from); | |
999 bjid = jidtodisp(from); | |
1000 sl_buddy = roster_find(bjid, jidsearch, ROSTER_TYPE_USER); | |
1001 g_free(bjid); | |
1002 | |
1003 /* XXX Actually that's wrong, since it filters out server "offline" | |
1691 | 1004 messages (for XEP-0022). This XEP is (almost) deprecated so |
1598 | 1005 we don't really care. */ |
1006 if (!sl_buddy) { | |
1007 return; | |
1008 } | |
1009 | |
1691 | 1010 /* Let's see chich XEP the contact uses. If possible, we'll use |
1011 XEP-85, if not we'll look for XEP-22 support. */ | |
1598 | 1012 events = buddy_resource_getevents(sl_buddy->data, rname); |
1013 | |
1866 | 1014 xep85 = buddy_resource_xep85(sl_buddy->data, rname); |
1015 if (xep85) { | |
1598 | 1016 state_ns = lm_message_node_find_xmlns(node, NS_CHATSTATES); |
1017 if (state_ns) | |
1866 | 1018 which_xep = XEP_85; |
1598 | 1019 } |
1020 | |
1866 | 1021 if (which_xep != XEP_85) { /* Fall back to XEP-0022 */ |
1022 xep22 = buddy_resource_xep22(sl_buddy->data, rname); | |
1023 if (xep22) { | |
1598 | 1024 state_ns = lm_message_node_find_xmlns(node, NS_EVENT); |
1025 if (state_ns) | |
1866 | 1026 which_xep = XEP_22; |
1598 | 1027 } |
1028 } | |
1029 | |
1866 | 1030 if (!which_xep) { /* Sender does not use chat states */ |
1598 | 1031 return; |
1032 } | |
1033 | |
1866 | 1034 if (which_xep == XEP_85) { /* XEP-0085 */ |
1035 xep85->support = CHATSTATES_SUPPORT_OK; | |
1598 | 1036 |
1037 if (!strcmp(state_ns->name, "composing")) { | |
1866 | 1038 xep85->last_state_rcvd = ROSTER_EVENT_COMPOSING; |
1598 | 1039 } else if (!strcmp(state_ns->name, "active")) { |
1866 | 1040 xep85->last_state_rcvd = ROSTER_EVENT_ACTIVE; |
1598 | 1041 } else if (!strcmp(state_ns->name, "paused")) { |
1866 | 1042 xep85->last_state_rcvd = ROSTER_EVENT_PAUSED; |
1598 | 1043 } else if (!strcmp(state_ns->name, "inactive")) { |
1866 | 1044 xep85->last_state_rcvd = ROSTER_EVENT_INACTIVE; |
1598 | 1045 } else if (!strcmp(state_ns->name, "gone")) { |
1866 | 1046 xep85->last_state_rcvd = ROSTER_EVENT_GONE; |
1598 | 1047 } |
1866 | 1048 events = xep85->last_state_rcvd; |
1691 | 1049 } else { /* XEP-0022 */ |
1050 #ifdef XEP0022 | |
1998
41667bc02883
Fix GCC warnings (variables set but not used)
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1994
diff
changeset
|
1051 const char *body = lm_message_node_get_child_value(node, "body"); |
1598 | 1052 const char *msgid; |
1866 | 1053 xep22->support = CHATSTATES_SUPPORT_OK; |
1054 xep22->last_state_rcvd = ROSTER_EVENT_NONE; | |
1598 | 1055 |
1056 msgid = lm_message_node_get_attribute(node, "id"); | |
1057 | |
1058 if (lm_message_node_get_child(state_ns, "composing")) { | |
1059 // Clear composing if the message contains a body | |
1060 if (body) | |
1061 events &= ~ROSTER_EVENT_COMPOSING; | |
1062 else | |
1063 events |= ROSTER_EVENT_COMPOSING; | |
1866 | 1064 xep22->last_state_rcvd |= ROSTER_EVENT_COMPOSING; |
1598 | 1065 |
1066 } else { | |
1067 events &= ~ROSTER_EVENT_COMPOSING; | |
1068 } | |
1069 | |
1070 // Cache the message id | |
1866 | 1071 g_free(xep22->last_msgid_rcvd); |
1598 | 1072 if (msgid) |
1866 | 1073 xep22->last_msgid_rcvd = g_strdup(msgid); |
1598 | 1074 else |
1866 | 1075 xep22->last_msgid_rcvd = NULL; |
1598 | 1076 |
1077 if (lm_message_node_get_child(state_ns, "delivered")) { | |
1866 | 1078 xep22->last_state_rcvd |= ROSTER_EVENT_DELIVERED; |
1598 | 1079 |
1080 // Do we have to send back an ACK? | |
1081 if (body) | |
1866 | 1082 xmpp_send_xep22_event(from, ROSTER_EVENT_DELIVERED); |
1598 | 1083 } |
1084 #endif | |
1085 } | |
1086 | |
1087 buddy_resource_setevents(sl_buddy->data, rname, events); | |
1088 | |
1089 update_roster = TRUE; | |
1090 #endif | |
1091 } | |
1092 | |
1093 static void gotmessage(LmMessageSubType type, const char *from, | |
1094 const char *body, const char *enc, const char *subject, | |
1095 time_t timestamp, LmMessageNode *node_signed) | |
29 | 1096 { |
1058 | 1097 char *bjid; |
1689
b8f9481dd0fe
Get server name from jid for block_unsubscribed
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1688
diff
changeset
|
1098 const char *rname; |
1347
07816313073b
Add an option 'otr' to enable OTR support in the configuration file
Mikael Berthe <mikael@lilotux.net>
parents:
1344
diff
changeset
|
1099 char *decrypted_pgp = NULL; |
07816313073b
Add an option 'otr' to enable OTR support in the configuration file
Mikael Berthe <mikael@lilotux.net>
parents:
1344
diff
changeset
|
1100 char *decrypted_otr = NULL; |
1299
3b338a5c01fc
OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
1290
diff
changeset
|
1101 int otr_msg = 0, free_msg = 0; |
29 | 1102 |
1058 | 1103 bjid = jidtodisp(from); |
441
51b8f10cfeb8
Handle g_locale_from_utf8() failures
Mikael Berthe <mikael@lilotux.net>
parents:
438
diff
changeset
|
1104 |
977
5b01de4ac5e1
Cosmetic changes
Alexis Hildebrandt <afh [at] 2drop [dot] net>
parents:
960
diff
changeset
|
1105 rname = strchr(from, JID_RESOURCE_SEPARATOR); |
447
03bb57383cea
Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents:
444
diff
changeset
|
1106 if (rname) rname++; |
819
c2d7d9dd4193
New option 'block_unsubscribed'
Mikael Berthe <mikael@lilotux.net>
parents:
818
diff
changeset
|
1107 |
1042
8a395c2cafc4
Initial PGP support (decrypt)
Mikael Berthe <mikael@lilotux.net>
parents:
1023
diff
changeset
|
1108 #ifdef HAVE_GPGME |
8a395c2cafc4
Initial PGP support (decrypt)
Mikael Berthe <mikael@lilotux.net>
parents:
1023
diff
changeset
|
1109 if (enc && gpg_enabled()) { |
1347
07816313073b
Add an option 'otr' to enable OTR support in the configuration file
Mikael Berthe <mikael@lilotux.net>
parents:
1344
diff
changeset
|
1110 decrypted_pgp = gpg_decrypt(enc); |
07816313073b
Add an option 'otr' to enable OTR support in the configuration file
Mikael Berthe <mikael@lilotux.net>
parents:
1344
diff
changeset
|
1111 if (decrypted_pgp) { |
07816313073b
Add an option 'otr' to enable OTR support in the configuration file
Mikael Berthe <mikael@lilotux.net>
parents:
1344
diff
changeset
|
1112 body = decrypted_pgp; |
1043
ebbde723614b
Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents:
1042
diff
changeset
|
1113 } |
1042
8a395c2cafc4
Initial PGP support (decrypt)
Mikael Berthe <mikael@lilotux.net>
parents:
1023
diff
changeset
|
1114 } |
1043
ebbde723614b
Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents:
1042
diff
changeset
|
1115 // Check signature of an unencrypted message |
1598 | 1116 if (node_signed && gpg_enabled()) |
1117 check_signature(bjid, rname, node_signed, decrypted_pgp); | |
1042
8a395c2cafc4
Initial PGP support (decrypt)
Mikael Berthe <mikael@lilotux.net>
parents:
1023
diff
changeset
|
1118 #endif |
8a395c2cafc4
Initial PGP support (decrypt)
Mikael Berthe <mikael@lilotux.net>
parents:
1023
diff
changeset
|
1119 |
1299
3b338a5c01fc
OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
1290
diff
changeset
|
1120 #ifdef HAVE_LIBOTR |
1347
07816313073b
Add an option 'otr' to enable OTR support in the configuration file
Mikael Berthe <mikael@lilotux.net>
parents:
1344
diff
changeset
|
1121 if (otr_enabled()) { |
07816313073b
Add an option 'otr' to enable OTR support in the configuration file
Mikael Berthe <mikael@lilotux.net>
parents:
1344
diff
changeset
|
1122 decrypted_otr = (char*)body; |
07816313073b
Add an option 'otr' to enable OTR support in the configuration file
Mikael Berthe <mikael@lilotux.net>
parents:
1344
diff
changeset
|
1123 otr_msg = otr_receive(&decrypted_otr, bjid, &free_msg); |
07816313073b
Add an option 'otr' to enable OTR support in the configuration file
Mikael Berthe <mikael@lilotux.net>
parents:
1344
diff
changeset
|
1124 if (!decrypted_otr) { |
07816313073b
Add an option 'otr' to enable OTR support in the configuration file
Mikael Berthe <mikael@lilotux.net>
parents:
1344
diff
changeset
|
1125 goto gotmessage_return; |
07816313073b
Add an option 'otr' to enable OTR support in the configuration file
Mikael Berthe <mikael@lilotux.net>
parents:
1344
diff
changeset
|
1126 } |
07816313073b
Add an option 'otr' to enable OTR support in the configuration file
Mikael Berthe <mikael@lilotux.net>
parents:
1344
diff
changeset
|
1127 body = decrypted_otr; |
1299
3b338a5c01fc
OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
1290
diff
changeset
|
1128 } |
3b338a5c01fc
OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
1290
diff
changeset
|
1129 #endif |
3b338a5c01fc
OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
1290
diff
changeset
|
1130 |
864
a7b3409df6bc
MUC: Work around user server restart
Mikael Berthe <mikael@lilotux.net>
parents:
862
diff
changeset
|
1131 // Check for unexpected groupchat messages |
a7b3409df6bc
MUC: Work around user server restart
Mikael Berthe <mikael@lilotux.net>
parents:
862
diff
changeset
|
1132 // If we receive a groupchat message from a room we're not a member of, |
a7b3409df6bc
MUC: Work around user server restart
Mikael Berthe <mikael@lilotux.net>
parents:
862
diff
changeset
|
1133 // this is probably a server issue and the best we can do is to send |
a7b3409df6bc
MUC: Work around user server restart
Mikael Berthe <mikael@lilotux.net>
parents:
862
diff
changeset
|
1134 // a type unavailable. |
1598 | 1135 if (type == LM_MESSAGE_SUB_TYPE_GROUPCHAT && !roster_getnickname(bjid)) { |
864
a7b3409df6bc
MUC: Work around user server restart
Mikael Berthe <mikael@lilotux.net>
parents:
862
diff
changeset
|
1136 // It shouldn't happen, probably a server issue |
a7b3409df6bc
MUC: Work around user server restart
Mikael Berthe <mikael@lilotux.net>
parents:
862
diff
changeset
|
1137 GSList *room_elt; |
a7b3409df6bc
MUC: Work around user server restart
Mikael Berthe <mikael@lilotux.net>
parents:
862
diff
changeset
|
1138 char *mbuf; |
a7b3409df6bc
MUC: Work around user server restart
Mikael Berthe <mikael@lilotux.net>
parents:
862
diff
changeset
|
1139 |
a7b3409df6bc
MUC: Work around user server restart
Mikael Berthe <mikael@lilotux.net>
parents:
862
diff
changeset
|
1140 mbuf = g_strdup_printf("Unexpected groupchat packet!"); |
a7b3409df6bc
MUC: Work around user server restart
Mikael Berthe <mikael@lilotux.net>
parents:
862
diff
changeset
|
1141 scr_LogPrint(LPRINT_LOGNORM, "%s", mbuf); |
1290
e42f48103609
Drawing the MUC nicks by a different color
Michal 'vorner' Vaner <vorner@ucw.cz>
parents:
1282
diff
changeset
|
1142 scr_WriteIncomingMessage(bjid, mbuf, 0, HBB_PREFIX_INFO, 0); |
864
a7b3409df6bc
MUC: Work around user server restart
Mikael Berthe <mikael@lilotux.net>
parents:
862
diff
changeset
|
1143 g_free(mbuf); |
a7b3409df6bc
MUC: Work around user server restart
Mikael Berthe <mikael@lilotux.net>
parents:
862
diff
changeset
|
1144 |
a7b3409df6bc
MUC: Work around user server restart
Mikael Berthe <mikael@lilotux.net>
parents:
862
diff
changeset
|
1145 // Send back an unavailable packet |
1598 | 1146 xmpp_setstatus(offline, bjid, "", TRUE); |
864
a7b3409df6bc
MUC: Work around user server restart
Mikael Berthe <mikael@lilotux.net>
parents:
862
diff
changeset
|
1147 |
a7b3409df6bc
MUC: Work around user server restart
Mikael Berthe <mikael@lilotux.net>
parents:
862
diff
changeset
|
1148 // MUC |
a7b3409df6bc
MUC: Work around user server restart
Mikael Berthe <mikael@lilotux.net>
parents:
862
diff
changeset
|
1149 // Make sure this is a room (it can be a conversion user->room) |
1058 | 1150 room_elt = roster_find(bjid, jidsearch, 0); |
864
a7b3409df6bc
MUC: Work around user server restart
Mikael Berthe <mikael@lilotux.net>
parents:
862
diff
changeset
|
1151 if (!room_elt) { |
1665
1a4890514eb9
Clean up some dead assignments/dead variables
Ulrich Spörlein
parents:
1663
diff
changeset
|
1152 roster_add_user(bjid, NULL, NULL, ROSTER_TYPE_ROOM, sub_none, -1); |
864
a7b3409df6bc
MUC: Work around user server restart
Mikael Berthe <mikael@lilotux.net>
parents:
862
diff
changeset
|
1153 } else { |
a7b3409df6bc
MUC: Work around user server restart
Mikael Berthe <mikael@lilotux.net>
parents:
862
diff
changeset
|
1154 buddy_settype(room_elt->data, ROSTER_TYPE_ROOM); |
a7b3409df6bc
MUC: Work around user server restart
Mikael Berthe <mikael@lilotux.net>
parents:
862
diff
changeset
|
1155 } |
a7b3409df6bc
MUC: Work around user server restart
Mikael Berthe <mikael@lilotux.net>
parents:
862
diff
changeset
|
1156 |
a7b3409df6bc
MUC: Work around user server restart
Mikael Berthe <mikael@lilotux.net>
parents:
862
diff
changeset
|
1157 buddylist_build(); |
1780
e4378fbab5d7
Major API cleanup - bump API to 4
Mikael Berthe <mikael@lilotux.net>
parents:
1747
diff
changeset
|
1158 scr_draw_roster(); |
1347
07816313073b
Add an option 'otr' to enable OTR support in the configuration file
Mikael Berthe <mikael@lilotux.net>
parents:
1344
diff
changeset
|
1159 goto gotmessage_return; |
864
a7b3409df6bc
MUC: Work around user server restart
Mikael Berthe <mikael@lilotux.net>
parents:
862
diff
changeset
|
1160 } |
a7b3409df6bc
MUC: Work around user server restart
Mikael Berthe <mikael@lilotux.net>
parents:
862
diff
changeset
|
1161 |
819
c2d7d9dd4193
New option 'block_unsubscribed'
Mikael Berthe <mikael@lilotux.net>
parents:
818
diff
changeset
|
1162 // We don't call the message_in hook if 'block_unsubscribed' is true and |
c2d7d9dd4193
New option 'block_unsubscribed'
Mikael Berthe <mikael@lilotux.net>
parents:
818
diff
changeset
|
1163 // this is a regular message from an unsubscribed user. |
956
819396bebdf5
Do not block system messages when block_unsubscribed is set
Mikael Berthe <mikael@lilotux.net>
parents:
940
diff
changeset
|
1164 // System messages (from our server) are allowed. |
1689
b8f9481dd0fe
Get server name from jid for block_unsubscribed
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1688
diff
changeset
|
1165 if (settings_opt_get_int("block_unsubscribed") && |
1895
7043542b3565
Do not block MUC private messages when 'block_unsubscribed' is set
Mikael Berthe <mikael@lilotux.net>
parents:
1869
diff
changeset
|
1166 (roster_gettype(bjid) != ROSTER_TYPE_ROOM) && |
1689
b8f9481dd0fe
Get server name from jid for block_unsubscribed
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1688
diff
changeset
|
1167 !(roster_getsubscription(bjid) & sub_from) && |
b8f9481dd0fe
Get server name from jid for block_unsubscribed
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1688
diff
changeset
|
1168 (type != LM_MESSAGE_SUB_TYPE_GROUPCHAT)) { |
b8f9481dd0fe
Get server name from jid for block_unsubscribed
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1688
diff
changeset
|
1169 char *sbjid = jidtodisp(lm_connection_get_jid(lconnection)); |
b8f9481dd0fe
Get server name from jid for block_unsubscribed
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1688
diff
changeset
|
1170 const char *server = strchr(sbjid, JID_DOMAIN_SEPARATOR); |
1963
5d718766d2d6
Do not block system messages when block_unsubscribed is set
Mikael Berthe <mikael@lilotux.net>
parents:
1953
diff
changeset
|
1171 if (server && g_strcmp0(server+1, bjid)) { |
1689
b8f9481dd0fe
Get server name from jid for block_unsubscribed
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1688
diff
changeset
|
1172 scr_LogPrint(LPRINT_LOGNORM, "Blocked a message from <%s>", bjid); |
b8f9481dd0fe
Get server name from jid for block_unsubscribed
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1688
diff
changeset
|
1173 g_free(sbjid); |
b8f9481dd0fe
Get server name from jid for block_unsubscribed
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1688
diff
changeset
|
1174 goto gotmessage_return; |
b8f9481dd0fe
Get server name from jid for block_unsubscribed
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1688
diff
changeset
|
1175 } |
b8f9481dd0fe
Get server name from jid for block_unsubscribed
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1688
diff
changeset
|
1176 g_free(sbjid); |
b8f9481dd0fe
Get server name from jid for block_unsubscribed
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1688
diff
changeset
|
1177 } |
b8f9481dd0fe
Get server name from jid for block_unsubscribed
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1688
diff
changeset
|
1178 |
b8f9481dd0fe
Get server name from jid for block_unsubscribed
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1688
diff
changeset
|
1179 { // format and pass message for further processing |
1399
187985455020
Correctly display PGP-encoded messages with a subject
Mikael Berthe <mikael@lilotux.net>
parents:
1397
diff
changeset
|
1180 gchar *fullbody = NULL; |
1484
7b36b91a4388
New UI message flag (O) when OTR is used
Mikael Berthe <mikael@lilotux.net>
parents:
1476
diff
changeset
|
1181 guint encrypted; |
7b36b91a4388
New UI message flag (O) when OTR is used
Mikael Berthe <mikael@lilotux.net>
parents:
1476
diff
changeset
|
1182 |
7b36b91a4388
New UI message flag (O) when OTR is used
Mikael Berthe <mikael@lilotux.net>
parents:
1476
diff
changeset
|
1183 if (decrypted_pgp) |
7b36b91a4388
New UI message flag (O) when OTR is used
Mikael Berthe <mikael@lilotux.net>
parents:
1476
diff
changeset
|
1184 encrypted = ENCRYPTED_PGP; |
7b36b91a4388
New UI message flag (O) when OTR is used
Mikael Berthe <mikael@lilotux.net>
parents:
1476
diff
changeset
|
1185 else if (otr_msg) |
7b36b91a4388
New UI message flag (O) when OTR is used
Mikael Berthe <mikael@lilotux.net>
parents:
1476
diff
changeset
|
1186 encrypted = ENCRYPTED_OTR; |
7b36b91a4388
New UI message flag (O) when OTR is used
Mikael Berthe <mikael@lilotux.net>
parents:
1476
diff
changeset
|
1187 else |
7b36b91a4388
New UI message flag (O) when OTR is used
Mikael Berthe <mikael@lilotux.net>
parents:
1476
diff
changeset
|
1188 encrypted = 0; |
7b36b91a4388
New UI message flag (O) when OTR is used
Mikael Berthe <mikael@lilotux.net>
parents:
1476
diff
changeset
|
1189 |
1399
187985455020
Correctly display PGP-encoded messages with a subject
Mikael Berthe <mikael@lilotux.net>
parents:
1397
diff
changeset
|
1190 if (subject) { |
187985455020
Correctly display PGP-encoded messages with a subject
Mikael Berthe <mikael@lilotux.net>
parents:
1397
diff
changeset
|
1191 if (body) |
187985455020
Correctly display PGP-encoded messages with a subject
Mikael Berthe <mikael@lilotux.net>
parents:
1397
diff
changeset
|
1192 fullbody = g_strdup_printf("[%s]\n%s", subject, body); |
187985455020
Correctly display PGP-encoded messages with a subject
Mikael Berthe <mikael@lilotux.net>
parents:
1397
diff
changeset
|
1193 else |
187985455020
Correctly display PGP-encoded messages with a subject
Mikael Berthe <mikael@lilotux.net>
parents:
1397
diff
changeset
|
1194 fullbody = g_strdup_printf("[%s]\n", subject); |
187985455020
Correctly display PGP-encoded messages with a subject
Mikael Berthe <mikael@lilotux.net>
parents:
1397
diff
changeset
|
1195 body = fullbody; |
187985455020
Correctly display PGP-encoded messages with a subject
Mikael Berthe <mikael@lilotux.net>
parents:
1397
diff
changeset
|
1196 } |
1484
7b36b91a4388
New UI message flag (O) when OTR is used
Mikael Berthe <mikael@lilotux.net>
parents:
1476
diff
changeset
|
1197 hk_message_in(bjid, rname, timestamp, body, type, encrypted); |
1399
187985455020
Correctly display PGP-encoded messages with a subject
Mikael Berthe <mikael@lilotux.net>
parents:
1397
diff
changeset
|
1198 g_free(fullbody); |
819
c2d7d9dd4193
New option 'block_unsubscribed'
Mikael Berthe <mikael@lilotux.net>
parents:
818
diff
changeset
|
1199 } |
1347
07816313073b
Add an option 'otr' to enable OTR support in the configuration file
Mikael Berthe <mikael@lilotux.net>
parents:
1344
diff
changeset
|
1200 |
07816313073b
Add an option 'otr' to enable OTR support in the configuration file
Mikael Berthe <mikael@lilotux.net>
parents:
1344
diff
changeset
|
1201 gotmessage_return: |
07816313073b
Add an option 'otr' to enable OTR support in the configuration file
Mikael Berthe <mikael@lilotux.net>
parents:
1344
diff
changeset
|
1202 // Clean up and exit |
1058 | 1203 g_free(bjid); |
1347
07816313073b
Add an option 'otr' to enable OTR support in the configuration file
Mikael Berthe <mikael@lilotux.net>
parents:
1344
diff
changeset
|
1204 g_free(decrypted_pgp); |
1333
e30a9d907105
Minor coding style adjustments
Mikael Berthe <mikael@lilotux.net>
parents:
1330
diff
changeset
|
1205 if (free_msg) |
1347
07816313073b
Add an option 'otr' to enable OTR support in the configuration file
Mikael Berthe <mikael@lilotux.net>
parents:
1344
diff
changeset
|
1206 g_free(decrypted_otr); |
29 | 1207 } |
1208 | |
420
04a0b450380b
Display error code/message when receiving a message packet with "error" type
Mikael Berthe <mikael@lilotux.net>
parents:
419
diff
changeset
|
1209 |
1598 | 1210 static LmHandlerResult handle_messages(LmMessageHandler *handler, |
1211 LmConnection *connection, | |
1212 LmMessage *m, gpointer user_data) | |
579
0c67755e0fa7
Introduce a handle_presence_muc() function
Mikael Berthe <mikael@lilotux.net>
parents:
578
diff
changeset
|
1213 { |
1598 | 1214 const char *p, *from=lm_message_get_from(m); |
1984
b0470ef8669b
XEP 184: don't send receipts to buddies that have no presence subscription
Mikael Berthe <mikael@lilotux.net>
parents:
1979
diff
changeset
|
1215 char *bjid, *res; |
1598 | 1216 LmMessageNode *x; |
1217 const char *body = NULL; | |
1218 const char *enc = NULL; | |
1219 const char *subject = NULL; | |
1001
dff25377c11f
Auto-reconnect after a network/server failure
Mikael Berthe <mikael@lilotux.net>
parents:
999
diff
changeset
|
1220 time_t timestamp = 0L; |
1646 | 1221 LmMessageSubType mstype; |
1222 | |
1223 mstype = lm_message_get_sub_type(m); | |
547
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
1224 |
1598 | 1225 body = lm_message_node_get_child_value(m->node, "body"); |
547
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
1226 |
1598 | 1227 x = lm_message_node_find_xmlns(m->node, NS_ENCRYPTED); |
1228 if (x && (p = lm_message_node_get_value(x)) != NULL) | |
1399
187985455020
Correctly display PGP-encoded messages with a subject
Mikael Berthe <mikael@lilotux.net>
parents:
1397
diff
changeset
|
1229 enc = p; |
187985455020
Correctly display PGP-encoded messages with a subject
Mikael Berthe <mikael@lilotux.net>
parents:
1397
diff
changeset
|
1230 |
1984
b0470ef8669b
XEP 184: don't send receipts to buddies that have no presence subscription
Mikael Berthe <mikael@lilotux.net>
parents:
1979
diff
changeset
|
1231 // Get the bare-JID/room (bjid) and the resource/nickname (res) |
b0470ef8669b
XEP 184: don't send receipts to buddies that have no presence subscription
Mikael Berthe <mikael@lilotux.net>
parents:
1979
diff
changeset
|
1232 bjid = g_strdup(lm_message_get_from(m)); |
b0470ef8669b
XEP 184: don't send receipts to buddies that have no presence subscription
Mikael Berthe <mikael@lilotux.net>
parents:
1979
diff
changeset
|
1233 res = strchr(bjid, JID_RESOURCE_SEPARATOR); |
b0470ef8669b
XEP 184: don't send receipts to buddies that have no presence subscription
Mikael Berthe <mikael@lilotux.net>
parents:
1979
diff
changeset
|
1234 if (res) *res++ = 0; |
b0470ef8669b
XEP 184: don't send receipts to buddies that have no presence subscription
Mikael Berthe <mikael@lilotux.net>
parents:
1979
diff
changeset
|
1235 |
1598 | 1236 p = lm_message_node_get_child_value(m->node, "subject"); |
1237 if (p != NULL) { | |
1646 | 1238 if (mstype != LM_MESSAGE_SUB_TYPE_GROUPCHAT) { |
1598 | 1239 // Chat message |
1399
187985455020
Correctly display PGP-encoded messages with a subject
Mikael Berthe <mikael@lilotux.net>
parents:
1397
diff
changeset
|
1240 subject = p; |
1984
b0470ef8669b
XEP 184: don't send receipts to buddies that have no presence subscription
Mikael Berthe <mikael@lilotux.net>
parents:
1979
diff
changeset
|
1241 } else { |
b0470ef8669b
XEP 184: don't send receipts to buddies that have no presence subscription
Mikael Berthe <mikael@lilotux.net>
parents:
1979
diff
changeset
|
1242 // Room topic |
549
448e299e45da
MUC: "/room topic" shows the current room topic
Mikael Berthe <mikael@lilotux.net>
parents:
547
diff
changeset
|
1243 GSList *roombuddy; |
1598 | 1244 gchar *mbuf; |
1245 const gchar *subj = p; | |
549
448e299e45da
MUC: "/room topic" shows the current room topic
Mikael Berthe <mikael@lilotux.net>
parents:
547
diff
changeset
|
1246 // Set the new topic |
1984
b0470ef8669b
XEP 184: don't send receipts to buddies that have no presence subscription
Mikael Berthe <mikael@lilotux.net>
parents:
1979
diff
changeset
|
1247 roombuddy = roster_find(bjid, jidsearch, 0); |
549
448e299e45da
MUC: "/room topic" shows the current room topic
Mikael Berthe <mikael@lilotux.net>
parents:
547
diff
changeset
|
1248 if (roombuddy) |
772
464be13343a9
Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents:
756
diff
changeset
|
1249 buddy_settopic(roombuddy->data, subj); |
547
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
1250 // Display inside the room window |
1984
b0470ef8669b
XEP 184: don't send receipts to buddies that have no presence subscription
Mikael Berthe <mikael@lilotux.net>
parents:
1979
diff
changeset
|
1251 if (!res) { |
560
64cb4de94972
Better topic attribution
Mikael Berthe <mikael@lilotux.net>
parents:
549
diff
changeset
|
1252 // No specific resource (this is certainly history) |
1896
c5ab9cf3819a
[MUC] Fix handling of empty room topic
Mikael Berthe <mikael@lilotux.net>
parents:
1895
diff
changeset
|
1253 if (*subj) |
c5ab9cf3819a
[MUC] Fix handling of empty room topic
Mikael Berthe <mikael@lilotux.net>
parents:
1895
diff
changeset
|
1254 mbuf = g_strdup_printf("The topic has been set to: %s", subj); |
c5ab9cf3819a
[MUC] Fix handling of empty room topic
Mikael Berthe <mikael@lilotux.net>
parents:
1895
diff
changeset
|
1255 else |
c5ab9cf3819a
[MUC] Fix handling of empty room topic
Mikael Berthe <mikael@lilotux.net>
parents:
1895
diff
changeset
|
1256 mbuf = g_strdup_printf("The topic has been cleared"); |
560
64cb4de94972
Better topic attribution
Mikael Berthe <mikael@lilotux.net>
parents:
549
diff
changeset
|
1257 } else { |
1896
c5ab9cf3819a
[MUC] Fix handling of empty room topic
Mikael Berthe <mikael@lilotux.net>
parents:
1895
diff
changeset
|
1258 if (*subj) |
1984
b0470ef8669b
XEP 184: don't send receipts to buddies that have no presence subscription
Mikael Berthe <mikael@lilotux.net>
parents:
1979
diff
changeset
|
1259 mbuf = g_strdup_printf("%s has set the topic to: %s", res, subj); |
1896
c5ab9cf3819a
[MUC] Fix handling of empty room topic
Mikael Berthe <mikael@lilotux.net>
parents:
1895
diff
changeset
|
1260 else |
1984
b0470ef8669b
XEP 184: don't send receipts to buddies that have no presence subscription
Mikael Berthe <mikael@lilotux.net>
parents:
1979
diff
changeset
|
1261 mbuf = g_strdup_printf("%s has cleared the topic", res); |
560
64cb4de94972
Better topic attribution
Mikael Berthe <mikael@lilotux.net>
parents:
549
diff
changeset
|
1262 } |
1984
b0470ef8669b
XEP 184: don't send receipts to buddies that have no presence subscription
Mikael Berthe <mikael@lilotux.net>
parents:
1979
diff
changeset
|
1263 scr_WriteIncomingMessage(bjid, mbuf, 0, |
1598 | 1264 HBB_PREFIX_INFO|HBB_PREFIX_NOFLAG, 0); |
1265 if (settings_opt_get_int("log_muc_conf")) | |
1984
b0470ef8669b
XEP 184: don't send receipts to buddies that have no presence subscription
Mikael Berthe <mikael@lilotux.net>
parents:
1979
diff
changeset
|
1266 hlog_write_message(bjid, 0, -1, mbuf); |
1598 | 1267 g_free(mbuf); |
732
ab623c2df964
MUC: Update the chat status line when the topic is updated
Mikael Berthe <mikael@lilotux.net>
parents:
724
diff
changeset
|
1268 // The topic is displayed in the chat status line, so refresh now. |
1780
e4378fbab5d7
Major API cleanup - bump API to 4
Mikael Berthe <mikael@lilotux.net>
parents:
1747
diff
changeset
|
1269 scr_update_chat_status(TRUE); |
547
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
1270 } |
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
1271 } |
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
1272 |
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
1273 // Timestamp? |
1598 | 1274 timestamp = lm_message_node_get_timestamp(m->node); |
547
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
1275 |
1646 | 1276 if (mstype == LM_MESSAGE_SUB_TYPE_ERROR) { |
1598 | 1277 x = lm_message_node_get_child(m->node, "error"); |
1800
d2747442918a
When displaying a server error, show the sender JID
Mikael Berthe <mikael@lilotux.net>
parents:
1780
diff
changeset
|
1278 display_server_error(x, from); |
1691 | 1279 #if defined XEP0022 || defined XEP0085 |
1280 // If the XEP85/22 support is probed, set it back to unknown so that | |
999
9687ecc59303
Redo chat states detection if we receive a message error packet from a contact
Mikael Berthe <mikael@lilotux.net>
parents:
998
diff
changeset
|
1281 // we probe it again. |
9687ecc59303
Redo chat states detection if we receive a message error packet from a contact
Mikael Berthe <mikael@lilotux.net>
parents:
998
diff
changeset
|
1282 chatstates_reset_probed(from); |
9687ecc59303
Redo chat states detection if we receive a message error packet from a contact
Mikael Berthe <mikael@lilotux.net>
parents:
998
diff
changeset
|
1283 #endif |
1132
1650056b96fc
Do not use chat states of error messages :)
Mikael Berthe <mikael@lilotux.net>
parents:
1128
diff
changeset
|
1284 } else { |
1598 | 1285 handle_state_events(from, m->node); |
547
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
1286 } |
1984
b0470ef8669b
XEP 184: don't send receipts to buddies that have no presence subscription
Mikael Berthe <mikael@lilotux.net>
parents:
1979
diff
changeset
|
1287 |
1399
187985455020
Correctly display PGP-encoded messages with a subject
Mikael Berthe <mikael@lilotux.net>
parents:
1397
diff
changeset
|
1288 if (from && (body || subject)) |
1646 | 1289 gotmessage(mstype, from, body, enc, subject, timestamp, |
1598 | 1290 lm_message_node_find_xmlns(m->node, NS_SIGNED)); |
1984
b0470ef8669b
XEP 184: don't send receipts to buddies that have no presence subscription
Mikael Berthe <mikael@lilotux.net>
parents:
1979
diff
changeset
|
1291 |
b0470ef8669b
XEP 184: don't send receipts to buddies that have no presence subscription
Mikael Berthe <mikael@lilotux.net>
parents:
1979
diff
changeset
|
1292 // Report received message if message delivery receipt was requested |
b0470ef8669b
XEP 184: don't send receipts to buddies that have no presence subscription
Mikael Berthe <mikael@lilotux.net>
parents:
1979
diff
changeset
|
1293 if (lm_message_node_get_child(m->node, "request") && |
b0470ef8669b
XEP 184: don't send receipts to buddies that have no presence subscription
Mikael Berthe <mikael@lilotux.net>
parents:
1979
diff
changeset
|
1294 (roster_getsubscription(bjid) & sub_from)) { |
1869
fe385f2cfb93
Partial update for XEP-0184 v1.1
Mikael Berthe <mikael@lilotux.net>
parents:
1866
diff
changeset
|
1295 const gchar *mid; |
fe385f2cfb93
Partial update for XEP-0184 v1.1
Mikael Berthe <mikael@lilotux.net>
parents:
1866
diff
changeset
|
1296 LmMessageNode *y; |
1602 | 1297 LmMessage *rcvd = lm_message_new(from, LM_MESSAGE_TYPE_MESSAGE); |
1869
fe385f2cfb93
Partial update for XEP-0184 v1.1
Mikael Berthe <mikael@lilotux.net>
parents:
1866
diff
changeset
|
1298 mid = lm_message_get_id(m); |
fe385f2cfb93
Partial update for XEP-0184 v1.1
Mikael Berthe <mikael@lilotux.net>
parents:
1866
diff
changeset
|
1299 // For backward compatibility (XEP184 < v.1.1): |
fe385f2cfb93
Partial update for XEP-0184 v1.1
Mikael Berthe <mikael@lilotux.net>
parents:
1866
diff
changeset
|
1300 lm_message_node_set_attribute(rcvd->node, "id", mid); |
fe385f2cfb93
Partial update for XEP-0184 v1.1
Mikael Berthe <mikael@lilotux.net>
parents:
1866
diff
changeset
|
1301 y = lm_message_node_add_child(rcvd->node, "received", NULL); |
fe385f2cfb93
Partial update for XEP-0184 v1.1
Mikael Berthe <mikael@lilotux.net>
parents:
1866
diff
changeset
|
1302 lm_message_node_set_attribute(y, "xmlns", NS_RECEIPTS); |
fe385f2cfb93
Partial update for XEP-0184 v1.1
Mikael Berthe <mikael@lilotux.net>
parents:
1866
diff
changeset
|
1303 lm_message_node_set_attribute(y, "id", mid); |
1602 | 1304 lm_connection_send(connection, rcvd, NULL); |
1305 lm_message_unref(rcvd); | |
1306 } | |
1128 | 1307 |
1308 if (from) { | |
1908
e2def760c6d0
Introduce NS_MUC_{USER,ADMIN,OWNER}
Mikael Berthe <mikael@lilotux.net>
parents:
1906
diff
changeset
|
1309 x = lm_message_node_find_xmlns(m->node, NS_MUC_USER); |
1598 | 1310 if (x && !strcmp(x->name, "x")) |
1953
9f443617e96b
Improve MUC support (Myhailo Danylenko)
Mikael Berthe <mikael@lilotux.net>
parents:
1951
diff
changeset
|
1311 got_muc_message(from, x, timestamp); |
1951
1a01a7ef4e43
Add support for XEP-0249 / Direct MUC Invitations (Myhailo Danylenko)
Mikael Berthe <mikael@lilotux.net>
parents:
1937
diff
changeset
|
1312 |
1a01a7ef4e43
Add support for XEP-0249 / Direct MUC Invitations (Myhailo Danylenko)
Mikael Berthe <mikael@lilotux.net>
parents:
1937
diff
changeset
|
1313 x = lm_message_node_find_xmlns(m->node, NS_X_CONFERENCE); |
1a01a7ef4e43
Add support for XEP-0249 / Direct MUC Invitations (Myhailo Danylenko)
Mikael Berthe <mikael@lilotux.net>
parents:
1937
diff
changeset
|
1314 |
1a01a7ef4e43
Add support for XEP-0249 / Direct MUC Invitations (Myhailo Danylenko)
Mikael Berthe <mikael@lilotux.net>
parents:
1937
diff
changeset
|
1315 if (x && !strcmp(x->name, "x")) { |
1a01a7ef4e43
Add support for XEP-0249 / Direct MUC Invitations (Myhailo Danylenko)
Mikael Berthe <mikael@lilotux.net>
parents:
1937
diff
changeset
|
1316 const char *jid = lm_message_node_get_attribute(x, "jid"); |
1a01a7ef4e43
Add support for XEP-0249 / Direct MUC Invitations (Myhailo Danylenko)
Mikael Berthe <mikael@lilotux.net>
parents:
1937
diff
changeset
|
1317 if (jid) { |
1a01a7ef4e43
Add support for XEP-0249 / Direct MUC Invitations (Myhailo Danylenko)
Mikael Berthe <mikael@lilotux.net>
parents:
1937
diff
changeset
|
1318 const char *reason = lm_message_node_get_attribute(x, "reason"); |
1a01a7ef4e43
Add support for XEP-0249 / Direct MUC Invitations (Myhailo Danylenko)
Mikael Berthe <mikael@lilotux.net>
parents:
1937
diff
changeset
|
1319 const char *password = lm_message_node_get_attribute(x, "password"); |
1a01a7ef4e43
Add support for XEP-0249 / Direct MUC Invitations (Myhailo Danylenko)
Mikael Berthe <mikael@lilotux.net>
parents:
1937
diff
changeset
|
1320 // FIXME we shouldn't send decline stanzas in this case |
1a01a7ef4e43
Add support for XEP-0249 / Direct MUC Invitations (Myhailo Danylenko)
Mikael Berthe <mikael@lilotux.net>
parents:
1937
diff
changeset
|
1321 got_invite(from, jid, reason, password, FALSE); |
1a01a7ef4e43
Add support for XEP-0249 / Direct MUC Invitations (Myhailo Danylenko)
Mikael Berthe <mikael@lilotux.net>
parents:
1937
diff
changeset
|
1322 } |
1a01a7ef4e43
Add support for XEP-0249 / Direct MUC Invitations (Myhailo Danylenko)
Mikael Berthe <mikael@lilotux.net>
parents:
1937
diff
changeset
|
1323 } |
1128 | 1324 } |
1598 | 1325 |
1984
b0470ef8669b
XEP 184: don't send receipts to buddies that have no presence subscription
Mikael Berthe <mikael@lilotux.net>
parents:
1979
diff
changeset
|
1326 g_free(bjid); |
1598 | 1327 return LM_HANDLER_RESULT_REMOVE_MESSAGE; |
547
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
1328 } |
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
1329 |
1600 | 1330 static LmHandlerResult cb_caps(LmMessageHandler *h, LmConnection *c, |
1331 LmMessage *m, gpointer user_data) | |
1332 { | |
1333 char *ver = user_data; | |
1999
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1998
diff
changeset
|
1334 char *hash; |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1998
diff
changeset
|
1335 const char *from = lm_message_get_from(m); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1998
diff
changeset
|
1336 char *bjid = jidtodisp(from); |
1646 | 1337 LmMessageSubType mstype = lm_message_get_sub_type(m); |
1600 | 1338 |
1999
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1998
diff
changeset
|
1339 hash = strchr(ver, ','); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1998
diff
changeset
|
1340 if (hash) |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1998
diff
changeset
|
1341 *hash++ = '\0'; |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1998
diff
changeset
|
1342 |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1998
diff
changeset
|
1343 if (mstype == LM_MESSAGE_SUB_TYPE_RESULT) { |
1600 | 1344 LmMessageNode *info; |
1345 LmMessageNode *query = lm_message_node_get_child(m->node, "query"); | |
1346 | |
1999
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1998
diff
changeset
|
1347 if (caps_has_hash(ver, bjid)) |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1998
diff
changeset
|
1348 goto caps_callback_return; |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1998
diff
changeset
|
1349 |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1998
diff
changeset
|
1350 caps_add(ver); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1998
diff
changeset
|
1351 |
1600 | 1352 info = lm_message_node_get_child(query, "identity"); |
1999
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1998
diff
changeset
|
1353 while (info) { |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1998
diff
changeset
|
1354 if (!g_strcmp0(info->name, "identity")) |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1998
diff
changeset
|
1355 caps_add_identity(ver, lm_message_node_get_attribute(info, "category"), |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1998
diff
changeset
|
1356 lm_message_node_get_attribute(info, "name"), |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1998
diff
changeset
|
1357 lm_message_node_get_attribute(info, "type"), |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1998
diff
changeset
|
1358 lm_message_node_get_attribute(info, "xml:lang")); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1998
diff
changeset
|
1359 info = info->next; |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1998
diff
changeset
|
1360 } |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1998
diff
changeset
|
1361 |
1600 | 1362 info = lm_message_node_get_child(query, "feature"); |
1363 while (info) { | |
1364 if (!g_strcmp0(info->name, "feature")) | |
1365 caps_add_feature(ver, lm_message_node_get_attribute(info, "var")); | |
1366 info = info->next; | |
1367 } | |
1999
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1998
diff
changeset
|
1368 |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1998
diff
changeset
|
1369 info = lm_message_node_get_child(query, "x"); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1998
diff
changeset
|
1370 { |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1998
diff
changeset
|
1371 LmMessageNode *field; |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1998
diff
changeset
|
1372 LmMessageNode *value; |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1998
diff
changeset
|
1373 const char *formtype, *var; |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1998
diff
changeset
|
1374 while (info) { |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1998
diff
changeset
|
1375 if (!g_strcmp0(info->name, "x") |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1998
diff
changeset
|
1376 && !g_strcmp0(lm_message_node_get_attribute(info, "type"), |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1998
diff
changeset
|
1377 "result") |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1998
diff
changeset
|
1378 && !g_strcmp0(lm_message_node_get_attribute(info, "xmlns"), |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1998
diff
changeset
|
1379 "jabber:x:data")) { |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1998
diff
changeset
|
1380 field = lm_message_node_get_child(info, "field"); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1998
diff
changeset
|
1381 formtype = NULL; |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1998
diff
changeset
|
1382 while (field) { |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1998
diff
changeset
|
1383 if (!g_strcmp0(field->name, "field") |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1998
diff
changeset
|
1384 && !g_strcmp0(lm_message_node_get_attribute(field, "var"), |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1998
diff
changeset
|
1385 "FORM_TYPE") |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1998
diff
changeset
|
1386 && !g_strcmp0(lm_message_node_get_attribute(field, "type"), |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1998
diff
changeset
|
1387 "hidden")) { |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1998
diff
changeset
|
1388 value = lm_message_node_get_child(field, "value"); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1998
diff
changeset
|
1389 if (value) |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1998
diff
changeset
|
1390 formtype = lm_message_node_get_value(value); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1998
diff
changeset
|
1391 } |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1998
diff
changeset
|
1392 field = field->next; |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1998
diff
changeset
|
1393 } |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1998
diff
changeset
|
1394 if (formtype) { |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1998
diff
changeset
|
1395 caps_add_dataform(ver, formtype); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1998
diff
changeset
|
1396 field = lm_message_node_get_child(info, "field"); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1998
diff
changeset
|
1397 while (field) { |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1998
diff
changeset
|
1398 var = lm_message_node_get_attribute(field, "var"); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1998
diff
changeset
|
1399 if (!g_strcmp0(field->name, "field") |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1998
diff
changeset
|
1400 && (g_strcmp0(var, "FORM_TYPE") |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1998
diff
changeset
|
1401 || g_strcmp0(lm_message_node_get_attribute(field, "type"), |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1998
diff
changeset
|
1402 "hidden"))) { |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1998
diff
changeset
|
1403 value = lm_message_node_get_child(field, "value"); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1998
diff
changeset
|
1404 while (value) { |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1998
diff
changeset
|
1405 if (!g_strcmp0(value->name, "value")) |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1998
diff
changeset
|
1406 caps_add_dataform_field(ver, formtype, var, |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1998
diff
changeset
|
1407 lm_message_node_get_value(value)); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1998
diff
changeset
|
1408 value = value->next; |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1998
diff
changeset
|
1409 } |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1998
diff
changeset
|
1410 } |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1998
diff
changeset
|
1411 field = field->next; |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1998
diff
changeset
|
1412 } |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1998
diff
changeset
|
1413 } |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1998
diff
changeset
|
1414 } |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1998
diff
changeset
|
1415 info = info->next; |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1998
diff
changeset
|
1416 } |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1998
diff
changeset
|
1417 } |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1998
diff
changeset
|
1418 |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1998
diff
changeset
|
1419 if (caps_verify(ver, hash)) |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1998
diff
changeset
|
1420 caps_copy_to_persistent(ver, lm_message_node_to_string(query)); |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1998
diff
changeset
|
1421 else |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1998
diff
changeset
|
1422 caps_move_to_local(ver, bjid); |
1600 | 1423 } |
1999
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1998
diff
changeset
|
1424 |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1998
diff
changeset
|
1425 caps_callback_return: |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1998
diff
changeset
|
1426 g_free(bjid); |
1600 | 1427 g_free(ver); |
1428 return LM_HANDLER_RESULT_REMOVE_MESSAGE; | |
1429 } | |
1430 | |
1598 | 1431 static LmHandlerResult handle_presence(LmMessageHandler *handler, |
1432 LmConnection *connection, | |
1433 LmMessage *m, gpointer user_data) | |
986
ed697234bd39
Chat states receival (Alexis Hildebrandt)
Mikael Berthe <mikael@lilotux.net>
parents:
977
diff
changeset
|
1434 { |
1731 | 1435 char *bjid; |
1598 | 1436 const char *from, *rname, *p=NULL, *ustmsg=NULL; |
1437 enum imstatus ust; | |
1438 char bpprio; | |
1439 time_t timestamp = 0L; | |
1600 | 1440 LmMessageNode *muc_packet, *caps; |
1910
3695266e16c7
Fix error presence packet handling.
Mikael Berthe <mikael@lilotux.net>
parents:
1909
diff
changeset
|
1441 LmMessageSubType mstype = lm_message_get_sub_type(m); |
1598 | 1442 |
1644
73fc85ea0b4b
Do not send disco requests to offline resources
Mikael Berthe <mikael@lilotux.net>
parents:
1637
diff
changeset
|
1443 // Check for MUC presence packet |
1908
e2def760c6d0
Introduce NS_MUC_{USER,ADMIN,OWNER}
Mikael Berthe <mikael@lilotux.net>
parents:
1906
diff
changeset
|
1444 muc_packet = lm_message_node_find_xmlns(m->node, NS_MUC_USER); |
1598 | 1445 |
1446 from = lm_message_get_from(m); | |
1910
3695266e16c7
Fix error presence packet handling.
Mikael Berthe <mikael@lilotux.net>
parents:
1909
diff
changeset
|
1447 if (!from) { |
3695266e16c7
Fix error presence packet handling.
Mikael Berthe <mikael@lilotux.net>
parents:
1909
diff
changeset
|
1448 scr_LogPrint(LPRINT_LOGNORM, "Unexpected presence packet!"); |
3695266e16c7
Fix error presence packet handling.
Mikael Berthe <mikael@lilotux.net>
parents:
1909
diff
changeset
|
1449 |
3695266e16c7
Fix error presence packet handling.
Mikael Berthe <mikael@lilotux.net>
parents:
1909
diff
changeset
|
1450 if (mstype == LM_MESSAGE_SUB_TYPE_ERROR) { |
3695266e16c7
Fix error presence packet handling.
Mikael Berthe <mikael@lilotux.net>
parents:
1909
diff
changeset
|
1451 display_server_error(lm_message_node_get_child(m->node, "error"), |
3695266e16c7
Fix error presence packet handling.
Mikael Berthe <mikael@lilotux.net>
parents:
1909
diff
changeset
|
1452 lm_message_get_from(m)); |
3695266e16c7
Fix error presence packet handling.
Mikael Berthe <mikael@lilotux.net>
parents:
1909
diff
changeset
|
1453 return LM_HANDLER_RESULT_REMOVE_MESSAGE; |
3695266e16c7
Fix error presence packet handling.
Mikael Berthe <mikael@lilotux.net>
parents:
1909
diff
changeset
|
1454 } |
3695266e16c7
Fix error presence packet handling.
Mikael Berthe <mikael@lilotux.net>
parents:
1909
diff
changeset
|
1455 return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS; |
3695266e16c7
Fix error presence packet handling.
Mikael Berthe <mikael@lilotux.net>
parents:
1909
diff
changeset
|
1456 } |
987
f47e312560af
Improve JEP22 + JEP85 support
Mikael Berthe <mikael@lilotux.net>
parents:
986
diff
changeset
|
1457 |
f47e312560af
Improve JEP22 + JEP85 support
Mikael Berthe <mikael@lilotux.net>
parents:
986
diff
changeset
|
1458 rname = strchr(from, JID_RESOURCE_SEPARATOR); |
1598 | 1459 if (rname) rname++; |
986
ed697234bd39
Chat states receival (Alexis Hildebrandt)
Mikael Berthe <mikael@lilotux.net>
parents:
977
diff
changeset
|
1460 |
1598 | 1461 if (settings_opt_get_int("ignore_self_presence")) { |
1462 const char *self_fjid = lm_connection_get_jid(connection); | |
1463 if (self_fjid && !strcasecmp(self_fjid, from)) { | |
1464 return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS; // Ignoring self presence | |
987
f47e312560af
Improve JEP22 + JEP85 support
Mikael Berthe <mikael@lilotux.net>
parents:
986
diff
changeset
|
1465 } |
f47e312560af
Improve JEP22 + JEP85 support
Mikael Berthe <mikael@lilotux.net>
parents:
986
diff
changeset
|
1466 } |
f47e312560af
Improve JEP22 + JEP85 support
Mikael Berthe <mikael@lilotux.net>
parents:
986
diff
changeset
|
1467 |
1731 | 1468 bjid = jidtodisp(from); |
987
f47e312560af
Improve JEP22 + JEP85 support
Mikael Berthe <mikael@lilotux.net>
parents:
986
diff
changeset
|
1469 |
1646 | 1470 if (mstype == LM_MESSAGE_SUB_TYPE_ERROR) { |
1598 | 1471 LmMessageNode *x; |
1731 | 1472 scr_LogPrint(LPRINT_LOGNORM, "Error presence packet from <%s>", bjid); |
1598 | 1473 x = lm_message_node_find_child(m->node, "error"); |
1800
d2747442918a
When displaying a server error, show the sender JID
Mikael Berthe <mikael@lilotux.net>
parents:
1780
diff
changeset
|
1474 display_server_error(x, from); |
1598 | 1475 // Let's check it isn't a nickname conflict. |
1476 // XXX Note: We should handle the <conflict/> string condition. | |
1477 if ((p = lm_message_node_get_attribute(x, "code")) != NULL) { | |
1478 if (atoi(p) == 409) { | |
1479 // 409 = conflict (nickname is in use or registered by another user) | |
1480 // If we are not inside this room, we should reset the nickname | |
1731 | 1481 GSList *room_elt = roster_find(bjid, jidsearch, 0); |
1598 | 1482 if (room_elt && !buddy_getinsideroom(room_elt->data)) |
1483 buddy_setnickname(room_elt->data, NULL); | |
1484 } | |
987
f47e312560af
Improve JEP22 + JEP85 support
Mikael Berthe <mikael@lilotux.net>
parents:
986
diff
changeset
|
1485 } |
f47e312560af
Improve JEP22 + JEP85 support
Mikael Berthe <mikael@lilotux.net>
parents:
986
diff
changeset
|
1486 |
1731 | 1487 g_free(bjid); |
1598 | 1488 return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS; |
986
ed697234bd39
Chat states receival (Alexis Hildebrandt)
Mikael Berthe <mikael@lilotux.net>
parents:
977
diff
changeset
|
1489 } |
ed697234bd39
Chat states receival (Alexis Hildebrandt)
Mikael Berthe <mikael@lilotux.net>
parents:
977
diff
changeset
|
1490 |
1598 | 1491 p = lm_message_node_get_child_value(m->node, "priority"); |
1492 if (p && *p) bpprio = (gchar)atoi(p); | |
1493 else bpprio = 0; | |
986
ed697234bd39
Chat states receival (Alexis Hildebrandt)
Mikael Berthe <mikael@lilotux.net>
parents:
977
diff
changeset
|
1494 |
1598 | 1495 ust = available; |
749
6c633adaae10
Use events system for subscription requests
Mikael Berthe <mikael@lilotux.net>
parents:
745
diff
changeset
|
1496 |
1598 | 1497 p = lm_message_node_get_child_value(m->node, "show"); |
1498 if (p) { | |
1499 if (!strcmp(p, "away")) ust = away; | |
1500 else if (!strcmp(p, "dnd")) ust = dontdisturb; | |
1501 else if (!strcmp(p, "xa")) ust = notavail; | |
1502 else if (!strcmp(p, "chat")) ust = freeforchat; | |
749
6c633adaae10
Use events system for subscription requests
Mikael Berthe <mikael@lilotux.net>
parents:
745
diff
changeset
|
1503 } |
6c633adaae10
Use events system for subscription requests
Mikael Berthe <mikael@lilotux.net>
parents:
745
diff
changeset
|
1504 |
1646 | 1505 if (mstype == LM_MESSAGE_SUB_TYPE_UNAVAILABLE) |
1598 | 1506 ust = offline; |
749
6c633adaae10
Use events system for subscription requests
Mikael Berthe <mikael@lilotux.net>
parents:
745
diff
changeset
|
1507 |
1598 | 1508 ustmsg = lm_message_node_get_child_value(m->node, "status"); |
1899
decf94827efe
More lm_message_node_get_child_value() return value checks
Mikael Berthe <mikael@lilotux.net>
parents:
1896
diff
changeset
|
1509 if (ustmsg && !*ustmsg) |
decf94827efe
More lm_message_node_get_child_value() return value checks
Mikael Berthe <mikael@lilotux.net>
parents:
1896
diff
changeset
|
1510 ustmsg = NULL; |
749
6c633adaae10
Use events system for subscription requests
Mikael Berthe <mikael@lilotux.net>
parents:
745
diff
changeset
|
1511 |
1598 | 1512 // Timestamp? |
1513 timestamp = lm_message_node_get_timestamp(m->node); | |
1514 | |
1515 if (muc_packet) { | |
1516 // This is a MUC presence message | |
1731 | 1517 handle_muc_presence(from, muc_packet, bjid, rname, |
1598 | 1518 ust, ustmsg, timestamp, bpprio); |
749
6c633adaae10
Use events system for subscription requests
Mikael Berthe <mikael@lilotux.net>
parents:
745
diff
changeset
|
1519 } else { |
1598 | 1520 // Not a MUC message, so this is a regular buddy... |
1521 // Call hk_statuschange() if status has changed or if the | |
1522 // status message is different | |
1523 const char *msg; | |
1731 | 1524 msg = roster_getstatusmsg(bjid, rname); |
1525 if ((ust != roster_getstatus(bjid, rname)) || | |
1728
15b3834cbe5f
Handle priority changes when the contact status doesn't change
Mikael Berthe <mikael@lilotux.net>
parents:
1722
diff
changeset
|
1526 (!ustmsg && msg && msg[0]) || |
15b3834cbe5f
Handle priority changes when the contact status doesn't change
Mikael Berthe <mikael@lilotux.net>
parents:
1722
diff
changeset
|
1527 (ustmsg && (!msg || strcmp(ustmsg, msg))) || |
1731 | 1528 (bpprio != roster_getprio(bjid, rname))) |
1529 hk_statuschange(bjid, rname, bpprio, timestamp, ust, ustmsg); | |
1598 | 1530 // Presence signature processing |
1531 if (!ustmsg) | |
1532 ustmsg = ""; // Some clients omit the <status/> element :-( | |
1731 | 1533 check_signature(bjid, rname, |
1534 lm_message_node_find_xmlns(m->node, NS_SIGNED), ustmsg); | |
1128 | 1535 } |
1536 | |
1644
73fc85ea0b4b
Do not send disco requests to offline resources
Mikael Berthe <mikael@lilotux.net>
parents:
1637
diff
changeset
|
1537 // XEP-0115 Entity Capabilities |
1600 | 1538 caps = lm_message_node_find_xmlns(m->node, NS_CAPS); |
1644
73fc85ea0b4b
Do not send disco requests to offline resources
Mikael Berthe <mikael@lilotux.net>
parents:
1637
diff
changeset
|
1539 if (caps && ust != offline) { |
1600 | 1540 const char *ver = lm_message_node_get_attribute(caps, "ver"); |
1999
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1998
diff
changeset
|
1541 const char *hash = lm_message_node_get_attribute(caps, "hash"); |
1600 | 1542 GSList *sl_buddy = NULL; |
1917
33d1c42cf07e
Ignore malformed caps packets
Mikael Berthe <mikael@lilotux.net>
parents:
1911
diff
changeset
|
1543 |
1999
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1998
diff
changeset
|
1544 if (!hash) { |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1998
diff
changeset
|
1545 // No support for legacy format |
1917
33d1c42cf07e
Ignore malformed caps packets
Mikael Berthe <mikael@lilotux.net>
parents:
1911
diff
changeset
|
1546 goto handle_presence_return; |
33d1c42cf07e
Ignore malformed caps packets
Mikael Berthe <mikael@lilotux.net>
parents:
1911
diff
changeset
|
1547 } |
1999
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1998
diff
changeset
|
1548 if (!ver || !g_strcmp0(ver, "") || !g_strcmp0(hash, "")) |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1998
diff
changeset
|
1549 goto handle_presence_return; |
1917
33d1c42cf07e
Ignore malformed caps packets
Mikael Berthe <mikael@lilotux.net>
parents:
1911
diff
changeset
|
1550 |
1600 | 1551 if (rname) |
1731 | 1552 sl_buddy = roster_find(bjid, jidsearch, ROSTER_TYPE_USER); |
1644
73fc85ea0b4b
Do not send disco requests to offline resources
Mikael Berthe <mikael@lilotux.net>
parents:
1637
diff
changeset
|
1553 // Only cache the caps if the user is on the roster |
1600 | 1554 if (sl_buddy && buddy_getonserverflag(sl_buddy->data)) { |
1555 buddy_resource_setcaps(sl_buddy->data, rname, ver); | |
1556 | |
1999
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1998
diff
changeset
|
1557 if (!caps_has_hash(ver, bjid) && !caps_restore_from_persistent(ver)) { |
1600 | 1558 char *node; |
1559 LmMessageHandler *handler; | |
1560 LmMessage *iq = lm_message_new_with_sub_type(from, LM_MESSAGE_TYPE_IQ, | |
1561 LM_MESSAGE_SUB_TYPE_GET); | |
1562 node = g_strdup_printf("%s#%s", | |
1563 lm_message_node_get_attribute(caps, "node"), | |
1564 ver); | |
1565 lm_message_node_set_attributes | |
1566 (lm_message_node_add_child(iq->node, "query", NULL), | |
1567 "xmlns", NS_DISCO_INFO, | |
1568 "node", node, | |
1569 NULL); | |
1570 g_free(node); | |
1999
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1998
diff
changeset
|
1571 handler = lm_message_handler_new(cb_caps, |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1998
diff
changeset
|
1572 g_strdup_printf("%s,%s",ver,hash), |
51f032d5ca22
Add support for XEP-0115 Entity Capabilities, with offline cache
Hermitifier
parents:
1998
diff
changeset
|
1573 NULL); |
1600 | 1574 lm_connection_send_with_reply(connection, iq, handler, NULL); |
1575 lm_message_unref(iq); | |
1576 lm_message_handler_unref(handler); | |
1577 } | |
1578 } | |
1579 } | |
1580 | |
1917
33d1c42cf07e
Ignore malformed caps packets
Mikael Berthe <mikael@lilotux.net>
parents:
1911
diff
changeset
|
1581 handle_presence_return: |
1731 | 1582 g_free(bjid); |
1598 | 1583 return LM_HANDLER_RESULT_REMOVE_MESSAGE; |
1128 | 1584 } |
1585 | |
1586 | |
1598 | 1587 static LmHandlerResult handle_iq(LmMessageHandler *handler, |
1588 LmConnection *connection, | |
1589 LmMessage *m, gpointer user_data) | |
1590 { | |
1591 int i; | |
1592 const char *xmlns = NULL; | |
1593 LmMessageNode *x; | |
1646 | 1594 LmMessageSubType mstype = lm_message_get_sub_type(m); |
1598 | 1595 |
1647
cfa1fff86f78
Reorder processing in handle_iq()
Mikael Berthe <mikael@lilotux.net>
parents:
1646
diff
changeset
|
1596 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
|
1597 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
|
1598 lm_message_get_from(m)); |
1647
cfa1fff86f78
Reorder processing in handle_iq()
Mikael Berthe <mikael@lilotux.net>
parents:
1646
diff
changeset
|
1599 return LM_HANDLER_RESULT_REMOVE_MESSAGE; |
cfa1fff86f78
Reorder processing in handle_iq()
Mikael Berthe <mikael@lilotux.net>
parents:
1646
diff
changeset
|
1600 } |
cfa1fff86f78
Reorder processing in handle_iq()
Mikael Berthe <mikael@lilotux.net>
parents:
1646
diff
changeset
|
1601 |
1904
9a3d7a7dada2
Fix looping issue spotted by isbear when sending manual IQ messages
Mikael Berthe <mikael@lilotux.net>
parents:
1902
diff
changeset
|
1602 if (mstype == LM_MESSAGE_SUB_TYPE_RESULT) { |
1905
68a4f8dda3e7
Clean up previous patch
Mikael Berthe <mikael@lilotux.net>
parents:
1904
diff
changeset
|
1603 scr_LogPrint(LPRINT_DEBUG, "Unhandled IQ result? %s", |
68a4f8dda3e7
Clean up previous patch
Mikael Berthe <mikael@lilotux.net>
parents:
1904
diff
changeset
|
1604 lm_message_node_to_string(m->node)); |
1904
9a3d7a7dada2
Fix looping issue spotted by isbear when sending manual IQ messages
Mikael Berthe <mikael@lilotux.net>
parents:
1902
diff
changeset
|
1605 return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS; |
9a3d7a7dada2
Fix looping issue spotted by isbear when sending manual IQ messages
Mikael Berthe <mikael@lilotux.net>
parents:
1902
diff
changeset
|
1606 } |
9a3d7a7dada2
Fix looping issue spotted by isbear when sending manual IQ messages
Mikael Berthe <mikael@lilotux.net>
parents:
1902
diff
changeset
|
1607 |
1598 | 1608 for (x = m->node->children; x; x=x->next) { |
1609 xmlns = lm_message_node_get_attribute(x, "xmlns"); | |
1610 if (xmlns) | |
1611 for (i=0; iq_handlers[i].xmlns; ++i) | |
1612 if (!strcmp(iq_handlers[i].xmlns, xmlns)) | |
1613 return iq_handlers[i].handler(NULL, connection, m, user_data); | |
1614 xmlns = NULL; | |
1128 | 1615 } |
1616 | |
1646 | 1617 if ((mstype == LM_MESSAGE_SUB_TYPE_SET) || |
1618 (mstype == LM_MESSAGE_SUB_TYPE_GET)) | |
1598 | 1619 send_iq_error(connection, m, XMPP_ERROR_NOT_IMPLEMENTED); |
1620 | |
1905
68a4f8dda3e7
Clean up previous patch
Mikael Berthe <mikael@lilotux.net>
parents:
1904
diff
changeset
|
1621 scr_LogPrint(LPRINT_DEBUG, "Unhandled IQ: %s", |
68a4f8dda3e7
Clean up previous patch
Mikael Berthe <mikael@lilotux.net>
parents:
1904
diff
changeset
|
1622 lm_message_node_to_string(m->node)); |
1621
eec2fa456d0f
Do not print Unhandled IQ results to the log window
Mikael Berthe <mikael@lilotux.net>
parents:
1616
diff
changeset
|
1623 |
1904
9a3d7a7dada2
Fix looping issue spotted by isbear when sending manual IQ messages
Mikael Berthe <mikael@lilotux.net>
parents:
1902
diff
changeset
|
1624 scr_LogPrint(LPRINT_NORMAL, "Received unhandled IQ request from <%s>.", |
9a3d7a7dada2
Fix looping issue spotted by isbear when sending manual IQ messages
Mikael Berthe <mikael@lilotux.net>
parents:
1902
diff
changeset
|
1625 lm_message_get_from(m)); |
1721
8cfc2a386b1f
Do not display Unhandled IQ request stanzas in the log window
Mikael Berthe <mikael@lilotux.net>
parents:
1720
diff
changeset
|
1626 |
1598 | 1627 return LM_HANDLER_RESULT_REMOVE_MESSAGE; |
1128 | 1628 } |
1629 | |
1598 | 1630 static LmHandlerResult handle_s10n(LmMessageHandler *handler, |
1631 LmConnection *connection, | |
1632 LmMessage *m, gpointer user_data) | |
547
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
1633 { |
611
ad737139a144
Improve subscription management
Mikael Berthe <mikael@lilotux.net>
parents:
610
diff
changeset
|
1634 char *r; |
ad737139a144
Improve subscription management
Mikael Berthe <mikael@lilotux.net>
parents:
610
diff
changeset
|
1635 char *buf; |
818
55cd45481a07
Fix a buddylist bug when receiving a subscription request
Mikael Berthe <mikael@lilotux.net>
parents:
793
diff
changeset
|
1636 int newbuddy; |
1906
5d37cee8c6c6
Add "hook-subscription" hook and hk_subscription()
Mikael Berthe <mikael@lilotux.net>
parents:
1905
diff
changeset
|
1637 guint hook_result; |
1910
3695266e16c7
Fix error presence packet handling.
Mikael Berthe <mikael@lilotux.net>
parents:
1909
diff
changeset
|
1638 LmMessageSubType mstype = lm_message_get_sub_type(m); |
1598 | 1639 const char *from = lm_message_get_from(m); |
1906
5d37cee8c6c6
Add "hook-subscription" hook and hk_subscription()
Mikael Berthe <mikael@lilotux.net>
parents:
1905
diff
changeset
|
1640 const char *msg = lm_message_node_get_child_value(m->node, "status"); |
611
ad737139a144
Improve subscription management
Mikael Berthe <mikael@lilotux.net>
parents:
610
diff
changeset
|
1641 |
1910
3695266e16c7
Fix error presence packet handling.
Mikael Berthe <mikael@lilotux.net>
parents:
1909
diff
changeset
|
1642 if (mstype == LM_MESSAGE_SUB_TYPE_ERROR) { |
3695266e16c7
Fix error presence packet handling.
Mikael Berthe <mikael@lilotux.net>
parents:
1909
diff
changeset
|
1643 display_server_error(lm_message_node_get_child(m->node, "error"), |
3695266e16c7
Fix error presence packet handling.
Mikael Berthe <mikael@lilotux.net>
parents:
1909
diff
changeset
|
1644 lm_message_get_from(m)); |
3695266e16c7
Fix error presence packet handling.
Mikael Berthe <mikael@lilotux.net>
parents:
1909
diff
changeset
|
1645 return LM_HANDLER_RESULT_REMOVE_MESSAGE; |
3695266e16c7
Fix error presence packet handling.
Mikael Berthe <mikael@lilotux.net>
parents:
1909
diff
changeset
|
1646 } |
3695266e16c7
Fix error presence packet handling.
Mikael Berthe <mikael@lilotux.net>
parents:
1909
diff
changeset
|
1647 |
3695266e16c7
Fix error presence packet handling.
Mikael Berthe <mikael@lilotux.net>
parents:
1909
diff
changeset
|
1648 if (!from) { |
3695266e16c7
Fix error presence packet handling.
Mikael Berthe <mikael@lilotux.net>
parents:
1909
diff
changeset
|
1649 scr_LogPrint(LPRINT_DEBUG, "handle_s10n: Unexpected presence packet!"); |
3695266e16c7
Fix error presence packet handling.
Mikael Berthe <mikael@lilotux.net>
parents:
1909
diff
changeset
|
1650 return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS; |
3695266e16c7
Fix error presence packet handling.
Mikael Berthe <mikael@lilotux.net>
parents:
1909
diff
changeset
|
1651 } |
611
ad737139a144
Improve subscription management
Mikael Berthe <mikael@lilotux.net>
parents:
610
diff
changeset
|
1652 r = jidtodisp(from); |
547
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
1653 |
818
55cd45481a07
Fix a buddylist bug when receiving a subscription request
Mikael Berthe <mikael@lilotux.net>
parents:
793
diff
changeset
|
1654 newbuddy = !roster_find(r, jidsearch, 0); |
55cd45481a07
Fix a buddylist bug when receiving a subscription request
Mikael Berthe <mikael@lilotux.net>
parents:
793
diff
changeset
|
1655 |
1906
5d37cee8c6c6
Add "hook-subscription" hook and hk_subscription()
Mikael Berthe <mikael@lilotux.net>
parents:
1905
diff
changeset
|
1656 hook_result = hk_subscription(mstype, r, msg); |
5d37cee8c6c6
Add "hook-subscription" hook and hk_subscription()
Mikael Berthe <mikael@lilotux.net>
parents:
1905
diff
changeset
|
1657 |
1646 | 1658 if (mstype == LM_MESSAGE_SUB_TYPE_SUBSCRIBE) { |
611
ad737139a144
Improve subscription management
Mikael Berthe <mikael@lilotux.net>
parents:
610
diff
changeset
|
1659 /* The sender wishes to subscribe to our presence */ |
ad737139a144
Improve subscription management
Mikael Berthe <mikael@lilotux.net>
parents:
610
diff
changeset
|
1660 |
1906
5d37cee8c6c6
Add "hook-subscription" hook and hk_subscription()
Mikael Berthe <mikael@lilotux.net>
parents:
1905
diff
changeset
|
1661 if (hook_result) { |
5d37cee8c6c6
Add "hook-subscription" hook and hk_subscription()
Mikael Berthe <mikael@lilotux.net>
parents:
1905
diff
changeset
|
1662 g_free(r); |
5d37cee8c6c6
Add "hook-subscription" hook and hk_subscription()
Mikael Berthe <mikael@lilotux.net>
parents:
1905
diff
changeset
|
1663 return LM_HANDLER_RESULT_REMOVE_MESSAGE; |
5d37cee8c6c6
Add "hook-subscription" hook and hk_subscription()
Mikael Berthe <mikael@lilotux.net>
parents:
1905
diff
changeset
|
1664 } |
611
ad737139a144
Improve subscription management
Mikael Berthe <mikael@lilotux.net>
parents:
610
diff
changeset
|
1665 |
617
d3a8b43bf9e7
Add "/authorization" command
Mikael Berthe <mikael@lilotux.net>
parents:
616
diff
changeset
|
1666 buf = g_strdup_printf("<%s> wants to subscribe to your presence updates", |
d3a8b43bf9e7
Add "/authorization" command
Mikael Berthe <mikael@lilotux.net>
parents:
616
diff
changeset
|
1667 from); |
1290
e42f48103609
Drawing the MUC nicks by a different color
Michal 'vorner' Vaner <vorner@ucw.cz>
parents:
1282
diff
changeset
|
1668 scr_WriteIncomingMessage(r, buf, 0, HBB_PREFIX_INFO, 0); |
617
d3a8b43bf9e7
Add "/authorization" command
Mikael Berthe <mikael@lilotux.net>
parents:
616
diff
changeset
|
1669 scr_LogPrint(LPRINT_LOGNORM, "%s", buf); |
d3a8b43bf9e7
Add "/authorization" command
Mikael Berthe <mikael@lilotux.net>
parents:
616
diff
changeset
|
1670 g_free(buf); |
d3a8b43bf9e7
Add "/authorization" command
Mikael Berthe <mikael@lilotux.net>
parents:
616
diff
changeset
|
1671 |
611
ad737139a144
Improve subscription management
Mikael Berthe <mikael@lilotux.net>
parents:
610
diff
changeset
|
1672 if (msg) { |
772
464be13343a9
Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents:
756
diff
changeset
|
1673 buf = g_strdup_printf("<%s> said: %s", from, msg); |
1290
e42f48103609
Drawing the MUC nicks by a different color
Michal 'vorner' Vaner <vorner@ucw.cz>
parents:
1282
diff
changeset
|
1674 scr_WriteIncomingMessage(r, buf, 0, HBB_PREFIX_INFO, 0); |
772
464be13343a9
Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents:
756
diff
changeset
|
1675 replace_nl_with_dots(buf); |
464be13343a9
Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents:
756
diff
changeset
|
1676 scr_LogPrint(LPRINT_LOGNORM, "%s", buf); |
464be13343a9
Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents:
756
diff
changeset
|
1677 g_free(buf); |
547
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
1678 } |
611
ad737139a144
Improve subscription management
Mikael Berthe <mikael@lilotux.net>
parents:
610
diff
changeset
|
1679 |
749
6c633adaae10
Use events system for subscription requests
Mikael Berthe <mikael@lilotux.net>
parents:
745
diff
changeset
|
1680 // Create a new event item |
1685
1342df44c814
Improved events interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1684
diff
changeset
|
1681 { |
1342df44c814
Improved events interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1684
diff
changeset
|
1682 const char *id; |
1342df44c814
Improved events interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1684
diff
changeset
|
1683 char *desc = g_strdup_printf("<%s> wants to subscribe to your " |
1342df44c814
Improved events interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1684
diff
changeset
|
1684 "presence updates", r); |
1342df44c814
Improved events interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1684
diff
changeset
|
1685 |
1342df44c814
Improved events interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1684
diff
changeset
|
1686 id = evs_new(desc, NULL, 0, evscallback_subscription, g_strdup(r), |
1342df44c814
Improved events interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1684
diff
changeset
|
1687 (GDestroyNotify)g_free); |
1342df44c814
Improved events interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1684
diff
changeset
|
1688 g_free(desc); |
1342df44c814
Improved events interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1684
diff
changeset
|
1689 if (id) |
1342df44c814
Improved events interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1684
diff
changeset
|
1690 buf = g_strdup_printf("Please use /event %s accept|reject", id); |
1342df44c814
Improved events interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1684
diff
changeset
|
1691 else |
1342df44c814
Improved events interface
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1684
diff
changeset
|
1692 buf = g_strdup_printf("Unable to create a new event!"); |
751
4a7271e69694
Avoid reusing events ids
Mikael Berthe <mikael@lilotux.net>
parents:
749
diff
changeset
|
1693 } |
1290
e42f48103609
Drawing the MUC nicks by a different color
Michal 'vorner' Vaner <vorner@ucw.cz>
parents:
1282
diff
changeset
|
1694 scr_WriteIncomingMessage(r, buf, 0, HBB_PREFIX_INFO, 0); |
617
d3a8b43bf9e7
Add "/authorization" command
Mikael Berthe <mikael@lilotux.net>
parents:
616
diff
changeset
|
1695 scr_LogPrint(LPRINT_LOGNORM, "%s", buf); |
611
ad737139a144
Improve subscription management
Mikael Berthe <mikael@lilotux.net>
parents:
610
diff
changeset
|
1696 g_free(buf); |
1646 | 1697 } else if (mstype == LM_MESSAGE_SUB_TYPE_UNSUBSCRIBE) { |
611
ad737139a144
Improve subscription management
Mikael Berthe <mikael@lilotux.net>
parents:
610
diff
changeset
|
1698 /* The sender is unsubscribing from our presence */ |
1598 | 1699 xmpp_send_s10n(from, LM_MESSAGE_SUB_TYPE_UNSUBSCRIBED); |
611
ad737139a144
Improve subscription management
Mikael Berthe <mikael@lilotux.net>
parents:
610
diff
changeset
|
1700 buf = g_strdup_printf("<%s> is unsubscribing from your " |
ad737139a144
Improve subscription management
Mikael Berthe <mikael@lilotux.net>
parents:
610
diff
changeset
|
1701 "presence updates", from); |
1290
e42f48103609
Drawing the MUC nicks by a different color
Michal 'vorner' Vaner <vorner@ucw.cz>
parents:
1282
diff
changeset
|
1702 scr_WriteIncomingMessage(r, buf, 0, HBB_PREFIX_INFO, 0); |
611
ad737139a144
Improve subscription management
Mikael Berthe <mikael@lilotux.net>
parents:
610
diff
changeset
|
1703 scr_LogPrint(LPRINT_LOGNORM, "%s", buf); |
ad737139a144
Improve subscription management
Mikael Berthe <mikael@lilotux.net>
parents:
610
diff
changeset
|
1704 g_free(buf); |
1646 | 1705 } else if (mstype == LM_MESSAGE_SUB_TYPE_SUBSCRIBED) { |
611
ad737139a144
Improve subscription management
Mikael Berthe <mikael@lilotux.net>
parents:
610
diff
changeset
|
1706 /* The sender has allowed us to receive their presence */ |
ad737139a144
Improve subscription management
Mikael Berthe <mikael@lilotux.net>
parents:
610
diff
changeset
|
1707 buf = g_strdup_printf("<%s> has allowed you to receive their " |
ad737139a144
Improve subscription management
Mikael Berthe <mikael@lilotux.net>
parents:
610
diff
changeset
|
1708 "presence updates", from); |
1290
e42f48103609
Drawing the MUC nicks by a different color
Michal 'vorner' Vaner <vorner@ucw.cz>
parents:
1282
diff
changeset
|
1709 scr_WriteIncomingMessage(r, buf, 0, HBB_PREFIX_INFO, 0); |
611
ad737139a144
Improve subscription management
Mikael Berthe <mikael@lilotux.net>
parents:
610
diff
changeset
|
1710 scr_LogPrint(LPRINT_LOGNORM, "%s", buf); |
ad737139a144
Improve subscription management
Mikael Berthe <mikael@lilotux.net>
parents:
610
diff
changeset
|
1711 g_free(buf); |
1646 | 1712 } else if (mstype == LM_MESSAGE_SUB_TYPE_UNSUBSCRIBED) { |
611
ad737139a144
Improve subscription management
Mikael Berthe <mikael@lilotux.net>
parents:
610
diff
changeset
|
1713 /* The subscription request has been denied or a previously-granted |
ad737139a144
Improve subscription management
Mikael Berthe <mikael@lilotux.net>
parents:
610
diff
changeset
|
1714 subscription has been cancelled */ |
610
0e8247cf2bd1
Consider buddies as offline when they have cancelled our subscription
Mikael Berthe <mikael@lilotux.net>
parents:
609
diff
changeset
|
1715 roster_unsubscribed(from); |
859
cb2a3a1d985f
Make sure we update the roster when a subscription is cancelled
Mikael Berthe <mikael@lilotux.net>
parents:
845
diff
changeset
|
1716 update_roster = TRUE; |
611
ad737139a144
Improve subscription management
Mikael Berthe <mikael@lilotux.net>
parents:
610
diff
changeset
|
1717 buf = g_strdup_printf("<%s> has cancelled your subscription to " |
ad737139a144
Improve subscription management
Mikael Berthe <mikael@lilotux.net>
parents:
610
diff
changeset
|
1718 "their presence updates", from); |
1290
e42f48103609
Drawing the MUC nicks by a different color
Michal 'vorner' Vaner <vorner@ucw.cz>
parents:
1282
diff
changeset
|
1719 scr_WriteIncomingMessage(r, buf, 0, HBB_PREFIX_INFO, 0); |
611
ad737139a144
Improve subscription management
Mikael Berthe <mikael@lilotux.net>
parents:
610
diff
changeset
|
1720 scr_LogPrint(LPRINT_LOGNORM, "%s", buf); |
ad737139a144
Improve subscription management
Mikael Berthe <mikael@lilotux.net>
parents:
610
diff
changeset
|
1721 g_free(buf); |
603 | 1722 } else { |
1634 | 1723 g_free(r); |
1598 | 1724 return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS; |
818
55cd45481a07
Fix a buddylist bug when receiving a subscription request
Mikael Berthe <mikael@lilotux.net>
parents:
793
diff
changeset
|
1725 } |
55cd45481a07
Fix a buddylist bug when receiving a subscription request
Mikael Berthe <mikael@lilotux.net>
parents:
793
diff
changeset
|
1726 |
1010
54405d09b15a
Add a call to buddylist_build()
Mikael Berthe <mikael@lilotux.net>
parents:
1008
diff
changeset
|
1727 if (newbuddy) |
818
55cd45481a07
Fix a buddylist bug when receiving a subscription request
Mikael Berthe <mikael@lilotux.net>
parents:
793
diff
changeset
|
1728 update_roster = TRUE; |
611
ad737139a144
Improve subscription management
Mikael Berthe <mikael@lilotux.net>
parents:
610
diff
changeset
|
1729 g_free(r); |
1598 | 1730 return LM_HANDLER_RESULT_REMOVE_MESSAGE; |
1731 } | |
1732 | |
1729
e6e89b1d7831
Minor style and header updates
Mikael Berthe <mikael@lilotux.net>
parents:
1728
diff
changeset
|
1733 // TODO: Use the enum of loudmouth, when it's included in the header... |
1598 | 1734 typedef enum { |
1735 LM_LOG_LEVEL_VERBOSE = 1 << (G_LOG_LEVEL_USER_SHIFT), | |
1736 LM_LOG_LEVEL_NET = 1 << (G_LOG_LEVEL_USER_SHIFT + 1), | |
1737 LM_LOG_LEVEL_PARSER = 1 << (G_LOG_LEVEL_USER_SHIFT + 2), | |
1738 LM_LOG_LEVEL_SSL = 1 << (G_LOG_LEVEL_USER_SHIFT + 3), | |
1739 LM_LOG_LEVEL_SASL = 1 << (G_LOG_LEVEL_USER_SHIFT + 4), | |
1740 LM_LOG_LEVEL_ALL = (LM_LOG_LEVEL_NET | | |
1741 LM_LOG_LEVEL_VERBOSE | | |
1742 LM_LOG_LEVEL_PARSER | | |
1743 LM_LOG_LEVEL_SSL | | |
1744 LM_LOG_LEVEL_SASL) | |
1745 } LmLogLevelFlags; | |
1746 | |
1747 static void lm_debug_handler (const gchar *log_domain, | |
1748 GLogLevelFlags log_level, | |
1749 const gchar *message, | |
1750 gpointer user_data) | |
1751 { | |
1616
4c7104ec5f3b
Add 2 debugging levels (for 'tracelog_level')
Mikael Berthe <mikael@lilotux.net>
parents:
1615
diff
changeset
|
1752 if (message && *message) { |
1598 | 1753 char *msg; |
1616
4c7104ec5f3b
Add 2 debugging levels (for 'tracelog_level')
Mikael Berthe <mikael@lilotux.net>
parents:
1615
diff
changeset
|
1754 int mcabber_loglevel = settings_opt_get_int("tracelog_level"); |
4c7104ec5f3b
Add 2 debugging levels (for 'tracelog_level')
Mikael Berthe <mikael@lilotux.net>
parents:
1615
diff
changeset
|
1755 |
4c7104ec5f3b
Add 2 debugging levels (for 'tracelog_level')
Mikael Berthe <mikael@lilotux.net>
parents:
1615
diff
changeset
|
1756 if (mcabber_loglevel < 2) |
4c7104ec5f3b
Add 2 debugging levels (for 'tracelog_level')
Mikael Berthe <mikael@lilotux.net>
parents:
1615
diff
changeset
|
1757 return; |
4c7104ec5f3b
Add 2 debugging levels (for 'tracelog_level')
Mikael Berthe <mikael@lilotux.net>
parents:
1615
diff
changeset
|
1758 |
1598 | 1759 if (message[0] == '\n') |
1760 msg = g_strdup(&message[1]); | |
1761 else | |
1762 msg = g_strdup(message); | |
1616
4c7104ec5f3b
Add 2 debugging levels (for 'tracelog_level')
Mikael Berthe <mikael@lilotux.net>
parents:
1615
diff
changeset
|
1763 |
4c7104ec5f3b
Add 2 debugging levels (for 'tracelog_level')
Mikael Berthe <mikael@lilotux.net>
parents:
1615
diff
changeset
|
1764 if (msg[strlen(msg)-1] == '\n') |
4c7104ec5f3b
Add 2 debugging levels (for 'tracelog_level')
Mikael Berthe <mikael@lilotux.net>
parents:
1615
diff
changeset
|
1765 msg[strlen(msg)-1] = '\0'; |
1598 | 1766 |
1767 if (log_level & LM_LOG_LEVEL_VERBOSE) { | |
1768 scr_LogPrint(LPRINT_DEBUG, "LM-VERBOSE: %s", msg); | |
1769 } | |
1616
4c7104ec5f3b
Add 2 debugging levels (for 'tracelog_level')
Mikael Berthe <mikael@lilotux.net>
parents:
1615
diff
changeset
|
1770 if (log_level & LM_LOG_LEVEL_NET) { |
4c7104ec5f3b
Add 2 debugging levels (for 'tracelog_level')
Mikael Berthe <mikael@lilotux.net>
parents:
1615
diff
changeset
|
1771 if (mcabber_loglevel > 2) |
4c7104ec5f3b
Add 2 debugging levels (for 'tracelog_level')
Mikael Berthe <mikael@lilotux.net>
parents:
1615
diff
changeset
|
1772 scr_LogPrint(LPRINT_DEBUG, "LM-NET: %s", msg); |
4c7104ec5f3b
Add 2 debugging levels (for 'tracelog_level')
Mikael Berthe <mikael@lilotux.net>
parents:
1615
diff
changeset
|
1773 } else if (log_level & LM_LOG_LEVEL_PARSER) { |
4c7104ec5f3b
Add 2 debugging levels (for 'tracelog_level')
Mikael Berthe <mikael@lilotux.net>
parents:
1615
diff
changeset
|
1774 if (mcabber_loglevel > 3) |
4c7104ec5f3b
Add 2 debugging levels (for 'tracelog_level')
Mikael Berthe <mikael@lilotux.net>
parents:
1615
diff
changeset
|
1775 scr_LogPrint(LPRINT_DEBUG, "LM-PARSER: %s", msg); |
4c7104ec5f3b
Add 2 debugging levels (for 'tracelog_level')
Mikael Berthe <mikael@lilotux.net>
parents:
1615
diff
changeset
|
1776 } else if (log_level & LM_LOG_LEVEL_SASL) { |
1598 | 1777 scr_LogPrint(LPRINT_DEBUG, "LM-SASL: %s", msg); |
1616
4c7104ec5f3b
Add 2 debugging levels (for 'tracelog_level')
Mikael Berthe <mikael@lilotux.net>
parents:
1615
diff
changeset
|
1778 } else if (log_level & LM_LOG_LEVEL_SSL) { |
1598 | 1779 scr_LogPrint(LPRINT_DEBUG, "LM-SSL: %s", msg); |
1780 } | |
1781 g_free(msg); | |
1782 } | |
547
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
1783 } |
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
1784 |
1598 | 1785 |
1810
8c2651fc217a
Improve initial display when there is an error message
Mikael Berthe <mikael@lilotux.net>
parents:
1800
diff
changeset
|
1786 // xmpp_connect() |
8c2651fc217a
Improve initial display when there is an error message
Mikael Berthe <mikael@lilotux.net>
parents:
1800
diff
changeset
|
1787 // Return a non-zero value if there's an obvious problem |
8c2651fc217a
Improve initial display when there is an error message
Mikael Berthe <mikael@lilotux.net>
parents:
1800
diff
changeset
|
1788 // (no JID, no password, etc.) |
8c2651fc217a
Improve initial display when there is an error message
Mikael Berthe <mikael@lilotux.net>
parents:
1800
diff
changeset
|
1789 gint xmpp_connect(void) |
31 | 1790 { |
1610
6db9f403f707
Replace 'username' with 'jid' in the configuration file
Mikael Berthe <mikael@lilotux.net>
parents:
1604
diff
changeset
|
1791 const char *userjid, *password, *resource, *servername, *ssl_fpr; |
1598 | 1792 char *dynresource = NULL; |
1793 char fpr[16]; | |
1794 const char *proxy_host; | |
1795 const char *resource_prefix = PACKAGE_NAME; | |
1796 char *fjid; | |
1797 int ssl, tls; | |
1798 LmSSL *lssl; | |
1799 unsigned int port; | |
1800 unsigned int ping; | |
1801 LmMessageHandler *handler; | |
1802 GError *error = NULL; | |
1803 | |
1682
d1e8fb14ce2d
Destroy lm connection object on disconnect
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1668
diff
changeset
|
1804 xmpp_disconnect(); |
1598 | 1805 |
1806 servername = settings_opt_get("server"); | |
1610
6db9f403f707
Replace 'username' with 'jid' in the configuration file
Mikael Berthe <mikael@lilotux.net>
parents:
1604
diff
changeset
|
1807 userjid = settings_opt_get("jid"); |
1598 | 1808 password = settings_opt_get("password"); |
1809 resource = settings_opt_get("resource"); | |
1810 proxy_host = settings_opt_get("proxy_host"); | |
1811 ssl_fpr = settings_opt_get("ssl_fingerprint"); | |
1812 | |
1610
6db9f403f707
Replace 'username' with 'jid' in the configuration file
Mikael Berthe <mikael@lilotux.net>
parents:
1604
diff
changeset
|
1813 if (!userjid) { |
6db9f403f707
Replace 'username' with 'jid' in the configuration file
Mikael Berthe <mikael@lilotux.net>
parents:
1604
diff
changeset
|
1814 scr_LogPrint(LPRINT_LOGNORM, "Your JID has not been specified!"); |
1810
8c2651fc217a
Improve initial display when there is an error message
Mikael Berthe <mikael@lilotux.net>
parents:
1800
diff
changeset
|
1815 return -1; |
1598 | 1816 } |
1817 if (!password) { | |
1610
6db9f403f707
Replace 'username' with 'jid' in the configuration file
Mikael Berthe <mikael@lilotux.net>
parents:
1604
diff
changeset
|
1818 scr_LogPrint(LPRINT_LOGNORM, "Your password has not been specified!"); |
1810
8c2651fc217a
Improve initial display when there is an error message
Mikael Berthe <mikael@lilotux.net>
parents:
1800
diff
changeset
|
1819 return -1; |
1598 | 1820 } |
1821 | |
1653
fca9a4c17432
Improve UI latency and CPU usage
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1647
diff
changeset
|
1822 lconnection = lm_connection_new_with_context(NULL, main_context); |
1598 | 1823 |
1824 g_log_set_handler("LM", LM_LOG_LEVEL_ALL, lm_debug_handler, NULL); | |
1825 | |
1826 ping = 40; | |
1827 if (settings_opt_get("pinginterval")) | |
1828 ping = (unsigned int) settings_opt_get_int("pinginterval"); | |
1829 lm_connection_set_keep_alive_rate(lconnection, ping); | |
1830 scr_LogPrint(LPRINT_DEBUG, "Ping interval established: %d secs", ping); | |
1831 | |
1832 lm_connection_set_disconnect_function(lconnection, connection_close_cb, | |
1833 NULL, NULL); | |
1834 | |
1835 handler = lm_message_handler_new(handle_messages, NULL, NULL); | |
1836 lm_connection_register_message_handler(lconnection, handler, | |
1837 LM_MESSAGE_TYPE_MESSAGE, | |
1838 LM_HANDLER_PRIORITY_NORMAL); | |
1839 lm_message_handler_unref(handler); | |
1840 | |
1841 handler = lm_message_handler_new(handle_iq, NULL, NULL); | |
1842 lm_connection_register_message_handler(lconnection, handler, | |
1843 LM_MESSAGE_TYPE_IQ, | |
1844 LM_HANDLER_PRIORITY_NORMAL); | |
1845 lm_message_handler_unref(handler); | |
1846 | |
1847 handler = lm_message_handler_new(handle_presence, NULL, NULL); | |
1848 lm_connection_register_message_handler(lconnection, handler, | |
1849 LM_MESSAGE_TYPE_PRESENCE, | |
1850 LM_HANDLER_PRIORITY_LAST); | |
1851 lm_message_handler_unref(handler); | |
1852 | |
1853 handler = lm_message_handler_new(handle_s10n, NULL, NULL); | |
1854 lm_connection_register_message_handler(lconnection, handler, | |
1855 LM_MESSAGE_TYPE_PRESENCE, | |
1856 LM_HANDLER_PRIORITY_NORMAL); | |
1857 lm_message_handler_unref(handler); | |
1858 | |
1859 /* Connect to server */ | |
1902
51cc01a1a5ec
Improve messages when connecting to the Jabber server
Mikael Berthe <mikael@lilotux.net>
parents:
1899
diff
changeset
|
1860 scr_LogPrint(LPRINT_NORMAL|LPRINT_DEBUG, "Connecting to server%s%s", |
51cc01a1a5ec
Improve messages when connecting to the Jabber server
Mikael Berthe <mikael@lilotux.net>
parents:
1899
diff
changeset
|
1861 servername ? ": " : "", |
51cc01a1a5ec
Improve messages when connecting to the Jabber server
Mikael Berthe <mikael@lilotux.net>
parents:
1899
diff
changeset
|
1862 servername ? servername : ""); |
1598 | 1863 if (!resource) |
1864 resource = resource_prefix; | |
31 | 1865 |
1747
c4f67e2e675f
Randomize reconnection delay
Mikael Berthe <mikael@lilotux.net>
parents:
1746
diff
changeset
|
1866 // Initialize pseudo-random seed |
c4f67e2e675f
Randomize reconnection delay
Mikael Berthe <mikael@lilotux.net>
parents:
1746
diff
changeset
|
1867 srandom(time(NULL)); |
c4f67e2e675f
Randomize reconnection delay
Mikael Berthe <mikael@lilotux.net>
parents:
1746
diff
changeset
|
1868 |
1598 | 1869 if (!settings_opt_get("disable_random_resource")) { |
1870 #if HAVE_ARC4RANDOM | |
1871 dynresource = g_strdup_printf("%s.%08x", resource, arc4random()); | |
1872 #else | |
1873 unsigned int tab[2]; | |
1746
b7574de9ae4b
Use random() instead of rand()
Mikael Berthe <mikael@lilotux.net>
parents:
1733
diff
changeset
|
1874 tab[0] = (unsigned int) (0xffff * (random() / (RAND_MAX + 1.0))); |
b7574de9ae4b
Use random() instead of rand()
Mikael Berthe <mikael@lilotux.net>
parents:
1733
diff
changeset
|
1875 tab[1] = (unsigned int) (0xffff * (random() / (RAND_MAX + 1.0))); |
1598 | 1876 dynresource = g_strdup_printf("%s.%04x%04x", resource, tab[0], tab[1]); |
1877 #endif | |
1878 resource = dynresource; | |
1879 } | |
1880 | |
1881 port = (unsigned int) settings_opt_get_int("port"); | |
1882 | |
1883 if (port) | |
1884 scr_LogPrint(LPRINT_NORMAL|LPRINT_DEBUG, " using port %d", port); | |
1902
51cc01a1a5ec
Improve messages when connecting to the Jabber server
Mikael Berthe <mikael@lilotux.net>
parents:
1899
diff
changeset
|
1885 scr_LogPrint(LPRINT_NORMAL|LPRINT_DEBUG, " with resource %s", resource); |
1598 | 1886 |
1887 if (proxy_host) { | |
1888 int proxy_port = settings_opt_get_int("proxy_port"); | |
1889 if (proxy_port <= 0 || proxy_port > 65535) { | |
1890 scr_LogPrint(LPRINT_NORMAL|LPRINT_DEBUG, "Invalid proxy port: %d", | |
1891 proxy_port); | |
1892 } else { | |
1893 const char *proxy_user, *proxy_pass; | |
1894 LmProxy *lproxy; | |
1895 proxy_user = settings_opt_get("proxy_user"); | |
1896 proxy_pass = settings_opt_get("proxy_pass"); | |
1897 // Proxy initialization | |
1898 lproxy = lm_proxy_new_with_server(LM_PROXY_TYPE_HTTP, | |
1899 proxy_host, proxy_port); | |
1900 lm_proxy_set_username(lproxy, proxy_user); | |
1901 lm_proxy_set_password(lproxy, proxy_pass); | |
1902 lm_connection_set_proxy(lconnection, lproxy); | |
1903 lm_proxy_unref(lproxy); | |
1904 scr_LogPrint(LPRINT_NORMAL|LPRINT_DEBUG, " using proxy %s:%d", | |
1905 proxy_host, proxy_port); | |
1906 } | |
1907 } | |
31 | 1908 |
1610
6db9f403f707
Replace 'username' with 'jid' in the configuration file
Mikael Berthe <mikael@lilotux.net>
parents:
1604
diff
changeset
|
1909 fjid = compose_jid(userjid, servername, resource); |
1598 | 1910 lm_connection_set_jid(lconnection, fjid); |
1610
6db9f403f707
Replace 'username' with 'jid' in the configuration file
Mikael Berthe <mikael@lilotux.net>
parents:
1604
diff
changeset
|
1911 if (servername) |
6db9f403f707
Replace 'username' with 'jid' in the configuration file
Mikael Berthe <mikael@lilotux.net>
parents:
1604
diff
changeset
|
1912 lm_connection_set_server(lconnection, servername); |
1598 | 1913 #if defined(HAVE_LIBOTR) |
1914 otr_init(fjid); | |
1915 #endif | |
1916 g_free(fjid); | |
1917 g_free(dynresource); | |
1918 | |
1919 ssl = settings_opt_get_int("ssl"); | |
1920 tls = settings_opt_get_int("tls"); | |
1921 | |
1922 if (!lm_ssl_is_supported()) { | |
1923 if (ssl || tls) { | |
1924 scr_LogPrint(LPRINT_LOGNORM, "** Error: SSL is NOT available, " | |
1925 "please recompile loudmouth with SSL enabled."); | |
1810
8c2651fc217a
Improve initial display when there is an error message
Mikael Berthe <mikael@lilotux.net>
parents:
1800
diff
changeset
|
1926 return -1; |
1598 | 1927 } |
1928 } | |
1929 | |
1930 if (ssl && tls) { | |
1931 scr_LogPrint(LPRINT_LOGNORM, "You can only set ssl or tls, not both."); | |
1810
8c2651fc217a
Improve initial display when there is an error message
Mikael Berthe <mikael@lilotux.net>
parents:
1800
diff
changeset
|
1932 return -1; |
1598 | 1933 } |
1934 | |
1935 if (!port) | |
1936 port = (ssl ? LM_CONNECTION_DEFAULT_PORT_SSL : LM_CONNECTION_DEFAULT_PORT); | |
1937 lm_connection_set_port(lconnection, port); | |
1938 | |
1939 if (ssl_fpr && (!hex_to_fingerprint(ssl_fpr, fpr))) { | |
1810
8c2651fc217a
Improve initial display when there is an error message
Mikael Berthe <mikael@lilotux.net>
parents:
1800
diff
changeset
|
1940 scr_LogPrint(LPRINT_LOGNORM, "** Please set the fingerprint in the format " |
1598 | 1941 "97:5C:00:3F:1D:77:45:25:E2:C5:70:EC:83:C8:87:EE"); |
1810
8c2651fc217a
Improve initial display when there is an error message
Mikael Berthe <mikael@lilotux.net>
parents:
1800
diff
changeset
|
1942 return -1; |
1598 | 1943 } |
1944 | |
1945 lssl = lm_ssl_new((ssl_fpr ? fpr : NULL), ssl_cb, NULL, NULL); | |
1946 if (lssl) { | |
1947 lm_ssl_use_starttls(lssl, !ssl, tls); | |
1948 lm_connection_set_ssl(lconnection, lssl); | |
1949 lm_ssl_unref(lssl); | |
1950 } else if (ssl || tls) { | |
1951 scr_LogPrint(LPRINT_LOGNORM, "** Error: Couldn't create SSL struct."); | |
1810
8c2651fc217a
Improve initial display when there is an error message
Mikael Berthe <mikael@lilotux.net>
parents:
1800
diff
changeset
|
1952 return -1; |
671
c5da36fd437a
Do not process packet if type = 0
Mikael Berthe <mikael@lilotux.net>
parents:
668
diff
changeset
|
1953 } |
c5da36fd437a
Do not process packet if type = 0
Mikael Berthe <mikael@lilotux.net>
parents:
668
diff
changeset
|
1954 |
1598 | 1955 if (!lm_connection_open(lconnection, connection_open_cb, |
1956 NULL, FALSE, &error)) { | |
1957 _try_to_reconnect(); | |
1717
c12455fec611
Remove extra newlines in scr_LogPrint() calls
Mikael Berthe <mikael@lilotux.net>
parents:
1716
diff
changeset
|
1958 scr_LogPrint(LPRINT_LOGNORM, "Failed to open: %s", error->message); |
1810
8c2651fc217a
Improve initial display when there is an error message
Mikael Berthe <mikael@lilotux.net>
parents:
1800
diff
changeset
|
1959 g_error_free(error); |
1598 | 1960 } |
1810
8c2651fc217a
Improve initial display when there is an error message
Mikael Berthe <mikael@lilotux.net>
parents:
1800
diff
changeset
|
1961 return 0; |
1598 | 1962 } |
1963 | |
1920
bfa507815e0c
Add caps to presence when joining a MUC room
Mikael Berthe <mikael@lilotux.net>
parents:
1917
diff
changeset
|
1964 // xmpp_insert_entity_capabilities(presence_stanza) |
1598 | 1965 // Entity Capabilities (XEP-0115) |
1920
bfa507815e0c
Add caps to presence when joining a MUC room
Mikael Berthe <mikael@lilotux.net>
parents:
1917
diff
changeset
|
1966 void xmpp_insert_entity_capabilities(LmMessageNode *x, enum imstatus status) |
1598 | 1967 { |
1968 LmMessageNode *y; | |
1600 | 1969 const char *ver = entity_version(status); |
1598 | 1970 |
1971 y = lm_message_node_add_child(x, "c", NULL); | |
1972 lm_message_node_set_attribute(y, "xmlns", NS_CAPS); | |
1600 | 1973 lm_message_node_set_attribute(y, "hash", "sha-1"); |
1598 | 1974 lm_message_node_set_attribute(y, "node", MCABBER_CAPS_NODE); |
1975 lm_message_node_set_attribute(y, "ver", ver); | |
1976 } | |
1977 | |
1978 void xmpp_disconnect(void) | |
1979 { | |
1682
d1e8fb14ce2d
Destroy lm connection object on disconnect
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1668
diff
changeset
|
1980 if (!lconnection) |
1598 | 1981 return; |
1682
d1e8fb14ce2d
Destroy lm connection object on disconnect
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1668
diff
changeset
|
1982 if (lm_connection_is_authenticated(lconnection)) { |
d1e8fb14ce2d
Destroy lm connection object on disconnect
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1668
diff
changeset
|
1983 // Launch pre-disconnect internal hook |
1683
b09f82f61745
Split HOOK_INTERNAL
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1682
diff
changeset
|
1984 hk_predisconnect(); |
1682
d1e8fb14ce2d
Destroy lm connection object on disconnect
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1668
diff
changeset
|
1985 // Announce it to everyone else |
d1e8fb14ce2d
Destroy lm connection object on disconnect
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1668
diff
changeset
|
1986 xmpp_setstatus(offline, NULL, "", FALSE); |
d1e8fb14ce2d
Destroy lm connection object on disconnect
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1668
diff
changeset
|
1987 } |
d1e8fb14ce2d
Destroy lm connection object on disconnect
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1668
diff
changeset
|
1988 if (lm_connection_is_open(lconnection)) |
d1e8fb14ce2d
Destroy lm connection object on disconnect
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1668
diff
changeset
|
1989 lm_connection_close(lconnection, NULL); |
d1e8fb14ce2d
Destroy lm connection object on disconnect
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1668
diff
changeset
|
1990 lm_connection_unref(lconnection); |
d1e8fb14ce2d
Destroy lm connection object on disconnect
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1668
diff
changeset
|
1991 lconnection = NULL; |
1598 | 1992 } |
1993 | |
1994 void xmpp_setstatus(enum imstatus st, const char *recipient, const char *msg, | |
1995 int do_not_sign) | |
1996 { | |
1997 LmMessage *m; | |
1693
32c6d81bd1ef
Update status when unexpectedly disconnected from server
Mikael Berthe <mikael@lilotux.net>
parents:
1691
diff
changeset
|
1998 gboolean isonline; |
1598 | 1999 |
2000 if (msg) { | |
2001 // The status message has been specified. We'll use it, unless it is | |
2002 // "-" which is a special case (option meaning "no status message"). | |
2003 if (!strcmp(msg, "-")) | |
2004 msg = ""; | |
2005 } else { | |
2006 // No status message specified; we'll use: | |
2007 // a) the default status message (if provided by the user); | |
2008 // b) the current status message; | |
2009 // c) no status message (i.e. an empty one). | |
2010 msg = settings_get_status_msg(st); | |
2011 if (!msg) { | |
2012 if (mystatusmsg) | |
2013 msg = mystatusmsg; | |
2014 else | |
2015 msg = ""; | |
2016 } | |
2017 } | |
2018 | |
1693
32c6d81bd1ef
Update status when unexpectedly disconnected from server
Mikael Berthe <mikael@lilotux.net>
parents:
1691
diff
changeset
|
2019 isonline = xmpp_is_online(); |
32c6d81bd1ef
Update status when unexpectedly disconnected from server
Mikael Berthe <mikael@lilotux.net>
parents:
1691
diff
changeset
|
2020 |
1598 | 2021 // Only send the packet if we're online. |
2022 // (But we want to update internal status even when disconnected, | |
2023 // in order to avoid some problems during network failures) | |
1693
32c6d81bd1ef
Update status when unexpectedly disconnected from server
Mikael Berthe <mikael@lilotux.net>
parents:
1691
diff
changeset
|
2024 if (isonline) { |
1972
45f0f0f60656
Remove deprecated status invisible
Mikael Berthe <mikael@lilotux.net>
parents:
1963
diff
changeset
|
2025 #ifdef WITH_DEPRECATED_STATUS_INVISIBLE |
1598 | 2026 const char *s_msg = (st != invisible ? msg : NULL); |
1972
45f0f0f60656
Remove deprecated status invisible
Mikael Berthe <mikael@lilotux.net>
parents:
1963
diff
changeset
|
2027 #else |
45f0f0f60656
Remove deprecated status invisible
Mikael Berthe <mikael@lilotux.net>
parents:
1963
diff
changeset
|
2028 // XXX Could be removed if/when we get rid of status invisible |
45f0f0f60656
Remove deprecated status invisible
Mikael Berthe <mikael@lilotux.net>
parents:
1963
diff
changeset
|
2029 // completely. |
45f0f0f60656
Remove deprecated status invisible
Mikael Berthe <mikael@lilotux.net>
parents:
1963
diff
changeset
|
2030 const char *s_msg = msg; |
45f0f0f60656
Remove deprecated status invisible
Mikael Berthe <mikael@lilotux.net>
parents:
1963
diff
changeset
|
2031 #endif |
2023
26edaf6ea10b
xmpp_setstatus: send presence to MUC rooms before the global presence
Mikael Berthe <mikael@lilotux.net>
parents:
2017
diff
changeset
|
2032 |
26edaf6ea10b
xmpp_setstatus: send presence to MUC rooms before the global presence
Mikael Berthe <mikael@lilotux.net>
parents:
2017
diff
changeset
|
2033 if (!recipient) { |
26edaf6ea10b
xmpp_setstatus: send presence to MUC rooms before the global presence
Mikael Berthe <mikael@lilotux.net>
parents:
2017
diff
changeset
|
2034 // This is a global status, send presence to chatrooms |
26edaf6ea10b
xmpp_setstatus: send presence to MUC rooms before the global presence
Mikael Berthe <mikael@lilotux.net>
parents:
2017
diff
changeset
|
2035 #ifdef WITH_DEPRECATED_STATUS_INVISIBLE |
26edaf6ea10b
xmpp_setstatus: send presence to MUC rooms before the global presence
Mikael Berthe <mikael@lilotux.net>
parents:
2017
diff
changeset
|
2036 if (st != invisible) |
26edaf6ea10b
xmpp_setstatus: send presence to MUC rooms before the global presence
Mikael Berthe <mikael@lilotux.net>
parents:
2017
diff
changeset
|
2037 #endif |
26edaf6ea10b
xmpp_setstatus: send presence to MUC rooms before the global presence
Mikael Berthe <mikael@lilotux.net>
parents:
2017
diff
changeset
|
2038 { |
26edaf6ea10b
xmpp_setstatus: send presence to MUC rooms before the global presence
Mikael Berthe <mikael@lilotux.net>
parents:
2017
diff
changeset
|
2039 struct T_presence room_presence; |
26edaf6ea10b
xmpp_setstatus: send presence to MUC rooms before the global presence
Mikael Berthe <mikael@lilotux.net>
parents:
2017
diff
changeset
|
2040 room_presence.st = st; |
26edaf6ea10b
xmpp_setstatus: send presence to MUC rooms before the global presence
Mikael Berthe <mikael@lilotux.net>
parents:
2017
diff
changeset
|
2041 room_presence.msg = msg; |
26edaf6ea10b
xmpp_setstatus: send presence to MUC rooms before the global presence
Mikael Berthe <mikael@lilotux.net>
parents:
2017
diff
changeset
|
2042 foreach_buddy(ROSTER_TYPE_ROOM, &roompresence, &room_presence); |
26edaf6ea10b
xmpp_setstatus: send presence to MUC rooms before the global presence
Mikael Berthe <mikael@lilotux.net>
parents:
2017
diff
changeset
|
2043 } |
26edaf6ea10b
xmpp_setstatus: send presence to MUC rooms before the global presence
Mikael Berthe <mikael@lilotux.net>
parents:
2017
diff
changeset
|
2044 } |
26edaf6ea10b
xmpp_setstatus: send presence to MUC rooms before the global presence
Mikael Berthe <mikael@lilotux.net>
parents:
2017
diff
changeset
|
2045 |
1598 | 2046 m = lm_message_new_presence(st, recipient, s_msg); |
1920
bfa507815e0c
Add caps to presence when joining a MUC room
Mikael Berthe <mikael@lilotux.net>
parents:
1917
diff
changeset
|
2047 xmpp_insert_entity_capabilities(m->node, st); // Entity Caps (XEP-0115) |
1598 | 2048 #ifdef HAVE_GPGME |
2049 if (!do_not_sign && gpg_enabled()) { | |
2050 char *signature; | |
2051 signature = gpg_sign(s_msg ? s_msg : ""); | |
2052 if (signature) { | |
2053 LmMessageNode *y; | |
2054 y = lm_message_node_add_child(m->node, "x", signature); | |
2055 lm_message_node_set_attribute(y, "xmlns", NS_SIGNED); | |
2056 g_free(signature); | |
2057 } | |
2058 } | |
2059 #endif | |
2060 lm_connection_send(lconnection, m, NULL); | |
2061 lm_message_unref(m); | |
2062 } | |
2063 | |
2064 // If we didn't change our _global_ status, we are done | |
2065 if (recipient) return; | |
2066 | |
1693
32c6d81bd1ef
Update status when unexpectedly disconnected from server
Mikael Berthe <mikael@lilotux.net>
parents:
1691
diff
changeset
|
2067 if (isonline || !st) { |
1598 | 2068 // We'll have to update the roster if we switch to/from offline because |
2069 // we don't know the presences of buddies when offline... | |
2070 if (mystatus == offline || st == offline) | |
2071 update_roster = TRUE; | |
2072 | |
1716
d30fb41725fe
Do not call hk_mystatuschange() twice when we're disconnected
Mikael Berthe <mikael@lilotux.net>
parents:
1715
diff
changeset
|
2073 if (isonline || mystatus || st) |
1972
45f0f0f60656
Remove deprecated status invisible
Mikael Berthe <mikael@lilotux.net>
parents:
1963
diff
changeset
|
2074 #ifdef WITH_DEPRECATED_STATUS_INVISIBLE |
1716
d30fb41725fe
Do not call hk_mystatuschange() twice when we're disconnected
Mikael Berthe <mikael@lilotux.net>
parents:
1715
diff
changeset
|
2075 hk_mystatuschange(0, mystatus, st, (st != invisible ? msg : "")); |
1972
45f0f0f60656
Remove deprecated status invisible
Mikael Berthe <mikael@lilotux.net>
parents:
1963
diff
changeset
|
2076 #else |
45f0f0f60656
Remove deprecated status invisible
Mikael Berthe <mikael@lilotux.net>
parents:
1963
diff
changeset
|
2077 hk_mystatuschange(0, mystatus, st, msg); |
45f0f0f60656
Remove deprecated status invisible
Mikael Berthe <mikael@lilotux.net>
parents:
1963
diff
changeset
|
2078 #endif |
1598 | 2079 mystatus = st; |
2080 } | |
2081 | |
2082 if (st) | |
2083 mywantedstatus = st; | |
2084 | |
2085 if (msg != mystatusmsg) { | |
2086 g_free(mystatusmsg); | |
2087 if (*msg) | |
2088 mystatusmsg = g_strdup(msg); | |
2089 else | |
2090 mystatusmsg = NULL; | |
2091 } | |
2092 | |
1780
e4378fbab5d7
Major API cleanup - bump API to 4
Mikael Berthe <mikael@lilotux.net>
parents:
1747
diff
changeset
|
2093 if (!scr_curses_status()) |
1733
a9b0364c0cb2
Fix segfault introduced in previous commit
Mikael Berthe <mikael@lilotux.net>
parents:
1731
diff
changeset
|
2094 return; // Called from config. file |
a9b0364c0cb2
Fix segfault introduced in previous commit
Mikael Berthe <mikael@lilotux.net>
parents:
1731
diff
changeset
|
2095 |
1598 | 2096 if (!Autoaway) |
2097 update_last_use(); | |
2098 | |
2099 // Update status line | |
1780
e4378fbab5d7
Major API cleanup - bump API to 4
Mikael Berthe <mikael@lilotux.net>
parents:
1747
diff
changeset
|
2100 scr_update_main_status(TRUE); |
1598 | 2101 } |
2102 | |
547
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
2103 |
1598 | 2104 enum imstatus xmpp_getstatus(void) |
2105 { | |
2106 return mystatus; | |
2107 } | |
2108 | |
2109 const char *xmpp_getstatusmsg(void) | |
2110 { | |
2111 return mystatusmsg; | |
2112 } | |
2113 | |
2114 // xmpp_setprevstatus() | |
2115 // Set previous status. This wrapper function is used after a disconnection. | |
2116 void xmpp_setprevstatus(void) | |
2117 { | |
2118 xmpp_setstatus(mywantedstatus, NULL, mystatusmsg, FALSE); | |
2119 } | |
2120 | |
2121 // send_storage(store) | |
2122 // Send the node "store" to update the server. | |
2123 // Note: the sender should check we're online. | |
2124 void send_storage(LmMessageNode *store) | |
2125 { | |
2126 LmMessage *iq; | |
1994
024bdd1c6418
Add a dummy handler for some unhandled IQ replies
Mikael Berthe <mikael@lilotux.net>
parents:
1984
diff
changeset
|
2127 LmMessageHandler *handler; |
1598 | 2128 LmMessageNode *query; |
2129 | |
2130 if (!rosternotes) return; | |
2131 | |
2132 iq = lm_message_new_with_sub_type(NULL, LM_MESSAGE_TYPE_IQ, | |
2133 LM_MESSAGE_SUB_TYPE_SET); | |
2134 query = lm_message_node_add_child(iq->node, "query", NULL); | |
2135 lm_message_node_set_attribute(query, "xmlns", NS_PRIVATE); | |
2136 lm_message_node_insert_childnode(query, store); | |
2137 | |
1994
024bdd1c6418
Add a dummy handler for some unhandled IQ replies
Mikael Berthe <mikael@lilotux.net>
parents:
1984
diff
changeset
|
2138 handler = lm_message_handler_new(handle_iq_dummy, NULL, FALSE); |
024bdd1c6418
Add a dummy handler for some unhandled IQ replies
Mikael Berthe <mikael@lilotux.net>
parents:
1984
diff
changeset
|
2139 lm_connection_send_with_reply(lconnection, iq, handler, NULL); |
024bdd1c6418
Add a dummy handler for some unhandled IQ replies
Mikael Berthe <mikael@lilotux.net>
parents:
1984
diff
changeset
|
2140 lm_message_handler_unref(handler); |
1598 | 2141 lm_message_unref(iq); |
2142 } | |
2143 | |
2144 | |
2145 // xmpp_is_bookmarked(roomjid) | |
2146 // Return TRUE if there's a bookmark for the given jid. | |
2147 guint xmpp_is_bookmarked(const char *bjid) | |
2148 { | |
2149 LmMessageNode *x; | |
2150 | |
2151 if (!bookmarks) | |
2152 return FALSE; | |
2153 | |
2154 // Walk through the storage bookmark tags | |
2155 for (x = bookmarks->children ; x; x = x->next) { | |
2156 // If the node is a conference item, check the jid. | |
2157 if (x->name && !strcmp(x->name, "conference")) { | |
2158 const char *fjid = lm_message_node_get_attribute(x, "jid"); | |
2159 if (fjid && !strcasecmp(bjid, fjid)) | |
2160 return TRUE; | |
2161 } | |
2162 } | |
2163 return FALSE; | |
2164 } | |
2165 | |
2166 // xmpp_get_bookmark_nick(roomjid) | |
2167 // Return the room nickname if it is present in a bookmark. | |
2168 const char *xmpp_get_bookmark_nick(const char *bjid) | |
2169 { | |
2170 LmMessageNode *x; | |
2171 | |
2172 if (!bookmarks || !bjid) | |
2173 return NULL; | |
469
a926523d2392
Use UTF8 to handle resources and room nicknames
Mikael Berthe <mikael@lilotux.net>
parents:
468
diff
changeset
|
2174 |
1598 | 2175 // Walk through the storage bookmark tags |
2176 for (x = bookmarks->children ; x; x = x->next) { | |
2177 // If the node is a conference item, check the jid. | |
2178 if (x->name && !strcmp(x->name, "conference")) { | |
2179 const char *fjid = lm_message_node_get_attribute(x, "jid"); | |
2180 if (fjid && !strcasecmp(bjid, fjid)) | |
2181 return lm_message_node_get_child_value(x, "nick"); | |
2182 } | |
2183 } | |
2184 return NULL; | |
2185 } | |
2186 | |
2010 | 2187 int xmpp_get_bookmark_autojoin(const char *bjid) |
2188 { | |
2189 LmMessageNode *x; | |
2190 | |
2191 if (!bookmarks || !bjid) | |
2192 return 0; | |
2193 | |
2194 // Walk through the storage bookmark tags | |
2195 for (x = bookmarks->children ; x; x = x->next) { | |
2196 // If the node is a conference item, check the jid. | |
2197 if (x->name && !strcmp(x->name, "conference")) { | |
2198 const char *fjid = lm_message_node_get_attribute(x, "jid"); | |
2199 if (fjid && !strcasecmp(bjid, fjid)) { | |
2200 const char *autojoin; | |
2201 autojoin = lm_message_node_get_attribute(x, "autojoin"); | |
2202 if (autojoin && (!strcmp(autojoin, "1") || !strcmp(autojoin, "true"))) | |
2203 return 1; | |
2204 return 0; | |
2205 } | |
2206 } | |
2207 } | |
2208 return 0; | |
2209 } | |
1598 | 2210 |
2211 // xmpp_get_all_storage_bookmarks() | |
2212 // Return a GSList with all storage bookmarks. | |
2213 // The caller should g_free the list (not the MUC jids). | |
2214 GSList *xmpp_get_all_storage_bookmarks(void) | |
2215 { | |
2216 LmMessageNode *x; | |
2217 GSList *sl_bookmarks = NULL; | |
2218 | |
2219 // If we have no bookmarks, probably the server doesn't support them. | |
2220 if (!bookmarks) | |
2221 return NULL; | |
2222 | |
2223 // Walk through the storage bookmark tags | |
2224 for (x = bookmarks->children ; x; x = x->next) { | |
2225 // If the node is a conference item, let's add the note to our list. | |
2226 if (x->name && !strcmp(x->name, "conference")) { | |
2227 struct bookmark *bm_elt; | |
2228 const char *autojoin, *name, *nick; | |
2229 const char *fjid = lm_message_node_get_attribute(x, "jid"); | |
2230 if (!fjid) | |
2231 continue; | |
2232 bm_elt = g_new0(struct bookmark, 1); | |
2233 bm_elt->roomjid = g_strdup(fjid); | |
2234 autojoin = lm_message_node_get_attribute(x, "autojoin"); | |
1818
4694fad35ed8
Fix not displaying of MUC nick, set in bookmark
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1811
diff
changeset
|
2235 nick = lm_message_node_get_child_value(x, "nick"); |
1598 | 2236 name = lm_message_node_get_attribute(x, "name"); |
2004
aa7e03c35488
Accept "true" as well as "1" for autojoin in bookmarked rooms
Hermitifier
parents:
1999
diff
changeset
|
2237 if (autojoin && (!strcmp(autojoin, "1") || !strcmp(autojoin, "true"))) |
1598 | 2238 bm_elt->autojoin = 1; |
2239 if (nick) | |
2240 bm_elt->nick = g_strdup(nick); | |
2241 if (name) | |
2242 bm_elt->name = g_strdup(name); | |
2243 sl_bookmarks = g_slist_append(sl_bookmarks, bm_elt); | |
2244 } | |
2245 } | |
2246 return sl_bookmarks; | |
2247 } | |
2248 | |
2249 // xmpp_set_storage_bookmark(roomid, name, nick, passwd, autojoin, | |
1979
6febc7d1f760
Add /room setopt flag_joins (Hermitifier)
Mikael Berthe <mikael@lilotux.net>
parents:
1976
diff
changeset
|
2250 // printstatus, autowhois, flagjoins, group) |
1598 | 2251 // Update the private storage bookmarks: add a conference room. |
2252 // If name is nil, we remove the bookmark. | |
2253 void xmpp_set_storage_bookmark(const char *roomid, const char *name, | |
2254 const char *nick, const char *passwd, | |
2255 int autojoin, enum room_printstatus pstatus, | |
1979
6febc7d1f760
Add /room setopt flag_joins (Hermitifier)
Mikael Berthe <mikael@lilotux.net>
parents:
1976
diff
changeset
|
2256 enum room_autowhois awhois, |
6febc7d1f760
Add /room setopt flag_joins (Hermitifier)
Mikael Berthe <mikael@lilotux.net>
parents:
1976
diff
changeset
|
2257 enum room_flagjoins fjoins, const char *group) |
1598 | 2258 { |
2259 LmMessageNode *x; | |
2260 bool changed = FALSE; | |
2261 | |
2262 if (!roomid) | |
2263 return; | |
2264 | |
2265 // If we have no bookmarks, probably the server doesn't support them. | |
2266 if (!bookmarks) { | |
2267 scr_LogPrint(LPRINT_NORMAL, | |
2268 "Sorry, your server doesn't seem to support private storage."); | |
469
a926523d2392
Use UTF8 to handle resources and room nicknames
Mikael Berthe <mikael@lilotux.net>
parents:
468
diff
changeset
|
2269 return; |
a926523d2392
Use UTF8 to handle resources and room nicknames
Mikael Berthe <mikael@lilotux.net>
parents:
468
diff
changeset
|
2270 } |
31 | 2271 |
1598 | 2272 // Walk through the storage tags |
2273 for (x = bookmarks->children ; x; x = x->next) { | |
2274 // If the current node is a conference item, see if we have to replace it. | |
2275 if (x->name && !strcmp(x->name, "conference")) { | |
2276 const char *fjid = lm_message_node_get_attribute(x, "jid"); | |
2277 if (!fjid) | |
2278 continue; | |
2279 if (!strcmp(fjid, roomid)) { | |
2280 // We've found a bookmark for this room. Let's hide it and we'll | |
2281 // create a new one. | |
2282 lm_message_node_hide(x); | |
2283 changed = TRUE; | |
2284 if (!name) | |
2285 scr_LogPrint(LPRINT_LOGNORM, "Deleting bookmark..."); | |
2286 } | |
2287 } | |
2288 } | |
31 | 2289 |
1598 | 2290 // Let's create a node/bookmark for this roomid, if the name is not NULL. |
2291 if (name) { | |
2292 x = lm_message_node_add_child(bookmarks, "conference", NULL); | |
2293 lm_message_node_set_attributes(x, | |
2294 "jid", roomid, | |
2295 "name", name, | |
2296 "autojoin", autojoin ? "1" : "0", | |
2297 NULL); | |
2298 if (nick) | |
2299 lm_message_node_add_child(x, "nick", nick); | |
2300 if (passwd) | |
2301 lm_message_node_add_child(x, "password", passwd); | |
2302 if (pstatus) | |
2303 lm_message_node_add_child(x, "print_status", strprintstatus[pstatus]); | |
2304 if (awhois) | |
1633
e3afe1da8a5f
Fix saving autowhois option in bookmarks
Mikael Berthe <mikael@lilotux.net>
parents:
1621
diff
changeset
|
2305 lm_message_node_set_attributes(x, "autowhois", |
e3afe1da8a5f
Fix saving autowhois option in bookmarks
Mikael Berthe <mikael@lilotux.net>
parents:
1621
diff
changeset
|
2306 (awhois == autowhois_on) ? "1" : "0", |
e3afe1da8a5f
Fix saving autowhois option in bookmarks
Mikael Berthe <mikael@lilotux.net>
parents:
1621
diff
changeset
|
2307 NULL); |
1979
6febc7d1f760
Add /room setopt flag_joins (Hermitifier)
Mikael Berthe <mikael@lilotux.net>
parents:
1976
diff
changeset
|
2308 if (fjoins) |
6febc7d1f760
Add /room setopt flag_joins (Hermitifier)
Mikael Berthe <mikael@lilotux.net>
parents:
1976
diff
changeset
|
2309 lm_message_node_add_child(x, "flag_joins", strflagjoins[fjoins]); |
2010 | 2310 if (group && *group) |
1976
e6beab22099b
Do not add items to roster with commands /move and /rename (Hermitifier)
Mikael Berthe <mikael@lilotux.net>
parents:
1972
diff
changeset
|
2311 lm_message_node_add_child(x, "group", group); |
1598 | 2312 changed = TRUE; |
2313 scr_LogPrint(LPRINT_LOGNORM, "Updating bookmarks..."); | |
2314 } | |
2315 | |
2316 if (!changed) | |
2317 return; | |
31 | 2318 |
1684
95df4ea512c8
Provide xmpp_is_online()
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1683
diff
changeset
|
2319 if (xmpp_is_online()) |
1598 | 2320 send_storage(bookmarks); |
2321 else | |
2322 scr_LogPrint(LPRINT_LOGNORM, | |
2323 "Warning: you're not connected to the server."); | |
2324 } | |
2325 | |
2326 static struct annotation *parse_storage_rosternote(LmMessageNode *notenode) | |
2327 { | |
2328 const char *p; | |
2329 struct annotation *note = g_new0(struct annotation, 1); | |
2330 p = lm_message_node_get_attribute(notenode, "cdate"); | |
2331 if (p) | |
2332 note->cdate = from_iso8601(p, 1); | |
2333 p = lm_message_node_get_attribute(notenode, "mdate"); | |
2334 if (p) | |
2335 note->mdate = from_iso8601(p, 1); | |
2336 note->text = g_strdup(lm_message_node_get_value(notenode)); | |
2337 note->jid = g_strdup(lm_message_node_get_attribute(notenode, "jid")); | |
2338 return note; | |
2339 } | |
31 | 2340 |
1598 | 2341 // xmpp_get_all_storage_rosternotes() |
2342 // Return a GSList with all storage annotations. | |
2343 // The caller should g_free the list and its contents. | |
2344 GSList *xmpp_get_all_storage_rosternotes(void) | |
2345 { | |
2346 LmMessageNode *x; | |
2347 GSList *sl_notes = NULL; | |
2348 | |
2349 // If we have no rosternotes, probably the server doesn't support them. | |
2350 if (!rosternotes) | |
2351 return NULL; | |
31 | 2352 |
1598 | 2353 // Walk through the storage rosternotes tags |
2354 for (x = rosternotes->children ; x; x = x->next) { | |
2355 struct annotation *note; | |
2356 | |
2357 // We want a note item | |
2358 if (!x->name || strcmp(x->name, "note")) | |
2359 continue; | |
2360 // Just in case, check the jid... | |
2361 if (!lm_message_node_get_attribute(x, "jid")) | |
2362 continue; | |
2363 // Ok, let's add the note to our list | |
2364 note = parse_storage_rosternote(x); | |
2365 sl_notes = g_slist_append(sl_notes, note); | |
31 | 2366 } |
1598 | 2367 return sl_notes; |
31 | 2368 } |
2369 | |
1598 | 2370 // xmpp_get_storage_rosternotes(barejid, silent) |
2371 // Return the annotation associated with this jid. | |
2372 // If silent is TRUE, no warning is displayed when rosternotes is disabled | |
2373 // The caller should g_free the string and structure after use. | |
2374 struct annotation *xmpp_get_storage_rosternotes(const char *barejid, int silent) | |
2375 { | |
2376 LmMessageNode *x; | |
2377 | |
2378 if (!barejid) | |
2379 return NULL; | |
2380 | |
2381 // If we have no rosternotes, probably the server doesn't support them. | |
2382 if (!rosternotes) { | |
2383 if (!silent) | |
2384 scr_LogPrint(LPRINT_NORMAL, "Sorry, " | |
2385 "your server doesn't seem to support private storage."); | |
2386 return NULL; | |
2387 } | |
2388 | |
2389 // Walk through the storage rosternotes tags | |
2390 for (x = rosternotes->children ; x; x = x->next) { | |
2391 const char *fjid; | |
2392 // We want a note item | |
2393 if (!x->name || strcmp(x->name, "note")) | |
2394 continue; | |
2395 // Just in case, check the jid... | |
2396 fjid = lm_message_node_get_attribute(x, "jid"); | |
2397 if (fjid && !strcmp(fjid, barejid)) // We've found a note for this contact. | |
2398 return parse_storage_rosternote(x); | |
2399 } | |
2400 return NULL; // No note found | |
2401 } | |
2402 | |
2403 // xmpp_set_storage_rosternotes(barejid, note) | |
2404 // Update the private storage rosternotes: add/delete a note. | |
2405 // If note is nil, we remove the existing note. | |
2406 void xmpp_set_storage_rosternotes(const char *barejid, const char *note) | |
2407 { | |
2408 LmMessageNode *x; | |
2409 bool changed = FALSE; | |
2410 const char *cdate = NULL; | |
2411 | |
2412 if (!barejid) | |
2413 return; | |
2414 | |
2415 // If we have no rosternotes, probably the server doesn't support them. | |
2416 if (!rosternotes) { | |
2417 scr_LogPrint(LPRINT_NORMAL, | |
2418 "Sorry, your server doesn't seem to support private storage."); | |
2419 return; | |
2420 } | |
2421 | |
2422 // Walk through the storage tags | |
2423 for (x = rosternotes->children ; x; x = x->next) { | |
2424 // If the current node is a conference item, see if we have to replace it. | |
2425 if (x->name && !strcmp(x->name, "note")) { | |
2426 const char *fjid = lm_message_node_get_attribute(x, "jid"); | |
2427 if (!fjid) | |
2428 continue; | |
2429 if (!strcmp(fjid, barejid)) { | |
2430 // We've found a note for this jid. Let's hide it and we'll | |
2431 // create a new one. | |
2432 cdate = lm_message_node_get_attribute(x, "cdate"); | |
2433 lm_message_node_hide(x); | |
2434 changed = TRUE; | |
2435 break; | |
2436 } | |
2437 } | |
2438 } | |
2439 | |
2440 // Let's create a node for this jid, if the note is not NULL. | |
2441 if (note) { | |
2442 char mdate[20]; | |
2443 time_t now; | |
2444 time(&now); | |
2445 to_iso8601(mdate, now); | |
2446 if (!cdate) | |
2447 cdate = mdate; | |
2448 x = lm_message_node_add_child(rosternotes, "note", note); | |
2449 lm_message_node_set_attributes(x, | |
2450 "jid", barejid, | |
2451 "cdate", cdate, | |
2452 "mdate", mdate, | |
2453 NULL); | |
2454 changed = TRUE; | |
2455 } | |
2456 | |
2457 if (!changed) | |
2458 return; | |
2459 | |
1684
95df4ea512c8
Provide xmpp_is_online()
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1683
diff
changeset
|
2460 if (xmpp_is_online()) |
1598 | 2461 send_storage(rosternotes); |
2462 else | |
2463 scr_LogPrint(LPRINT_LOGNORM, | |
2464 "Warning: you're not connected to the server."); | |
2465 } | |
1599 | 2466 |
1811 | 2467 /* vim: set et cindent cinoptions=>2\:2(0 ts=2 sw=2: For Vim users... */ |