annotate mcabber/mcabber/xmpp.c @ 2135:361603828d9e

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