annotate mcabber/src/xmpp.c @ 1598:a087125d8fc8

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