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