annotate mcabber/src/xmpp.c @ 1610:6db9f403f707

Replace 'username' with 'jid' in the configuration file The previous behaviour doesn't make much sense anymore. MCabber does DNS SRV lookups so providing the server name is usually not needed.
author Mikael Berthe <mikael@lilotux.net>
date Sun, 11 Oct 2009 20:06:47 +0200
parents 351427ef0b4b
children f9bf561e54d0
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 *
1599
dcd5d4c75199 Update/Add headers
Mikael Berthe <mikael@lilotux.net>
parents: 1598
diff changeset
4 * Copyright (C) 2008-2009 Frank Zschockelt <mcabber@freakysoft.de>
dcd5d4c75199 Update/Add headers
Mikael Berthe <mikael@lilotux.net>
parents: 1598
diff changeset
5 * Copyright (C) 2005-2009 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"
86837ff0554c [/trunk] Changeset 45 by mikael
mikael
parents:
diff changeset
42
1001
dff25377c11f Auto-reconnect after a network/server failure
Mikael Berthe <mikael@lilotux.net>
parents: 999
diff changeset
43 #define RECONNECTION_TIMEOUT 60L
dff25377c11f Auto-reconnect after a network/server failure
Mikael Berthe <mikael@lilotux.net>
parents: 999
diff changeset
44
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
45 LmConnection* lconnection;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
46 static guint AutoConnection;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
47
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
48 inline void update_last_use(void);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
49 inline gboolean xmpp_reconnect();
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
50
1604
351427ef0b4b Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents: 1602
diff changeset
51 enum imstatus mystatus = offline;
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
52 static enum imstatus mywantedstatus = available;
1604
351427ef0b4b Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents: 1602
diff changeset
53 gchar *mystatusmsg;
29
86837ff0554c [/trunk] Changeset 45 by mikael
mikael
parents:
diff changeset
54
353
3fe43f6daa5a Make imstatus2char a null-terminated string
Mikael Berthe <mikael@lilotux.net>
parents: 325
diff changeset
55 char imstatus2char[imstatus_size+1] = {
1311
0dda8238af21 Implement "/roster display"
Mikael Berthe <mikael@lilotux.net>
parents: 1310
diff changeset
56 '_', 'o', 'f', 'd', 'n', 'a', 'i', '\0'
46
f22e1d120606 [/trunk] Changeset 62 by mikael
mikael
parents: 43
diff changeset
57 };
f22e1d120606 [/trunk] Changeset 62 by mikael
mikael
parents: 43
diff changeset
58
1604
351427ef0b4b Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents: 1602
diff changeset
59 char *imstatus_showmap[] = {
1378
61fc9eddf763 Small code cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 1377
diff changeset
60 "",
61fc9eddf763 Small code cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 1377
diff changeset
61 "",
61fc9eddf763 Small code cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 1377
diff changeset
62 "chat",
61fc9eddf763 Small code cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 1377
diff changeset
63 "dnd",
61fc9eddf763 Small code cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 1377
diff changeset
64 "xa",
61fc9eddf763 Small code cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 1377
diff changeset
65 "away",
61fc9eddf763 Small code cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 1377
diff changeset
66 ""
61fc9eddf763 Small code cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 1377
diff changeset
67 };
61fc9eddf763 Small code cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 1377
diff changeset
68
1604
351427ef0b4b Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents: 1602
diff changeset
69 LmMessageNode *bookmarks = NULL;
351427ef0b4b Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents: 1602
diff changeset
70 LmMessageNode *rosternotes = NULL;
29
86837ff0554c [/trunk] Changeset 45 by mikael
mikael
parents:
diff changeset
71
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
72 static struct IqHandlers
116
1e7e59775f12 [/trunk] Changeset 130 by mikael
mikael
parents: 114
diff changeset
73 {
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
74 const gchar *xmlns;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
75 LmHandleMessageFunction handler;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
76 } iq_handlers[] = {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
77 {NS_PING, &handle_iq_ping},
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
78 {NS_VERSION, &handle_iq_version},
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
79 {NS_TIME, &handle_iq_time},
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
80 {NS_ROSTER, &handle_iq_roster},
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
81 {NS_XMPP_TIME, &handle_iq_time202},
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
82 {NS_LAST, &handle_iq_last},
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
83 {NS_DISCO_INFO, &handle_iq_disco_info},
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
84 {NS_DISCO_ITEMS,&handle_iq_disco_items},
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
85 {NS_COMMANDS, &handle_iq_commands},
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
86 {NULL, NULL}
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
87 };
519
5c338d31de56 Show current global status message in "/status"
Mikael Berthe <mikael@lilotux.net>
parents: 513
diff changeset
88
1558
3df441efb7c2 Fix gcc warnings related to inline/static uses
Mikael Berthe <mikael@lilotux.net>
parents: 1546
diff changeset
89 void update_last_use(void)
1254
401639413340 More jabber:iq:last support... (misc)
Mikael Berthe <mikael@lilotux.net>
parents: 1244
diff changeset
90 {
401639413340 More jabber:iq:last support... (misc)
Mikael Berthe <mikael@lilotux.net>
parents: 1244
diff changeset
91 iqlast = time(NULL);
401639413340 More jabber:iq:last support... (misc)
Mikael Berthe <mikael@lilotux.net>
parents: 1244
diff changeset
92 }
401639413340 More jabber:iq:last support... (misc)
Mikael Berthe <mikael@lilotux.net>
parents: 1244
diff changeset
93
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
94 // Note: the caller should check the jid is correct
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
95 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
96 {
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
97 LmMessageNode *query, *y;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
98 LmMessage *iq;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
99 char *cleanjid;
1255
ceada40bbe20 Update Entity Capabilities (add iq:last)
Mikael Berthe <mikael@lilotux.net>
parents: 1254
diff changeset
100
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
101 if (!lm_connection_is_authenticated(lconnection)) return;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
102
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
103 cleanjid = jidtodisp(bjid); // Stripping resource, just in case...
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
104
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
105 // We don't check if the jabber user already exists in the roster,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
106 // because it allows to re-ask for notification.
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 iq = lm_message_new_with_sub_type(NULL, LM_MESSAGE_TYPE_IQ,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
109 LM_MESSAGE_SUB_TYPE_SET);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
110 query = lm_message_node_add_child(iq->node, "query", NULL);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
111 lm_message_node_set_attribute(query, "xmlns", NS_ROSTER);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
112 y = lm_message_node_add_child(query, "item", NULL);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
113 lm_message_node_set_attribute(y, "jid", cleanjid);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
114
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
115 if (name)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
116 lm_message_node_set_attribute(y, "name", name);
1215
80c095886fb5 Entity Capabilities support (XEP-0115)
Mikael Berthe <mikael@lilotux.net>
parents: 1213
diff changeset
117
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
118 if (group)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
119 lm_message_node_add_child(y, "group", group);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
120
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
121 lm_connection_send(lconnection, iq, NULL);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
122 lm_message_unref(iq);
532
2ac8d8e49e81 Send status changes to chatrooms
Mikael Berthe <mikael@lilotux.net>
parents: 531
diff changeset
123
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
124 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
125
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
126 roster_add_user(cleanjid, name, group, ROSTER_TYPE_USER, sub_pending, -1);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
127 g_free(cleanjid);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
128 buddylist_build();
532
2ac8d8e49e81 Send status changes to chatrooms
Mikael Berthe <mikael@lilotux.net>
parents: 531
diff changeset
129
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
130 update_roster = TRUE;
532
2ac8d8e49e81 Send status changes to chatrooms
Mikael Berthe <mikael@lilotux.net>
parents: 531
diff changeset
131 }
2ac8d8e49e81 Send status changes to chatrooms
Mikael Berthe <mikael@lilotux.net>
parents: 531
diff changeset
132
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
133 void xmpp_updatebuddy(const char *bjid, const char *name, const char *group)
29
86837ff0554c [/trunk] Changeset 45 by mikael
mikael
parents:
diff changeset
134 {
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
135 LmMessage *iq;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
136 LmMessageNode *x;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
137 char *cleanjid;
29
86837ff0554c [/trunk] Changeset 45 by mikael
mikael
parents:
diff changeset
138
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
139 if (!lm_connection_is_authenticated(lconnection)) return;
444
5927c3bfba13 Add /status_to command
Mikael Berthe <mikael@lilotux.net>
parents: 441
diff changeset
140
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
141 // XXX We should check name's and group's correctness
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
142
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
143 cleanjid = jidtodisp(bjid); // Stripping resource, just in case...
29
86837ff0554c [/trunk] Changeset 45 by mikael
mikael
parents:
diff changeset
144
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
145 iq = lm_message_new_with_sub_type(NULL, LM_MESSAGE_TYPE_IQ,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
146 LM_MESSAGE_SUB_TYPE_SET);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
147 x = lm_message_node_add_child(iq->node, "query", NULL);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
148 lm_message_node_set_attribute(x, "xmlns", NS_ROSTER);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
149 x = lm_message_node_add_child(x, "item", NULL);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
150 lm_message_node_set_attributes(x,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
151 "jid", cleanjid,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
152 "name", name,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
153 NULL);
29
86837ff0554c [/trunk] Changeset 45 by mikael
mikael
parents:
diff changeset
154
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
155 if (group)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
156 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
157
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
158 lm_connection_send(lconnection, iq, NULL);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
159 lm_message_unref(iq);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
160 g_free(cleanjid);
534
3569d38f7bbb Add presnew()
Mikael Berthe <mikael@lilotux.net>
parents: 533
diff changeset
161 }
3569d38f7bbb Add presnew()
Mikael Berthe <mikael@lilotux.net>
parents: 533
diff changeset
162
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
163 void xmpp_delbuddy(const char *bjid)
534
3569d38f7bbb Add presnew()
Mikael Berthe <mikael@lilotux.net>
parents: 533
diff changeset
164 {
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
165 LmMessageNode *y, *z;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
166 LmMessage *iq;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
167 char *cleanjid;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
168
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
169 if (!lm_connection_is_authenticated(lconnection)) return;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
170
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
171 cleanjid = jidtodisp(bjid); // Stripping resource, just in case...
534
3569d38f7bbb Add presnew()
Mikael Berthe <mikael@lilotux.net>
parents: 533
diff changeset
172
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
173 // If the current buddy is an agent, unsubscribe from it
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
174 if (roster_gettype(cleanjid) == ROSTER_TYPE_AGENT) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
175 scr_LogPrint(LPRINT_LOGNORM, "Unregistering from the %s agent", cleanjid);
29
86837ff0554c [/trunk] Changeset 45 by mikael
mikael
parents:
diff changeset
176
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
177 iq = lm_message_new_with_sub_type(cleanjid, LM_MESSAGE_TYPE_IQ,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
178 LM_MESSAGE_SUB_TYPE_SET);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
179 y = lm_message_node_add_child(iq->node, "query", NULL);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
180 lm_message_node_set_attribute(y, "xmlns", NS_REGISTER);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
181 lm_message_node_add_child(y, "remove", NULL);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
182 lm_connection_send(lconnection, iq, NULL);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
183 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
184 }
29
86837ff0554c [/trunk] Changeset 45 by mikael
mikael
parents:
diff changeset
185
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
186 // Cancel the subscriptions
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
187 xmpp_send_s10n(cleanjid, LM_MESSAGE_SUB_TYPE_UNSUBSCRIBED); //cancel "from"
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
188 xmpp_send_s10n(cleanjid, LM_MESSAGE_SUB_TYPE_UNSUBSCRIBE); //cancel "to"
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
189
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
190 // Ask for removal from roster
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
191 iq = lm_message_new_with_sub_type(NULL, LM_MESSAGE_TYPE_IQ,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
192 LM_MESSAGE_SUB_TYPE_SET);
444
5927c3bfba13 Add /status_to command
Mikael Berthe <mikael@lilotux.net>
parents: 441
diff changeset
193
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
194 y = lm_message_node_add_child(iq->node, "query", NULL);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
195 lm_message_node_set_attribute(y, "xmlns", NS_ROSTER);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
196 z = lm_message_node_add_child(y, "item", NULL);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
197 lm_message_node_set_attributes(z,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
198 "jid", cleanjid,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
199 "subscription", "remove",
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
200 NULL);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
201 lm_connection_send(lconnection, iq, NULL);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
202 lm_message_unref(iq);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
203
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
204 roster_del_user(cleanjid);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
205 g_free(cleanjid);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
206 buddylist_build();
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
207
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
208 update_roster = TRUE;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
209 }
1365
c7e709719c43 Small code cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 1363
diff changeset
210
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
211 void xmpp_request(const char *fjid, enum iqreq_type reqtype)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
212 {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
213 GSList *resources, *p_res;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
214 GSList *roster_elt;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
215 const char *strreqtype, *xmlns;
1365
c7e709719c43 Small code cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 1363
diff changeset
216
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
217 if (reqtype == iqreq_version) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
218 xmlns = NS_VERSION;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
219 strreqtype = "version";
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
220 } else if (reqtype == iqreq_time) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
221 xmlns = NS_TIME;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
222 strreqtype = "time";
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
223 } else if (reqtype == iqreq_last) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
224 xmlns = NS_LAST;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
225 strreqtype = "last";
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
226 } else if (reqtype == iqreq_vcard) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
227 xmlns = NS_VCARD;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
228 strreqtype = "vCard";
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
229 // Special case
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
230 } else
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
231 return;
1365
c7e709719c43 Small code cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 1363
diff changeset
232
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
233 if (strchr(fjid, JID_RESOURCE_SEPARATOR)) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
234 // This is a full JID
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
235 xmpp_iq_request(fjid, xmlns);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
236 scr_LogPrint(LPRINT_NORMAL, "Sent %s request to <%s>", strreqtype, fjid);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
237 return;
521
cc8c969ab6e5 "/status" changes
Mikael Berthe <mikael@lilotux.net>
parents: 519
diff changeset
238 }
713
b5aa7b7afee8 Update status lines
Mikael Berthe <mikael@lilotux.net>
parents: 706
diff changeset
239
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
240 // The resource has not been specified
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
241 roster_elt = roster_find(fjid, jidsearch, ROSTER_TYPE_USER|ROSTER_TYPE_ROOM);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
242 if (!roster_elt) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
243 scr_LogPrint(LPRINT_NORMAL, "No known resource for <%s>...", fjid);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
244 xmpp_iq_request(fjid, xmlns); // Let's send a request anyway...
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
245 scr_LogPrint(LPRINT_NORMAL, "Sent %s request to <%s>", strreqtype, fjid);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
246 return;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
247 }
1254
401639413340 More jabber:iq:last support... (misc)
Mikael Berthe <mikael@lilotux.net>
parents: 1244
diff changeset
248
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
249 // Send a request to each resource
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
250 resources = buddy_getresources(roster_elt->data);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
251 if (!resources) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
252 scr_LogPrint(LPRINT_NORMAL, "No known resource for <%s>...", fjid);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
253 xmpp_iq_request(fjid, xmlns); // Let's send a request anyway...
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
254 scr_LogPrint(LPRINT_NORMAL, "Sent %s request to <%s>", strreqtype, fjid);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
255 }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
256 for (p_res = resources ; p_res ; p_res = g_slist_next(p_res)) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
257 gchar *fulljid;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
258 fulljid = g_strdup_printf("%s/%s", fjid, (char*)p_res->data);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
259 xmpp_iq_request(fulljid, xmlns);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
260 scr_LogPrint(LPRINT_NORMAL, "Sent %s request to <%s>", strreqtype, fulljid);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
261 g_free(fulljid);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
262 g_free(p_res->data);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
263 }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
264 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
265 }
99c5278bf6b8 Keep the status and status messages when we're disconnected
Mikael Berthe <mikael@lilotux.net>
parents: 1013
diff changeset
266
1602
f4a2c6f767d1 Message Receipts support (XEP-0184)
franky
parents: 1600
diff changeset
267 static LmHandlerResult cb_xep184(LmMessageHandler *h, LmConnection *c,
f4a2c6f767d1 Message Receipts support (XEP-0184)
franky
parents: 1600
diff changeset
268 LmMessage *m, gpointer user_data)
f4a2c6f767d1 Message Receipts support (XEP-0184)
franky
parents: 1600
diff changeset
269 {
f4a2c6f767d1 Message Receipts support (XEP-0184)
franky
parents: 1600
diff changeset
270 char *from = jidtodisp(lm_message_get_from(m));
f4a2c6f767d1 Message Receipts support (XEP-0184)
franky
parents: 1600
diff changeset
271 scr_RemoveReceiptFlag(from, h);
f4a2c6f767d1 Message Receipts support (XEP-0184)
franky
parents: 1600
diff changeset
272 g_free(from);
f4a2c6f767d1 Message Receipts support (XEP-0184)
franky
parents: 1600
diff changeset
273 return LM_HANDLER_RESULT_REMOVE_MESSAGE;
f4a2c6f767d1 Message Receipts support (XEP-0184)
franky
parents: 1600
diff changeset
274 }
f4a2c6f767d1 Message Receipts support (XEP-0184)
franky
parents: 1600
diff changeset
275
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
276 // xmpp_send_msg(jid, text, type, subject,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
277 // otrinject, *encrypted, type_overwrite)
1197
6f602d3270a4 Add /pgp [-]force
Mikael Berthe <mikael@lilotux.net>
parents: 1194
diff changeset
278 // 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
279 // message has been PGP-encrypted. If encryption enforcement is set and
6f602d3270a4 Add /pgp [-]force
Mikael Berthe <mikael@lilotux.net>
parents: 1194
diff changeset
280 // encryption fails, *encrypted is set to -1.
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
281 void xmpp_send_msg(const char *fjid, const char *text, int type,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
282 const char *subject, gboolean otrinject, gint *encrypted,
1602
f4a2c6f767d1 Message Receipts support (XEP-0184)
franky
parents: 1600
diff changeset
283 LmMessageSubType type_overwrite, gpointer *xep184)
35
a8ceaa3005fd [/trunk] Changeset 51 by mikael
mikael
parents: 33
diff changeset
284 {
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
285 LmMessage *x;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
286 LmMessageSubType subtype;
1304
8ada97e5eb75 Fix a gcc warning
Mikael Berthe <mikael@lilotux.net>
parents: 1299
diff changeset
287 #ifdef HAVE_LIBOTR
1299
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents: 1290
diff changeset
288 int otr_msg = 0;
1304
8ada97e5eb75 Fix a gcc warning
Mikael Berthe <mikael@lilotux.net>
parents: 1299
diff changeset
289 #endif
1044
52cfe9bf9840 Encryption support for outgoing messages
Mikael Berthe <mikael@lilotux.net>
parents: 1043
diff changeset
290 #if defined HAVE_GPGME || defined JEP0022 || defined JEP0085
52cfe9bf9840 Encryption support for outgoing messages
Mikael Berthe <mikael@lilotux.net>
parents: 1043
diff changeset
291 char *rname, *barejid;
52cfe9bf9840 Encryption support for outgoing messages
Mikael Berthe <mikael@lilotux.net>
parents: 1043
diff changeset
292 GSList *sl_buddy;
52cfe9bf9840 Encryption support for outgoing messages
Mikael Berthe <mikael@lilotux.net>
parents: 1043
diff changeset
293 #endif
987
f47e312560af Improve JEP22 + JEP85 support
Mikael Berthe <mikael@lilotux.net>
parents: 986
diff changeset
294 #if defined JEP0022 || defined JEP0085
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
295 LmMessageNode *event;
997
d0d0cd9e39c4 Cosmetics & comments
Mikael Berthe <mikael@lilotux.net>
parents: 993
diff changeset
296 guint use_jep85 = 0;
987
f47e312560af Improve JEP22 + JEP85 support
Mikael Berthe <mikael@lilotux.net>
parents: 986
diff changeset
297 struct jep0085 *jep85 = NULL;
f47e312560af Improve JEP22 + JEP85 support
Mikael Berthe <mikael@lilotux.net>
parents: 986
diff changeset
298 #endif
1044
52cfe9bf9840 Encryption support for outgoing messages
Mikael Berthe <mikael@lilotux.net>
parents: 1043
diff changeset
299 gchar *enc = NULL;
447
03bb57383cea Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents: 444
diff changeset
300
1055
6eb1efea75d0 PGP: Visual encryption flag
Mikael Berthe <mikael@lilotux.net>
parents: 1053
diff changeset
301 if (encrypted)
1197
6f602d3270a4 Add /pgp [-]force
Mikael Berthe <mikael@lilotux.net>
parents: 1194
diff changeset
302 *encrypted = 0;
1055
6eb1efea75d0 PGP: Visual encryption flag
Mikael Berthe <mikael@lilotux.net>
parents: 1053
diff changeset
303
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
304 if (!lm_connection_is_authenticated(lconnection))
1435
9bf7f3ddff10 Do not send a groupchat-style message when changing a MUC room topic
Mikael Berthe <mikael@lilotux.net>
parents: 1426
diff changeset
305 return;
9bf7f3ddff10 Do not send a groupchat-style message when changing a MUC room topic
Mikael Berthe <mikael@lilotux.net>
parents: 1426
diff changeset
306
9bf7f3ddff10 Do not send a groupchat-style message when changing a MUC room topic
Mikael Berthe <mikael@lilotux.net>
parents: 1426
diff changeset
307 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
308 return;
472
75442262c082 Disable some commands when not connected
Mikael Berthe <mikael@lilotux.net>
parents: 470
diff changeset
309
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
310 if (type_overwrite != LM_MESSAGE_SUB_TYPE_NOT_SET)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
311 subtype = type_overwrite;
1305
9bc68473f8a3 -n and -f flags to message-sending commands
Michal 'vorner' Vaner <vorner@ucw.cz>
parents: 1304
diff changeset
312 else {
9bc68473f8a3 -n and -f flags to message-sending commands
Michal 'vorner' Vaner <vorner@ucw.cz>
parents: 1304
diff changeset
313 if (type == ROSTER_TYPE_ROOM)
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
314 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
315 else
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
316 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
317 }
447
03bb57383cea Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents: 444
diff changeset
318
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
319 #if defined HAVE_GPGME || defined HAVE_LIBOTR || \
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
320 defined JEP0022 || defined JEP0085
1058
c0d44a9a99bc Code cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 1055
diff changeset
321 rname = strchr(fjid, JID_RESOURCE_SEPARATOR);
c0d44a9a99bc Code cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 1055
diff changeset
322 barejid = jidtodisp(fjid);
987
f47e312560af Improve JEP22 + JEP85 support
Mikael Berthe <mikael@lilotux.net>
parents: 986
diff changeset
323 sl_buddy = roster_find(barejid, jidsearch, ROSTER_TYPE_USER);
f47e312560af Improve JEP22 + JEP85 support
Mikael Berthe <mikael@lilotux.net>
parents: 986
diff changeset
324
f47e312560af Improve JEP22 + JEP85 support
Mikael Berthe <mikael@lilotux.net>
parents: 986
diff changeset
325 // 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
326 // which hopefully will give us the most likely resource.
f47e312560af Improve JEP22 + JEP85 support
Mikael Berthe <mikael@lilotux.net>
parents: 986
diff changeset
327 if (rname)
f47e312560af Improve JEP22 + JEP85 support
Mikael Berthe <mikael@lilotux.net>
parents: 986
diff changeset
328 rname++;
1044
52cfe9bf9840 Encryption support for outgoing messages
Mikael Berthe <mikael@lilotux.net>
parents: 1043
diff changeset
329
1299
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents: 1290
diff changeset
330 #ifdef HAVE_LIBOTR
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
331 if (otr_enabled() && !otrinject) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
332 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
333 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
334 if (!text) {
07816313073b Add an option 'otr' to enable OTR support in the configuration file
Mikael Berthe <mikael@lilotux.net>
parents: 1344
diff changeset
335 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
336 if (encrypted)
07816313073b Add an option 'otr' to enable OTR support in the configuration file
Mikael Berthe <mikael@lilotux.net>
parents: 1344
diff changeset
337 *encrypted = -1;
07816313073b Add an option 'otr' to enable OTR support in the configuration file
Mikael Berthe <mikael@lilotux.net>
parents: 1344
diff changeset
338 return;
07816313073b Add an option 'otr' to enable OTR support in the configuration file
Mikael Berthe <mikael@lilotux.net>
parents: 1344
diff changeset
339 }
1299
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents: 1290
diff changeset
340 }
1484
7b36b91a4388 New UI message flag (O) when OTR is used
Mikael Berthe <mikael@lilotux.net>
parents: 1476
diff changeset
341 if (otr_msg && encrypted)
7b36b91a4388 New UI message flag (O) when OTR is used
Mikael Berthe <mikael@lilotux.net>
parents: 1476
diff changeset
342 *encrypted = ENCRYPTED_OTR;
1299
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents: 1290
diff changeset
343 }
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents: 1290
diff changeset
344 #endif
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents: 1290
diff changeset
345
1044
52cfe9bf9840 Encryption support for outgoing messages
Mikael Berthe <mikael@lilotux.net>
parents: 1043
diff changeset
346 #ifdef HAVE_GPGME
52cfe9bf9840 Encryption support for outgoing messages
Mikael Berthe <mikael@lilotux.net>
parents: 1043
diff changeset
347 if (type == ROSTER_TYPE_USER && sl_buddy && gpg_enabled()) {
1197
6f602d3270a4 Add /pgp [-]force
Mikael Berthe <mikael@lilotux.net>
parents: 1194
diff changeset
348 if (!settings_pgp_getdisabled(barejid)) { // not disabled for this contact?
6f602d3270a4 Add /pgp [-]force
Mikael Berthe <mikael@lilotux.net>
parents: 1194
diff changeset
349 guint force;
1065
230dca34dbea Extand pgp_data structure
Mikael Berthe <mikael@lilotux.net>
parents: 1058
diff changeset
350 struct pgp_data *res_pgpdata;
1197
6f602d3270a4 Add /pgp [-]force
Mikael Berthe <mikael@lilotux.net>
parents: 1194
diff changeset
351 force = settings_pgp_getforce(barejid);
1065
230dca34dbea Extand pgp_data structure
Mikael Berthe <mikael@lilotux.net>
parents: 1058
diff changeset
352 res_pgpdata = buddy_resource_pgp(sl_buddy->data, rname);
1197
6f602d3270a4 Add /pgp [-]force
Mikael Berthe <mikael@lilotux.net>
parents: 1194
diff changeset
353 if (force || (res_pgpdata && res_pgpdata->sign_keyid)) {
6f602d3270a4 Add /pgp [-]force
Mikael Berthe <mikael@lilotux.net>
parents: 1194
diff changeset
354 /* Remote client has PGP support (we have a signature)
6f602d3270a4 Add /pgp [-]force
Mikael Berthe <mikael@lilotux.net>
parents: 1194
diff changeset
355 * 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
356 * 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
357 * 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
358 * 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
359 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
360 key = settings_pgp_getkeyid(barejid);
1197
6f602d3270a4 Add /pgp [-]force
Mikael Berthe <mikael@lilotux.net>
parents: 1194
diff changeset
361 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
362 key = res_pgpdata->sign_keyid;
1197
6f602d3270a4 Add /pgp [-]force
Mikael Berthe <mikael@lilotux.net>
parents: 1194
diff changeset
363 if (key)
6f602d3270a4 Add /pgp [-]force
Mikael Berthe <mikael@lilotux.net>
parents: 1194
diff changeset
364 enc = gpg_encrypt(text, key);
6f602d3270a4 Add /pgp [-]force
Mikael Berthe <mikael@lilotux.net>
parents: 1194
diff changeset
365 if (!enc && force) {
6f602d3270a4 Add /pgp [-]force
Mikael Berthe <mikael@lilotux.net>
parents: 1194
diff changeset
366 if (encrypted)
6f602d3270a4 Add /pgp [-]force
Mikael Berthe <mikael@lilotux.net>
parents: 1194
diff changeset
367 *encrypted = -1;
6f602d3270a4 Add /pgp [-]force
Mikael Berthe <mikael@lilotux.net>
parents: 1194
diff changeset
368 g_free(barejid);
6f602d3270a4 Add /pgp [-]force
Mikael Berthe <mikael@lilotux.net>
parents: 1194
diff changeset
369 return;
6f602d3270a4 Add /pgp [-]force
Mikael Berthe <mikael@lilotux.net>
parents: 1194
diff changeset
370 }
1067
a5dc85fdebde Add key comparison for signatures & use user-provided PGP keys for encryption
Mikael Berthe <mikael@lilotux.net>
parents: 1065
diff changeset
371 }
1065
230dca34dbea Extand pgp_data structure
Mikael Berthe <mikael@lilotux.net>
parents: 1058
diff changeset
372 }
1044
52cfe9bf9840 Encryption support for outgoing messages
Mikael Berthe <mikael@lilotux.net>
parents: 1043
diff changeset
373 }
1067
a5dc85fdebde Add key comparison for signatures & use user-provided PGP keys for encryption
Mikael Berthe <mikael@lilotux.net>
parents: 1065
diff changeset
374 #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
375
1065
230dca34dbea Extand pgp_data structure
Mikael Berthe <mikael@lilotux.net>
parents: 1058
diff changeset
376 g_free(barejid);
1067
a5dc85fdebde Add key comparison for signatures & use user-provided PGP keys for encryption
Mikael Berthe <mikael@lilotux.net>
parents: 1065
diff changeset
377 #endif // HAVE_GPGME || defined JEP0022 || defined JEP0085
1044
52cfe9bf9840 Encryption support for outgoing messages
Mikael Berthe <mikael@lilotux.net>
parents: 1043
diff changeset
378
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
379 x = lm_message_new_with_sub_type(fjid, LM_MESSAGE_TYPE_MESSAGE, subtype);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
380 lm_message_node_add_child(x->node, "body",
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
381 enc ? "This message is PGP-encrypted." : text);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
382
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
383 if (subject)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
384 lm_message_node_add_child(x->node, "subject", subject);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
385
1044
52cfe9bf9840 Encryption support for outgoing messages
Mikael Berthe <mikael@lilotux.net>
parents: 1043
diff changeset
386 if (enc) {
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
387 LmMessageNode *y;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
388 y = lm_message_node_add_child(x->node, "x", enc);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
389 lm_message_node_set_attribute(y, "xmlns", NS_ENCRYPTED);
1055
6eb1efea75d0 PGP: Visual encryption flag
Mikael Berthe <mikael@lilotux.net>
parents: 1053
diff changeset
390 if (encrypted)
1484
7b36b91a4388 New UI message flag (O) when OTR is used
Mikael Berthe <mikael@lilotux.net>
parents: 1476
diff changeset
391 *encrypted = ENCRYPTED_PGP;
1044
52cfe9bf9840 Encryption support for outgoing messages
Mikael Berthe <mikael@lilotux.net>
parents: 1043
diff changeset
392 g_free(enc);
52cfe9bf9840 Encryption support for outgoing messages
Mikael Berthe <mikael@lilotux.net>
parents: 1043
diff changeset
393 }
52cfe9bf9840 Encryption support for outgoing messages
Mikael Berthe <mikael@lilotux.net>
parents: 1043
diff changeset
394
1602
f4a2c6f767d1 Message Receipts support (XEP-0184)
franky
parents: 1600
diff changeset
395 //XEP-0184: Message Receipts
f4a2c6f767d1 Message Receipts support (XEP-0184)
franky
parents: 1600
diff changeset
396 if (sl_buddy && rname && xep184 &&
f4a2c6f767d1 Message Receipts support (XEP-0184)
franky
parents: 1600
diff changeset
397 caps_has_feature(buddy_resource_getcaps(sl_buddy->data, rname),
f4a2c6f767d1 Message Receipts support (XEP-0184)
franky
parents: 1600
diff changeset
398 NS_RECEIPTS)) {
f4a2c6f767d1 Message Receipts support (XEP-0184)
franky
parents: 1600
diff changeset
399 lm_message_node_set_attribute
f4a2c6f767d1 Message Receipts support (XEP-0184)
franky
parents: 1600
diff changeset
400 (lm_message_node_add_child(x->node, "request", NULL),
f4a2c6f767d1 Message Receipts support (XEP-0184)
franky
parents: 1600
diff changeset
401 "xmlns", NS_RECEIPTS);
f4a2c6f767d1 Message Receipts support (XEP-0184)
franky
parents: 1600
diff changeset
402 *xep184 = lm_message_handler_new(cb_xep184, NULL, NULL);
f4a2c6f767d1 Message Receipts support (XEP-0184)
franky
parents: 1600
diff changeset
403 }
f4a2c6f767d1 Message Receipts support (XEP-0184)
franky
parents: 1600
diff changeset
404
1044
52cfe9bf9840 Encryption support for outgoing messages
Mikael Berthe <mikael@lilotux.net>
parents: 1043
diff changeset
405 #if defined JEP0022 || defined JEP0085
52cfe9bf9840 Encryption support for outgoing messages
Mikael Berthe <mikael@lilotux.net>
parents: 1043
diff changeset
406 // 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
407 if (chatstates_disabled || type == ROSTER_TYPE_ROOM)
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
408 goto xmpp_send_msg_no_chatstates;
1044
52cfe9bf9840 Encryption support for outgoing messages
Mikael Berthe <mikael@lilotux.net>
parents: 1043
diff changeset
409
987
f47e312560af Improve JEP22 + JEP85 support
Mikael Berthe <mikael@lilotux.net>
parents: 986
diff changeset
410 if (sl_buddy)
f47e312560af Improve JEP22 + JEP85 support
Mikael Berthe <mikael@lilotux.net>
parents: 986
diff changeset
411 jep85 = buddy_resource_jep85(sl_buddy->data, rname);
986
ed697234bd39 Chat states receival (Alexis Hildebrandt)
Mikael Berthe <mikael@lilotux.net>
parents: 977
diff changeset
412 #endif
ed697234bd39 Chat states receival (Alexis Hildebrandt)
Mikael Berthe <mikael@lilotux.net>
parents: 977
diff changeset
413
987
f47e312560af Improve JEP22 + JEP85 support
Mikael Berthe <mikael@lilotux.net>
parents: 986
diff changeset
414 #ifdef JEP0085
f47e312560af Improve JEP22 + JEP85 support
Mikael Berthe <mikael@lilotux.net>
parents: 986
diff changeset
415 /* JEP-0085 5.1
f47e312560af Improve JEP22 + JEP85 support
Mikael Berthe <mikael@lilotux.net>
parents: 986
diff changeset
416 * "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
417 * 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
418 * state notifications to the Contact."
1378
61fc9eddf763 Small code cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 1377
diff changeset
419 * 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
420 * and can become "ok".
f47e312560af Improve JEP22 + JEP85 support
Mikael Berthe <mikael@lilotux.net>
parents: 986
diff changeset
421 */
f47e312560af Improve JEP22 + JEP85 support
Mikael Berthe <mikael@lilotux.net>
parents: 986
diff changeset
422 if (jep85 && (jep85->support == CHATSTATES_SUPPORT_OK ||
f47e312560af Improve JEP22 + JEP85 support
Mikael Berthe <mikael@lilotux.net>
parents: 986
diff changeset
423 jep85->support == CHATSTATES_SUPPORT_UNKNOWN)) {
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
424 event = lm_message_node_add_child(x->node, "active", NULL);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
425 lm_message_node_set_attribute(event, "xmlns", NS_CHATSTATES);
987
f47e312560af Improve JEP22 + JEP85 support
Mikael Berthe <mikael@lilotux.net>
parents: 986
diff changeset
426 if (jep85->support == CHATSTATES_SUPPORT_UNKNOWN)
f47e312560af Improve JEP22 + JEP85 support
Mikael Berthe <mikael@lilotux.net>
parents: 986
diff changeset
427 jep85->support = CHATSTATES_SUPPORT_PROBED;
f47e312560af Improve JEP22 + JEP85 support
Mikael Berthe <mikael@lilotux.net>
parents: 986
diff changeset
428 else
997
d0d0cd9e39c4 Cosmetics & comments
Mikael Berthe <mikael@lilotux.net>
parents: 993
diff changeset
429 use_jep85 = 1;
990
35e7913affb7 Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents: 989
diff changeset
430 jep85->last_state_sent = ROSTER_EVENT_ACTIVE;
987
f47e312560af Improve JEP22 + JEP85 support
Mikael Berthe <mikael@lilotux.net>
parents: 986
diff changeset
431 }
f47e312560af Improve JEP22 + JEP85 support
Mikael Berthe <mikael@lilotux.net>
parents: 986
diff changeset
432 #endif
f47e312560af Improve JEP22 + JEP85 support
Mikael Berthe <mikael@lilotux.net>
parents: 986
diff changeset
433 #ifdef JEP0022
f47e312560af Improve JEP22 + JEP85 support
Mikael Berthe <mikael@lilotux.net>
parents: 986
diff changeset
434 /* JEP-22
f47e312560af Improve JEP22 + JEP85 support
Mikael Berthe <mikael@lilotux.net>
parents: 986
diff changeset
435 * If the Contact supports JEP-0085, we do not use JEP-0022.
f47e312560af Improve JEP22 + JEP85 support
Mikael Berthe <mikael@lilotux.net>
parents: 986
diff changeset
436 * If not, we try to fall back to JEP-0022.
f47e312560af Improve JEP22 + JEP85 support
Mikael Berthe <mikael@lilotux.net>
parents: 986
diff changeset
437 */
997
d0d0cd9e39c4 Cosmetics & comments
Mikael Berthe <mikael@lilotux.net>
parents: 993
diff changeset
438 if (!use_jep85) {
990
35e7913affb7 Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents: 989
diff changeset
439 struct jep0022 *jep22 = NULL;
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
440 event = lm_message_node_add_child(x->node, "x", NULL);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
441 lm_message_node_set_attribute(event, "xmlns", NS_EVENT);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
442 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
443
990
35e7913affb7 Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents: 989
diff changeset
444 if (sl_buddy)
35e7913affb7 Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents: 989
diff changeset
445 jep22 = buddy_resource_jep22(sl_buddy->data, rname);
35e7913affb7 Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents: 989
diff changeset
446 if (jep22)
35e7913affb7 Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents: 989
diff changeset
447 jep22->last_state_sent = ROSTER_EVENT_ACTIVE;
35e7913affb7 Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents: 989
diff changeset
448
988
6e2bfd1ffded Add ids to message stanzas if needed
Mikael Berthe <mikael@lilotux.net>
parents: 987
diff changeset
449 // An id is mandatory when using JEP-0022.
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
450 if (text || subject) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
451 const gchar *msgid = lm_message_get_id(x);
989
859ab76e5093 Send JEP-22 delivered messages
Mikael Berthe <mikael@lilotux.net>
parents: 988
diff changeset
452 // Let's update last_msgid_sent
859ab76e5093 Send JEP-22 delivered messages
Mikael Berthe <mikael@lilotux.net>
parents: 988
diff changeset
453 if (jep22) {
859ab76e5093 Send JEP-22 delivered messages
Mikael Berthe <mikael@lilotux.net>
parents: 988
diff changeset
454 g_free(jep22->last_msgid_sent);
859ab76e5093 Send JEP-22 delivered messages
Mikael Berthe <mikael@lilotux.net>
parents: 988
diff changeset
455 jep22->last_msgid_sent = g_strdup(msgid);
859ab76e5093 Send JEP-22 delivered messages
Mikael Berthe <mikael@lilotux.net>
parents: 988
diff changeset
456 }
988
6e2bfd1ffded Add ids to message stanzas if needed
Mikael Berthe <mikael@lilotux.net>
parents: 987
diff changeset
457 }
987
f47e312560af Improve JEP22 + JEP85 support
Mikael Berthe <mikael@lilotux.net>
parents: 986
diff changeset
458 }
f47e312560af Improve JEP22 + JEP85 support
Mikael Berthe <mikael@lilotux.net>
parents: 986
diff changeset
459 #endif
986
ed697234bd39 Chat states receival (Alexis Hildebrandt)
Mikael Berthe <mikael@lilotux.net>
parents: 977
diff changeset
460
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
461 xmpp_send_msg_no_chatstates:
1254
401639413340 More jabber:iq:last support... (misc)
Mikael Berthe <mikael@lilotux.net>
parents: 1244
diff changeset
462 if (mystatus != invisible)
401639413340 More jabber:iq:last support... (misc)
Mikael Berthe <mikael@lilotux.net>
parents: 1244
diff changeset
463 update_last_use();
1602
f4a2c6f767d1 Message Receipts support (XEP-0184)
franky
parents: 1600
diff changeset
464 if (xep184 && *xep184) {
f4a2c6f767d1 Message Receipts support (XEP-0184)
franky
parents: 1600
diff changeset
465 lm_connection_send_with_reply(lconnection, x, *xep184, NULL);
f4a2c6f767d1 Message Receipts support (XEP-0184)
franky
parents: 1600
diff changeset
466 lm_message_handler_unref(*xep184);
f4a2c6f767d1 Message Receipts support (XEP-0184)
franky
parents: 1600
diff changeset
467 } else
f4a2c6f767d1 Message Receipts support (XEP-0184)
franky
parents: 1600
diff changeset
468 lm_connection_send(lconnection, x, NULL);
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
469 lm_message_unref(x);
35
a8ceaa3005fd [/trunk] Changeset 51 by mikael
mikael
parents: 33
diff changeset
470 }
a8ceaa3005fd [/trunk] Changeset 51 by mikael
mikael
parents: 33
diff changeset
471
990
35e7913affb7 Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents: 989
diff changeset
472 #ifdef JEP0085
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
473 // xmpp_send_jep85_chatstate()
990
35e7913affb7 Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents: 989
diff changeset
474 // Send a JEP-85 chatstate.
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
475 static void xmpp_send_jep85_chatstate(const char *bjid, const char *resname,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
476 guint state)
990
35e7913affb7 Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents: 989
diff changeset
477 {
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
478 LmMessage *m;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
479 LmMessageNode *event;
990
35e7913affb7 Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents: 989
diff changeset
480 GSList *sl_buddy;
35e7913affb7 Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents: 989
diff changeset
481 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
482 char *rjid, *fjid = NULL;
990
35e7913affb7 Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents: 989
diff changeset
483 struct jep0085 *jep85 = NULL;
35e7913affb7 Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents: 989
diff changeset
484
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
485 if (!lm_connection_is_authenticated(lconnection)) return;
990
35e7913affb7 Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents: 989
diff changeset
486
1091
10f9d6fcfeab JEP85: Reset composing/paused state when a resource with higher prio comes up
Mikael Berthe <mikael@lilotux.net>
parents: 1072
diff changeset
487 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
488
1091
10f9d6fcfeab JEP85: Reset composing/paused state when a resource with higher prio comes up
Mikael Berthe <mikael@lilotux.net>
parents: 1072
diff changeset
489 // 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
490 // 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
491 if (sl_buddy)
1091
10f9d6fcfeab JEP85: Reset composing/paused state when a resource with higher prio comes up
Mikael Berthe <mikael@lilotux.net>
parents: 1072
diff changeset
492 jep85 = buddy_resource_jep85(sl_buddy->data, resname);
990
35e7913affb7 Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents: 989
diff changeset
493
35e7913affb7 Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents: 989
diff changeset
494 if (!jep85 || (jep85->support != CHATSTATES_SUPPORT_OK))
35e7913affb7 Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents: 989
diff changeset
495 return;
35e7913affb7 Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents: 989
diff changeset
496
35e7913affb7 Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents: 989
diff changeset
497 if (state == jep85->last_state_sent)
35e7913affb7 Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents: 989
diff changeset
498 return;
35e7913affb7 Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents: 989
diff changeset
499
35e7913affb7 Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents: 989
diff changeset
500 if (state == ROSTER_EVENT_ACTIVE)
35e7913affb7 Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents: 989
diff changeset
501 chattag = "active";
35e7913affb7 Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents: 989
diff changeset
502 else if (state == ROSTER_EVENT_COMPOSING)
35e7913affb7 Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents: 989
diff changeset
503 chattag = "composing";
35e7913affb7 Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents: 989
diff changeset
504 else if (state == ROSTER_EVENT_PAUSED)
35e7913affb7 Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents: 989
diff changeset
505 chattag = "paused";
35e7913affb7 Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents: 989
diff changeset
506 else {
35e7913affb7 Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents: 989
diff changeset
507 scr_LogPrint(LPRINT_LOGNORM, "Error: unsupported JEP-85 state (%d)", state);
35e7913affb7 Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents: 989
diff changeset
508 return;
35e7913affb7 Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents: 989
diff changeset
509 }
35e7913affb7 Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents: 989
diff changeset
510
35e7913affb7 Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents: 989
diff changeset
511 jep85->last_state_sent = state;
35e7913affb7 Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents: 989
diff changeset
512
1091
10f9d6fcfeab JEP85: Reset composing/paused state when a resource with higher prio comes up
Mikael Berthe <mikael@lilotux.net>
parents: 1072
diff changeset
513 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
514 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
515
10f9d6fcfeab JEP85: Reset composing/paused state when a resource with higher prio comes up
Mikael Berthe <mikael@lilotux.net>
parents: 1072
diff changeset
516 rjid = resname ? fjid : (char*)bjid;
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
517 m = lm_message_new_with_sub_type(rjid, LM_MESSAGE_TYPE_MESSAGE,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
518 LM_MESSAGE_SUB_TYPE_CHAT);
990
35e7913affb7 Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents: 989
diff changeset
519
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
520 event = lm_message_node_add_child(m->node, chattag, NULL);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
521 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
522
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
523 lm_connection_send(lconnection, m, NULL);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
524 lm_message_unref(m);
990
35e7913affb7 Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents: 989
diff changeset
525
1091
10f9d6fcfeab JEP85: Reset composing/paused state when a resource with higher prio comes up
Mikael Berthe <mikael@lilotux.net>
parents: 1072
diff changeset
526 g_free(fjid);
990
35e7913affb7 Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents: 989
diff changeset
527 }
35e7913affb7 Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents: 989
diff changeset
528 #endif
35e7913affb7 Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents: 989
diff changeset
529
989
859ab76e5093 Send JEP-22 delivered messages
Mikael Berthe <mikael@lilotux.net>
parents: 988
diff changeset
530 #ifdef JEP0022
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
531 // xmpp_send_jep22_event()
989
859ab76e5093 Send JEP-22 delivered messages
Mikael Berthe <mikael@lilotux.net>
parents: 988
diff changeset
532 // Send a JEP-22 message event (delivered, composing...).
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
533 static void xmpp_send_jep22_event(const char *fjid, guint type)
989
859ab76e5093 Send JEP-22 delivered messages
Mikael Berthe <mikael@lilotux.net>
parents: 988
diff changeset
534 {
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
535 LmMessage *x;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
536 LmMessageNode *event;
989
859ab76e5093 Send JEP-22 delivered messages
Mikael Berthe <mikael@lilotux.net>
parents: 988
diff changeset
537 const char *msgid;
859ab76e5093 Send JEP-22 delivered messages
Mikael Berthe <mikael@lilotux.net>
parents: 988
diff changeset
538 char *rname, *barejid;
859ab76e5093 Send JEP-22 delivered messages
Mikael Berthe <mikael@lilotux.net>
parents: 988
diff changeset
539 GSList *sl_buddy;
859ab76e5093 Send JEP-22 delivered messages
Mikael Berthe <mikael@lilotux.net>
parents: 988
diff changeset
540 struct jep0022 *jep22 = NULL;
990
35e7913affb7 Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents: 989
diff changeset
541 guint jep22_state;
989
859ab76e5093 Send JEP-22 delivered messages
Mikael Berthe <mikael@lilotux.net>
parents: 988
diff changeset
542
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
543 if (!lm_connection_is_authenticated(lconnection)) return;
989
859ab76e5093 Send JEP-22 delivered messages
Mikael Berthe <mikael@lilotux.net>
parents: 988
diff changeset
544
1058
c0d44a9a99bc Code cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 1055
diff changeset
545 rname = strchr(fjid, JID_RESOURCE_SEPARATOR);
c0d44a9a99bc Code cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 1055
diff changeset
546 barejid = jidtodisp(fjid);
989
859ab76e5093 Send JEP-22 delivered messages
Mikael Berthe <mikael@lilotux.net>
parents: 988
diff changeset
547 sl_buddy = roster_find(barejid, jidsearch, ROSTER_TYPE_USER);
859ab76e5093 Send JEP-22 delivered messages
Mikael Berthe <mikael@lilotux.net>
parents: 988
diff changeset
548 g_free(barejid);
859ab76e5093 Send JEP-22 delivered messages
Mikael Berthe <mikael@lilotux.net>
parents: 988
diff changeset
549
859ab76e5093 Send JEP-22 delivered messages
Mikael Berthe <mikael@lilotux.net>
parents: 988
diff changeset
550 // 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
551 // which hopefully will give us the most likely resource.
859ab76e5093 Send JEP-22 delivered messages
Mikael Berthe <mikael@lilotux.net>
parents: 988
diff changeset
552 if (rname)
859ab76e5093 Send JEP-22 delivered messages
Mikael Berthe <mikael@lilotux.net>
parents: 988
diff changeset
553 rname++;
859ab76e5093 Send JEP-22 delivered messages
Mikael Berthe <mikael@lilotux.net>
parents: 988
diff changeset
554 if (sl_buddy)
859ab76e5093 Send JEP-22 delivered messages
Mikael Berthe <mikael@lilotux.net>
parents: 988
diff changeset
555 jep22 = buddy_resource_jep22(sl_buddy->data, rname);
859ab76e5093 Send JEP-22 delivered messages
Mikael Berthe <mikael@lilotux.net>
parents: 988
diff changeset
556
990
35e7913affb7 Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents: 989
diff changeset
557 if (!jep22)
35e7913affb7 Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents: 989
diff changeset
558 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
559
35e7913affb7 Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents: 989
diff changeset
560 msgid = jep22->last_msgid_rcvd;
35e7913affb7 Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents: 989
diff changeset
561
35e7913affb7 Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents: 989
diff changeset
562 // For composing events (composing, active, inactive, paused...),
35e7913affb7 Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents: 989
diff changeset
563 // JEP22 only has 2 states; we'll use composing and active.
35e7913affb7 Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents: 989
diff changeset
564 if (type == ROSTER_EVENT_COMPOSING)
35e7913affb7 Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents: 989
diff changeset
565 jep22_state = ROSTER_EVENT_COMPOSING;
35e7913affb7 Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents: 989
diff changeset
566 else if (type == ROSTER_EVENT_ACTIVE ||
35e7913affb7 Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents: 989
diff changeset
567 type == ROSTER_EVENT_PAUSED)
35e7913affb7 Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents: 989
diff changeset
568 jep22_state = ROSTER_EVENT_ACTIVE;
35e7913affb7 Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents: 989
diff changeset
569 else
35e7913affb7 Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents: 989
diff changeset
570 jep22_state = 0; // ROSTER_EVENT_NONE
35e7913affb7 Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents: 989
diff changeset
571
35e7913affb7 Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents: 989
diff changeset
572 if (jep22_state) {
35e7913affb7 Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents: 989
diff changeset
573 // Do not re-send a same event
35e7913affb7 Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents: 989
diff changeset
574 if (jep22_state == jep22->last_state_sent)
35e7913affb7 Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents: 989
diff changeset
575 return;
35e7913affb7 Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents: 989
diff changeset
576 jep22->last_state_sent = jep22_state;
35e7913affb7 Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents: 989
diff changeset
577 }
989
859ab76e5093 Send JEP-22 delivered messages
Mikael Berthe <mikael@lilotux.net>
parents: 988
diff changeset
578
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
579 x = lm_message_new_with_sub_type(fjid, LM_MESSAGE_TYPE_MESSAGE,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
580 LM_MESSAGE_SUB_TYPE_CHAT);
989
859ab76e5093 Send JEP-22 delivered messages
Mikael Berthe <mikael@lilotux.net>
parents: 988
diff changeset
581
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
582 event = lm_message_node_add_child(x->node, "x", NULL);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
583 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
584 if (type == ROSTER_EVENT_DELIVERED)
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
585 lm_message_node_add_child(event, "delivered", NULL);
989
859ab76e5093 Send JEP-22 delivered messages
Mikael Berthe <mikael@lilotux.net>
parents: 988
diff changeset
586 else if (type == ROSTER_EVENT_COMPOSING)
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
587 lm_message_node_add_child(event, "composing", NULL);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
588 lm_message_node_add_child(event, "id", msgid);
989
859ab76e5093 Send JEP-22 delivered messages
Mikael Berthe <mikael@lilotux.net>
parents: 988
diff changeset
589
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
590 lm_connection_send(lconnection, x, NULL);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
591 lm_message_unref(x);
989
859ab76e5093 Send JEP-22 delivered messages
Mikael Berthe <mikael@lilotux.net>
parents: 988
diff changeset
592 }
859ab76e5093 Send JEP-22 delivered messages
Mikael Berthe <mikael@lilotux.net>
parents: 988
diff changeset
593 #endif
859ab76e5093 Send JEP-22 delivered messages
Mikael Berthe <mikael@lilotux.net>
parents: 988
diff changeset
594
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
595 // xmpp_send_chatstate(buddy, state)
997
d0d0cd9e39c4 Cosmetics & comments
Mikael Berthe <mikael@lilotux.net>
parents: 993
diff changeset
596 // Send a chatstate or event (JEP-22/85) according to the buddy's capabilities.
d0d0cd9e39c4 Cosmetics & comments
Mikael Berthe <mikael@lilotux.net>
parents: 993
diff changeset
597 // The message is sent to one of the resources with the highest priority.
990
35e7913affb7 Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents: 989
diff changeset
598 #if defined JEP0022 || defined JEP0085
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
599 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
600 {
1058
c0d44a9a99bc Code cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 1055
diff changeset
601 const char *bjid;
1091
10f9d6fcfeab JEP85: Reset composing/paused state when a resource with higher prio comes up
Mikael Berthe <mikael@lilotux.net>
parents: 1072
diff changeset
602 #ifdef JEP0085
10f9d6fcfeab JEP85: Reset composing/paused state when a resource with higher prio comes up
Mikael Berthe <mikael@lilotux.net>
parents: 1072
diff changeset
603 GSList *resources, *p_res, *p_next;
1476
77afd831f8f7 Avoid mixed declarations and code
Mikael Berthe <mikael@lilotux.net>
parents: 1448
diff changeset
604 struct jep0085 *jep85 = 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
605 #endif
10f9d6fcfeab JEP85: Reset composing/paused state when a resource with higher prio comes up
Mikael Berthe <mikael@lilotux.net>
parents: 1072
diff changeset
606 #ifdef JEP0022
10f9d6fcfeab JEP85: Reset composing/paused state when a resource with higher prio comes up
Mikael Berthe <mikael@lilotux.net>
parents: 1072
diff changeset
607 struct jep0022 *jep22;
10f9d6fcfeab JEP85: Reset composing/paused state when a resource with higher prio comes up
Mikael Berthe <mikael@lilotux.net>
parents: 1072
diff changeset
608 #endif
990
35e7913affb7 Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents: 989
diff changeset
609
1058
c0d44a9a99bc Code cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 1055
diff changeset
610 bjid = buddy_getjid(buddy);
c0d44a9a99bc Code cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 1055
diff changeset
611 if (!bjid) return;
990
35e7913affb7 Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents: 989
diff changeset
612
35e7913affb7 Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents: 989
diff changeset
613 #ifdef JEP0085
1091
10f9d6fcfeab JEP85: Reset composing/paused state when a resource with higher prio comes up
Mikael Berthe <mikael@lilotux.net>
parents: 1072
diff changeset
614 /* 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
615 priority).
10f9d6fcfeab JEP85: Reset composing/paused state when a resource with higher prio comes up
Mikael Berthe <mikael@lilotux.net>
parents: 1072
diff changeset
616 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
617 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
618 */
10f9d6fcfeab JEP85: Reset composing/paused state when a resource with higher prio comes up
Mikael Berthe <mikael@lilotux.net>
parents: 1072
diff changeset
619 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
620 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
621 p_next = g_slist_next(p_res);
10f9d6fcfeab JEP85: Reset composing/paused state when a resource with higher prio comes up
Mikael Berthe <mikael@lilotux.net>
parents: 1072
diff changeset
622 jep85 = buddy_resource_jep85(buddy, p_res->data);
10f9d6fcfeab JEP85: Reset composing/paused state when a resource with higher prio comes up
Mikael Berthe <mikael@lilotux.net>
parents: 1072
diff changeset
623 if (jep85 && jep85->support == CHATSTATES_SUPPORT_OK) {
10f9d6fcfeab JEP85: Reset composing/paused state when a resource with higher prio comes up
Mikael Berthe <mikael@lilotux.net>
parents: 1072
diff changeset
624 // If p_next is NULL, this is the highest (prio) resource, i.e.
10f9d6fcfeab JEP85: Reset composing/paused state when a resource with higher prio comes up
Mikael Berthe <mikael@lilotux.net>
parents: 1072
diff changeset
625 // the one we are probably writing to.
10f9d6fcfeab JEP85: Reset composing/paused state when a resource with higher prio comes up
Mikael Berthe <mikael@lilotux.net>
parents: 1072
diff changeset
626 if (!p_next || (jep85->last_state_sent != ROSTER_EVENT_ACTIVE &&
10f9d6fcfeab JEP85: Reset composing/paused state when a resource with higher prio comes up
Mikael Berthe <mikael@lilotux.net>
parents: 1072
diff changeset
627 chatstate == ROSTER_EVENT_ACTIVE))
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
628 xmpp_send_jep85_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
629 }
10f9d6fcfeab JEP85: Reset composing/paused state when a resource with higher prio comes up
Mikael Berthe <mikael@lilotux.net>
parents: 1072
diff changeset
630 g_free(p_res->data);
990
35e7913affb7 Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents: 989
diff changeset
631 }
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 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
633 // If the last resource had chatstates support when can return now,
7804dbac3875 Fix a potential JEP22/85 issue introduced by changeset 10f9d6fcfeab
Mikael Berthe <mikael@lilotux.net>
parents: 1091
diff changeset
634 // we don't want to send a JEP22 event.
7804dbac3875 Fix a potential JEP22/85 issue introduced by changeset 10f9d6fcfeab
Mikael Berthe <mikael@lilotux.net>
parents: 1091
diff changeset
635 if (jep85 && jep85->support == CHATSTATES_SUPPORT_OK)
7804dbac3875 Fix a potential JEP22/85 issue introduced by changeset 10f9d6fcfeab
Mikael Berthe <mikael@lilotux.net>
parents: 1091
diff changeset
636 return;
990
35e7913affb7 Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents: 989
diff changeset
637 #endif
35e7913affb7 Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents: 989
diff changeset
638 #ifdef JEP0022
35e7913affb7 Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents: 989
diff changeset
639 jep22 = buddy_resource_jep22(buddy, NULL);
35e7913affb7 Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents: 989
diff changeset
640 if (jep22 && jep22->support == CHATSTATES_SUPPORT_OK) {
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
641 xmpp_send_jep22_event(bjid, chatstate);
990
35e7913affb7 Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents: 989
diff changeset
642 }
35e7913affb7 Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents: 989
diff changeset
643 #endif
35e7913affb7 Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents: 989
diff changeset
644 }
35e7913affb7 Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents: 989
diff changeset
645 #endif
35e7913affb7 Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents: 989
diff changeset
646
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
647
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
648 // chatstates_reset_probed(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
649 // If the JEP has been probed for this contact, set it back to unknown so
9687ecc59303 Redo chat states detection if we receive a message error packet from a contact
Mikael Berthe <mikael@lilotux.net>
parents: 998
diff changeset
650 // that we probe it again. The parameter must be a full jid (w/ resource).
9687ecc59303 Redo chat states detection if we receive a message error packet from a contact
Mikael Berthe <mikael@lilotux.net>
parents: 998
diff changeset
651 #if defined JEP0022 || defined JEP0085
9687ecc59303 Redo chat states detection if we receive a message error packet from a contact
Mikael Berthe <mikael@lilotux.net>
parents: 998
diff changeset
652 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
653 {
9687ecc59303 Redo chat states detection if we receive a message error packet from a contact
Mikael Berthe <mikael@lilotux.net>
parents: 998
diff changeset
654 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
655 GSList *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
656 struct jep0085 *jep85;
9687ecc59303 Redo chat states detection if we receive a message error packet from a contact
Mikael Berthe <mikael@lilotux.net>
parents: 998
diff changeset
657 struct jep0022 *jep22;
9687ecc59303 Redo chat states detection if we receive a message error packet from a contact
Mikael Berthe <mikael@lilotux.net>
parents: 998
diff changeset
658
9687ecc59303 Redo chat states detection if we receive a message error packet from a contact
Mikael Berthe <mikael@lilotux.net>
parents: 998
diff changeset
659 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
660 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
661 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
662
9687ecc59303 Redo chat states detection if we receive a message error packet from a contact
Mikael Berthe <mikael@lilotux.net>
parents: 998
diff changeset
663 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
664 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
665 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
666
9687ecc59303 Redo chat states detection if we receive a message error packet from a contact
Mikael Berthe <mikael@lilotux.net>
parents: 998
diff changeset
667 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
668 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
669
9687ecc59303 Redo chat states detection if we receive a message error packet from a contact
Mikael Berthe <mikael@lilotux.net>
parents: 998
diff changeset
670 jep85 = buddy_resource_jep85(sl_buddy->data, 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
671 jep22 = buddy_resource_jep22(sl_buddy->data, 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
672
9687ecc59303 Redo chat states detection if we receive a message error packet from a contact
Mikael Berthe <mikael@lilotux.net>
parents: 998
diff changeset
673 if (jep85 && jep85->support == CHATSTATES_SUPPORT_PROBED)
9687ecc59303 Redo chat states detection if we receive a message error packet from a contact
Mikael Berthe <mikael@lilotux.net>
parents: 998
diff changeset
674 jep85->support = CHATSTATES_SUPPORT_UNKNOWN;
9687ecc59303 Redo chat states detection if we receive a message error packet from a contact
Mikael Berthe <mikael@lilotux.net>
parents: 998
diff changeset
675 if (jep22 && jep22->support == CHATSTATES_SUPPORT_PROBED)
9687ecc59303 Redo chat states detection if we receive a message error packet from a contact
Mikael Berthe <mikael@lilotux.net>
parents: 998
diff changeset
676 jep22->support = CHATSTATES_SUPPORT_UNKNOWN;
9687ecc59303 Redo chat states detection if we receive a message error packet from a contact
Mikael Berthe <mikael@lilotux.net>
parents: 998
diff changeset
677 }
9687ecc59303 Redo chat states detection if we receive a message error packet from a contact
Mikael Berthe <mikael@lilotux.net>
parents: 998
diff changeset
678 #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
679
1194
03d8fafe8104 Remove a warning when gpgme is disabled
Mikael Berthe <mikael@lilotux.net>
parents: 1166
diff changeset
680 #ifdef HAVE_GPGME
1104
382972712208 Allow short key format in check_signature()
Mikael Berthe <mikael@lilotux.net>
parents: 1099
diff changeset
681 // keys_mismatch(key, expectedkey)
382972712208 Allow short key format in check_signature()
Mikael Berthe <mikael@lilotux.net>
parents: 1099
diff changeset
682 // 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
683 // the end of "key".
382972712208 Allow short key format in check_signature()
Mikael Berthe <mikael@lilotux.net>
parents: 1099
diff changeset
684 // 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
685 // 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
686 //
382972712208 Allow short key format in check_signature()
Mikael Berthe <mikael@lilotux.net>
parents: 1099
diff changeset
687 // 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
688 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
689 {
382972712208 Allow short key format in check_signature()
Mikael Berthe <mikael@lilotux.net>
parents: 1099
diff changeset
690 int lk, lek;
382972712208 Allow short key format in check_signature()
Mikael Berthe <mikael@lilotux.net>
parents: 1099
diff changeset
691
382972712208 Allow short key format in check_signature()
Mikael Berthe <mikael@lilotux.net>
parents: 1099
diff changeset
692 if (!expectedkey || !key)
382972712208 Allow short key format in check_signature()
Mikael Berthe <mikael@lilotux.net>
parents: 1099
diff changeset
693 return FALSE;
382972712208 Allow short key format in check_signature()
Mikael Berthe <mikael@lilotux.net>
parents: 1099
diff changeset
694
382972712208 Allow short key format in check_signature()
Mikael Berthe <mikael@lilotux.net>
parents: 1099
diff changeset
695 lk = strlen(key);
382972712208 Allow short key format in check_signature()
Mikael Berthe <mikael@lilotux.net>
parents: 1099
diff changeset
696 lek = strlen(expectedkey);
382972712208 Allow short key format in check_signature()
Mikael Berthe <mikael@lilotux.net>
parents: 1099
diff changeset
697
382972712208 Allow short key format in check_signature()
Mikael Berthe <mikael@lilotux.net>
parents: 1099
diff changeset
698 // 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
699 // 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
700 if (lek < 8)
382972712208 Allow short key format in check_signature()
Mikael Berthe <mikael@lilotux.net>
parents: 1099
diff changeset
701 return TRUE;
382972712208 Allow short key format in check_signature()
Mikael Berthe <mikael@lilotux.net>
parents: 1099
diff changeset
702
382972712208 Allow short key format in check_signature()
Mikael Berthe <mikael@lilotux.net>
parents: 1099
diff changeset
703 if (lek < lk)
382972712208 Allow short key format in check_signature()
Mikael Berthe <mikael@lilotux.net>
parents: 1099
diff changeset
704 key += lk - lek;
382972712208 Allow short key format in check_signature()
Mikael Berthe <mikael@lilotux.net>
parents: 1099
diff changeset
705
382972712208 Allow short key format in check_signature()
Mikael Berthe <mikael@lilotux.net>
parents: 1099
diff changeset
706 return strcasecmp(key, expectedkey);
382972712208 Allow short key format in check_signature()
Mikael Berthe <mikael@lilotux.net>
parents: 1099
diff changeset
707 }
1194
03d8fafe8104 Remove a warning when gpgme is disabled
Mikael Berthe <mikael@lilotux.net>
parents: 1166
diff changeset
708 #endif
1104
382972712208 Allow short key format in check_signature()
Mikael Berthe <mikael@lilotux.net>
parents: 1099
diff changeset
709
1043
ebbde723614b Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents: 1042
diff changeset
710 // check_signature(barejid, resourcename, xmldata, text)
ebbde723614b Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents: 1042
diff changeset
711 // Verify the signature (in xmldata) of "text" for the contact
ebbde723614b Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents: 1042
diff changeset
712 // barejid/resourcename.
ebbde723614b Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents: 1042
diff changeset
713 // xmldata is the 'jabber:x:signed' stanza.
ebbde723614b Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents: 1042
diff changeset
714 // 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
715 static void check_signature(const char *barejid, const char *rname,
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
716 LmMessageNode *node, const char *text)
1043
ebbde723614b Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents: 1042
diff changeset
717 {
ebbde723614b Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents: 1042
diff changeset
718 #ifdef HAVE_GPGME
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
719 const char *p, *key;
1043
ebbde723614b Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents: 1042
diff changeset
720 GSList *sl_buddy;
ebbde723614b Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents: 1042
diff changeset
721 struct pgp_data *res_pgpdata;
ebbde723614b Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents: 1042
diff changeset
722 gpgme_sigsum_t sigsum;
ebbde723614b Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents: 1042
diff changeset
723
ebbde723614b Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents: 1042
diff changeset
724 // All parameters must be valid
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
725 if (!(node && barejid && rname && text))
1043
ebbde723614b Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents: 1042
diff changeset
726 return;
ebbde723614b Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents: 1042
diff changeset
727
ebbde723614b Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents: 1042
diff changeset
728 if (!gpg_enabled())
ebbde723614b Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents: 1042
diff changeset
729 return;
ebbde723614b Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents: 1042
diff changeset
730
ebbde723614b Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents: 1042
diff changeset
731 // Get the resource PGP data structure
ebbde723614b Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents: 1042
diff changeset
732 sl_buddy = roster_find(barejid, jidsearch, ROSTER_TYPE_USER);
ebbde723614b Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents: 1042
diff changeset
733 if (!sl_buddy)
ebbde723614b Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents: 1042
diff changeset
734 return;
ebbde723614b Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents: 1042
diff changeset
735 res_pgpdata = buddy_resource_pgp(sl_buddy->data, rname);
ebbde723614b Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents: 1042
diff changeset
736 if (!res_pgpdata)
ebbde723614b Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents: 1042
diff changeset
737 return;
ebbde723614b Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents: 1042
diff changeset
738
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
739 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
740 return; // We expect "<x xmlns='jabber:x:signed'>"
ebbde723614b Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents: 1042
diff changeset
741
ebbde723614b Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents: 1042
diff changeset
742 // Get signature
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
743 p = lm_message_node_get_value(node);
1043
ebbde723614b Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents: 1042
diff changeset
744 if (!p)
ebbde723614b Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents: 1042
diff changeset
745 return;
ebbde723614b Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents: 1042
diff changeset
746
ebbde723614b Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents: 1042
diff changeset
747 key = gpg_verify(p, text, &sigsum);
ebbde723614b Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents: 1042
diff changeset
748 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
749 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
750 char *buf;
1043
ebbde723614b Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents: 1042
diff changeset
751 g_free(res_pgpdata->sign_keyid);
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
752 res_pgpdata->sign_keyid = (char *)key;
1043
ebbde723614b Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents: 1042
diff changeset
753 res_pgpdata->last_sigsum = sigsum;
1046
a3748bd3d010 Tell the user when a signature is bad
Mikael Berthe <mikael@lilotux.net>
parents: 1045
diff changeset
754 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
755 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
756 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
757 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
758 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
759 }
a5dc85fdebde Add key comparison for signatures & use user-provided PGP keys for encryption
Mikael Berthe <mikael@lilotux.net>
parents: 1065
diff changeset
760 // 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
761 expectedkey = settings_pgp_getkeyid(barejid);
1104
382972712208 Allow short key format in check_signature()
Mikael Berthe <mikael@lilotux.net>
parents: 1099
diff changeset
762 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
763 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
764 "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
765 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
766 scr_LogPrint(LPRINT_LOGNORM, "%s", buf);
a3748bd3d010 Tell the user when a signature is bad
Mikael Berthe <mikael@lilotux.net>
parents: 1045
diff changeset
767 g_free(buf);
a3748bd3d010 Tell the user when a signature is bad
Mikael Berthe <mikael@lilotux.net>
parents: 1045
diff changeset
768 }
1043
ebbde723614b Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents: 1042
diff changeset
769 }
ebbde723614b Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents: 1042
diff changeset
770 #endif
ebbde723614b Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents: 1042
diff changeset
771 }
ebbde723614b Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents: 1042
diff changeset
772
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
773 static LmSSLResponse ssl_cb(LmSSL *ssl, LmSSLStatus status, gpointer ud)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
774 {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
775 scr_LogPrint(LPRINT_LOGNORM, "SSL status:%d", status);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
776
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
777 switch (status) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
778 case LM_SSL_STATUS_NO_CERT_FOUND:
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
779 scr_LogPrint(LPRINT_LOGNORM, "No certificate found!");
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
780 break;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
781 case LM_SSL_STATUS_UNTRUSTED_CERT:
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
782 scr_LogPrint(LPRINT_LOGNORM, "Certificate is not trusted!");
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
783 break;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
784 case LM_SSL_STATUS_CERT_EXPIRED:
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
785 scr_LogPrint(LPRINT_LOGNORM, "Certificate has expired!");
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
786 break;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
787 case LM_SSL_STATUS_CERT_NOT_ACTIVATED:
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
788 scr_LogPrint(LPRINT_LOGNORM, "Certificate has not been activated!");
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
789 break;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
790 case LM_SSL_STATUS_CERT_HOSTNAME_MISMATCH:
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
791 scr_LogPrint(LPRINT_LOGNORM,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
792 "Certificate hostname does not match expected hostname!");
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
793 break;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
794 case LM_SSL_STATUS_CERT_FINGERPRINT_MISMATCH: {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
795 char fpr[49];
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
796 fingerprint_to_hex((const unsigned char*)lm_ssl_get_fingerprint(ssl),
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
797 fpr);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
798 scr_LogPrint(LPRINT_LOGNORM,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
799 "Certificate fingerprint does not match expected fingerprint!");
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
800 scr_LogPrint(LPRINT_LOGNORM, "Remote fingerprint: %s", fpr);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
801
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
802 scr_LogPrint(LPRINT_LOGNORM, "Expected fingerprint: %s",
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
803 settings_opt_get("ssl_fingerprint"));
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
804
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
805 return LM_SSL_RESPONSE_STOP;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
806 break;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
807 }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
808 case LM_SSL_STATUS_GENERIC_ERROR:
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
809 scr_LogPrint(LPRINT_LOGNORM, "Generic SSL error!");
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
810 break;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
811 }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
812
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
813 if (!settings_opt_get_int("ssl_ignore_checks"))
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
814 return LM_SSL_RESPONSE_CONTINUE;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
815 return LM_SSL_RESPONSE_STOP;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
816 }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
817
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
818 static void connection_auth_cb(LmConnection *connection, gboolean success,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
819 gpointer user_data)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
820 {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
821 if (success) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
822 LmMessage *m;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
823
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
824 m = lm_message_new_with_sub_type(NULL, LM_MESSAGE_TYPE_PRESENCE,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
825 LM_MESSAGE_SUB_TYPE_AVAILABLE);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
826 lm_connection_send(connection, m, NULL);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
827
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
828 lm_message_unref(m);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
829 xmpp_setprevstatus();
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
830 xmpp_iq_request(NULL, NS_ROSTER);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
831 xmpp_request_storage("storage:bookmarks");
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
832 xmpp_request_storage("storage:rosternotes");
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
833
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
834 AutoConnection = TRUE;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
835 } else
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
836 scr_LogPrint(LPRINT_LOGNORM, "Authentication failed");
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
837 }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
838
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
839 gboolean xmpp_reconnect()
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
840 {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
841 if (!lm_connection_is_authenticated(lconnection))
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
842 xmpp_connect();
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
843 return FALSE;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
844 }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
845
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
846 static void _try_to_reconnect(void)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
847 {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
848 if (AutoConnection)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
849 g_timeout_add_seconds(RECONNECTION_TIMEOUT, xmpp_reconnect, NULL);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
850 }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
851
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
852 static void connection_open_cb(LmConnection *connection, gboolean success,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
853 gpointer user_data)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
854 {
1610
6db9f403f707 Replace 'username' with 'jid' in the configuration file
Mikael Berthe <mikael@lilotux.net>
parents: 1604
diff changeset
855 const char *userjid, *password, *resource, *servername;
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
856 GError *error;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
857
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
858 if (success) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
859 servername = settings_opt_get("server");
1610
6db9f403f707 Replace 'username' with 'jid' in the configuration file
Mikael Berthe <mikael@lilotux.net>
parents: 1604
diff changeset
860 userjid = settings_opt_get("jid");
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
861 password = settings_opt_get("password");
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
862 resource = strchr(lm_connection_get_jid(connection),
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
863 JID_RESOURCE_SEPARATOR);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
864 if (resource)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
865 resource++;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
866
1610
6db9f403f707 Replace 'username' with 'jid' in the configuration file
Mikael Berthe <mikael@lilotux.net>
parents: 1604
diff changeset
867 if (!lm_connection_authenticate(lconnection, userjid, password, resource,
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
868 connection_auth_cb, NULL, FALSE, &error)) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
869 scr_LogPrint(LPRINT_LOGNORM, "Failed to authenticate: %s\n",
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
870 error->message);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
871 _try_to_reconnect();
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
872 }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
873 } else {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
874 scr_LogPrint(LPRINT_LOGNORM, "There was an error while connecting.");
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
875 _try_to_reconnect();
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
876 }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
877 }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
878
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
879 static void connection_close_cb(LmConnection *connection,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
880 LmDisconnectReason reason,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
881 gpointer user_data)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
882 {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
883 const char *str;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
884
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
885 switch (reason) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
886 case LM_DISCONNECT_REASON_OK:
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
887 str = "LM_DISCONNECT_REASON_OK";
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
888 break;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
889 case LM_DISCONNECT_REASON_PING_TIME_OUT:
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
890 str = "LM_DISCONNECT_REASON_PING_TIME_OUT";
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
891 break;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
892 case LM_DISCONNECT_REASON_HUP:
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
893 str = "LM_DISCONNECT_REASON_HUP";
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
894 break;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
895 case LM_DISCONNECT_REASON_ERROR:
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
896 str = "LM_DISCONNECT_REASON_ERROR";
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
897 break;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
898 case LM_DISCONNECT_REASON_UNKNOWN:
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
899 default:
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
900 str = "LM_DISCONNECT_REASON_UNKNOWN";
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
901 break;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
902 }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
903
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
904 if (reason != LM_DISCONNECT_REASON_OK)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
905 _try_to_reconnect();
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
906
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
907 // Free bookmarks
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
908 if (bookmarks)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
909 lm_message_node_unref(bookmarks);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
910 bookmarks = NULL;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
911 // Free roster
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
912 roster_free();
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
913 if (rosternotes)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
914 lm_message_node_unref(rosternotes);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
915 rosternotes = NULL;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
916 // Update display
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
917 update_roster = TRUE;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
918 scr_UpdateBuddyWindow();
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
919
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
920 scr_LogPrint(LPRINT_NORMAL, "Disconnected, reason:%d->'%s'\n", reason, str);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
921 }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
922
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
923 static void handle_state_events(const char *from, LmMessageNode *node)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
924 {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
925 #if defined JEP0022 || defined JEP0085
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
926 LmMessageNode *state_ns = NULL;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
927 const char *body;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
928 char *rname, *bjid;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
929 GSList *sl_buddy;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
930 guint events;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
931 struct jep0022 *jep22 = NULL;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
932 struct jep0085 *jep85 = NULL;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
933 enum {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
934 JEP_none,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
935 JEP_85,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
936 JEP_22
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
937 } which_jep = JEP_none;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
938
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
939 rname = strchr(from, JID_RESOURCE_SEPARATOR);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
940 if (rname)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
941 ++rname;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
942 else
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
943 rname = (char *)from + strlen(from);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
944 bjid = jidtodisp(from);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
945 sl_buddy = roster_find(bjid, jidsearch, ROSTER_TYPE_USER);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
946 g_free(bjid);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
947
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
948 /* XXX Actually that's wrong, since it filters out server "offline"
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
949 messages (for JEP-0022). This JEP is (almost) deprecated so
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
950 we don't really care. */
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
951 if (!sl_buddy) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
952 return;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
953 }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
954
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
955 /* Let's see chich JEP the contact uses. If possible, we'll use
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
956 JEP-85, if not we'll look for JEP-22 support. */
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
957 events = buddy_resource_getevents(sl_buddy->data, rname);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
958
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
959 jep85 = buddy_resource_jep85(sl_buddy->data, rname);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
960 if (jep85) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
961 state_ns = lm_message_node_find_xmlns(node, NS_CHATSTATES);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
962 if (state_ns)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
963 which_jep = JEP_85;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
964 }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
965
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
966 if (which_jep != JEP_85) { /* Fall back to JEP-0022 */
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
967 jep22 = buddy_resource_jep22(sl_buddy->data, rname);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
968 if (jep22) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
969 state_ns = lm_message_node_find_xmlns(node, NS_EVENT);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
970 if (state_ns)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
971 which_jep = JEP_22;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
972 }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
973 }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
974
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
975 if (!which_jep) { /* Sender does not use chat states */
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
976 return;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
977 }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
978
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
979 body = lm_message_node_get_child_value(node, "body");
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
980
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
981 if (which_jep == JEP_85) { /* JEP-0085 */
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
982 jep85->support = CHATSTATES_SUPPORT_OK;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
983
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
984 if (!strcmp(state_ns->name, "composing")) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
985 jep85->last_state_rcvd = ROSTER_EVENT_COMPOSING;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
986 } else if (!strcmp(state_ns->name, "active")) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
987 jep85->last_state_rcvd = ROSTER_EVENT_ACTIVE;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
988 } else if (!strcmp(state_ns->name, "paused")) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
989 jep85->last_state_rcvd = ROSTER_EVENT_PAUSED;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
990 } else if (!strcmp(state_ns->name, "inactive")) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
991 jep85->last_state_rcvd = ROSTER_EVENT_INACTIVE;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
992 } else if (!strcmp(state_ns->name, "gone")) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
993 jep85->last_state_rcvd = ROSTER_EVENT_GONE;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
994 }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
995 events = jep85->last_state_rcvd;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
996 } else { /* JEP-0022 */
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
997 #ifdef JEP0022
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
998 const char *msgid;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
999 jep22->support = CHATSTATES_SUPPORT_OK;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1000 jep22->last_state_rcvd = ROSTER_EVENT_NONE;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1001
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1002 msgid = lm_message_node_get_attribute(node, "id");
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1003
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1004 if (lm_message_node_get_child(state_ns, "composing")) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1005 // Clear composing if the message contains a body
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1006 if (body)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1007 events &= ~ROSTER_EVENT_COMPOSING;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1008 else
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1009 events |= ROSTER_EVENT_COMPOSING;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1010 jep22->last_state_rcvd |= ROSTER_EVENT_COMPOSING;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1011
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1012 } else {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1013 events &= ~ROSTER_EVENT_COMPOSING;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1014 }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1015
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1016 // Cache the message id
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1017 g_free(jep22->last_msgid_rcvd);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1018 if (msgid)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1019 jep22->last_msgid_rcvd = g_strdup(msgid);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1020 else
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1021 jep22->last_msgid_rcvd = NULL;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1022
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1023 if (lm_message_node_get_child(state_ns, "delivered")) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1024 jep22->last_state_rcvd |= ROSTER_EVENT_DELIVERED;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1025
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1026 // Do we have to send back an ACK?
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1027 if (body)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1028 xmpp_send_jep22_event(from, ROSTER_EVENT_DELIVERED);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1029 }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1030 #endif
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1031 }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1032
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1033 buddy_resource_setevents(sl_buddy->data, rname, events);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1034
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1035 update_roster = TRUE;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1036 #endif
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1037 }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1038
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1039 static void gotmessage(LmMessageSubType type, const char *from,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1040 const char *body, const char *enc, const char *subject,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1041 time_t timestamp, LmMessageNode *node_signed)
29
86837ff0554c [/trunk] Changeset 45 by mikael
mikael
parents:
diff changeset
1042 {
1058
c0d44a9a99bc Code cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 1055
diff changeset
1043 char *bjid;
956
819396bebdf5 Do not block system messages when block_unsubscribed is set
Mikael Berthe <mikael@lilotux.net>
parents: 940
diff changeset
1044 const char *rname, *s;
1347
07816313073b Add an option 'otr' to enable OTR support in the configuration file
Mikael Berthe <mikael@lilotux.net>
parents: 1344
diff changeset
1045 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
1046 char *decrypted_otr = NULL;
1299
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents: 1290
diff changeset
1047 int otr_msg = 0, free_msg = 0;
29
86837ff0554c [/trunk] Changeset 45 by mikael
mikael
parents:
diff changeset
1048
1058
c0d44a9a99bc Code cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 1055
diff changeset
1049 bjid = jidtodisp(from);
441
51b8f10cfeb8 Handle g_locale_from_utf8() failures
Mikael Berthe <mikael@lilotux.net>
parents: 438
diff changeset
1050
977
5b01de4ac5e1 Cosmetic changes
Alexis Hildebrandt <afh [at] 2drop [dot] net>
parents: 960
diff changeset
1051 rname = strchr(from, JID_RESOURCE_SEPARATOR);
447
03bb57383cea Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents: 444
diff changeset
1052 if (rname) rname++;
819
c2d7d9dd4193 New option 'block_unsubscribed'
Mikael Berthe <mikael@lilotux.net>
parents: 818
diff changeset
1053
1042
8a395c2cafc4 Initial PGP support (decrypt)
Mikael Berthe <mikael@lilotux.net>
parents: 1023
diff changeset
1054 #ifdef HAVE_GPGME
8a395c2cafc4 Initial PGP support (decrypt)
Mikael Berthe <mikael@lilotux.net>
parents: 1023
diff changeset
1055 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
1056 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
1057 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
1058 body = decrypted_pgp;
1043
ebbde723614b Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents: 1042
diff changeset
1059 }
1042
8a395c2cafc4 Initial PGP support (decrypt)
Mikael Berthe <mikael@lilotux.net>
parents: 1023
diff changeset
1060 }
1043
ebbde723614b Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents: 1042
diff changeset
1061 // Check signature of an unencrypted message
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1062 if (node_signed && gpg_enabled())
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1063 check_signature(bjid, rname, node_signed, decrypted_pgp);
1042
8a395c2cafc4 Initial PGP support (decrypt)
Mikael Berthe <mikael@lilotux.net>
parents: 1023
diff changeset
1064 #endif
8a395c2cafc4 Initial PGP support (decrypt)
Mikael Berthe <mikael@lilotux.net>
parents: 1023
diff changeset
1065
1299
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents: 1290
diff changeset
1066 #ifdef HAVE_LIBOTR
1347
07816313073b Add an option 'otr' to enable OTR support in the configuration file
Mikael Berthe <mikael@lilotux.net>
parents: 1344
diff changeset
1067 if (otr_enabled()) {
07816313073b Add an option 'otr' to enable OTR support in the configuration file
Mikael Berthe <mikael@lilotux.net>
parents: 1344
diff changeset
1068 decrypted_otr = (char*)body;
07816313073b Add an option 'otr' to enable OTR support in the configuration file
Mikael Berthe <mikael@lilotux.net>
parents: 1344
diff changeset
1069 otr_msg = otr_receive(&decrypted_otr, bjid, &free_msg);
07816313073b Add an option 'otr' to enable OTR support in the configuration file
Mikael Berthe <mikael@lilotux.net>
parents: 1344
diff changeset
1070 if (!decrypted_otr) {
07816313073b Add an option 'otr' to enable OTR support in the configuration file
Mikael Berthe <mikael@lilotux.net>
parents: 1344
diff changeset
1071 goto gotmessage_return;
07816313073b Add an option 'otr' to enable OTR support in the configuration file
Mikael Berthe <mikael@lilotux.net>
parents: 1344
diff changeset
1072 }
07816313073b Add an option 'otr' to enable OTR support in the configuration file
Mikael Berthe <mikael@lilotux.net>
parents: 1344
diff changeset
1073 body = decrypted_otr;
1299
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents: 1290
diff changeset
1074 }
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents: 1290
diff changeset
1075 #endif
3b338a5c01fc OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents: 1290
diff changeset
1076
864
a7b3409df6bc MUC: Work around user server restart
Mikael Berthe <mikael@lilotux.net>
parents: 862
diff changeset
1077 // Check for unexpected groupchat messages
a7b3409df6bc MUC: Work around user server restart
Mikael Berthe <mikael@lilotux.net>
parents: 862
diff changeset
1078 // 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
1079 // 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
1080 // a type unavailable.
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1081 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
1082 // It shouldn't happen, probably a server issue
a7b3409df6bc MUC: Work around user server restart
Mikael Berthe <mikael@lilotux.net>
parents: 862
diff changeset
1083 GSList *room_elt;
a7b3409df6bc MUC: Work around user server restart
Mikael Berthe <mikael@lilotux.net>
parents: 862
diff changeset
1084 char *mbuf;
a7b3409df6bc MUC: Work around user server restart
Mikael Berthe <mikael@lilotux.net>
parents: 862
diff changeset
1085
a7b3409df6bc MUC: Work around user server restart
Mikael Berthe <mikael@lilotux.net>
parents: 862
diff changeset
1086 mbuf = g_strdup_printf("Unexpected groupchat packet!");
a7b3409df6bc MUC: Work around user server restart
Mikael Berthe <mikael@lilotux.net>
parents: 862
diff changeset
1087 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
1088 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
1089 g_free(mbuf);
a7b3409df6bc MUC: Work around user server restart
Mikael Berthe <mikael@lilotux.net>
parents: 862
diff changeset
1090
a7b3409df6bc MUC: Work around user server restart
Mikael Berthe <mikael@lilotux.net>
parents: 862
diff changeset
1091 // Send back an unavailable packet
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1092 xmpp_setstatus(offline, bjid, "", TRUE);
864
a7b3409df6bc MUC: Work around user server restart
Mikael Berthe <mikael@lilotux.net>
parents: 862
diff changeset
1093
a7b3409df6bc MUC: Work around user server restart
Mikael Berthe <mikael@lilotux.net>
parents: 862
diff changeset
1094 // MUC
a7b3409df6bc MUC: Work around user server restart
Mikael Berthe <mikael@lilotux.net>
parents: 862
diff changeset
1095 // 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
1096 room_elt = roster_find(bjid, jidsearch, 0);
864
a7b3409df6bc MUC: Work around user server restart
Mikael Berthe <mikael@lilotux.net>
parents: 862
diff changeset
1097 if (!room_elt) {
1355
9716cf8a0726 Add on_server flag
Mikael Berthe <mikael@lilotux.net>
parents: 1354
diff changeset
1098 room_elt = roster_add_user(bjid, NULL, NULL, ROSTER_TYPE_ROOM,
9716cf8a0726 Add on_server flag
Mikael Berthe <mikael@lilotux.net>
parents: 1354
diff changeset
1099 sub_none, -1);
864
a7b3409df6bc MUC: Work around user server restart
Mikael Berthe <mikael@lilotux.net>
parents: 862
diff changeset
1100 } else {
a7b3409df6bc MUC: Work around user server restart
Mikael Berthe <mikael@lilotux.net>
parents: 862
diff changeset
1101 buddy_settype(room_elt->data, ROSTER_TYPE_ROOM);
a7b3409df6bc MUC: Work around user server restart
Mikael Berthe <mikael@lilotux.net>
parents: 862
diff changeset
1102 }
a7b3409df6bc MUC: Work around user server restart
Mikael Berthe <mikael@lilotux.net>
parents: 862
diff changeset
1103
a7b3409df6bc MUC: Work around user server restart
Mikael Berthe <mikael@lilotux.net>
parents: 862
diff changeset
1104 buddylist_build();
a7b3409df6bc MUC: Work around user server restart
Mikael Berthe <mikael@lilotux.net>
parents: 862
diff changeset
1105 scr_DrawRoster();
1347
07816313073b Add an option 'otr' to enable OTR support in the configuration file
Mikael Berthe <mikael@lilotux.net>
parents: 1344
diff changeset
1106 goto gotmessage_return;
864
a7b3409df6bc MUC: Work around user server restart
Mikael Berthe <mikael@lilotux.net>
parents: 862
diff changeset
1107 }
a7b3409df6bc MUC: Work around user server restart
Mikael Berthe <mikael@lilotux.net>
parents: 862
diff changeset
1108
819
c2d7d9dd4193 New option 'block_unsubscribed'
Mikael Berthe <mikael@lilotux.net>
parents: 818
diff changeset
1109 // 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
1110 // 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
1111 // System messages (from our server) are allowed.
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1112 if ((!settings_opt_get_int("block_unsubscribed") ||
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1113 (roster_getsubscription(bjid) & sub_from) ||
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1114 (type == LM_MESSAGE_SUB_TYPE_CHAT)) ||
1058
c0d44a9a99bc Code cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 1055
diff changeset
1115 ((s = settings_opt_get("server")) != NULL && !strcasecmp(bjid, s))) {
1399
187985455020 Correctly display PGP-encoded messages with a subject
Mikael Berthe <mikael@lilotux.net>
parents: 1397
diff changeset
1116 gchar *fullbody = NULL;
1484
7b36b91a4388 New UI message flag (O) when OTR is used
Mikael Berthe <mikael@lilotux.net>
parents: 1476
diff changeset
1117 guint encrypted;
7b36b91a4388 New UI message flag (O) when OTR is used
Mikael Berthe <mikael@lilotux.net>
parents: 1476
diff changeset
1118
7b36b91a4388 New UI message flag (O) when OTR is used
Mikael Berthe <mikael@lilotux.net>
parents: 1476
diff changeset
1119 if (decrypted_pgp)
7b36b91a4388 New UI message flag (O) when OTR is used
Mikael Berthe <mikael@lilotux.net>
parents: 1476
diff changeset
1120 encrypted = ENCRYPTED_PGP;
7b36b91a4388 New UI message flag (O) when OTR is used
Mikael Berthe <mikael@lilotux.net>
parents: 1476
diff changeset
1121 else if (otr_msg)
7b36b91a4388 New UI message flag (O) when OTR is used
Mikael Berthe <mikael@lilotux.net>
parents: 1476
diff changeset
1122 encrypted = ENCRYPTED_OTR;
7b36b91a4388 New UI message flag (O) when OTR is used
Mikael Berthe <mikael@lilotux.net>
parents: 1476
diff changeset
1123 else
7b36b91a4388 New UI message flag (O) when OTR is used
Mikael Berthe <mikael@lilotux.net>
parents: 1476
diff changeset
1124 encrypted = 0;
7b36b91a4388 New UI message flag (O) when OTR is used
Mikael Berthe <mikael@lilotux.net>
parents: 1476
diff changeset
1125
1399
187985455020 Correctly display PGP-encoded messages with a subject
Mikael Berthe <mikael@lilotux.net>
parents: 1397
diff changeset
1126 if (subject) {
187985455020 Correctly display PGP-encoded messages with a subject
Mikael Berthe <mikael@lilotux.net>
parents: 1397
diff changeset
1127 if (body)
187985455020 Correctly display PGP-encoded messages with a subject
Mikael Berthe <mikael@lilotux.net>
parents: 1397
diff changeset
1128 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
1129 else
187985455020 Correctly display PGP-encoded messages with a subject
Mikael Berthe <mikael@lilotux.net>
parents: 1397
diff changeset
1130 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
1131 body = fullbody;
187985455020 Correctly display PGP-encoded messages with a subject
Mikael Berthe <mikael@lilotux.net>
parents: 1397
diff changeset
1132 }
1484
7b36b91a4388 New UI message flag (O) when OTR is used
Mikael Berthe <mikael@lilotux.net>
parents: 1476
diff changeset
1133 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
1134 g_free(fullbody);
819
c2d7d9dd4193 New option 'block_unsubscribed'
Mikael Berthe <mikael@lilotux.net>
parents: 818
diff changeset
1135 } else {
1058
c0d44a9a99bc Code cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 1055
diff changeset
1136 scr_LogPrint(LPRINT_LOGNORM, "Blocked a message from <%s>", bjid);
819
c2d7d9dd4193 New option 'block_unsubscribed'
Mikael Berthe <mikael@lilotux.net>
parents: 818
diff changeset
1137 }
1347
07816313073b Add an option 'otr' to enable OTR support in the configuration file
Mikael Berthe <mikael@lilotux.net>
parents: 1344
diff changeset
1138
07816313073b Add an option 'otr' to enable OTR support in the configuration file
Mikael Berthe <mikael@lilotux.net>
parents: 1344
diff changeset
1139 gotmessage_return:
07816313073b Add an option 'otr' to enable OTR support in the configuration file
Mikael Berthe <mikael@lilotux.net>
parents: 1344
diff changeset
1140 // Clean up and exit
1058
c0d44a9a99bc Code cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 1055
diff changeset
1141 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
1142 g_free(decrypted_pgp);
1333
e30a9d907105 Minor coding style adjustments
Mikael Berthe <mikael@lilotux.net>
parents: 1330
diff changeset
1143 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
1144 g_free(decrypted_otr);
29
86837ff0554c [/trunk] Changeset 45 by mikael
mikael
parents:
diff changeset
1145 }
86837ff0554c [/trunk] Changeset 45 by mikael
mikael
parents:
diff changeset
1146
420
04a0b450380b Display error code/message when receiving a message packet with "error" type
Mikael Berthe <mikael@lilotux.net>
parents: 419
diff changeset
1147
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1148 static LmHandlerResult handle_messages(LmMessageHandler *handler,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1149 LmConnection *connection,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1150 LmMessage *m, gpointer user_data)
579
0c67755e0fa7 Introduce a handle_presence_muc() function
Mikael Berthe <mikael@lilotux.net>
parents: 578
diff changeset
1151 {
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1152 const char *p, *from=lm_message_get_from(m);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1153 char *r, *s;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1154 LmMessageNode *x;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1155 const char *body = NULL;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1156 const char *enc = NULL;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1157 const char *subject = NULL;
1001
dff25377c11f Auto-reconnect after a network/server failure
Mikael Berthe <mikael@lilotux.net>
parents: 999
diff changeset
1158 time_t timestamp = 0L;
547
1df26ff0ed8c Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents: 539
diff changeset
1159
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1160 body = lm_message_node_get_child_value(m->node, "body");
547
1df26ff0ed8c Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents: 539
diff changeset
1161
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1162 x = lm_message_node_find_xmlns(m->node, NS_ENCRYPTED);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1163 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
1164 enc = p;
187985455020 Correctly display PGP-encoded messages with a subject
Mikael Berthe <mikael@lilotux.net>
parents: 1397
diff changeset
1165
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1166 p = lm_message_node_get_child_value(m->node, "subject");
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1167 if (p != NULL) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1168 if (lm_message_get_sub_type(m) != LM_MESSAGE_SUB_TYPE_GROUPCHAT) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1169 // Chat message
1399
187985455020 Correctly display PGP-encoded messages with a subject
Mikael Berthe <mikael@lilotux.net>
parents: 1397
diff changeset
1170 subject = p;
187985455020 Correctly display PGP-encoded messages with a subject
Mikael Berthe <mikael@lilotux.net>
parents: 1397
diff changeset
1171 } else { // Room topic
549
448e299e45da MUC: "/room topic" shows the current room topic
Mikael Berthe <mikael@lilotux.net>
parents: 547
diff changeset
1172 GSList *roombuddy;
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1173 gchar *mbuf;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1174 const gchar *subj = p;
547
1df26ff0ed8c Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents: 539
diff changeset
1175 // Get the room (s) and the nickname (r)
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1176 s = g_strdup(lm_message_get_from(m));
977
5b01de4ac5e1 Cosmetic changes
Alexis Hildebrandt <afh [at] 2drop [dot] net>
parents: 960
diff changeset
1177 r = strchr(s, JID_RESOURCE_SEPARATOR);
547
1df26ff0ed8c Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents: 539
diff changeset
1178 if (r) *r++ = 0;
1df26ff0ed8c Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents: 539
diff changeset
1179 else r = s;
549
448e299e45da MUC: "/room topic" shows the current room topic
Mikael Berthe <mikael@lilotux.net>
parents: 547
diff changeset
1180 // Set the new topic
448e299e45da MUC: "/room topic" shows the current room topic
Mikael Berthe <mikael@lilotux.net>
parents: 547
diff changeset
1181 roombuddy = roster_find(s, jidsearch, 0);
448e299e45da MUC: "/room topic" shows the current room topic
Mikael Berthe <mikael@lilotux.net>
parents: 547
diff changeset
1182 if (roombuddy)
772
464be13343a9 Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents: 756
diff changeset
1183 buddy_settopic(roombuddy->data, subj);
547
1df26ff0ed8c Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents: 539
diff changeset
1184 // Display inside the room window
560
64cb4de94972 Better topic attribution
Mikael Berthe <mikael@lilotux.net>
parents: 549
diff changeset
1185 if (r == s) {
64cb4de94972 Better topic attribution
Mikael Berthe <mikael@lilotux.net>
parents: 549
diff changeset
1186 // No specific resource (this is certainly history)
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1187 mbuf = g_strdup_printf("The topic has been set to: %s", subj);
560
64cb4de94972 Better topic attribution
Mikael Berthe <mikael@lilotux.net>
parents: 549
diff changeset
1188 } else {
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1189 mbuf = g_strdup_printf("%s has set the topic to: %s", r, subj);
560
64cb4de94972 Better topic attribution
Mikael Berthe <mikael@lilotux.net>
parents: 549
diff changeset
1190 }
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1191 scr_WriteIncomingMessage(s, mbuf, 0,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1192 HBB_PREFIX_INFO|HBB_PREFIX_NOFLAG, 0);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1193 if (settings_opt_get_int("log_muc_conf"))
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1194 hlog_write_message(s, 0, -1, mbuf);
547
1df26ff0ed8c Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents: 539
diff changeset
1195 g_free(s);
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1196 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
1197 // The topic is displayed in the chat status line, so refresh now.
ab623c2df964 MUC: Update the chat status line when the topic is updated
Mikael Berthe <mikael@lilotux.net>
parents: 724
diff changeset
1198 scr_UpdateChatStatus(TRUE);
547
1df26ff0ed8c Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents: 539
diff changeset
1199 }
1df26ff0ed8c Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents: 539
diff changeset
1200 }
1df26ff0ed8c Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents: 539
diff changeset
1201
1df26ff0ed8c Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents: 539
diff changeset
1202 // Timestamp?
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1203 timestamp = lm_message_node_get_timestamp(m->node);
547
1df26ff0ed8c Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents: 539
diff changeset
1204
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1205 if (lm_message_get_sub_type(m) == LM_MESSAGE_SUB_TYPE_ERROR) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1206 x = lm_message_node_get_child(m->node, "error");
1213
4a7db2870685 Improve Private Storage detection.
Mikael Berthe <mikael@lilotux.net>
parents: 1212
diff changeset
1207 display_server_error(x);
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
1208 #if defined JEP0022 || defined JEP0085
9687ecc59303 Redo chat states detection if we receive a message error packet from a contact
Mikael Berthe <mikael@lilotux.net>
parents: 998
diff changeset
1209 // If the JEP85/22 support is probed, set it back to unknown so that
9687ecc59303 Redo chat states detection if we receive a message error packet from a contact
Mikael Berthe <mikael@lilotux.net>
parents: 998
diff changeset
1210 // 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
1211 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
1212 #endif
1132
1650056b96fc Do not use chat states of error messages :)
Mikael Berthe <mikael@lilotux.net>
parents: 1128
diff changeset
1213 } else {
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1214 handle_state_events(from, m->node);
547
1df26ff0ed8c Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents: 539
diff changeset
1215 }
1399
187985455020 Correctly display PGP-encoded messages with a subject
Mikael Berthe <mikael@lilotux.net>
parents: 1397
diff changeset
1216 if (from && (body || subject))
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1217 gotmessage(lm_message_get_sub_type(m), from, body, enc, subject, timestamp,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1218 lm_message_node_find_xmlns(m->node, NS_SIGNED));
1602
f4a2c6f767d1 Message Receipts support (XEP-0184)
franky
parents: 1600
diff changeset
1219 //report received message if message receipt was requested
f4a2c6f767d1 Message Receipts support (XEP-0184)
franky
parents: 1600
diff changeset
1220 if (lm_message_node_get_child(m->node, "request")) {
f4a2c6f767d1 Message Receipts support (XEP-0184)
franky
parents: 1600
diff changeset
1221 LmMessage *rcvd = lm_message_new(from, LM_MESSAGE_TYPE_MESSAGE);
f4a2c6f767d1 Message Receipts support (XEP-0184)
franky
parents: 1600
diff changeset
1222 lm_message_node_set_attribute(rcvd->node, "id", lm_message_get_id(m));
f4a2c6f767d1 Message Receipts support (XEP-0184)
franky
parents: 1600
diff changeset
1223 lm_message_node_set_attribute
f4a2c6f767d1 Message Receipts support (XEP-0184)
franky
parents: 1600
diff changeset
1224 (lm_message_node_add_child(rcvd->node, "received", NULL),
f4a2c6f767d1 Message Receipts support (XEP-0184)
franky
parents: 1600
diff changeset
1225 "xmlns", NS_RECEIPTS);
f4a2c6f767d1 Message Receipts support (XEP-0184)
franky
parents: 1600
diff changeset
1226 lm_connection_send(connection, rcvd, NULL);
f4a2c6f767d1 Message Receipts support (XEP-0184)
franky
parents: 1600
diff changeset
1227 lm_message_unref(rcvd);
f4a2c6f767d1 Message Receipts support (XEP-0184)
franky
parents: 1600
diff changeset
1228 }
1128
ac9c89f6cb51 Support for invitations to muc rooms
misc@mandriva.org
parents: 1104
diff changeset
1229
ac9c89f6cb51 Support for invitations to muc rooms
misc@mandriva.org
parents: 1104
diff changeset
1230 if (from) {
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1231 x = lm_message_node_find_xmlns(m->node,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1232 "http://jabber.org/protocol/muc#user");
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1233 if (x && !strcmp(x->name, "x"))
1128
ac9c89f6cb51 Support for invitations to muc rooms
misc@mandriva.org
parents: 1104
diff changeset
1234 got_muc_message(from, x);
ac9c89f6cb51 Support for invitations to muc rooms
misc@mandriva.org
parents: 1104
diff changeset
1235 }
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1236
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1237 return LM_HANDLER_RESULT_REMOVE_MESSAGE;
547
1df26ff0ed8c Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents: 539
diff changeset
1238 }
1df26ff0ed8c Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents: 539
diff changeset
1239
1600
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
1240 static LmHandlerResult cb_caps(LmMessageHandler *h, LmConnection *c,
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
1241 LmMessage *m, gpointer user_data)
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
1242 {
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
1243 char *ver = user_data;
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
1244
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
1245 if (lm_message_get_sub_type(m) == LM_MESSAGE_SUB_TYPE_ERROR) {
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
1246 display_server_error(lm_message_node_get_child(m->node, "error"));
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
1247 } else if (lm_message_get_sub_type(m) == LM_MESSAGE_SUB_TYPE_RESULT) {
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
1248 LmMessageNode *info;
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
1249 LmMessageNode *query = lm_message_node_get_child(m->node, "query");
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
1250
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
1251 caps_add(ver);
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
1252 info = lm_message_node_get_child(query, "identity");
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
1253 if (info)
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
1254 caps_set_identity(ver, lm_message_node_get_attribute(info, "category"),
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
1255 lm_message_node_get_attribute(info, "name"),
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
1256 lm_message_node_get_attribute(info, "type"));
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
1257 info = lm_message_node_get_child(query, "feature");
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
1258 while (info) {
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
1259 if (!g_strcmp0(info->name, "feature"))
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
1260 caps_add_feature(ver, lm_message_node_get_attribute(info, "var"));
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
1261 info = info->next;
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
1262 }
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
1263 }
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
1264 g_free(ver);
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
1265 return LM_HANDLER_RESULT_REMOVE_MESSAGE;
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
1266 }
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
1267
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1268 static LmHandlerResult handle_presence(LmMessageHandler *handler,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1269 LmConnection *connection,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1270 LmMessage *m, gpointer user_data)
986
ed697234bd39 Chat states receival (Alexis Hildebrandt)
Mikael Berthe <mikael@lilotux.net>
parents: 977
diff changeset
1271 {
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1272 char *r;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1273 const char *from, *rname, *p=NULL, *ustmsg=NULL;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1274 enum imstatus ust;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1275 char bpprio;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1276 time_t timestamp = 0L;
1600
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
1277 LmMessageNode *muc_packet, *caps;
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1278
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1279 //Check for MUC presence packet
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1280 muc_packet = lm_message_node_find_xmlns
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1281 (m->node, "http://jabber.org/protocol/muc#user");
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1282
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1283 from = lm_message_get_from(m);
987
f47e312560af Improve JEP22 + JEP85 support
Mikael Berthe <mikael@lilotux.net>
parents: 986
diff changeset
1284
f47e312560af Improve JEP22 + JEP85 support
Mikael Berthe <mikael@lilotux.net>
parents: 986
diff changeset
1285 rname = strchr(from, JID_RESOURCE_SEPARATOR);
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1286 if (rname) rname++;
986
ed697234bd39 Chat states receival (Alexis Hildebrandt)
Mikael Berthe <mikael@lilotux.net>
parents: 977
diff changeset
1287
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1288 if (settings_opt_get_int("ignore_self_presence")) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1289 const char *self_fjid = lm_connection_get_jid(connection);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1290 if (self_fjid && !strcasecmp(self_fjid, from)) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1291 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
1292 }
f47e312560af Improve JEP22 + JEP85 support
Mikael Berthe <mikael@lilotux.net>
parents: 986
diff changeset
1293 }
f47e312560af Improve JEP22 + JEP85 support
Mikael Berthe <mikael@lilotux.net>
parents: 986
diff changeset
1294
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1295 r = jidtodisp(from);
987
f47e312560af Improve JEP22 + JEP85 support
Mikael Berthe <mikael@lilotux.net>
parents: 986
diff changeset
1296
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1297 if (lm_message_get_sub_type(m) == LM_MESSAGE_SUB_TYPE_ERROR) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1298 LmMessageNode *x;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1299 scr_LogPrint(LPRINT_LOGNORM, "Error presence packet from <%s>", r);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1300 x = lm_message_node_find_child(m->node, "error");
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1301 display_server_error(x);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1302 // Let's check it isn't a nickname conflict.
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1303 // XXX Note: We should handle the <conflict/> string condition.
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1304 if ((p = lm_message_node_get_attribute(x, "code")) != NULL) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1305 if (atoi(p) == 409) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1306 // 409 = conflict (nickname is in use or registered by another user)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1307 // If we are not inside this room, we should reset the nickname
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1308 GSList *room_elt = roster_find(r, jidsearch, 0);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1309 if (room_elt && !buddy_getinsideroom(room_elt->data))
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1310 buddy_setnickname(room_elt->data, NULL);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1311 }
987
f47e312560af Improve JEP22 + JEP85 support
Mikael Berthe <mikael@lilotux.net>
parents: 986
diff changeset
1312 }
f47e312560af Improve JEP22 + JEP85 support
Mikael Berthe <mikael@lilotux.net>
parents: 986
diff changeset
1313
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1314 g_free(r);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1315 return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS;
986
ed697234bd39 Chat states receival (Alexis Hildebrandt)
Mikael Berthe <mikael@lilotux.net>
parents: 977
diff changeset
1316 }
ed697234bd39 Chat states receival (Alexis Hildebrandt)
Mikael Berthe <mikael@lilotux.net>
parents: 977
diff changeset
1317
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1318 p = lm_message_node_get_child_value(m->node, "priority");
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1319 if (p && *p) bpprio = (gchar)atoi(p);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1320 else bpprio = 0;
986
ed697234bd39 Chat states receival (Alexis Hildebrandt)
Mikael Berthe <mikael@lilotux.net>
parents: 977
diff changeset
1321
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1322 ust = available;
749
6c633adaae10 Use events system for subscription requests
Mikael Berthe <mikael@lilotux.net>
parents: 745
diff changeset
1323
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1324 p = lm_message_node_get_child_value(m->node, "show");
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1325 if (p) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1326 if (!strcmp(p, "away")) ust = away;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1327 else if (!strcmp(p, "dnd")) ust = dontdisturb;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1328 else if (!strcmp(p, "xa")) ust = notavail;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1329 else if (!strcmp(p, "chat")) ust = freeforchat;
749
6c633adaae10 Use events system for subscription requests
Mikael Berthe <mikael@lilotux.net>
parents: 745
diff changeset
1330 }
6c633adaae10 Use events system for subscription requests
Mikael Berthe <mikael@lilotux.net>
parents: 745
diff changeset
1331
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1332 if (lm_message_get_sub_type(m) == LM_MESSAGE_SUB_TYPE_UNAVAILABLE)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1333 ust = offline;
749
6c633adaae10 Use events system for subscription requests
Mikael Berthe <mikael@lilotux.net>
parents: 745
diff changeset
1334
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1335 ustmsg = lm_message_node_get_child_value(m->node, "status");
749
6c633adaae10 Use events system for subscription requests
Mikael Berthe <mikael@lilotux.net>
parents: 745
diff changeset
1336
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1337 // Timestamp?
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1338 timestamp = lm_message_node_get_timestamp(m->node);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1339
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1340 if (muc_packet) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1341 // This is a MUC presence message
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1342 handle_muc_presence(from, muc_packet, r, rname,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1343 ust, ustmsg, timestamp, bpprio);
749
6c633adaae10 Use events system for subscription requests
Mikael Berthe <mikael@lilotux.net>
parents: 745
diff changeset
1344 } else {
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1345 // Not a MUC message, so this is a regular buddy...
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1346 // Call hk_statuschange() if status has changed or if the
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1347 // status message is different
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1348 const char *msg;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1349 msg = roster_getstatusmsg(r, rname);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1350 if ((ust != roster_getstatus(r, rname)) ||
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1351 (!ustmsg && msg && msg[0]) || (ustmsg && (!msg || strcmp(ustmsg, msg))))
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1352 hk_statuschange(r, rname, bpprio, timestamp, ust, ustmsg);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1353 // Presence signature processing
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1354 if (!ustmsg)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1355 ustmsg = ""; // Some clients omit the <status/> element :-(
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1356 check_signature(r, rname, lm_message_node_find_xmlns(m->node, NS_SIGNED),
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1357 ustmsg);
1128
ac9c89f6cb51 Support for invitations to muc rooms
misc@mandriva.org
parents: 1104
diff changeset
1358 }
ac9c89f6cb51 Support for invitations to muc rooms
misc@mandriva.org
parents: 1104
diff changeset
1359
1600
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
1360 //XEP-0115 Entity Capabilities
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
1361 caps = lm_message_node_find_xmlns(m->node, NS_CAPS);
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
1362 if (caps) {
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
1363 const char *ver = lm_message_node_get_attribute(caps, "ver");
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
1364 GSList *sl_buddy = NULL;
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
1365 if (rname)
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
1366 sl_buddy = roster_find(r, jidsearch, ROSTER_TYPE_USER);
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
1367 //only cache the caps if the user is on the roster
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
1368 if (sl_buddy && buddy_getonserverflag(sl_buddy->data)) {
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
1369 buddy_resource_setcaps(sl_buddy->data, rname, ver);
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
1370
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
1371 if (!caps_has_hash(ver)) {
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
1372 char *node;
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
1373 LmMessageHandler *handler;
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
1374 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
1375 LM_MESSAGE_SUB_TYPE_GET);
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
1376 node = g_strdup_printf("%s#%s",
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
1377 lm_message_node_get_attribute(caps, "node"),
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
1378 ver);
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
1379 lm_message_node_set_attributes
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
1380 (lm_message_node_add_child(iq->node, "query", NULL),
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
1381 "xmlns", NS_DISCO_INFO,
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
1382 "node", node,
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
1383 NULL);
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
1384 g_free(node);
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
1385 handler = lm_message_handler_new(cb_caps, g_strdup(ver), NULL);
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
1386 lm_connection_send_with_reply(connection, iq, handler, NULL);
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
1387 lm_message_unref(iq);
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
1388 lm_message_handler_unref(handler);
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
1389 }
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
1390 }
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
1391 }
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
1392
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1393 g_free(r);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1394 return LM_HANDLER_RESULT_REMOVE_MESSAGE;
1128
ac9c89f6cb51 Support for invitations to muc rooms
misc@mandriva.org
parents: 1104
diff changeset
1395 }
ac9c89f6cb51 Support for invitations to muc rooms
misc@mandriva.org
parents: 1104
diff changeset
1396
ac9c89f6cb51 Support for invitations to muc rooms
misc@mandriva.org
parents: 1104
diff changeset
1397
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1398 static LmHandlerResult handle_iq(LmMessageHandler *handler,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1399 LmConnection *connection,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1400 LmMessage *m, gpointer user_data)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1401 {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1402 int i;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1403 const char *xmlns = NULL;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1404 LmMessageNode *x;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1405
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1406 for (x = m->node->children; x; x=x->next) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1407 xmlns = lm_message_node_get_attribute(x, "xmlns");
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1408 if (xmlns)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1409 for (i=0; iq_handlers[i].xmlns; ++i)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1410 if (!strcmp(iq_handlers[i].xmlns, xmlns))
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1411 return iq_handlers[i].handler(NULL, connection, m, user_data);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1412 xmlns = NULL;
1128
ac9c89f6cb51 Support for invitations to muc rooms
misc@mandriva.org
parents: 1104
diff changeset
1413 }
ac9c89f6cb51 Support for invitations to muc rooms
misc@mandriva.org
parents: 1104
diff changeset
1414
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1415 if (lm_message_get_sub_type(m) == LM_MESSAGE_SUB_TYPE_ERROR) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1416 display_server_error(lm_message_node_get_child(m->node, "error"));
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1417 return LM_HANDLER_RESULT_REMOVE_MESSAGE;
1128
ac9c89f6cb51 Support for invitations to muc rooms
misc@mandriva.org
parents: 1104
diff changeset
1418 }
ac9c89f6cb51 Support for invitations to muc rooms
misc@mandriva.org
parents: 1104
diff changeset
1419
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1420 if ((lm_message_get_sub_type(m) == LM_MESSAGE_SUB_TYPE_SET) ||
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1421 (lm_message_get_sub_type(m) == LM_MESSAGE_SUB_TYPE_GET))
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1422 send_iq_error(connection, m, XMPP_ERROR_NOT_IMPLEMENTED);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1423
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1424 scr_LogPrint(LPRINT_NORMAL|LPRINT_DEBUG, "Unhandled IQ: %s",
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1425 lm_message_node_to_string(m->node));
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1426 return LM_HANDLER_RESULT_REMOVE_MESSAGE;
1128
ac9c89f6cb51 Support for invitations to muc rooms
misc@mandriva.org
parents: 1104
diff changeset
1427 }
ac9c89f6cb51 Support for invitations to muc rooms
misc@mandriva.org
parents: 1104
diff changeset
1428
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1429 static LmHandlerResult handle_s10n(LmMessageHandler *handler,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1430 LmConnection *connection,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1431 LmMessage *m, gpointer user_data)
547
1df26ff0ed8c Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents: 539
diff changeset
1432 {
611
ad737139a144 Improve subscription management
Mikael Berthe <mikael@lilotux.net>
parents: 610
diff changeset
1433 char *r;
ad737139a144 Improve subscription management
Mikael Berthe <mikael@lilotux.net>
parents: 610
diff changeset
1434 char *buf;
818
55cd45481a07 Fix a buddylist bug when receiving a subscription request
Mikael Berthe <mikael@lilotux.net>
parents: 793
diff changeset
1435 int newbuddy;
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1436 const char *from = lm_message_get_from(m);
611
ad737139a144 Improve subscription management
Mikael Berthe <mikael@lilotux.net>
parents: 610
diff changeset
1437
ad737139a144 Improve subscription management
Mikael Berthe <mikael@lilotux.net>
parents: 610
diff changeset
1438 r = jidtodisp(from);
547
1df26ff0ed8c Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents: 539
diff changeset
1439
818
55cd45481a07 Fix a buddylist bug when receiving a subscription request
Mikael Berthe <mikael@lilotux.net>
parents: 793
diff changeset
1440 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
1441
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1442 if (lm_message_get_sub_type(m) == LM_MESSAGE_SUB_TYPE_SUBSCRIBE) {
611
ad737139a144 Improve subscription management
Mikael Berthe <mikael@lilotux.net>
parents: 610
diff changeset
1443 /* The sender wishes to subscribe to our presence */
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1444 const char *msg;
547
1df26ff0ed8c Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents: 539
diff changeset
1445 int isagent;
749
6c633adaae10 Use events system for subscription requests
Mikael Berthe <mikael@lilotux.net>
parents: 745
diff changeset
1446 eviqs *evn;
611
ad737139a144 Improve subscription management
Mikael Berthe <mikael@lilotux.net>
parents: 610
diff changeset
1447
547
1df26ff0ed8c Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents: 539
diff changeset
1448 isagent = (roster_gettype(r) & ROSTER_TYPE_AGENT) != 0;
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1449 msg = lm_message_node_get_child_value(m->node, "status");
611
ad737139a144 Improve subscription management
Mikael Berthe <mikael@lilotux.net>
parents: 610
diff changeset
1450
617
d3a8b43bf9e7 Add "/authorization" command
Mikael Berthe <mikael@lilotux.net>
parents: 616
diff changeset
1451 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
1452 from);
1290
e42f48103609 Drawing the MUC nicks by a different color
Michal 'vorner' Vaner <vorner@ucw.cz>
parents: 1282
diff changeset
1453 scr_WriteIncomingMessage(r, buf, 0, HBB_PREFIX_INFO, 0);
617
d3a8b43bf9e7 Add "/authorization" command
Mikael Berthe <mikael@lilotux.net>
parents: 616
diff changeset
1454 scr_LogPrint(LPRINT_LOGNORM, "%s", buf);
d3a8b43bf9e7 Add "/authorization" command
Mikael Berthe <mikael@lilotux.net>
parents: 616
diff changeset
1455 g_free(buf);
d3a8b43bf9e7 Add "/authorization" command
Mikael Berthe <mikael@lilotux.net>
parents: 616
diff changeset
1456
611
ad737139a144 Improve subscription management
Mikael Berthe <mikael@lilotux.net>
parents: 610
diff changeset
1457 if (msg) {
772
464be13343a9 Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents: 756
diff changeset
1458 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
1459 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
1460 replace_nl_with_dots(buf);
464be13343a9 Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents: 756
diff changeset
1461 scr_LogPrint(LPRINT_LOGNORM, "%s", buf);
464be13343a9 Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents: 756
diff changeset
1462 g_free(buf);
547
1df26ff0ed8c Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents: 539
diff changeset
1463 }
611
ad737139a144 Improve subscription management
Mikael Berthe <mikael@lilotux.net>
parents: 610
diff changeset
1464
749
6c633adaae10 Use events system for subscription requests
Mikael Berthe <mikael@lilotux.net>
parents: 745
diff changeset
1465 // Create a new event item
6c633adaae10 Use events system for subscription requests
Mikael Berthe <mikael@lilotux.net>
parents: 745
diff changeset
1466 evn = evs_new(EVS_TYPE_SUBSCRIPTION, EVS_MAX_TIMEOUT);
751
4a7271e69694 Avoid reusing events ids
Mikael Berthe <mikael@lilotux.net>
parents: 749
diff changeset
1467 if (evn) {
752
d2d5ee71e68c Fix small typo
Mikael Berthe <mikael@lilotux.net>
parents: 751
diff changeset
1468 evn->callback = &evscallback_subscription;
751
4a7271e69694 Avoid reusing events ids
Mikael Berthe <mikael@lilotux.net>
parents: 749
diff changeset
1469 evn->data = g_strdup(r);
754
5b962b978573 Add event description when receiving a subscription request
Mikael Berthe <mikael@lilotux.net>
parents: 752
diff changeset
1470 evn->desc = g_strdup_printf("<%s> wants to subscribe to your "
5b962b978573 Add event description when receiving a subscription request
Mikael Berthe <mikael@lilotux.net>
parents: 752
diff changeset
1471 "presence updates", r);
751
4a7271e69694 Avoid reusing events ids
Mikael Berthe <mikael@lilotux.net>
parents: 749
diff changeset
1472 buf = g_strdup_printf("Please use /event %s accept|reject", evn->id);
4a7271e69694 Avoid reusing events ids
Mikael Berthe <mikael@lilotux.net>
parents: 749
diff changeset
1473 } else {
4a7271e69694 Avoid reusing events ids
Mikael Berthe <mikael@lilotux.net>
parents: 749
diff changeset
1474 buf = g_strdup_printf("Unable to create a new event!");
4a7271e69694 Avoid reusing events ids
Mikael Berthe <mikael@lilotux.net>
parents: 749
diff changeset
1475 }
1290
e42f48103609 Drawing the MUC nicks by a different color
Michal 'vorner' Vaner <vorner@ucw.cz>
parents: 1282
diff changeset
1476 scr_WriteIncomingMessage(r, buf, 0, HBB_PREFIX_INFO, 0);
617
d3a8b43bf9e7 Add "/authorization" command
Mikael Berthe <mikael@lilotux.net>
parents: 616
diff changeset
1477 scr_LogPrint(LPRINT_LOGNORM, "%s", buf);
611
ad737139a144 Improve subscription management
Mikael Berthe <mikael@lilotux.net>
parents: 610
diff changeset
1478 g_free(buf);
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1479 } else if (lm_message_get_sub_type(m) == LM_MESSAGE_SUB_TYPE_UNSUBSCRIBE) {
611
ad737139a144 Improve subscription management
Mikael Berthe <mikael@lilotux.net>
parents: 610
diff changeset
1480 /* The sender is unsubscribing from our presence */
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1481 xmpp_send_s10n(from, LM_MESSAGE_SUB_TYPE_UNSUBSCRIBED);
611
ad737139a144 Improve subscription management
Mikael Berthe <mikael@lilotux.net>
parents: 610
diff changeset
1482 buf = g_strdup_printf("<%s> is unsubscribing from your "
ad737139a144 Improve subscription management
Mikael Berthe <mikael@lilotux.net>
parents: 610
diff changeset
1483 "presence updates", from);
1290
e42f48103609 Drawing the MUC nicks by a different color
Michal 'vorner' Vaner <vorner@ucw.cz>
parents: 1282
diff changeset
1484 scr_WriteIncomingMessage(r, buf, 0, HBB_PREFIX_INFO, 0);
611
ad737139a144 Improve subscription management
Mikael Berthe <mikael@lilotux.net>
parents: 610
diff changeset
1485 scr_LogPrint(LPRINT_LOGNORM, "%s", buf);
ad737139a144 Improve subscription management
Mikael Berthe <mikael@lilotux.net>
parents: 610
diff changeset
1486 g_free(buf);
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1487 } else if (lm_message_get_sub_type(m) == LM_MESSAGE_SUB_TYPE_SUBSCRIBED) {
611
ad737139a144 Improve subscription management
Mikael Berthe <mikael@lilotux.net>
parents: 610
diff changeset
1488 /* The sender has allowed us to receive their presence */
ad737139a144 Improve subscription management
Mikael Berthe <mikael@lilotux.net>
parents: 610
diff changeset
1489 buf = g_strdup_printf("<%s> has allowed you to receive their "
ad737139a144 Improve subscription management
Mikael Berthe <mikael@lilotux.net>
parents: 610
diff changeset
1490 "presence updates", from);
1290
e42f48103609 Drawing the MUC nicks by a different color
Michal 'vorner' Vaner <vorner@ucw.cz>
parents: 1282
diff changeset
1491 scr_WriteIncomingMessage(r, buf, 0, HBB_PREFIX_INFO, 0);
611
ad737139a144 Improve subscription management
Mikael Berthe <mikael@lilotux.net>
parents: 610
diff changeset
1492 scr_LogPrint(LPRINT_LOGNORM, "%s", buf);
ad737139a144 Improve subscription management
Mikael Berthe <mikael@lilotux.net>
parents: 610
diff changeset
1493 g_free(buf);
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1494 } else if (lm_message_get_sub_type(m) == LM_MESSAGE_SUB_TYPE_UNSUBSCRIBED) {
611
ad737139a144 Improve subscription management
Mikael Berthe <mikael@lilotux.net>
parents: 610
diff changeset
1495 /* The subscription request has been denied or a previously-granted
ad737139a144 Improve subscription management
Mikael Berthe <mikael@lilotux.net>
parents: 610
diff changeset
1496 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
1497 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
1498 update_roster = TRUE;
611
ad737139a144 Improve subscription management
Mikael Berthe <mikael@lilotux.net>
parents: 610
diff changeset
1499 buf = g_strdup_printf("<%s> has cancelled your subscription to "
ad737139a144 Improve subscription management
Mikael Berthe <mikael@lilotux.net>
parents: 610
diff changeset
1500 "their presence updates", from);
1290
e42f48103609 Drawing the MUC nicks by a different color
Michal 'vorner' Vaner <vorner@ucw.cz>
parents: 1282
diff changeset
1501 scr_WriteIncomingMessage(r, buf, 0, HBB_PREFIX_INFO, 0);
611
ad737139a144 Improve subscription management
Mikael Berthe <mikael@lilotux.net>
parents: 610
diff changeset
1502 scr_LogPrint(LPRINT_LOGNORM, "%s", buf);
ad737139a144 Improve subscription management
Mikael Berthe <mikael@lilotux.net>
parents: 610
diff changeset
1503 g_free(buf);
603
9516db839e08 Store subscription data
Mikael Berthe <mikael@lilotux.net>
parents: 600
diff changeset
1504 } else {
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1505 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
1506 }
55cd45481a07 Fix a buddylist bug when receiving a subscription request
Mikael Berthe <mikael@lilotux.net>
parents: 793
diff changeset
1507
1010
54405d09b15a Add a call to buddylist_build()
Mikael Berthe <mikael@lilotux.net>
parents: 1008
diff changeset
1508 if (newbuddy)
818
55cd45481a07 Fix a buddylist bug when receiving a subscription request
Mikael Berthe <mikael@lilotux.net>
parents: 793
diff changeset
1509 update_roster = TRUE;
611
ad737139a144 Improve subscription management
Mikael Berthe <mikael@lilotux.net>
parents: 610
diff changeset
1510 g_free(r);
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1511 return LM_HANDLER_RESULT_REMOVE_MESSAGE;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1512 }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1513
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1514 //TODO: Use the enum of loudmouth, when it's included in the header...
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1515 typedef enum {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1516 LM_LOG_LEVEL_VERBOSE = 1 << (G_LOG_LEVEL_USER_SHIFT),
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1517 LM_LOG_LEVEL_NET = 1 << (G_LOG_LEVEL_USER_SHIFT + 1),
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1518 LM_LOG_LEVEL_PARSER = 1 << (G_LOG_LEVEL_USER_SHIFT + 2),
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1519 LM_LOG_LEVEL_SSL = 1 << (G_LOG_LEVEL_USER_SHIFT + 3),
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1520 LM_LOG_LEVEL_SASL = 1 << (G_LOG_LEVEL_USER_SHIFT + 4),
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1521 LM_LOG_LEVEL_ALL = (LM_LOG_LEVEL_NET |
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1522 LM_LOG_LEVEL_VERBOSE |
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1523 LM_LOG_LEVEL_PARSER |
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1524 LM_LOG_LEVEL_SSL |
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1525 LM_LOG_LEVEL_SASL)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1526 } LmLogLevelFlags;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1527
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1528 static void lm_debug_handler (const gchar *log_domain,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1529 GLogLevelFlags log_level,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1530 const gchar *message,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1531 gpointer user_data)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1532 {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1533 if (settings_opt_get_int("tracelog_level") != 2)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1534 return;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1535 if (message) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1536 char *msg;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1537 if (message[0] == '\n')
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1538 msg = g_strdup(&message[1]);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1539 else
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1540 msg = g_strdup(message);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1541 if (msg[strlen(msg)-1] == '\n') msg[strlen(msg)-1] = '\0';
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1542
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1543 if (log_level & LM_LOG_LEVEL_VERBOSE) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1544 scr_LogPrint(LPRINT_DEBUG, "LM-VERBOSE: %s", msg);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1545 }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1546 if ((LmLogLevelFlags)log_level & LM_LOG_LEVEL_NET) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1547 scr_LogPrint(LPRINT_DEBUG, "LM-NET: %s", msg);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1548 }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1549 else if (log_level & LM_LOG_LEVEL_PARSER) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1550 scr_LogPrint(LPRINT_DEBUG, "LM-PARSER: %s", msg);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1551 }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1552 else if (log_level & LM_LOG_LEVEL_SASL) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1553 scr_LogPrint(LPRINT_DEBUG, "LM-SASL: %s", msg);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1554 }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1555 else if (log_level & LM_LOG_LEVEL_SSL) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1556 scr_LogPrint(LPRINT_DEBUG, "LM-SSL: %s", msg);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1557 }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1558 g_free(msg);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1559 }
547
1df26ff0ed8c Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents: 539
diff changeset
1560 }
1df26ff0ed8c Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents: 539
diff changeset
1561
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1562
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1563 void xmpp_connect(void)
31
0f0fbd0c4a7f [/trunk] Changeset 47 by mikael
mikael
parents: 29
diff changeset
1564 {
1610
6db9f403f707 Replace 'username' with 'jid' in the configuration file
Mikael Berthe <mikael@lilotux.net>
parents: 1604
diff changeset
1565 const char *userjid, *password, *resource, *servername, *ssl_fpr;
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1566 char *dynresource = NULL;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1567 char fpr[16];
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1568 const char *proxy_host;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1569 const char *resource_prefix = PACKAGE_NAME;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1570 char *fjid;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1571 int ssl, tls;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1572 LmSSL *lssl;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1573 unsigned int port;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1574 unsigned int ping;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1575 LmMessageHandler *handler;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1576 GError *error = NULL;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1577
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1578 if (lconnection && lm_connection_is_open(lconnection))
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1579 xmpp_disconnect();
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1580
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1581 servername = settings_opt_get("server");
1610
6db9f403f707 Replace 'username' with 'jid' in the configuration file
Mikael Berthe <mikael@lilotux.net>
parents: 1604
diff changeset
1582 userjid = settings_opt_get("jid");
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1583 password = settings_opt_get("password");
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1584 resource = settings_opt_get("resource");
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1585 proxy_host = settings_opt_get("proxy_host");
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1586 ssl_fpr = settings_opt_get("ssl_fingerprint");
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1587
1610
6db9f403f707 Replace 'username' with 'jid' in the configuration file
Mikael Berthe <mikael@lilotux.net>
parents: 1604
diff changeset
1588 if (!userjid) {
6db9f403f707 Replace 'username' with 'jid' in the configuration file
Mikael Berthe <mikael@lilotux.net>
parents: 1604
diff changeset
1589 scr_LogPrint(LPRINT_LOGNORM, "Your JID has not been specified!");
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1590 return;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1591 }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1592 if (!password) {
1610
6db9f403f707 Replace 'username' with 'jid' in the configuration file
Mikael Berthe <mikael@lilotux.net>
parents: 1604
diff changeset
1593 scr_LogPrint(LPRINT_LOGNORM, "Your password has not been specified!");
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1594 return;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1595 }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1596
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1597 lconnection = lm_connection_new_with_context
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1598 (NULL, g_main_loop_get_context(main_loop));
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1599
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1600 g_log_set_handler("LM", LM_LOG_LEVEL_ALL, lm_debug_handler, NULL);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1601
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1602 ping = 40;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1603 if (settings_opt_get("pinginterval"))
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1604 ping = (unsigned int) settings_opt_get_int("pinginterval");
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1605 lm_connection_set_keep_alive_rate(lconnection, ping);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1606 scr_LogPrint(LPRINT_DEBUG, "Ping interval established: %d secs", ping);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1607
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1608 lm_connection_set_disconnect_function(lconnection, connection_close_cb,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1609 NULL, NULL);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1610
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1611 handler = lm_message_handler_new(handle_messages, NULL, NULL);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1612 lm_connection_register_message_handler(lconnection, handler,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1613 LM_MESSAGE_TYPE_MESSAGE,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1614 LM_HANDLER_PRIORITY_NORMAL);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1615 lm_message_handler_unref(handler);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1616
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1617 handler = lm_message_handler_new(handle_iq, NULL, NULL);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1618 lm_connection_register_message_handler(lconnection, handler,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1619 LM_MESSAGE_TYPE_IQ,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1620 LM_HANDLER_PRIORITY_NORMAL);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1621 lm_message_handler_unref(handler);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1622
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1623 handler = lm_message_handler_new(handle_presence, NULL, NULL);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1624 lm_connection_register_message_handler(lconnection, handler,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1625 LM_MESSAGE_TYPE_PRESENCE,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1626 LM_HANDLER_PRIORITY_LAST);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1627 lm_message_handler_unref(handler);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1628
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1629 handler = lm_message_handler_new(handle_s10n, NULL, NULL);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1630 lm_connection_register_message_handler(lconnection, handler,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1631 LM_MESSAGE_TYPE_PRESENCE,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1632 LM_HANDLER_PRIORITY_NORMAL);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1633 lm_message_handler_unref(handler);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1634
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1635 /* Connect to server */
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1636 scr_LogPrint(LPRINT_NORMAL|LPRINT_DEBUG, "Connecting to server: %s",
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1637 servername);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1638 if (!resource)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1639 resource = resource_prefix;
31
0f0fbd0c4a7f [/trunk] Changeset 47 by mikael
mikael
parents: 29
diff changeset
1640
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1641 if (!settings_opt_get("disable_random_resource")) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1642 #if HAVE_ARC4RANDOM
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1643 dynresource = g_strdup_printf("%s.%08x", resource, arc4random());
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1644 #else
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1645 unsigned int tab[2];
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1646 srand(time(NULL));
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1647 tab[0] = (unsigned int) (0xffff * (rand() / (RAND_MAX + 1.0)));
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1648 tab[1] = (unsigned int) (0xffff * (rand() / (RAND_MAX + 1.0)));
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1649 dynresource = g_strdup_printf("%s.%04x%04x", resource, tab[0], tab[1]);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1650 #endif
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1651 resource = dynresource;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1652 }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1653
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1654 port = (unsigned int) settings_opt_get_int("port");
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1655
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1656 if (port)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1657 scr_LogPrint(LPRINT_NORMAL|LPRINT_DEBUG, " using port %d", port);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1658 scr_LogPrint(LPRINT_NORMAL|LPRINT_DEBUG, " resource %s", resource);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1659
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1660 if (proxy_host) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1661 int proxy_port = settings_opt_get_int("proxy_port");
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1662 if (proxy_port <= 0 || proxy_port > 65535) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1663 scr_LogPrint(LPRINT_NORMAL|LPRINT_DEBUG, "Invalid proxy port: %d",
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1664 proxy_port);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1665 } else {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1666 const char *proxy_user, *proxy_pass;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1667 LmProxy *lproxy;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1668 proxy_user = settings_opt_get("proxy_user");
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1669 proxy_pass = settings_opt_get("proxy_pass");
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1670 // Proxy initialization
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1671 lproxy = lm_proxy_new_with_server(LM_PROXY_TYPE_HTTP,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1672 proxy_host, proxy_port);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1673 lm_proxy_set_username(lproxy, proxy_user);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1674 lm_proxy_set_password(lproxy, proxy_pass);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1675 lm_connection_set_proxy(lconnection, lproxy);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1676 lm_proxy_unref(lproxy);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1677 scr_LogPrint(LPRINT_NORMAL|LPRINT_DEBUG, " using proxy %s:%d",
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1678 proxy_host, proxy_port);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1679 }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1680 }
31
0f0fbd0c4a7f [/trunk] Changeset 47 by mikael
mikael
parents: 29
diff changeset
1681
1610
6db9f403f707 Replace 'username' with 'jid' in the configuration file
Mikael Berthe <mikael@lilotux.net>
parents: 1604
diff changeset
1682 fjid = compose_jid(userjid, servername, resource);
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1683 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
1684 if (servername)
6db9f403f707 Replace 'username' with 'jid' in the configuration file
Mikael Berthe <mikael@lilotux.net>
parents: 1604
diff changeset
1685 lm_connection_set_server(lconnection, servername);
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1686 #if defined(HAVE_LIBOTR)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1687 otr_init(fjid);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1688 #endif
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1689 g_free(fjid);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1690 g_free(dynresource);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1691
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1692 ssl = settings_opt_get_int("ssl");
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1693 tls = settings_opt_get_int("tls");
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1694
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1695 if (!lm_ssl_is_supported()) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1696 if (ssl || tls) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1697 scr_LogPrint(LPRINT_LOGNORM, "** Error: SSL is NOT available, "
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1698 "please recompile loudmouth with SSL enabled.");
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1699 return;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1700 }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1701 }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1702
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1703 if (ssl && tls) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1704 scr_LogPrint(LPRINT_LOGNORM, "You can only set ssl or tls, not both.");
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1705 return;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1706 }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1707
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1708 if (!port)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1709 port = (ssl ? LM_CONNECTION_DEFAULT_PORT_SSL : LM_CONNECTION_DEFAULT_PORT);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1710 lm_connection_set_port(lconnection, port);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1711 scr_LogPrint(LPRINT_LOGNORM, "Port: %i\n", port);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1712
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1713 if (ssl_fpr && (!hex_to_fingerprint(ssl_fpr, fpr))) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1714 scr_LogPrint(LPRINT_LOGNORM, "** Plese set the fingerprint in the format "
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1715 "97:5C:00:3F:1D:77:45:25:E2:C5:70:EC:83:C8:87:EE");
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1716 return;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1717 }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1718
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1719 lssl = lm_ssl_new((ssl_fpr ? fpr : NULL), ssl_cb, NULL, NULL);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1720 if (lssl) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1721 lm_ssl_use_starttls(lssl, !ssl, tls);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1722 lm_connection_set_ssl(lconnection, lssl);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1723 lm_ssl_unref(lssl);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1724 } else if (ssl || tls) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1725 scr_LogPrint(LPRINT_LOGNORM, "** Error: Couldn't create SSL struct.");
671
c5da36fd437a Do not process packet if type = 0
Mikael Berthe <mikael@lilotux.net>
parents: 668
diff changeset
1726 return;
c5da36fd437a Do not process packet if type = 0
Mikael Berthe <mikael@lilotux.net>
parents: 668
diff changeset
1727 }
c5da36fd437a Do not process packet if type = 0
Mikael Berthe <mikael@lilotux.net>
parents: 668
diff changeset
1728
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1729 if (!lm_connection_open(lconnection, connection_open_cb,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1730 NULL, FALSE, &error)) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1731 _try_to_reconnect();
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1732 scr_LogPrint(LPRINT_LOGNORM, "Failed to open: %s\n", error->message);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1733 }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1734 }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1735
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1736 // insert_entity_capabilities(presence_stanza)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1737 // Entity Capabilities (XEP-0115)
1600
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
1738 static void insert_entity_capabilities(LmMessageNode *x, enum imstatus status)
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1739 {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1740 LmMessageNode *y;
1600
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
1741 const char *ver = entity_version(status);
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1742
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1743 y = lm_message_node_add_child(x, "c", NULL);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1744 lm_message_node_set_attribute(y, "xmlns", NS_CAPS);
1600
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
1745 lm_message_node_set_attribute(y, "hash", "sha-1");
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1746 lm_message_node_set_attribute(y, "node", MCABBER_CAPS_NODE);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1747 lm_message_node_set_attribute(y, "ver", ver);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1748 }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1749
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1750 void xmpp_disconnect(void)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1751 {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1752 if (!lconnection || !lm_connection_is_authenticated(lconnection))
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1753 return;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1754
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1755 // Launch pre-disconnect internal hook
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1756 hook_execute_internal("hook-pre-disconnect");
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1757 // Announce it to everyone else
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1758 xmpp_setstatus(offline, NULL, "", FALSE);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1759 lm_connection_close(lconnection, NULL);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1760 }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1761
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1762 void xmpp_setstatus(enum imstatus st, const char *recipient, const char *msg,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1763 int do_not_sign)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1764 {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1765 LmMessage *m;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1766
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1767 if (msg) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1768 // The status message has been specified. We'll use it, unless it is
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1769 // "-" which is a special case (option meaning "no status message").
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1770 if (!strcmp(msg, "-"))
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1771 msg = "";
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1772 } else {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1773 // No status message specified; we'll use:
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1774 // a) the default status message (if provided by the user);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1775 // b) the current status message;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1776 // c) no status message (i.e. an empty one).
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1777 msg = settings_get_status_msg(st);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1778 if (!msg) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1779 if (mystatusmsg)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1780 msg = mystatusmsg;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1781 else
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1782 msg = "";
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1783 }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1784 }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1785
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1786 // Only send the packet if we're online.
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1787 // (But we want to update internal status even when disconnected,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1788 // in order to avoid some problems during network failures)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1789 if (lm_connection_is_authenticated(lconnection)) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1790 const char *s_msg = (st != invisible ? msg : NULL);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1791 m = lm_message_new_presence(st, recipient, s_msg);
1600
c5ee395fbc8c Updated Entity Capabilities support (XEP-0115)
franky
parents: 1599
diff changeset
1792 insert_entity_capabilities(m->node, st); // Entity Capabilities (XEP-0115)
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1793 #ifdef HAVE_GPGME
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1794 if (!do_not_sign && gpg_enabled()) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1795 char *signature;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1796 signature = gpg_sign(s_msg ? s_msg : "");
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1797 if (signature) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1798 LmMessageNode *y;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1799 y = lm_message_node_add_child(m->node, "x", signature);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1800 lm_message_node_set_attribute(y, "xmlns", NS_SIGNED);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1801 g_free(signature);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1802 }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1803 }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1804 #endif
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1805 lm_connection_send(lconnection, m, NULL);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1806 lm_message_unref(m);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1807 }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1808
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1809 // If we didn't change our _global_ status, we are done
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1810 if (recipient) return;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1811
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1812 if (lm_connection_is_authenticated(lconnection)) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1813 // Send presence to chatrooms
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1814 if (st != invisible) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1815 struct T_presence room_presence;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1816 room_presence.st = st;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1817 room_presence.msg = msg;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1818 foreach_buddy(ROSTER_TYPE_ROOM, &roompresence, &room_presence);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1819 }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1820
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1821 // We'll have to update the roster if we switch to/from offline because
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1822 // we don't know the presences of buddies when offline...
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1823 if (mystatus == offline || st == offline)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1824 update_roster = TRUE;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1825
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1826 hk_mystatuschange(0, mystatus, st, (st != invisible ? msg : ""));
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1827 mystatus = st;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1828 }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1829
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1830 if (st)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1831 mywantedstatus = st;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1832
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1833 if (msg != mystatusmsg) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1834 g_free(mystatusmsg);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1835 if (*msg)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1836 mystatusmsg = g_strdup(msg);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1837 else
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1838 mystatusmsg = NULL;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1839 }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1840
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1841 if (!Autoaway)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1842 update_last_use();
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1843
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1844 // Update status line
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1845 scr_UpdateMainStatus(TRUE);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1846 }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1847
547
1df26ff0ed8c Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents: 539
diff changeset
1848
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1849 enum imstatus xmpp_getstatus(void)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1850 {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1851 return mystatus;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1852 }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1853
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1854 const char *xmpp_getstatusmsg(void)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1855 {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1856 return mystatusmsg;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1857 }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1858
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1859 // xmpp_setprevstatus()
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1860 // Set previous status. This wrapper function is used after a disconnection.
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1861 void xmpp_setprevstatus(void)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1862 {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1863 xmpp_setstatus(mywantedstatus, NULL, mystatusmsg, FALSE);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1864 }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1865
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1866 // send_storage(store)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1867 // Send the node "store" to update the server.
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1868 // Note: the sender should check we're online.
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1869 void send_storage(LmMessageNode *store)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1870 {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1871 LmMessage *iq;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1872 LmMessageNode *query;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1873
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1874 if (!rosternotes) return;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1875
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1876 iq = lm_message_new_with_sub_type(NULL, LM_MESSAGE_TYPE_IQ,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1877 LM_MESSAGE_SUB_TYPE_SET);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1878 query = lm_message_node_add_child(iq->node, "query", NULL);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1879 lm_message_node_set_attribute(query, "xmlns", NS_PRIVATE);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1880 lm_message_node_insert_childnode(query, store);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1881
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1882 lm_connection_send(lconnection, iq, NULL);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1883 lm_message_unref(iq);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1884 }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1885
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1886
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1887 // xmpp_is_bookmarked(roomjid)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1888 // Return TRUE if there's a bookmark for the given jid.
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1889 guint xmpp_is_bookmarked(const char *bjid)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1890 {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1891 LmMessageNode *x;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1892
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1893 if (!bookmarks)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1894 return FALSE;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1895
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1896 // Walk through the storage bookmark tags
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1897 for (x = bookmarks->children ; x; x = x->next) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1898 // If the node is a conference item, check the jid.
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1899 if (x->name && !strcmp(x->name, "conference")) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1900 const char *fjid = lm_message_node_get_attribute(x, "jid");
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1901 if (fjid && !strcasecmp(bjid, fjid))
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1902 return TRUE;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1903 }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1904 }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1905 return FALSE;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1906 }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1907
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1908 // xmpp_get_bookmark_nick(roomjid)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1909 // Return the room nickname if it is present in a bookmark.
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1910 const char *xmpp_get_bookmark_nick(const char *bjid)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1911 {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1912 LmMessageNode *x;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1913
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1914 if (!bookmarks || !bjid)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1915 return NULL;
469
a926523d2392 Use UTF8 to handle resources and room nicknames
Mikael Berthe <mikael@lilotux.net>
parents: 468
diff changeset
1916
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1917 // Walk through the storage bookmark tags
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1918 for (x = bookmarks->children ; x; x = x->next) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1919 // If the node is a conference item, check the jid.
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1920 if (x->name && !strcmp(x->name, "conference")) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1921 const char *fjid = lm_message_node_get_attribute(x, "jid");
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1922 if (fjid && !strcasecmp(bjid, fjid))
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1923 return lm_message_node_get_child_value(x, "nick");
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1924 }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1925 }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1926 return NULL;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1927 }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1928
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1929
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1930 // xmpp_get_all_storage_bookmarks()
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1931 // Return a GSList with all storage bookmarks.
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1932 // The caller should g_free the list (not the MUC jids).
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1933 GSList *xmpp_get_all_storage_bookmarks(void)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1934 {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1935 LmMessageNode *x;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1936 GSList *sl_bookmarks = NULL;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1937
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1938 // If we have no bookmarks, probably the server doesn't support them.
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1939 if (!bookmarks)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1940 return NULL;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1941
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1942 // Walk through the storage bookmark tags
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1943 for (x = bookmarks->children ; x; x = x->next) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1944 // 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
1945 if (x->name && !strcmp(x->name, "conference")) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1946 struct bookmark *bm_elt;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1947 const char *autojoin, *name, *nick;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1948 const char *fjid = lm_message_node_get_attribute(x, "jid");
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1949 if (!fjid)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1950 continue;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1951 bm_elt = g_new0(struct bookmark, 1);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1952 bm_elt->roomjid = g_strdup(fjid);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1953 autojoin = lm_message_node_get_attribute(x, "autojoin");
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1954 nick = lm_message_node_get_attribute(x, "nick");
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1955 name = lm_message_node_get_attribute(x, "name");
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1956 if (autojoin && !strcmp(autojoin, "1"))
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1957 bm_elt->autojoin = 1;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1958 if (nick)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1959 bm_elt->nick = g_strdup(nick);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1960 if (name)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1961 bm_elt->name = g_strdup(name);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1962 sl_bookmarks = g_slist_append(sl_bookmarks, bm_elt);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1963 }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1964 }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1965 return sl_bookmarks;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1966 }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1967
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1968 // xmpp_set_storage_bookmark(roomid, name, nick, passwd, autojoin,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1969 // printstatus, autowhois)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1970 // Update the private storage bookmarks: add a conference room.
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1971 // If name is nil, we remove the bookmark.
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1972 void xmpp_set_storage_bookmark(const char *roomid, const char *name,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1973 const char *nick, const char *passwd,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1974 int autojoin, enum room_printstatus pstatus,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1975 enum room_autowhois awhois)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1976 {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1977 LmMessageNode *x;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1978 bool changed = FALSE;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1979
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1980 if (!roomid)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1981 return;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1982
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1983 // If we have no bookmarks, probably the server doesn't support them.
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1984 if (!bookmarks) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1985 scr_LogPrint(LPRINT_NORMAL,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1986 "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
1987 return;
a926523d2392 Use UTF8 to handle resources and room nicknames
Mikael Berthe <mikael@lilotux.net>
parents: 468
diff changeset
1988 }
31
0f0fbd0c4a7f [/trunk] Changeset 47 by mikael
mikael
parents: 29
diff changeset
1989
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1990 // Walk through the storage tags
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1991 for (x = bookmarks->children ; x; x = x->next) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1992 // 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
1993 if (x->name && !strcmp(x->name, "conference")) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1994 const char *fjid = lm_message_node_get_attribute(x, "jid");
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1995 if (!fjid)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1996 continue;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1997 if (!strcmp(fjid, roomid)) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1998 // 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
1999 // create a new one.
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2000 lm_message_node_hide(x);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2001 changed = TRUE;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2002 if (!name)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2003 scr_LogPrint(LPRINT_LOGNORM, "Deleting bookmark...");
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2004 }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2005 }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2006 }
31
0f0fbd0c4a7f [/trunk] Changeset 47 by mikael
mikael
parents: 29
diff changeset
2007
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2008 // 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
2009 if (name) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2010 x = lm_message_node_add_child(bookmarks, "conference", NULL);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2011 lm_message_node_set_attributes(x,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2012 "jid", roomid,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2013 "name", name,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2014 "autojoin", autojoin ? "1" : "0",
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2015 NULL);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2016 if (nick)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2017 lm_message_node_add_child(x, "nick", nick);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2018 if (passwd)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2019 lm_message_node_add_child(x, "password", passwd);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2020 if (pstatus)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2021 lm_message_node_add_child(x, "print_status", strprintstatus[pstatus]);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2022 if (awhois)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2023 lm_message_node_add_child(x, "autowhois",
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2024 (awhois == autowhois_on) ? "1" : "0");
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2025 changed = TRUE;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2026 scr_LogPrint(LPRINT_LOGNORM, "Updating bookmarks...");
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2027 }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2028
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2029 if (!changed)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2030 return;
31
0f0fbd0c4a7f [/trunk] Changeset 47 by mikael
mikael
parents: 29
diff changeset
2031
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2032 if (lm_connection_is_authenticated(lconnection))
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2033 send_storage(bookmarks);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2034 else
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2035 scr_LogPrint(LPRINT_LOGNORM,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2036 "Warning: you're not connected to the server.");
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2037 }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2038
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2039 static struct annotation *parse_storage_rosternote(LmMessageNode *notenode)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2040 {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2041 const char *p;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2042 struct annotation *note = g_new0(struct annotation, 1);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2043 p = lm_message_node_get_attribute(notenode, "cdate");
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2044 if (p)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2045 note->cdate = from_iso8601(p, 1);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2046 p = lm_message_node_get_attribute(notenode, "mdate");
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2047 if (p)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2048 note->mdate = from_iso8601(p, 1);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2049 note->text = g_strdup(lm_message_node_get_value(notenode));
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2050 note->jid = g_strdup(lm_message_node_get_attribute(notenode, "jid"));
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2051 return note;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2052 }
31
0f0fbd0c4a7f [/trunk] Changeset 47 by mikael
mikael
parents: 29
diff changeset
2053
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2054 // xmpp_get_all_storage_rosternotes()
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2055 // Return a GSList with all storage annotations.
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2056 // The caller should g_free the list and its contents.
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2057 GSList *xmpp_get_all_storage_rosternotes(void)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2058 {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2059 LmMessageNode *x;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2060 GSList *sl_notes = NULL;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2061
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2062 // If we have no rosternotes, probably the server doesn't support them.
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2063 if (!rosternotes)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2064 return NULL;
31
0f0fbd0c4a7f [/trunk] Changeset 47 by mikael
mikael
parents: 29
diff changeset
2065
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2066 // Walk through the storage rosternotes tags
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2067 for (x = rosternotes->children ; x; x = x->next) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2068 struct annotation *note;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2069
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2070 // We want a note item
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2071 if (!x->name || strcmp(x->name, "note"))
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2072 continue;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2073 // Just in case, check the jid...
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2074 if (!lm_message_node_get_attribute(x, "jid"))
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2075 continue;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2076 // Ok, let's add the note to our list
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2077 note = parse_storage_rosternote(x);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2078 sl_notes = g_slist_append(sl_notes, note);
31
0f0fbd0c4a7f [/trunk] Changeset 47 by mikael
mikael
parents: 29
diff changeset
2079 }
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2080 return sl_notes;
31
0f0fbd0c4a7f [/trunk] Changeset 47 by mikael
mikael
parents: 29
diff changeset
2081 }
0f0fbd0c4a7f [/trunk] Changeset 47 by mikael
mikael
parents: 29
diff changeset
2082
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2083 // xmpp_get_storage_rosternotes(barejid, silent)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2084 // Return the annotation associated with this jid.
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2085 // If silent is TRUE, no warning is displayed when rosternotes is disabled
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2086 // The caller should g_free the string and structure after use.
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2087 struct annotation *xmpp_get_storage_rosternotes(const char *barejid, int silent)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2088 {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2089 LmMessageNode *x;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2090
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2091 if (!barejid)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2092 return NULL;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2093
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2094 // If we have no rosternotes, probably the server doesn't support them.
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2095 if (!rosternotes) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2096 if (!silent)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2097 scr_LogPrint(LPRINT_NORMAL, "Sorry, "
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2098 "your server doesn't seem to support private storage.");
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2099 return NULL;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2100 }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2101
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2102 // Walk through the storage rosternotes tags
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2103 for (x = rosternotes->children ; x; x = x->next) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2104 const char *fjid;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2105 // We want a note item
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2106 if (!x->name || strcmp(x->name, "note"))
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2107 continue;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2108 // Just in case, check the jid...
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2109 fjid = lm_message_node_get_attribute(x, "jid");
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2110 if (fjid && !strcmp(fjid, barejid)) // We've found a note for this contact.
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2111 return parse_storage_rosternote(x);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2112 }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2113 return NULL; // No note found
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2114 }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2115
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2116 // xmpp_set_storage_rosternotes(barejid, note)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2117 // Update the private storage rosternotes: add/delete a note.
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2118 // If note is nil, we remove the existing note.
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2119 void xmpp_set_storage_rosternotes(const char *barejid, const char *note)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2120 {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2121 LmMessageNode *x;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2122 bool changed = FALSE;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2123 const char *cdate = NULL;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2124
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2125 if (!barejid)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2126 return;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2127
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2128 // If we have no rosternotes, probably the server doesn't support them.
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2129 if (!rosternotes) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2130 scr_LogPrint(LPRINT_NORMAL,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2131 "Sorry, your server doesn't seem to support private storage.");
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2132 return;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2133 }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2134
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2135 // Walk through the storage tags
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2136 for (x = rosternotes->children ; x; x = x->next) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2137 // 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
2138 if (x->name && !strcmp(x->name, "note")) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2139 const char *fjid = lm_message_node_get_attribute(x, "jid");
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2140 if (!fjid)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2141 continue;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2142 if (!strcmp(fjid, barejid)) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2143 // 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
2144 // create a new one.
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2145 cdate = lm_message_node_get_attribute(x, "cdate");
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2146 lm_message_node_hide(x);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2147 changed = TRUE;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2148 break;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2149 }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2150 }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2151 }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2152
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2153 // Let's create a node for this jid, if the note is not NULL.
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2154 if (note) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2155 char mdate[20];
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2156 time_t now;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2157 time(&now);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2158 to_iso8601(mdate, now);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2159 if (!cdate)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2160 cdate = mdate;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2161 x = lm_message_node_add_child(rosternotes, "note", note);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2162 lm_message_node_set_attributes(x,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2163 "jid", barejid,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2164 "cdate", cdate,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2165 "mdate", mdate,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2166 NULL);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2167 changed = TRUE;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2168 }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2169
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2170 if (!changed)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2171 return;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2172
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2173 if (lm_connection_is_authenticated(lconnection))
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2174 send_storage(rosternotes);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2175 else
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2176 scr_LogPrint(LPRINT_LOGNORM,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2177 "Warning: you're not connected to the server.");
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
2178 }
1599
dcd5d4c75199 Update/Add headers
Mikael Berthe <mikael@lilotux.net>
parents: 1598
diff changeset
2179
dcd5d4c75199 Update/Add headers
Mikael Berthe <mikael@lilotux.net>
parents: 1598
diff changeset
2180 /* vim: set expandtab cindent cinoptions=>2\:2(0: For Vim users... */