author | Mikael Berthe <mikael@lilotux.net> |
Thu, 04 May 2006 18:39:25 +0200 | |
changeset 837 | 7c74eef1d0e0 |
parent 834 | 6f913f4fbb2a |
child 842 | f74c5c6d2c24 |
permissions | -rw-r--r-- |
29 | 1 |
/* |
2 |
* jabglue.c -- Jabber protocol handling |
|
393 | 3 |
* |
699 | 4 |
* Copyright (C) 2005, 2006 Mikael Berthe <bmikael@lists.lilotux.net> |
29 | 5 |
* Parts come from the centericq project: |
6 |
* Copyright (C) 2002-2005 by Konstantin Klyagin <konst@konst.org.ua> |
|
7 |
* |
|
8 |
* This program is free software; you can redistribute it and/or modify |
|
9 |
* it under the terms of the GNU General Public License as published by |
|
10 |
* the Free Software Foundation; either version 2 of the License, or (at |
|
11 |
* your option) any later version. |
|
12 |
* |
|
13 |
* This program is distributed in the hope that it will be useful, but |
|
14 |
* WITHOUT ANY WARRANTY; without even the implied warranty of |
|
15 |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|
16 |
* General Public License for more details. |
|
17 |
* |
|
18 |
* You should have received a copy of the GNU General Public License |
|
19 |
* along with this program; if not, write to the Free Software |
|
20 |
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 |
|
21 |
* USA |
|
22 |
*/ |
|
23 |
||
237 | 24 |
#define _GNU_SOURCE /* We need glibc for strptime */ |
29 | 25 |
#include "../libjabber/jabber.h" |
26 |
#include "jabglue.h" |
|
577
5c6d364130ee
Move IQ Jabber stuff to a separate file
Mikael Berthe <mikael@lilotux.net>
parents:
576
diff
changeset
|
27 |
#include "jab_priv.h" |
81 | 28 |
#include "roster.h" |
29 | 29 |
#include "screen.h" |
113 | 30 |
#include "hooks.h" |
29 | 31 |
#include "utils.h" |
294
871e53769084
Allow one status message per Jabber status
Mikael Berthe <mikael@lilotux.net>
parents:
277
diff
changeset
|
32 |
#include "settings.h" |
441
51b8f10cfeb8
Handle g_locale_from_utf8() failures
Mikael Berthe <mikael@lilotux.net>
parents:
438
diff
changeset
|
33 |
#include "hbuf.h" |
478
47cfa3779549
MUC: log join/nick/leave/topic if log_muc_conf is set
Mikael Berthe <mikael@lilotux.net>
parents:
475
diff
changeset
|
34 |
#include "histolog.h" |
837
7c74eef1d0e0
New option "muc_auto_whois"
Mikael Berthe <mikael@lilotux.net>
parents:
834
diff
changeset
|
35 |
#include "commands.h" |
29 | 36 |
|
37 |
#define JABBERPORT 5222 |
|
38 |
#define JABBERSSLPORT 5223 |
|
39 |
||
40 |
jconn jc; |
|
578 | 41 |
enum enum_jstate jstate; |
29 | 42 |
|
353
3fe43f6daa5a
Make imstatus2char a null-terminated string
Mikael Berthe <mikael@lilotux.net>
parents:
325
diff
changeset
|
43 |
char imstatus2char[imstatus_size+1] = { |
3fe43f6daa5a
Make imstatus2char a null-terminated string
Mikael Berthe <mikael@lilotux.net>
parents:
325
diff
changeset
|
44 |
'_', 'o', 'i', 'f', 'd', 'n', 'a', '\0' |
46 | 45 |
}; |
46 |
||
577
5c6d364130ee
Move IQ Jabber stuff to a separate file
Mikael Berthe <mikael@lilotux.net>
parents:
576
diff
changeset
|
47 |
static time_t LastPingTime; |
5c6d364130ee
Move IQ Jabber stuff to a separate file
Mikael Berthe <mikael@lilotux.net>
parents:
576
diff
changeset
|
48 |
static unsigned int KeepaliveDelay; |
5c6d364130ee
Move IQ Jabber stuff to a separate file
Mikael Berthe <mikael@lilotux.net>
parents:
576
diff
changeset
|
49 |
static enum imstatus mystatus = offline; |
5c6d364130ee
Move IQ Jabber stuff to a separate file
Mikael Berthe <mikael@lilotux.net>
parents:
576
diff
changeset
|
50 |
static gchar *mystatusmsg; |
5c6d364130ee
Move IQ Jabber stuff to a separate file
Mikael Berthe <mikael@lilotux.net>
parents:
576
diff
changeset
|
51 |
static unsigned char online; |
29 | 52 |
|
533
c478e8f7f074
Make some functions static
Mikael Berthe <mikael@lilotux.net>
parents:
532
diff
changeset
|
53 |
static void statehandler(jconn, int); |
c478e8f7f074
Make some functions static
Mikael Berthe <mikael@lilotux.net>
parents:
532
diff
changeset
|
54 |
static void packethandler(jconn, jpacket); |
31 | 55 |
|
374
bd5638c21834
Improve logging system (traces)
Mikael Berthe <mikael@lilotux.net>
parents:
364
diff
changeset
|
56 |
static void logger(jconn j, int io, const char *buf) |
31 | 57 |
{ |
374
bd5638c21834
Improve logging system (traces)
Mikael Berthe <mikael@lilotux.net>
parents:
364
diff
changeset
|
58 |
scr_LogPrint(LPRINT_DEBUG, "%03s: %s", ((io == 0) ? "OUT" : "IN"), buf); |
31 | 59 |
} |
60 |
||
192 | 61 |
// jidtodisp(jid) |
62 |
// Strips the resource part from the jid |
|
63 |
// The caller should g_free the result after use. |
|
577
5c6d364130ee
Move IQ Jabber stuff to a separate file
Mikael Berthe <mikael@lilotux.net>
parents:
576
diff
changeset
|
64 |
char *jidtodisp(const char *jid) |
29 | 65 |
{ |
66 |
char *ptr; |
|
165 | 67 |
char *alias; |
68 |
||
438
b44be19d6229
Handle multiple resources for the same buddy
Mikael Berthe <mikael@lilotux.net>
parents:
436
diff
changeset
|
69 |
alias = g_strdup(jid); |
165 | 70 |
|
29 | 71 |
if ((ptr = strchr(alias, '/')) != NULL) { |
72 |
*ptr = 0; |
|
73 |
} |
|
74 |
return alias; |
|
75 |
} |
|
76 |
||
298
35cda94e570d
Add /connect and /disconnect commands
Mikael Berthe <mikael@lilotux.net>
parents:
294
diff
changeset
|
77 |
char *compose_jid(const char *username, const char *servername, |
533
c478e8f7f074
Make some functions static
Mikael Berthe <mikael@lilotux.net>
parents:
532
diff
changeset
|
78 |
const char *resource) |
298
35cda94e570d
Add /connect and /disconnect commands
Mikael Berthe <mikael@lilotux.net>
parents:
294
diff
changeset
|
79 |
{ |
393 | 80 |
char *jid = g_new(char, 3 + |
81 |
strlen(username) + strlen(servername) + strlen(resource)); |
|
298
35cda94e570d
Add /connect and /disconnect commands
Mikael Berthe <mikael@lilotux.net>
parents:
294
diff
changeset
|
82 |
strcpy(jid, username); |
403
17aa60c6dc63
Allow a different server name than the jid domain name
Mikael Berthe <mikael@lilotux.net>
parents:
393
diff
changeset
|
83 |
if (!strchr(jid, '@')) { |
17aa60c6dc63
Allow a different server name than the jid domain name
Mikael Berthe <mikael@lilotux.net>
parents:
393
diff
changeset
|
84 |
strcat(jid, "@"); |
17aa60c6dc63
Allow a different server name than the jid domain name
Mikael Berthe <mikael@lilotux.net>
parents:
393
diff
changeset
|
85 |
strcat(jid, servername); |
17aa60c6dc63
Allow a different server name than the jid domain name
Mikael Berthe <mikael@lilotux.net>
parents:
393
diff
changeset
|
86 |
} |
298
35cda94e570d
Add /connect and /disconnect commands
Mikael Berthe <mikael@lilotux.net>
parents:
294
diff
changeset
|
87 |
strcat(jid, "/"); |
35cda94e570d
Add /connect and /disconnect commands
Mikael Berthe <mikael@lilotux.net>
parents:
294
diff
changeset
|
88 |
strcat(jid, resource); |
35cda94e570d
Add /connect and /disconnect commands
Mikael Berthe <mikael@lilotux.net>
parents:
294
diff
changeset
|
89 |
return jid; |
35cda94e570d
Add /connect and /disconnect commands
Mikael Berthe <mikael@lilotux.net>
parents:
294
diff
changeset
|
90 |
} |
35cda94e570d
Add /connect and /disconnect commands
Mikael Berthe <mikael@lilotux.net>
parents:
294
diff
changeset
|
91 |
|
472
75442262c082
Disable some commands when not connected
Mikael Berthe <mikael@lilotux.net>
parents:
470
diff
changeset
|
92 |
inline unsigned char jb_getonline(void) |
75442262c082
Disable some commands when not connected
Mikael Berthe <mikael@lilotux.net>
parents:
470
diff
changeset
|
93 |
{ |
75442262c082
Disable some commands when not connected
Mikael Berthe <mikael@lilotux.net>
parents:
470
diff
changeset
|
94 |
return online; |
75442262c082
Disable some commands when not connected
Mikael Berthe <mikael@lilotux.net>
parents:
470
diff
changeset
|
95 |
} |
75442262c082
Disable some commands when not connected
Mikael Berthe <mikael@lilotux.net>
parents:
470
diff
changeset
|
96 |
|
403
17aa60c6dc63
Allow a different server name than the jid domain name
Mikael Berthe <mikael@lilotux.net>
parents:
393
diff
changeset
|
97 |
jconn jb_connect(const char *jid, const char *server, unsigned int port, |
17aa60c6dc63
Allow a different server name than the jid domain name
Mikael Berthe <mikael@lilotux.net>
parents:
393
diff
changeset
|
98 |
int ssl, const char *pass) |
29 | 99 |
{ |
100 |
if (!port) { |
|
101 |
if (ssl) |
|
102 |
port = JABBERSSLPORT; |
|
103 |
else |
|
104 |
port = JABBERPORT; |
|
105 |
} |
|
106 |
||
357
e8adc3c96e68
Better messages for server connection states
Mikael Berthe <mikael@lilotux.net>
parents:
353
diff
changeset
|
107 |
jb_disconnect(); |
29 | 108 |
|
772
464be13343a9
Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents:
756
diff
changeset
|
109 |
if (!jid) return jc; |
469
a926523d2392
Use UTF8 to handle resources and room nicknames
Mikael Berthe <mikael@lilotux.net>
parents:
468
diff
changeset
|
110 |
|
772
464be13343a9
Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents:
756
diff
changeset
|
111 |
jc = jab_new((char*)jid, (char*)pass, (char*)server, port, ssl); |
29 | 112 |
|
298
35cda94e570d
Add /connect and /disconnect commands
Mikael Berthe <mikael@lilotux.net>
parents:
294
diff
changeset
|
113 |
/* These 3 functions can deal with a NULL jc, no worry... */ |
374
bd5638c21834
Improve logging system (traces)
Mikael Berthe <mikael@lilotux.net>
parents:
364
diff
changeset
|
114 |
jab_logger(jc, logger); |
29 | 115 |
jab_packet_handler(jc, &packethandler); |
116 |
jab_state_handler(jc, &statehandler); |
|
117 |
||
298
35cda94e570d
Add /connect and /disconnect commands
Mikael Berthe <mikael@lilotux.net>
parents:
294
diff
changeset
|
118 |
if (jc && jc->user) { |
112 | 119 |
online = TRUE; |
29 | 120 |
jstate = STATE_CONNECTING; |
121 |
statehandler(0, -1); |
|
122 |
jab_start(jc); |
|
123 |
} |
|
124 |
||
125 |
return jc; |
|
126 |
} |
|
127 |
||
128 |
void jb_disconnect(void) |
|
129 |
{ |
|
298
35cda94e570d
Add /connect and /disconnect commands
Mikael Berthe <mikael@lilotux.net>
parents:
294
diff
changeset
|
130 |
if (!jc) return; |
35cda94e570d
Add /connect and /disconnect commands
Mikael Berthe <mikael@lilotux.net>
parents:
294
diff
changeset
|
131 |
|
668
d0928694c81b
Small jb_disconnect() improvement
Mikael Berthe <mikael@lilotux.net>
parents:
655
diff
changeset
|
132 |
if (online) { |
d0928694c81b
Small jb_disconnect() improvement
Mikael Berthe <mikael@lilotux.net>
parents:
655
diff
changeset
|
133 |
// Announce it to everyone else |
d0928694c81b
Small jb_disconnect() improvement
Mikael Berthe <mikael@lilotux.net>
parents:
655
diff
changeset
|
134 |
jb_setstatus(offline, NULL, ""); |
d0928694c81b
Small jb_disconnect() improvement
Mikael Berthe <mikael@lilotux.net>
parents:
655
diff
changeset
|
135 |
// End the XML flow |
d0928694c81b
Small jb_disconnect() improvement
Mikael Berthe <mikael@lilotux.net>
parents:
655
diff
changeset
|
136 |
jb_send_raw("</stream:stream>"); |
d0928694c81b
Small jb_disconnect() improvement
Mikael Berthe <mikael@lilotux.net>
parents:
655
diff
changeset
|
137 |
} |
634
f3c05d5fe459
Send "</stream:stream>" when disconnecting from the server
Mikael Berthe <mikael@lilotux.net>
parents:
633
diff
changeset
|
138 |
|
f3c05d5fe459
Send "</stream:stream>" when disconnecting from the server
Mikael Berthe <mikael@lilotux.net>
parents:
633
diff
changeset
|
139 |
// Announce it to the user |
29 | 140 |
statehandler(jc, JCONN_STATE_OFF); |
416
48e7808c4191
Allow offline status message
Mikael Berthe <mikael@lilotux.net>
parents:
411
diff
changeset
|
141 |
|
298
35cda94e570d
Add /connect and /disconnect commands
Mikael Berthe <mikael@lilotux.net>
parents:
294
diff
changeset
|
142 |
jab_delete(jc); |
35cda94e570d
Add /connect and /disconnect commands
Mikael Berthe <mikael@lilotux.net>
parents:
294
diff
changeset
|
143 |
jc = NULL; |
29 | 144 |
} |
145 |
||
112 | 146 |
inline void jb_reset_keepalive() |
147 |
{ |
|
148 |
time(&LastPingTime); |
|
149 |
} |
|
150 |
||
436 | 151 |
void jb_send_raw(const char *str) |
152 |
{ |
|
461
1d8f5b3a5f2b
Convert /rawxml argument to UTF8
Mikael Berthe <mikael@lilotux.net>
parents:
449
diff
changeset
|
153 |
if (jc && online && str) |
436 | 154 |
jab_send_raw(jc, str); |
155 |
} |
|
156 |
||
29 | 157 |
void jb_keepalive() |
158 |
{ |
|
113 | 159 |
if (jc && online) |
112 | 160 |
jab_send_raw(jc, " \t "); |
161 |
jb_reset_keepalive(); |
|
162 |
} |
|
163 |
||
164 |
void jb_set_keepalive_delay(unsigned int delay) |
|
165 |
{ |
|
166 |
KeepaliveDelay = delay; |
|
29 | 167 |
} |
168 |
||
169 |
void jb_main() |
|
170 |
{ |
|
706
934fddc99592
Check for IQ requests timeouts
Mikael Berthe <mikael@lilotux.net>
parents:
699
diff
changeset
|
171 |
time_t now; |
756
12dc6bdff8c1
Check for events timeout
Mikael Berthe <mikael@lilotux.net>
parents:
754
diff
changeset
|
172 |
static time_t last_eviqs_check = 0; |
706
934fddc99592
Check for IQ requests timeouts
Mikael Berthe <mikael@lilotux.net>
parents:
699
diff
changeset
|
173 |
|
406 | 174 |
if (!online) { |
419 | 175 |
safe_usleep(10000); |
406 | 176 |
return; |
177 |
} |
|
164 | 178 |
|
29 | 179 |
if (jc && jc->state == JCONN_STATE_CONNECTING) { |
419 | 180 |
safe_usleep(75000); |
29 | 181 |
jab_start(jc); |
182 |
return; |
|
183 |
} |
|
184 |
||
31 | 185 |
jab_poll(jc, 50); |
29 | 186 |
|
187 |
if (jstate == STATE_CONNECTING) { |
|
188 |
if (jc) { |
|
745
413e95f3051a
Introduce user "events" list
Mikael Berthe <mikael@lilotux.net>
parents:
735
diff
changeset
|
189 |
eviqs *iqn; |
686
98de2d166a11
Use the new IQ system for authentication
Mikael Berthe <mikael@lilotux.net>
parents:
684
diff
changeset
|
190 |
xmlnode z; |
29 | 191 |
|
686
98de2d166a11
Use the new IQ system for authentication
Mikael Berthe <mikael@lilotux.net>
parents:
684
diff
changeset
|
192 |
iqn = iqs_new(JPACKET__GET, NS_AUTH, "auth", IQS_DEFAULT_TIMEOUT); |
98de2d166a11
Use the new IQ system for authentication
Mikael Berthe <mikael@lilotux.net>
parents:
684
diff
changeset
|
193 |
iqn->callback = &iqscallback_auth; |
98de2d166a11
Use the new IQ system for authentication
Mikael Berthe <mikael@lilotux.net>
parents:
684
diff
changeset
|
194 |
|
98de2d166a11
Use the new IQ system for authentication
Mikael Berthe <mikael@lilotux.net>
parents:
684
diff
changeset
|
195 |
z = xmlnode_insert_tag(xmlnode_get_tag(iqn->xmldata, "query"), |
98de2d166a11
Use the new IQ system for authentication
Mikael Berthe <mikael@lilotux.net>
parents:
684
diff
changeset
|
196 |
"username"); |
29 | 197 |
xmlnode_insert_cdata(z, jc->user->user, (unsigned) -1); |
686
98de2d166a11
Use the new IQ system for authentication
Mikael Berthe <mikael@lilotux.net>
parents:
684
diff
changeset
|
198 |
jab_send(jc, iqn->xmldata); |
29 | 199 |
|
200 |
jstate = STATE_GETAUTH; |
|
201 |
} |
|
202 |
||
203 |
if (!jc || jc->state == JCONN_STATE_OFF) { |
|
374
bd5638c21834
Improve logging system (traces)
Mikael Berthe <mikael@lilotux.net>
parents:
364
diff
changeset
|
204 |
scr_LogPrint(LPRINT_LOGNORM, "Unable to connect to the server"); |
112 | 205 |
online = FALSE; |
29 | 206 |
} |
207 |
} |
|
208 |
||
209 |
if (!jc) { |
|
210 |
statehandler(jc, JCONN_STATE_OFF); |
|
211 |
} else if (jc->state == JCONN_STATE_OFF || jc->fd == -1) { |
|
212 |
statehandler(jc, JCONN_STATE_OFF); |
|
213 |
} |
|
112 | 214 |
|
706
934fddc99592
Check for IQ requests timeouts
Mikael Berthe <mikael@lilotux.net>
parents:
699
diff
changeset
|
215 |
time(&now); |
934fddc99592
Check for IQ requests timeouts
Mikael Berthe <mikael@lilotux.net>
parents:
699
diff
changeset
|
216 |
|
756
12dc6bdff8c1
Check for events timeout
Mikael Berthe <mikael@lilotux.net>
parents:
754
diff
changeset
|
217 |
// Check for EV & IQ requests timeouts |
12dc6bdff8c1
Check for events timeout
Mikael Berthe <mikael@lilotux.net>
parents:
754
diff
changeset
|
218 |
if (now > last_eviqs_check + 20) { |
706
934fddc99592
Check for IQ requests timeouts
Mikael Berthe <mikael@lilotux.net>
parents:
699
diff
changeset
|
219 |
iqs_check_timeout(now); |
756
12dc6bdff8c1
Check for events timeout
Mikael Berthe <mikael@lilotux.net>
parents:
754
diff
changeset
|
220 |
evs_check_timeout(now); |
12dc6bdff8c1
Check for events timeout
Mikael Berthe <mikael@lilotux.net>
parents:
754
diff
changeset
|
221 |
last_eviqs_check = now; |
706
934fddc99592
Check for IQ requests timeouts
Mikael Berthe <mikael@lilotux.net>
parents:
699
diff
changeset
|
222 |
} |
934fddc99592
Check for IQ requests timeouts
Mikael Berthe <mikael@lilotux.net>
parents:
699
diff
changeset
|
223 |
|
112 | 224 |
// Keepalive |
225 |
if (KeepaliveDelay) { |
|
735 | 226 |
if (now > LastPingTime + (time_t)KeepaliveDelay) |
112 | 227 |
jb_keepalive(); |
228 |
} |
|
29 | 229 |
} |
230 |
||
116 | 231 |
inline enum imstatus jb_getstatus() |
232 |
{ |
|
233 |
return mystatus; |
|
234 |
} |
|
235 |
||
519
5c338d31de56
Show current global status message in "/status"
Mikael Berthe <mikael@lilotux.net>
parents:
513
diff
changeset
|
236 |
inline const char *jb_getstatusmsg() |
5c338d31de56
Show current global status message in "/status"
Mikael Berthe <mikael@lilotux.net>
parents:
513
diff
changeset
|
237 |
{ |
5c338d31de56
Show current global status message in "/status"
Mikael Berthe <mikael@lilotux.net>
parents:
513
diff
changeset
|
238 |
return mystatusmsg; |
5c338d31de56
Show current global status message in "/status"
Mikael Berthe <mikael@lilotux.net>
parents:
513
diff
changeset
|
239 |
} |
5c338d31de56
Show current global status message in "/status"
Mikael Berthe <mikael@lilotux.net>
parents:
513
diff
changeset
|
240 |
|
532
2ac8d8e49e81
Send status changes to chatrooms
Mikael Berthe <mikael@lilotux.net>
parents:
531
diff
changeset
|
241 |
static void roompresence(gpointer room, void *presencedata) |
2ac8d8e49e81
Send status changes to chatrooms
Mikael Berthe <mikael@lilotux.net>
parents:
531
diff
changeset
|
242 |
{ |
2ac8d8e49e81
Send status changes to chatrooms
Mikael Berthe <mikael@lilotux.net>
parents:
531
diff
changeset
|
243 |
const char *jid; |
2ac8d8e49e81
Send status changes to chatrooms
Mikael Berthe <mikael@lilotux.net>
parents:
531
diff
changeset
|
244 |
const char *nickname; |
2ac8d8e49e81
Send status changes to chatrooms
Mikael Berthe <mikael@lilotux.net>
parents:
531
diff
changeset
|
245 |
char *to; |
2ac8d8e49e81
Send status changes to chatrooms
Mikael Berthe <mikael@lilotux.net>
parents:
531
diff
changeset
|
246 |
struct T_presence *pres = presencedata; |
2ac8d8e49e81
Send status changes to chatrooms
Mikael Berthe <mikael@lilotux.net>
parents:
531
diff
changeset
|
247 |
|
652
b243d3b3ff1b
We do not need buddy_isresource() anymore
Mikael Berthe <mikael@lilotux.net>
parents:
651
diff
changeset
|
248 |
if (!buddy_getinsideroom(room)) |
532
2ac8d8e49e81
Send status changes to chatrooms
Mikael Berthe <mikael@lilotux.net>
parents:
531
diff
changeset
|
249 |
return; |
2ac8d8e49e81
Send status changes to chatrooms
Mikael Berthe <mikael@lilotux.net>
parents:
531
diff
changeset
|
250 |
|
2ac8d8e49e81
Send status changes to chatrooms
Mikael Berthe <mikael@lilotux.net>
parents:
531
diff
changeset
|
251 |
jid = buddy_getjid(room); |
2ac8d8e49e81
Send status changes to chatrooms
Mikael Berthe <mikael@lilotux.net>
parents:
531
diff
changeset
|
252 |
if (!jid) return; |
2ac8d8e49e81
Send status changes to chatrooms
Mikael Berthe <mikael@lilotux.net>
parents:
531
diff
changeset
|
253 |
nickname = buddy_getnickname(room); |
2ac8d8e49e81
Send status changes to chatrooms
Mikael Berthe <mikael@lilotux.net>
parents:
531
diff
changeset
|
254 |
if (!nickname) return; |
2ac8d8e49e81
Send status changes to chatrooms
Mikael Berthe <mikael@lilotux.net>
parents:
531
diff
changeset
|
255 |
|
2ac8d8e49e81
Send status changes to chatrooms
Mikael Berthe <mikael@lilotux.net>
parents:
531
diff
changeset
|
256 |
to = g_strdup_printf("%s/%s", jid, nickname); |
2ac8d8e49e81
Send status changes to chatrooms
Mikael Berthe <mikael@lilotux.net>
parents:
531
diff
changeset
|
257 |
jb_setstatus(pres->st, to, pres->msg); |
2ac8d8e49e81
Send status changes to chatrooms
Mikael Berthe <mikael@lilotux.net>
parents:
531
diff
changeset
|
258 |
g_free(to); |
2ac8d8e49e81
Send status changes to chatrooms
Mikael Berthe <mikael@lilotux.net>
parents:
531
diff
changeset
|
259 |
} |
2ac8d8e49e81
Send status changes to chatrooms
Mikael Berthe <mikael@lilotux.net>
parents:
531
diff
changeset
|
260 |
|
534 | 261 |
// presnew(status, recipient, message) |
262 |
// Create an xmlnode with default presence attributes |
|
263 |
// Note: the caller must free the node after use |
|
264 |
static xmlnode presnew(enum imstatus st, const char *recipient, |
|
590
a5707d61e469
Fix a few UTF-8 related issues
Mikael Berthe <mikael@lilotux.net>
parents:
589
diff
changeset
|
265 |
const char *msg) |
29 | 266 |
{ |
534 | 267 |
unsigned int prio; |
116 | 268 |
xmlnode x; |
269 |
||
270 |
x = jutil_presnew(JPACKET__UNKNOWN, 0, 0); |
|
29 | 271 |
|
772
464be13343a9
Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents:
756
diff
changeset
|
272 |
if (recipient) { |
464be13343a9
Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents:
756
diff
changeset
|
273 |
xmlnode_put_attrib(x, "to", recipient); |
590
a5707d61e469
Fix a few UTF-8 related issues
Mikael Berthe <mikael@lilotux.net>
parents:
589
diff
changeset
|
274 |
} |
444 | 275 |
|
29 | 276 |
switch(st) { |
277 |
case away: |
|
278 |
xmlnode_insert_cdata(xmlnode_insert_tag(x, "show"), "away", |
|
547
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
279 |
(unsigned) -1); |
29 | 280 |
break; |
281 |
||
282 |
case dontdisturb: |
|
283 |
xmlnode_insert_cdata(xmlnode_insert_tag(x, "show"), "dnd", |
|
547
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
284 |
(unsigned) -1); |
29 | 285 |
break; |
286 |
||
287 |
case freeforchat: |
|
288 |
xmlnode_insert_cdata(xmlnode_insert_tag(x, "show"), "chat", |
|
547
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
289 |
(unsigned) -1); |
29 | 290 |
break; |
291 |
||
292 |
case notavail: |
|
293 |
xmlnode_insert_cdata(xmlnode_insert_tag(x, "show"), "xa", |
|
547
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
294 |
(unsigned) -1); |
29 | 295 |
break; |
296 |
||
297 |
case invisible: |
|
298 |
xmlnode_put_attrib(x, "type", "invisible"); |
|
299 |
break; |
|
51 | 300 |
|
118 | 301 |
case offline: |
302 |
xmlnode_put_attrib(x, "type", "unavailable"); |
|
303 |
break; |
|
304 |
||
51 | 305 |
default: |
306 |
break; |
|
29 | 307 |
} |
308 |
||
531
aee9a279a0f3
Allow changing priority on the fly
Mikael Berthe <mikael@lilotux.net>
parents:
527
diff
changeset
|
309 |
prio = settings_opt_get_int("priority"); |
272 | 310 |
if (prio) { |
311 |
char strprio[8]; |
|
312 |
snprintf(strprio, 8, "%u", prio); |
|
29 | 313 |
xmlnode_insert_cdata(xmlnode_insert_tag(x, "priority"), |
534 | 314 |
strprio, (unsigned) -1); |
315 |
} |
|
316 |
||
772
464be13343a9
Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents:
756
diff
changeset
|
317 |
if (msg) |
464be13343a9
Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents:
756
diff
changeset
|
318 |
xmlnode_insert_cdata(xmlnode_insert_tag(x, "status"), msg, (unsigned) -1); |
29 | 319 |
|
534 | 320 |
return x; |
321 |
} |
|
322 |
||
323 |
void jb_setstatus(enum imstatus st, const char *recipient, const char *msg) |
|
324 |
{ |
|
325 |
xmlnode x; |
|
326 |
struct T_presence room_presence; |
|
327 |
||
328 |
if (!online) return; |
|
329 |
||
521 | 330 |
if (msg) { |
331 |
// The status message has been specified. We'll use it, unless it is |
|
332 |
// "-" which is a special case (option meaning "no status message"). |
|
333 |
if (!strcmp(msg, "-")) |
|
334 |
msg = ""; |
|
335 |
} else { |
|
336 |
// No status message specified; we'll use: |
|
337 |
// a) the default status message (if provided by the user); |
|
338 |
// b) the current status message; |
|
339 |
// c) no status message (i.e. an empty one). |
|
340 |
msg = settings_get_status_msg(st); |
|
341 |
if (!msg) { |
|
342 |
if (mystatusmsg) |
|
343 |
msg = mystatusmsg; |
|
344 |
else |
|
345 |
msg = ""; |
|
346 |
} |
|
347 |
} |
|
29 | 348 |
|
677
633a0522bd37
Using "/status invisible -" did not clear the status message
Mikael Berthe <mikael@lilotux.net>
parents:
671
diff
changeset
|
349 |
x = presnew(st, recipient, (st != invisible ? msg : NULL)); |
29 | 350 |
jab_send(jc, x); |
351 |
xmlnode_free(x); |
|
352 |
||
444 | 353 |
// If we didn't change our _global_ status, we are done |
354 |
if (recipient) return; |
|
355 |
||
532
2ac8d8e49e81
Send status changes to chatrooms
Mikael Berthe <mikael@lilotux.net>
parents:
531
diff
changeset
|
356 |
// Send presence to chatrooms |
2ac8d8e49e81
Send status changes to chatrooms
Mikael Berthe <mikael@lilotux.net>
parents:
531
diff
changeset
|
357 |
if (st != invisible) { |
2ac8d8e49e81
Send status changes to chatrooms
Mikael Berthe <mikael@lilotux.net>
parents:
531
diff
changeset
|
358 |
room_presence.st = st; |
2ac8d8e49e81
Send status changes to chatrooms
Mikael Berthe <mikael@lilotux.net>
parents:
531
diff
changeset
|
359 |
room_presence.msg = msg; |
2ac8d8e49e81
Send status changes to chatrooms
Mikael Berthe <mikael@lilotux.net>
parents:
531
diff
changeset
|
360 |
foreach_buddy(ROSTER_TYPE_ROOM, &roompresence, &room_presence); |
2ac8d8e49e81
Send status changes to chatrooms
Mikael Berthe <mikael@lilotux.net>
parents:
531
diff
changeset
|
361 |
} |
29 | 362 |
|
164 | 363 |
// We'll need to update the roster if we switch to/from offline because |
364 |
// we don't know the presences of buddies when offline... |
|
365 |
if (mystatus == offline || st == offline) |
|
366 |
update_roster = TRUE; |
|
367 |
||
677
633a0522bd37
Using "/status invisible -" did not clear the status message
Mikael Berthe <mikael@lilotux.net>
parents:
671
diff
changeset
|
368 |
hk_mystatuschange(0, mystatus, st, (st != invisible ? msg : "")); |
116 | 369 |
mystatus = st; |
521 | 370 |
if (msg != mystatusmsg) { |
774
46304b773a44
Remove useless checks before g_free() calls
Mikael Berthe <mikael@lilotux.net>
parents:
772
diff
changeset
|
371 |
g_free(mystatusmsg); |
521 | 372 |
if (*msg) |
373 |
mystatusmsg = g_strdup(msg); |
|
374 |
else |
|
375 |
mystatusmsg = NULL; |
|
376 |
} |
|
713 | 377 |
|
378 |
// Update status line |
|
724
264375fe7159
Fix a roster refresh issue
Mikael Berthe <mikael@lilotux.net>
parents:
721
diff
changeset
|
379 |
scr_UpdateMainStatus(TRUE); |
29 | 380 |
} |
381 |
||
475
fa49ac0bb8f3
Add "/room topic", and display topic changes
Mikael Berthe <mikael@lilotux.net>
parents:
474
diff
changeset
|
382 |
void jb_send_msg(const char *jid, const char *text, int type, |
fa49ac0bb8f3
Add "/room topic", and display topic changes
Mikael Berthe <mikael@lilotux.net>
parents:
474
diff
changeset
|
383 |
const char *subject) |
35 | 384 |
{ |
475
fa49ac0bb8f3
Add "/room topic", and display topic changes
Mikael Berthe <mikael@lilotux.net>
parents:
474
diff
changeset
|
385 |
xmlnode x; |
447
03bb57383cea
Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents:
444
diff
changeset
|
386 |
gchar *strtype; |
03bb57383cea
Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents:
444
diff
changeset
|
387 |
|
472
75442262c082
Disable some commands when not connected
Mikael Berthe <mikael@lilotux.net>
parents:
470
diff
changeset
|
388 |
if (!online) return; |
75442262c082
Disable some commands when not connected
Mikael Berthe <mikael@lilotux.net>
parents:
470
diff
changeset
|
389 |
|
447
03bb57383cea
Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents:
444
diff
changeset
|
390 |
if (type == ROSTER_TYPE_ROOM) |
03bb57383cea
Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents:
444
diff
changeset
|
391 |
strtype = TMSG_GROUPCHAT; |
03bb57383cea
Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents:
444
diff
changeset
|
392 |
else |
03bb57383cea
Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents:
444
diff
changeset
|
393 |
strtype = TMSG_CHAT; |
03bb57383cea
Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents:
444
diff
changeset
|
394 |
|
772
464be13343a9
Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents:
756
diff
changeset
|
395 |
x = jutil_msgnew(strtype, (char*)jid, NULL, (char*)text); |
475
fa49ac0bb8f3
Add "/room topic", and display topic changes
Mikael Berthe <mikael@lilotux.net>
parents:
474
diff
changeset
|
396 |
if (subject) { |
fa49ac0bb8f3
Add "/room topic", and display topic changes
Mikael Berthe <mikael@lilotux.net>
parents:
474
diff
changeset
|
397 |
xmlnode y; |
fa49ac0bb8f3
Add "/room topic", and display topic changes
Mikael Berthe <mikael@lilotux.net>
parents:
474
diff
changeset
|
398 |
y = xmlnode_insert_tag(x, "subject"); |
772
464be13343a9
Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents:
756
diff
changeset
|
399 |
xmlnode_insert_cdata(y, subject, (unsigned) -1); |
475
fa49ac0bb8f3
Add "/room topic", and display topic changes
Mikael Berthe <mikael@lilotux.net>
parents:
474
diff
changeset
|
400 |
} |
35 | 401 |
jab_send(jc, x); |
402 |
xmlnode_free(x); |
|
590
a5707d61e469
Fix a few UTF-8 related issues
Mikael Berthe <mikael@lilotux.net>
parents:
589
diff
changeset
|
403 |
|
114 | 404 |
jb_reset_keepalive(); |
35 | 405 |
} |
406 |
||
617
d3a8b43bf9e7
Add "/authorization" command
Mikael Berthe <mikael@lilotux.net>
parents:
616
diff
changeset
|
407 |
// jb_subscr_send_auth(jid) |
d3a8b43bf9e7
Add "/authorization" command
Mikael Berthe <mikael@lilotux.net>
parents:
616
diff
changeset
|
408 |
// Allow jid to receive our presence updates |
d3a8b43bf9e7
Add "/authorization" command
Mikael Berthe <mikael@lilotux.net>
parents:
616
diff
changeset
|
409 |
void jb_subscr_send_auth(const char *jid) |
d3a8b43bf9e7
Add "/authorization" command
Mikael Berthe <mikael@lilotux.net>
parents:
616
diff
changeset
|
410 |
{ |
d3a8b43bf9e7
Add "/authorization" command
Mikael Berthe <mikael@lilotux.net>
parents:
616
diff
changeset
|
411 |
xmlnode x; |
d3a8b43bf9e7
Add "/authorization" command
Mikael Berthe <mikael@lilotux.net>
parents:
616
diff
changeset
|
412 |
|
772
464be13343a9
Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents:
756
diff
changeset
|
413 |
x = jutil_presnew(JPACKET__SUBSCRIBED, (char *)jid, NULL); |
617
d3a8b43bf9e7
Add "/authorization" command
Mikael Berthe <mikael@lilotux.net>
parents:
616
diff
changeset
|
414 |
jab_send(jc, x); |
d3a8b43bf9e7
Add "/authorization" command
Mikael Berthe <mikael@lilotux.net>
parents:
616
diff
changeset
|
415 |
xmlnode_free(x); |
d3a8b43bf9e7
Add "/authorization" command
Mikael Berthe <mikael@lilotux.net>
parents:
616
diff
changeset
|
416 |
} |
d3a8b43bf9e7
Add "/authorization" command
Mikael Berthe <mikael@lilotux.net>
parents:
616
diff
changeset
|
417 |
|
d3a8b43bf9e7
Add "/authorization" command
Mikael Berthe <mikael@lilotux.net>
parents:
616
diff
changeset
|
418 |
// jb_subscr_cancel_auth(jid) |
d3a8b43bf9e7
Add "/authorization" command
Mikael Berthe <mikael@lilotux.net>
parents:
616
diff
changeset
|
419 |
// Cancel jid's subscription to our presence updates |
d3a8b43bf9e7
Add "/authorization" command
Mikael Berthe <mikael@lilotux.net>
parents:
616
diff
changeset
|
420 |
void jb_subscr_cancel_auth(const char *jid) |
d3a8b43bf9e7
Add "/authorization" command
Mikael Berthe <mikael@lilotux.net>
parents:
616
diff
changeset
|
421 |
{ |
d3a8b43bf9e7
Add "/authorization" command
Mikael Berthe <mikael@lilotux.net>
parents:
616
diff
changeset
|
422 |
xmlnode x; |
d3a8b43bf9e7
Add "/authorization" command
Mikael Berthe <mikael@lilotux.net>
parents:
616
diff
changeset
|
423 |
|
772
464be13343a9
Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents:
756
diff
changeset
|
424 |
x = jutil_presnew(JPACKET__UNSUBSCRIBED, (char *)jid, NULL); |
617
d3a8b43bf9e7
Add "/authorization" command
Mikael Berthe <mikael@lilotux.net>
parents:
616
diff
changeset
|
425 |
jab_send(jc, x); |
d3a8b43bf9e7
Add "/authorization" command
Mikael Berthe <mikael@lilotux.net>
parents:
616
diff
changeset
|
426 |
xmlnode_free(x); |
d3a8b43bf9e7
Add "/authorization" command
Mikael Berthe <mikael@lilotux.net>
parents:
616
diff
changeset
|
427 |
} |
d3a8b43bf9e7
Add "/authorization" command
Mikael Berthe <mikael@lilotux.net>
parents:
616
diff
changeset
|
428 |
|
d3a8b43bf9e7
Add "/authorization" command
Mikael Berthe <mikael@lilotux.net>
parents:
616
diff
changeset
|
429 |
// jb_subscr_request_auth(jid) |
d3a8b43bf9e7
Add "/authorization" command
Mikael Berthe <mikael@lilotux.net>
parents:
616
diff
changeset
|
430 |
// Request a subscription to jid's presence updates |
d3a8b43bf9e7
Add "/authorization" command
Mikael Berthe <mikael@lilotux.net>
parents:
616
diff
changeset
|
431 |
void jb_subscr_request_auth(const char *jid) |
d3a8b43bf9e7
Add "/authorization" command
Mikael Berthe <mikael@lilotux.net>
parents:
616
diff
changeset
|
432 |
{ |
d3a8b43bf9e7
Add "/authorization" command
Mikael Berthe <mikael@lilotux.net>
parents:
616
diff
changeset
|
433 |
xmlnode x; |
d3a8b43bf9e7
Add "/authorization" command
Mikael Berthe <mikael@lilotux.net>
parents:
616
diff
changeset
|
434 |
|
772
464be13343a9
Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents:
756
diff
changeset
|
435 |
x = jutil_presnew(JPACKET__SUBSCRIBE, (char *)jid, NULL); |
617
d3a8b43bf9e7
Add "/authorization" command
Mikael Berthe <mikael@lilotux.net>
parents:
616
diff
changeset
|
436 |
jab_send(jc, x); |
d3a8b43bf9e7
Add "/authorization" command
Mikael Berthe <mikael@lilotux.net>
parents:
616
diff
changeset
|
437 |
xmlnode_free(x); |
d3a8b43bf9e7
Add "/authorization" command
Mikael Berthe <mikael@lilotux.net>
parents:
616
diff
changeset
|
438 |
} |
d3a8b43bf9e7
Add "/authorization" command
Mikael Berthe <mikael@lilotux.net>
parents:
616
diff
changeset
|
439 |
|
834
6f913f4fbb2a
Use jb_subscr_ in jb_delbuddy()
Mikael Berthe <mikael@lilotux.net>
parents:
823
diff
changeset
|
440 |
// jb_subscr_request_cancel(jid) |
6f913f4fbb2a
Use jb_subscr_ in jb_delbuddy()
Mikael Berthe <mikael@lilotux.net>
parents:
823
diff
changeset
|
441 |
// Request to cancel jour subscription to jid's presence updates |
6f913f4fbb2a
Use jb_subscr_ in jb_delbuddy()
Mikael Berthe <mikael@lilotux.net>
parents:
823
diff
changeset
|
442 |
void jb_subscr_request_cancel(const char *jid) |
6f913f4fbb2a
Use jb_subscr_ in jb_delbuddy()
Mikael Berthe <mikael@lilotux.net>
parents:
823
diff
changeset
|
443 |
{ |
6f913f4fbb2a
Use jb_subscr_ in jb_delbuddy()
Mikael Berthe <mikael@lilotux.net>
parents:
823
diff
changeset
|
444 |
xmlnode x; |
6f913f4fbb2a
Use jb_subscr_ in jb_delbuddy()
Mikael Berthe <mikael@lilotux.net>
parents:
823
diff
changeset
|
445 |
|
6f913f4fbb2a
Use jb_subscr_ in jb_delbuddy()
Mikael Berthe <mikael@lilotux.net>
parents:
823
diff
changeset
|
446 |
x = jutil_presnew(JPACKET__UNSUBSCRIBE, (char *)jid, NULL); |
6f913f4fbb2a
Use jb_subscr_ in jb_delbuddy()
Mikael Berthe <mikael@lilotux.net>
parents:
823
diff
changeset
|
447 |
jab_send(jc, x); |
6f913f4fbb2a
Use jb_subscr_ in jb_delbuddy()
Mikael Berthe <mikael@lilotux.net>
parents:
823
diff
changeset
|
448 |
xmlnode_free(x); |
6f913f4fbb2a
Use jb_subscr_ in jb_delbuddy()
Mikael Berthe <mikael@lilotux.net>
parents:
823
diff
changeset
|
449 |
} |
6f913f4fbb2a
Use jb_subscr_ in jb_delbuddy()
Mikael Berthe <mikael@lilotux.net>
parents:
823
diff
changeset
|
450 |
|
213 | 451 |
// Note: the caller should check the jid is correct |
244 | 452 |
void jb_addbuddy(const char *jid, const char *name, const char *group) |
124 | 453 |
{ |
684
3282276e7413
Switch IQ packet creation to the new IQ system
Mikael Berthe <mikael@lilotux.net>
parents:
678
diff
changeset
|
454 |
xmlnode y, z; |
745
413e95f3051a
Introduce user "events" list
Mikael Berthe <mikael@lilotux.net>
parents:
735
diff
changeset
|
455 |
eviqs *iqn; |
192 | 456 |
char *cleanjid; |
124 | 457 |
|
208 | 458 |
if (!online) return; |
124 | 459 |
|
590
a5707d61e469
Fix a few UTF-8 related issues
Mikael Berthe <mikael@lilotux.net>
parents:
589
diff
changeset
|
460 |
cleanjid = jidtodisp(jid); |
a5707d61e469
Fix a few UTF-8 related issues
Mikael Berthe <mikael@lilotux.net>
parents:
589
diff
changeset
|
461 |
|
124 | 462 |
// We don't check if the jabber user already exists in the roster, |
463 |
// because it allows to re-ask for notification. |
|
464 |
||
684
3282276e7413
Switch IQ packet creation to the new IQ system
Mikael Berthe <mikael@lilotux.net>
parents:
678
diff
changeset
|
465 |
iqn = iqs_new(JPACKET__SET, NS_ROSTER, NULL, IQS_DEFAULT_TIMEOUT); |
3282276e7413
Switch IQ packet creation to the new IQ system
Mikael Berthe <mikael@lilotux.net>
parents:
678
diff
changeset
|
466 |
y = xmlnode_insert_tag(xmlnode_get_tag(iqn->xmldata, "query"), "item"); |
628
454399f026fa
Fix a bug in jb_addbuddy()
Mikael Berthe <mikael@lilotux.net>
parents:
625
diff
changeset
|
467 |
|
454399f026fa
Fix a bug in jb_addbuddy()
Mikael Berthe <mikael@lilotux.net>
parents:
625
diff
changeset
|
468 |
xmlnode_put_attrib(y, "jid", cleanjid); |
124 | 469 |
|
772
464be13343a9
Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents:
756
diff
changeset
|
470 |
if (name) |
464be13343a9
Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents:
756
diff
changeset
|
471 |
xmlnode_put_attrib(y, "name", name); |
244 | 472 |
|
124 | 473 |
if (group) { |
628
454399f026fa
Fix a bug in jb_addbuddy()
Mikael Berthe <mikael@lilotux.net>
parents:
625
diff
changeset
|
474 |
z = xmlnode_insert_tag(y, "group"); |
772
464be13343a9
Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents:
756
diff
changeset
|
475 |
xmlnode_insert_cdata(z, group, (unsigned) -1); |
124 | 476 |
} |
477 |
||
684
3282276e7413
Switch IQ packet creation to the new IQ system
Mikael Berthe <mikael@lilotux.net>
parents:
678
diff
changeset
|
478 |
jab_send(jc, iqn->xmldata); |
3282276e7413
Switch IQ packet creation to the new IQ system
Mikael Berthe <mikael@lilotux.net>
parents:
678
diff
changeset
|
479 |
iqs_del(iqn->id); // XXX |
124 | 480 |
|
617
d3a8b43bf9e7
Add "/authorization" command
Mikael Berthe <mikael@lilotux.net>
parents:
616
diff
changeset
|
481 |
jb_subscr_request_auth(cleanjid); |
612
789ec6aed764
Respect RFC 3921 order advice
Mikael Berthe <mikael@lilotux.net>
parents:
611
diff
changeset
|
482 |
|
603 | 483 |
roster_add_user(cleanjid, name, group, ROSTER_TYPE_USER, sub_pending); |
192 | 484 |
g_free(cleanjid); |
124 | 485 |
buddylist_build(); |
486 |
||
244 | 487 |
update_roster = TRUE; |
124 | 488 |
} |
489 |
||
205 | 490 |
void jb_delbuddy(const char *jid) |
491 |
{ |
|
834
6f913f4fbb2a
Use jb_subscr_ in jb_delbuddy()
Mikael Berthe <mikael@lilotux.net>
parents:
823
diff
changeset
|
492 |
xmlnode y, z; |
745
413e95f3051a
Introduce user "events" list
Mikael Berthe <mikael@lilotux.net>
parents:
735
diff
changeset
|
493 |
eviqs *iqn; |
205 | 494 |
char *cleanjid; |
495 |
||
496 |
if (!online) return; |
|
497 |
||
498 |
cleanjid = jidtodisp(jid); |
|
499 |
||
500 |
// If the current buddy is an agent, unsubscribe from it |
|
501 |
if (roster_gettype(cleanjid) == ROSTER_TYPE_AGENT) { |
|
374
bd5638c21834
Improve logging system (traces)
Mikael Berthe <mikael@lilotux.net>
parents:
364
diff
changeset
|
502 |
scr_LogPrint(LPRINT_LOGNORM, "Unregistering from the %s agent", cleanjid); |
205 | 503 |
|
684
3282276e7413
Switch IQ packet creation to the new IQ system
Mikael Berthe <mikael@lilotux.net>
parents:
678
diff
changeset
|
504 |
iqn = iqs_new(JPACKET__SET, NS_REGISTER, NULL, IQS_DEFAULT_TIMEOUT); |
3282276e7413
Switch IQ packet creation to the new IQ system
Mikael Berthe <mikael@lilotux.net>
parents:
678
diff
changeset
|
505 |
xmlnode_put_attrib(iqn->xmldata, "to", cleanjid); |
3282276e7413
Switch IQ packet creation to the new IQ system
Mikael Berthe <mikael@lilotux.net>
parents:
678
diff
changeset
|
506 |
y = xmlnode_get_tag(iqn->xmldata, "query"); |
205 | 507 |
xmlnode_insert_tag(y, "remove"); |
684
3282276e7413
Switch IQ packet creation to the new IQ system
Mikael Berthe <mikael@lilotux.net>
parents:
678
diff
changeset
|
508 |
jab_send(jc, iqn->xmldata); |
3282276e7413
Switch IQ packet creation to the new IQ system
Mikael Berthe <mikael@lilotux.net>
parents:
678
diff
changeset
|
509 |
iqs_del(iqn->id); // XXX |
205 | 510 |
} |
511 |
||
611
ad737139a144
Improve subscription management
Mikael Berthe <mikael@lilotux.net>
parents:
610
diff
changeset
|
512 |
// Cancel the subscriptions |
834
6f913f4fbb2a
Use jb_subscr_ in jb_delbuddy()
Mikael Berthe <mikael@lilotux.net>
parents:
823
diff
changeset
|
513 |
jb_subscr_cancel_auth(cleanjid); // Cancel "from" |
6f913f4fbb2a
Use jb_subscr_ in jb_delbuddy()
Mikael Berthe <mikael@lilotux.net>
parents:
823
diff
changeset
|
514 |
jb_subscr_request_cancel(cleanjid); // Cancel "to" |
205 | 515 |
|
516 |
// Ask for removal from roster |
|
684
3282276e7413
Switch IQ packet creation to the new IQ system
Mikael Berthe <mikael@lilotux.net>
parents:
678
diff
changeset
|
517 |
iqn = iqs_new(JPACKET__SET, NS_ROSTER, NULL, IQS_DEFAULT_TIMEOUT); |
3282276e7413
Switch IQ packet creation to the new IQ system
Mikael Berthe <mikael@lilotux.net>
parents:
678
diff
changeset
|
518 |
y = xmlnode_get_tag(iqn->xmldata, "query"); |
205 | 519 |
z = xmlnode_insert_tag(y, "item"); |
520 |
xmlnode_put_attrib(z, "jid", cleanjid); |
|
521 |
xmlnode_put_attrib(z, "subscription", "remove"); |
|
684
3282276e7413
Switch IQ packet creation to the new IQ system
Mikael Berthe <mikael@lilotux.net>
parents:
678
diff
changeset
|
522 |
jab_send(jc, iqn->xmldata); |
3282276e7413
Switch IQ packet creation to the new IQ system
Mikael Berthe <mikael@lilotux.net>
parents:
678
diff
changeset
|
523 |
iqs_del(iqn->id); // XXX |
205 | 524 |
|
525 |
roster_del_user(cleanjid); |
|
526 |
g_free(cleanjid); |
|
527 |
buddylist_build(); |
|
528 |
||
529 |
update_roster = TRUE; |
|
530 |
} |
|
531 |
||
208 | 532 |
void jb_updatebuddy(const char *jid, const char *name, const char *group) |
533 |
{ |
|
684
3282276e7413
Switch IQ packet creation to the new IQ system
Mikael Berthe <mikael@lilotux.net>
parents:
678
diff
changeset
|
534 |
xmlnode y; |
745
413e95f3051a
Introduce user "events" list
Mikael Berthe <mikael@lilotux.net>
parents:
735
diff
changeset
|
535 |
eviqs *iqn; |
208 | 536 |
char *cleanjid; |
537 |
||
538 |
if (!online) return; |
|
539 |
||
540 |
// XXX We should check name's and group's correctness |
|
541 |
||
542 |
cleanjid = jidtodisp(jid); |
|
543 |
||
684
3282276e7413
Switch IQ packet creation to the new IQ system
Mikael Berthe <mikael@lilotux.net>
parents:
678
diff
changeset
|
544 |
iqn = iqs_new(JPACKET__SET, NS_ROSTER, NULL, IQS_DEFAULT_TIMEOUT); |
3282276e7413
Switch IQ packet creation to the new IQ system
Mikael Berthe <mikael@lilotux.net>
parents:
678
diff
changeset
|
545 |
y = xmlnode_insert_tag(xmlnode_get_tag(iqn->xmldata, "query"), "item"); |
208 | 546 |
xmlnode_put_attrib(y, "jid", cleanjid); |
772
464be13343a9
Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents:
756
diff
changeset
|
547 |
xmlnode_put_attrib(y, "name", name); |
208 | 548 |
|
549 |
if (group) { |
|
550 |
y = xmlnode_insert_tag(y, "group"); |
|
772
464be13343a9
Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents:
756
diff
changeset
|
551 |
xmlnode_insert_cdata(y, group, (unsigned) -1); |
208 | 552 |
} |
553 |
||
684
3282276e7413
Switch IQ packet creation to the new IQ system
Mikael Berthe <mikael@lilotux.net>
parents:
678
diff
changeset
|
554 |
jab_send(jc, iqn->xmldata); |
3282276e7413
Switch IQ packet creation to the new IQ system
Mikael Berthe <mikael@lilotux.net>
parents:
678
diff
changeset
|
555 |
iqs_del(iqn->id); // XXX |
208 | 556 |
g_free(cleanjid); |
557 |
} |
|
558 |
||
693 | 559 |
void jb_request(const char *jid, enum iqreq_type reqtype) |
691
3c0a0a993de8
Implement IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents:
686
diff
changeset
|
560 |
{ |
693 | 561 |
GSList *resources; |
562 |
GSList *roster_elt; |
|
793 | 563 |
void (*request_fn)(const char *); |
564 |
const char *strreqtype; |
|
693 | 565 |
|
793 | 566 |
if (reqtype == iqreq_version) { |
567 |
request_fn = &request_version; |
|
568 |
strreqtype = "version"; |
|
569 |
} else if (reqtype == iqreq_time) { |
|
570 |
request_fn = &request_time; |
|
571 |
strreqtype = "time"; |
|
572 |
} else |
|
573 |
return; |
|
693 | 574 |
|
575 |
if (strchr(jid, '/')) { |
|
576 |
// This is a full JID |
|
793 | 577 |
(*request_fn)(jid); |
578 |
scr_LogPrint(LPRINT_NORMAL, "Sent %s request to <%s>", strreqtype, jid); |
|
693 | 579 |
return; |
580 |
} |
|
581 |
||
582 |
// The resource has not been specified |
|
583 |
roster_elt = roster_find(jid, jidsearch, ROSTER_TYPE_USER|ROSTER_TYPE_ROOM); |
|
584 |
if (!roster_elt) { |
|
695
c299035ccb9f
Fix up jb_request(), when the resource is unknown
Mikael Berthe <mikael@lilotux.net>
parents:
693
diff
changeset
|
585 |
scr_LogPrint(LPRINT_NORMAL, "No known resource for <%s>...", jid); |
793 | 586 |
(*request_fn)(jid); // Let's send a request anyway... |
587 |
scr_LogPrint(LPRINT_NORMAL, "Sent %s request to <%s>", strreqtype, jid); |
|
693 | 588 |
return; |
589 |
} |
|
590 |
||
591 |
// Send a request to each resource |
|
592 |
resources = buddy_getresources(roster_elt->data); |
|
793 | 593 |
if (!resources) { |
594 |
scr_LogPrint(LPRINT_NORMAL, "No known resource for <%s>...", jid); |
|
595 |
(*request_fn)(jid); // Let's send a request anyway... |
|
596 |
scr_LogPrint(LPRINT_NORMAL, "Sent %s request to <%s>", strreqtype, jid); |
|
597 |
} |
|
693 | 598 |
for ( ; resources ; resources = g_slist_next(resources) ) { |
599 |
gchar *fulljid; |
|
600 |
fulljid = g_strdup_printf("%s/%s", jid, (char*)resources->data); |
|
793 | 601 |
(*request_fn)(fulljid); |
602 |
scr_LogPrint(LPRINT_NORMAL, "Sent %s request to <%s>", strreqtype, fulljid); |
|
693 | 603 |
g_free(fulljid); |
604 |
} |
|
691
3c0a0a993de8
Implement IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents:
686
diff
changeset
|
605 |
} |
3c0a0a993de8
Implement IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents:
686
diff
changeset
|
606 |
|
447
03bb57383cea
Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents:
444
diff
changeset
|
607 |
// Join a MUC room |
469
a926523d2392
Use UTF8 to handle resources and room nicknames
Mikael Berthe <mikael@lilotux.net>
parents:
468
diff
changeset
|
608 |
void jb_room_join(const char *room, const char *nickname) |
447
03bb57383cea
Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents:
444
diff
changeset
|
609 |
{ |
03bb57383cea
Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents:
444
diff
changeset
|
610 |
xmlnode x, y; |
643
dd73c3dad815
Fix double UTF-8 encoding when joining a room
Mikael Berthe <mikael@lilotux.net>
parents:
642
diff
changeset
|
611 |
gchar *roomid; |
644
68fb0c1dfb15
MUC: better nickname check when entering a room
Mikael Berthe <mikael@lilotux.net>
parents:
643
diff
changeset
|
612 |
GSList *room_elt; |
447
03bb57383cea
Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents:
444
diff
changeset
|
613 |
|
472
75442262c082
Disable some commands when not connected
Mikael Berthe <mikael@lilotux.net>
parents:
470
diff
changeset
|
614 |
if (!online || !room) return; |
75442262c082
Disable some commands when not connected
Mikael Berthe <mikael@lilotux.net>
parents:
470
diff
changeset
|
615 |
if (!nickname) return; |
447
03bb57383cea
Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents:
444
diff
changeset
|
616 |
|
643
dd73c3dad815
Fix double UTF-8 encoding when joining a room
Mikael Berthe <mikael@lilotux.net>
parents:
642
diff
changeset
|
617 |
roomid = g_strdup_printf("%s/%s", room, nickname); |
469
a926523d2392
Use UTF8 to handle resources and room nicknames
Mikael Berthe <mikael@lilotux.net>
parents:
468
diff
changeset
|
618 |
if (check_jid_syntax(roomid)) { |
a926523d2392
Use UTF8 to handle resources and room nicknames
Mikael Berthe <mikael@lilotux.net>
parents:
468
diff
changeset
|
619 |
scr_LogPrint(LPRINT_NORMAL, "<%s/%s> is not a valid Jabber room", room, |
a926523d2392
Use UTF8 to handle resources and room nicknames
Mikael Berthe <mikael@lilotux.net>
parents:
468
diff
changeset
|
620 |
nickname); |
a926523d2392
Use UTF8 to handle resources and room nicknames
Mikael Berthe <mikael@lilotux.net>
parents:
468
diff
changeset
|
621 |
g_free(roomid); |
a926523d2392
Use UTF8 to handle resources and room nicknames
Mikael Berthe <mikael@lilotux.net>
parents:
468
diff
changeset
|
622 |
return; |
a926523d2392
Use UTF8 to handle resources and room nicknames
Mikael Berthe <mikael@lilotux.net>
parents:
468
diff
changeset
|
623 |
} |
a926523d2392
Use UTF8 to handle resources and room nicknames
Mikael Berthe <mikael@lilotux.net>
parents:
468
diff
changeset
|
624 |
|
644
68fb0c1dfb15
MUC: better nickname check when entering a room
Mikael Berthe <mikael@lilotux.net>
parents:
643
diff
changeset
|
625 |
room_elt = roster_find(room, jidsearch, ROSTER_TYPE_USER|ROSTER_TYPE_ROOM); |
68fb0c1dfb15
MUC: better nickname check when entering a room
Mikael Berthe <mikael@lilotux.net>
parents:
643
diff
changeset
|
626 |
// Add room if it doesn't already exist |
649
3ad6675caaf1
MUC: fix join bug when the conference is in the roster
Mikael Berthe <mikael@lilotux.net>
parents:
645
diff
changeset
|
627 |
if (!room_elt) { |
644
68fb0c1dfb15
MUC: better nickname check when entering a room
Mikael Berthe <mikael@lilotux.net>
parents:
643
diff
changeset
|
628 |
room_elt = roster_add_user(room, NULL, NULL, ROSTER_TYPE_ROOM, sub_none); |
649
3ad6675caaf1
MUC: fix join bug when the conference is in the roster
Mikael Berthe <mikael@lilotux.net>
parents:
645
diff
changeset
|
629 |
} else { |
3ad6675caaf1
MUC: fix join bug when the conference is in the roster
Mikael Berthe <mikael@lilotux.net>
parents:
645
diff
changeset
|
630 |
// Make sure this is a room (it can be a conversion user->room) |
3ad6675caaf1
MUC: fix join bug when the conference is in the roster
Mikael Berthe <mikael@lilotux.net>
parents:
645
diff
changeset
|
631 |
buddy_settype(room_elt->data, ROSTER_TYPE_ROOM); |
3ad6675caaf1
MUC: fix join bug when the conference is in the roster
Mikael Berthe <mikael@lilotux.net>
parents:
645
diff
changeset
|
632 |
} |
644
68fb0c1dfb15
MUC: better nickname check when entering a room
Mikael Berthe <mikael@lilotux.net>
parents:
643
diff
changeset
|
633 |
// If insideroom is TRUE, this is a nickname change and we don't care here |
68fb0c1dfb15
MUC: better nickname check when entering a room
Mikael Berthe <mikael@lilotux.net>
parents:
643
diff
changeset
|
634 |
if (!buddy_getinsideroom(room_elt->data)) { |
68fb0c1dfb15
MUC: better nickname check when entering a room
Mikael Berthe <mikael@lilotux.net>
parents:
643
diff
changeset
|
635 |
// We're trying to enter a room |
68fb0c1dfb15
MUC: better nickname check when entering a room
Mikael Berthe <mikael@lilotux.net>
parents:
643
diff
changeset
|
636 |
buddy_setnickname(room_elt->data, nickname); |
68fb0c1dfb15
MUC: better nickname check when entering a room
Mikael Berthe <mikael@lilotux.net>
parents:
643
diff
changeset
|
637 |
} |
68fb0c1dfb15
MUC: better nickname check when entering a room
Mikael Berthe <mikael@lilotux.net>
parents:
643
diff
changeset
|
638 |
|
469
a926523d2392
Use UTF8 to handle resources and room nicknames
Mikael Berthe <mikael@lilotux.net>
parents:
468
diff
changeset
|
639 |
// Send the XML request |
535
b407d19c39ab
Set status correctly when joining a room
Mikael Berthe <mikael@lilotux.net>
parents:
534
diff
changeset
|
640 |
x = presnew(mystatus, roomid, mystatusmsg); |
447
03bb57383cea
Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents:
444
diff
changeset
|
641 |
y = xmlnode_insert_tag(x, "x"); |
03bb57383cea
Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents:
444
diff
changeset
|
642 |
xmlnode_put_attrib(y, "xmlns", "http://jabber.org/protocol/muc"); |
03bb57383cea
Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents:
444
diff
changeset
|
643 |
|
03bb57383cea
Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents:
444
diff
changeset
|
644 |
jab_send(jc, x); |
03bb57383cea
Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents:
444
diff
changeset
|
645 |
xmlnode_free(x); |
03bb57383cea
Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents:
444
diff
changeset
|
646 |
jb_reset_keepalive(); |
469
a926523d2392
Use UTF8 to handle resources and room nicknames
Mikael Berthe <mikael@lilotux.net>
parents:
468
diff
changeset
|
647 |
g_free(roomid); |
447
03bb57383cea
Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents:
444
diff
changeset
|
648 |
} |
03bb57383cea
Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents:
444
diff
changeset
|
649 |
|
449 | 650 |
// Unlock a MUC room |
651 |
// room syntax: "room@server" |
|
652 |
void jb_room_unlock(const char *room) |
|
653 |
{ |
|
684
3282276e7413
Switch IQ packet creation to the new IQ system
Mikael Berthe <mikael@lilotux.net>
parents:
678
diff
changeset
|
654 |
xmlnode y, z; |
745
413e95f3051a
Introduce user "events" list
Mikael Berthe <mikael@lilotux.net>
parents:
735
diff
changeset
|
655 |
eviqs *iqn; |
449 | 656 |
|
472
75442262c082
Disable some commands when not connected
Mikael Berthe <mikael@lilotux.net>
parents:
470
diff
changeset
|
657 |
if (!online || !room) return; |
449 | 658 |
|
684
3282276e7413
Switch IQ packet creation to the new IQ system
Mikael Berthe <mikael@lilotux.net>
parents:
678
diff
changeset
|
659 |
iqn = iqs_new(JPACKET__SET, "http://jabber.org/protocol/muc#owner", |
3282276e7413
Switch IQ packet creation to the new IQ system
Mikael Berthe <mikael@lilotux.net>
parents:
678
diff
changeset
|
660 |
"unlock", IQS_DEFAULT_TIMEOUT); |
3282276e7413
Switch IQ packet creation to the new IQ system
Mikael Berthe <mikael@lilotux.net>
parents:
678
diff
changeset
|
661 |
xmlnode_put_attrib(iqn->xmldata, "to", room); |
3282276e7413
Switch IQ packet creation to the new IQ system
Mikael Berthe <mikael@lilotux.net>
parents:
678
diff
changeset
|
662 |
y = xmlnode_get_tag(iqn->xmldata, "query"); |
449 | 663 |
z = xmlnode_insert_tag(y, "x"); |
664 |
xmlnode_put_attrib(z, "xmlns", "jabber:x:data"); |
|
665 |
xmlnode_put_attrib(z, "type", "submit"); |
|
666 |
||
684
3282276e7413
Switch IQ packet creation to the new IQ system
Mikael Berthe <mikael@lilotux.net>
parents:
678
diff
changeset
|
667 |
jab_send(jc, iqn->xmldata); |
3282276e7413
Switch IQ packet creation to the new IQ system
Mikael Berthe <mikael@lilotux.net>
parents:
678
diff
changeset
|
668 |
iqs_del(iqn->id); // XXX |
449 | 669 |
jb_reset_keepalive(); |
670 |
} |
|
671 |
||
599 | 672 |
// Destroy a MUC room |
673 |
// room syntax: "room@server" |
|
674 |
void jb_room_destroy(const char *room, const char *venue, const char *reason) |
|
675 |
{ |
|
684
3282276e7413
Switch IQ packet creation to the new IQ system
Mikael Berthe <mikael@lilotux.net>
parents:
678
diff
changeset
|
676 |
xmlnode y, z; |
745
413e95f3051a
Introduce user "events" list
Mikael Berthe <mikael@lilotux.net>
parents:
735
diff
changeset
|
677 |
eviqs *iqn; |
599 | 678 |
|
679 |
if (!online || !room) return; |
|
680 |
||
684
3282276e7413
Switch IQ packet creation to the new IQ system
Mikael Berthe <mikael@lilotux.net>
parents:
678
diff
changeset
|
681 |
iqn = iqs_new(JPACKET__SET, "http://jabber.org/protocol/muc#owner", |
3282276e7413
Switch IQ packet creation to the new IQ system
Mikael Berthe <mikael@lilotux.net>
parents:
678
diff
changeset
|
682 |
"destroy", IQS_DEFAULT_TIMEOUT); |
3282276e7413
Switch IQ packet creation to the new IQ system
Mikael Berthe <mikael@lilotux.net>
parents:
678
diff
changeset
|
683 |
xmlnode_put_attrib(iqn->xmldata, "to", room); |
3282276e7413
Switch IQ packet creation to the new IQ system
Mikael Berthe <mikael@lilotux.net>
parents:
678
diff
changeset
|
684 |
y = xmlnode_get_tag(iqn->xmldata, "query"); |
599 | 685 |
z = xmlnode_insert_tag(y, "destroy"); |
686 |
||
687 |
if (venue && *venue) |
|
688 |
xmlnode_put_attrib(z, "jid", venue); |
|
689 |
||
690 |
if (reason) { |
|
691 |
y = xmlnode_insert_tag(z, "reason"); |
|
772
464be13343a9
Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents:
756
diff
changeset
|
692 |
xmlnode_insert_cdata(y, reason, (unsigned) -1); |
599 | 693 |
} |
694 |
||
684
3282276e7413
Switch IQ packet creation to the new IQ system
Mikael Berthe <mikael@lilotux.net>
parents:
678
diff
changeset
|
695 |
jab_send(jc, iqn->xmldata); |
3282276e7413
Switch IQ packet creation to the new IQ system
Mikael Berthe <mikael@lilotux.net>
parents:
678
diff
changeset
|
696 |
iqs_del(iqn->id); // XXX |
599 | 697 |
jb_reset_keepalive(); |
698 |
} |
|
699 |
||
584 | 700 |
// Change role or affiliation of a MUC user |
568 | 701 |
// room syntax: "room@server" |
702 |
// Either the jid or the nickname must be set (when banning, only the jid is |
|
703 |
// allowed) |
|
584 | 704 |
// ra: new role or affiliation |
705 |
// (ex. role none for kick, affil outcast for ban...) |
|
568 | 706 |
// The reason can be null |
707 |
// Return 0 if everything is ok |
|
584 | 708 |
int jb_room_setattrib(const char *roomid, const char *jid, const char *nick, |
709 |
struct role_affil ra, const char *reason) |
|
568 | 710 |
{ |
684
3282276e7413
Switch IQ packet creation to the new IQ system
Mikael Berthe <mikael@lilotux.net>
parents:
678
diff
changeset
|
711 |
xmlnode y, z; |
745
413e95f3051a
Introduce user "events" list
Mikael Berthe <mikael@lilotux.net>
parents:
735
diff
changeset
|
712 |
eviqs *iqn; |
568 | 713 |
|
714 |
if (!online || !roomid) return 1; |
|
584 | 715 |
if (!jid && !nick) return 1; |
568 | 716 |
|
717 |
if (check_jid_syntax((char*)roomid)) { |
|
718 |
scr_LogPrint(LPRINT_NORMAL, "<%s> is not a valid Jabber id", roomid); |
|
719 |
return 1; |
|
720 |
} |
|
721 |
if (jid && check_jid_syntax((char*)jid)) { |
|
722 |
scr_LogPrint(LPRINT_NORMAL, "<%s> is not a valid Jabber id", jid); |
|
723 |
return 1; |
|
724 |
} |
|
725 |
||
584 | 726 |
if (ra.type == type_affil && ra.val.affil == affil_outcast && !jid) |
572
afc2bd38b15c
Implement affiliations handling, add "/room whois"
Mikael Berthe <mikael@lilotux.net>
parents:
569
diff
changeset
|
727 |
return 1; // Shouldn't happen (jid mandatory when banning) |
568 | 728 |
|
684
3282276e7413
Switch IQ packet creation to the new IQ system
Mikael Berthe <mikael@lilotux.net>
parents:
678
diff
changeset
|
729 |
iqn = iqs_new(JPACKET__SET, "http://jabber.org/protocol/muc#admin", |
3282276e7413
Switch IQ packet creation to the new IQ system
Mikael Berthe <mikael@lilotux.net>
parents:
678
diff
changeset
|
730 |
"roleaffil", IQS_DEFAULT_TIMEOUT); |
3282276e7413
Switch IQ packet creation to the new IQ system
Mikael Berthe <mikael@lilotux.net>
parents:
678
diff
changeset
|
731 |
xmlnode_put_attrib(iqn->xmldata, "to", roomid); |
3282276e7413
Switch IQ packet creation to the new IQ system
Mikael Berthe <mikael@lilotux.net>
parents:
678
diff
changeset
|
732 |
xmlnode_put_attrib(iqn->xmldata, "type", "set"); |
3282276e7413
Switch IQ packet creation to the new IQ system
Mikael Berthe <mikael@lilotux.net>
parents:
678
diff
changeset
|
733 |
y = xmlnode_get_tag(iqn->xmldata, "query"); |
568 | 734 |
z = xmlnode_insert_tag(y, "item"); |
735 |
||
584 | 736 |
if (jid) { |
772
464be13343a9
Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents:
756
diff
changeset
|
737 |
xmlnode_put_attrib(z, "jid", jid); |
464be13343a9
Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents:
756
diff
changeset
|
738 |
} else { // nickname |
464be13343a9
Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents:
756
diff
changeset
|
739 |
xmlnode_put_attrib(z, "nick", nick); |
568 | 740 |
} |
584 | 741 |
|
742 |
if (ra.type == type_affil) |
|
743 |
xmlnode_put_attrib(z, "affiliation", straffil[ra.val.affil]); |
|
744 |
else if (ra.type == type_role) |
|
745 |
xmlnode_put_attrib(z, "role", strrole[ra.val.role]); |
|
568 | 746 |
|
747 |
if (reason) { |
|
748 |
y = xmlnode_insert_tag(z, "reason"); |
|
772
464be13343a9
Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents:
756
diff
changeset
|
749 |
xmlnode_insert_cdata(y, reason, (unsigned) -1); |
568 | 750 |
} |
751 |
||
684
3282276e7413
Switch IQ packet creation to the new IQ system
Mikael Berthe <mikael@lilotux.net>
parents:
678
diff
changeset
|
752 |
jab_send(jc, iqn->xmldata); |
3282276e7413
Switch IQ packet creation to the new IQ system
Mikael Berthe <mikael@lilotux.net>
parents:
678
diff
changeset
|
753 |
iqs_del(iqn->id); // XXX |
568 | 754 |
jb_reset_keepalive(); |
755 |
||
756 |
return 0; |
|
757 |
} |
|
486 | 758 |
|
759 |
// Invite a user to a MUC room |
|
760 |
// room syntax: "room@server" |
|
761 |
// reason can be null. |
|
762 |
void jb_room_invite(const char *room, const char *jid, const char *reason) |
|
763 |
{ |
|
764 |
xmlnode x, y, z; |
|
765 |
||
766 |
if (!online || !room || !jid) return; |
|
767 |
||
768 |
x = jutil_msgnew(NULL, (char*)room, NULL, NULL); |
|
769 |
||
770 |
y = xmlnode_insert_tag(x, "x"); |
|
771 |
xmlnode_put_attrib(y, "xmlns", "http://jabber.org/protocol/muc#user"); |
|
772 |
||
773 |
z = xmlnode_insert_tag(y, "invite"); |
|
772
464be13343a9
Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents:
756
diff
changeset
|
774 |
xmlnode_put_attrib(z, "to", jid); |
486 | 775 |
|
569
69afee8e1232
"/room invite": Do not send epty reason
Mikael Berthe <mikael@lilotux.net>
parents:
568
diff
changeset
|
776 |
if (reason) { |
69afee8e1232
"/room invite": Do not send epty reason
Mikael Berthe <mikael@lilotux.net>
parents:
568
diff
changeset
|
777 |
y = xmlnode_insert_tag(z, "reason"); |
772
464be13343a9
Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents:
756
diff
changeset
|
778 |
xmlnode_insert_cdata(y, reason, (unsigned) -1); |
569
69afee8e1232
"/room invite": Do not send epty reason
Mikael Berthe <mikael@lilotux.net>
parents:
568
diff
changeset
|
779 |
} |
486 | 780 |
|
781 |
jab_send(jc, x); |
|
782 |
xmlnode_free(x); |
|
783 |
jb_reset_keepalive(); |
|
784 |
} |
|
785 |
||
533
c478e8f7f074
Make some functions static
Mikael Berthe <mikael@lilotux.net>
parents:
532
diff
changeset
|
786 |
static void gotmessage(char *type, const char *from, const char *body, |
c478e8f7f074
Make some functions static
Mikael Berthe <mikael@lilotux.net>
parents:
532
diff
changeset
|
787 |
const char *enc, time_t timestamp) |
29 | 788 |
{ |
113 | 789 |
char *jid; |
447
03bb57383cea
Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents:
444
diff
changeset
|
790 |
const char *rname; |
29 | 791 |
|
441
51b8f10cfeb8
Handle g_locale_from_utf8() failures
Mikael Berthe <mikael@lilotux.net>
parents:
438
diff
changeset
|
792 |
jid = jidtodisp(from); |
51b8f10cfeb8
Handle g_locale_from_utf8() failures
Mikael Berthe <mikael@lilotux.net>
parents:
438
diff
changeset
|
793 |
|
447
03bb57383cea
Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents:
444
diff
changeset
|
794 |
rname = strchr(from, '/'); |
03bb57383cea
Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents:
444
diff
changeset
|
795 |
if (rname) rname++; |
819
c2d7d9dd4193
New option 'block_unsubscribed'
Mikael Berthe <mikael@lilotux.net>
parents:
818
diff
changeset
|
796 |
|
c2d7d9dd4193
New option 'block_unsubscribed'
Mikael Berthe <mikael@lilotux.net>
parents:
818
diff
changeset
|
797 |
// 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
|
798 |
// this is a regular message from an unsubscribed user. |
c2d7d9dd4193
New option 'block_unsubscribed'
Mikael Berthe <mikael@lilotux.net>
parents:
818
diff
changeset
|
799 |
if (!settings_opt_get_int("block_unsubscribed") || |
c2d7d9dd4193
New option 'block_unsubscribed'
Mikael Berthe <mikael@lilotux.net>
parents:
818
diff
changeset
|
800 |
(roster_getsubscription(jid) & sub_from) || |
c2d7d9dd4193
New option 'block_unsubscribed'
Mikael Berthe <mikael@lilotux.net>
parents:
818
diff
changeset
|
801 |
(type && strcmp(type, "chat"))) { |
c2d7d9dd4193
New option 'block_unsubscribed'
Mikael Berthe <mikael@lilotux.net>
parents:
818
diff
changeset
|
802 |
hk_message_in(jid, rname, timestamp, body, type); |
c2d7d9dd4193
New option 'block_unsubscribed'
Mikael Berthe <mikael@lilotux.net>
parents:
818
diff
changeset
|
803 |
} else { |
c2d7d9dd4193
New option 'block_unsubscribed'
Mikael Berthe <mikael@lilotux.net>
parents:
818
diff
changeset
|
804 |
scr_LogPrint(LPRINT_LOGNORM, "Blocked a message from <%s>", jid); |
c2d7d9dd4193
New option 'block_unsubscribed'
Mikael Berthe <mikael@lilotux.net>
parents:
818
diff
changeset
|
805 |
} |
192 | 806 |
g_free(jid); |
29 | 807 |
} |
808 |
||
533
c478e8f7f074
Make some functions static
Mikael Berthe <mikael@lilotux.net>
parents:
532
diff
changeset
|
809 |
static const char *defaulterrormsg(int code) |
420
04a0b450380b
Display error code/message when receiving a message packet with "error" type
Mikael Berthe <mikael@lilotux.net>
parents:
419
diff
changeset
|
810 |
{ |
04a0b450380b
Display error code/message when receiving a message packet with "error" type
Mikael Berthe <mikael@lilotux.net>
parents:
419
diff
changeset
|
811 |
const char *desc; |
04a0b450380b
Display error code/message when receiving a message packet with "error" type
Mikael Berthe <mikael@lilotux.net>
parents:
419
diff
changeset
|
812 |
|
04a0b450380b
Display error code/message when receiving a message packet with "error" type
Mikael Berthe <mikael@lilotux.net>
parents:
419
diff
changeset
|
813 |
switch(code) { |
04a0b450380b
Display error code/message when receiving a message packet with "error" type
Mikael Berthe <mikael@lilotux.net>
parents:
419
diff
changeset
|
814 |
case 401: desc = "Unauthorized"; |
04a0b450380b
Display error code/message when receiving a message packet with "error" type
Mikael Berthe <mikael@lilotux.net>
parents:
419
diff
changeset
|
815 |
break; |
04a0b450380b
Display error code/message when receiving a message packet with "error" type
Mikael Berthe <mikael@lilotux.net>
parents:
419
diff
changeset
|
816 |
case 302: desc = "Redirect"; |
04a0b450380b
Display error code/message when receiving a message packet with "error" type
Mikael Berthe <mikael@lilotux.net>
parents:
419
diff
changeset
|
817 |
break; |
04a0b450380b
Display error code/message when receiving a message packet with "error" type
Mikael Berthe <mikael@lilotux.net>
parents:
419
diff
changeset
|
818 |
case 400: desc = "Bad request"; |
04a0b450380b
Display error code/message when receiving a message packet with "error" type
Mikael Berthe <mikael@lilotux.net>
parents:
419
diff
changeset
|
819 |
break; |
04a0b450380b
Display error code/message when receiving a message packet with "error" type
Mikael Berthe <mikael@lilotux.net>
parents:
419
diff
changeset
|
820 |
case 402: desc = "Payment Required"; |
04a0b450380b
Display error code/message when receiving a message packet with "error" type
Mikael Berthe <mikael@lilotux.net>
parents:
419
diff
changeset
|
821 |
break; |
04a0b450380b
Display error code/message when receiving a message packet with "error" type
Mikael Berthe <mikael@lilotux.net>
parents:
419
diff
changeset
|
822 |
case 403: desc = "Forbidden"; |
04a0b450380b
Display error code/message when receiving a message packet with "error" type
Mikael Berthe <mikael@lilotux.net>
parents:
419
diff
changeset
|
823 |
break; |
04a0b450380b
Display error code/message when receiving a message packet with "error" type
Mikael Berthe <mikael@lilotux.net>
parents:
419
diff
changeset
|
824 |
case 404: desc = "Not Found"; |
04a0b450380b
Display error code/message when receiving a message packet with "error" type
Mikael Berthe <mikael@lilotux.net>
parents:
419
diff
changeset
|
825 |
break; |
04a0b450380b
Display error code/message when receiving a message packet with "error" type
Mikael Berthe <mikael@lilotux.net>
parents:
419
diff
changeset
|
826 |
case 405: desc = "Not Allowed"; |
04a0b450380b
Display error code/message when receiving a message packet with "error" type
Mikael Berthe <mikael@lilotux.net>
parents:
419
diff
changeset
|
827 |
break; |
04a0b450380b
Display error code/message when receiving a message packet with "error" type
Mikael Berthe <mikael@lilotux.net>
parents:
419
diff
changeset
|
828 |
case 406: desc = "Not Acceptable"; |
04a0b450380b
Display error code/message when receiving a message packet with "error" type
Mikael Berthe <mikael@lilotux.net>
parents:
419
diff
changeset
|
829 |
break; |
04a0b450380b
Display error code/message when receiving a message packet with "error" type
Mikael Berthe <mikael@lilotux.net>
parents:
419
diff
changeset
|
830 |
case 407: desc = "Registration Required"; |
04a0b450380b
Display error code/message when receiving a message packet with "error" type
Mikael Berthe <mikael@lilotux.net>
parents:
419
diff
changeset
|
831 |
break; |
04a0b450380b
Display error code/message when receiving a message packet with "error" type
Mikael Berthe <mikael@lilotux.net>
parents:
419
diff
changeset
|
832 |
case 408: desc = "Request Timeout"; |
04a0b450380b
Display error code/message when receiving a message packet with "error" type
Mikael Berthe <mikael@lilotux.net>
parents:
419
diff
changeset
|
833 |
break; |
04a0b450380b
Display error code/message when receiving a message packet with "error" type
Mikael Berthe <mikael@lilotux.net>
parents:
419
diff
changeset
|
834 |
case 409: desc = "Conflict"; |
04a0b450380b
Display error code/message when receiving a message packet with "error" type
Mikael Berthe <mikael@lilotux.net>
parents:
419
diff
changeset
|
835 |
break; |
04a0b450380b
Display error code/message when receiving a message packet with "error" type
Mikael Berthe <mikael@lilotux.net>
parents:
419
diff
changeset
|
836 |
case 500: desc = "Internal Server Error"; |
04a0b450380b
Display error code/message when receiving a message packet with "error" type
Mikael Berthe <mikael@lilotux.net>
parents:
419
diff
changeset
|
837 |
break; |
04a0b450380b
Display error code/message when receiving a message packet with "error" type
Mikael Berthe <mikael@lilotux.net>
parents:
419
diff
changeset
|
838 |
case 501: desc = "Not Implemented"; |
04a0b450380b
Display error code/message when receiving a message packet with "error" type
Mikael Berthe <mikael@lilotux.net>
parents:
419
diff
changeset
|
839 |
break; |
04a0b450380b
Display error code/message when receiving a message packet with "error" type
Mikael Berthe <mikael@lilotux.net>
parents:
419
diff
changeset
|
840 |
case 502: desc = "Remote Server Error"; |
04a0b450380b
Display error code/message when receiving a message packet with "error" type
Mikael Berthe <mikael@lilotux.net>
parents:
419
diff
changeset
|
841 |
break; |
04a0b450380b
Display error code/message when receiving a message packet with "error" type
Mikael Berthe <mikael@lilotux.net>
parents:
419
diff
changeset
|
842 |
case 503: desc = "Service Unavailable"; |
04a0b450380b
Display error code/message when receiving a message packet with "error" type
Mikael Berthe <mikael@lilotux.net>
parents:
419
diff
changeset
|
843 |
break; |
04a0b450380b
Display error code/message when receiving a message packet with "error" type
Mikael Berthe <mikael@lilotux.net>
parents:
419
diff
changeset
|
844 |
case 504: desc = "Remote Server Timeout"; |
04a0b450380b
Display error code/message when receiving a message packet with "error" type
Mikael Berthe <mikael@lilotux.net>
parents:
419
diff
changeset
|
845 |
break; |
04a0b450380b
Display error code/message when receiving a message packet with "error" type
Mikael Berthe <mikael@lilotux.net>
parents:
419
diff
changeset
|
846 |
default: |
04a0b450380b
Display error code/message when receiving a message packet with "error" type
Mikael Berthe <mikael@lilotux.net>
parents:
419
diff
changeset
|
847 |
desc = NULL; |
04a0b450380b
Display error code/message when receiving a message packet with "error" type
Mikael Berthe <mikael@lilotux.net>
parents:
419
diff
changeset
|
848 |
} |
04a0b450380b
Display error code/message when receiving a message packet with "error" type
Mikael Berthe <mikael@lilotux.net>
parents:
419
diff
changeset
|
849 |
|
04a0b450380b
Display error code/message when receiving a message packet with "error" type
Mikael Berthe <mikael@lilotux.net>
parents:
419
diff
changeset
|
850 |
return desc; |
04a0b450380b
Display error code/message when receiving a message packet with "error" type
Mikael Berthe <mikael@lilotux.net>
parents:
419
diff
changeset
|
851 |
} |
04a0b450380b
Display error code/message when receiving a message packet with "error" type
Mikael Berthe <mikael@lilotux.net>
parents:
419
diff
changeset
|
852 |
|
430
d03663d2e7d9
Display error messages as specified in RFC3920 (9.3)
Mikael Berthe <mikael@lilotux.net>
parents:
426
diff
changeset
|
853 |
// display_server_error(x) |
d03663d2e7d9
Display error messages as specified in RFC3920 (9.3)
Mikael Berthe <mikael@lilotux.net>
parents:
426
diff
changeset
|
854 |
// Display the error to the user |
d03663d2e7d9
Display error messages as specified in RFC3920 (9.3)
Mikael Berthe <mikael@lilotux.net>
parents:
426
diff
changeset
|
855 |
// x: error tag xmlnode pointer |
577
5c6d364130ee
Move IQ Jabber stuff to a separate file
Mikael Berthe <mikael@lilotux.net>
parents:
576
diff
changeset
|
856 |
void display_server_error(xmlnode x) |
426
2706ef3e25a7
Better handling of server error codes/messages
Mikael Berthe <mikael@lilotux.net>
parents:
421
diff
changeset
|
857 |
{ |
430
d03663d2e7d9
Display error messages as specified in RFC3920 (9.3)
Mikael Berthe <mikael@lilotux.net>
parents:
426
diff
changeset
|
858 |
const char *desc = NULL; |
d03663d2e7d9
Display error messages as specified in RFC3920 (9.3)
Mikael Berthe <mikael@lilotux.net>
parents:
426
diff
changeset
|
859 |
int code = 0; |
426
2706ef3e25a7
Better handling of server error codes/messages
Mikael Berthe <mikael@lilotux.net>
parents:
421
diff
changeset
|
860 |
char *s; |
430
d03663d2e7d9
Display error messages as specified in RFC3920 (9.3)
Mikael Berthe <mikael@lilotux.net>
parents:
426
diff
changeset
|
861 |
const char *p; |
426
2706ef3e25a7
Better handling of server error codes/messages
Mikael Berthe <mikael@lilotux.net>
parents:
421
diff
changeset
|
862 |
|
430
d03663d2e7d9
Display error messages as specified in RFC3920 (9.3)
Mikael Berthe <mikael@lilotux.net>
parents:
426
diff
changeset
|
863 |
/* RFC3920: |
d03663d2e7d9
Display error messages as specified in RFC3920 (9.3)
Mikael Berthe <mikael@lilotux.net>
parents:
426
diff
changeset
|
864 |
* The <error/> element: |
d03663d2e7d9
Display error messages as specified in RFC3920 (9.3)
Mikael Berthe <mikael@lilotux.net>
parents:
426
diff
changeset
|
865 |
* o MUST contain a child element corresponding to one of the defined |
d03663d2e7d9
Display error messages as specified in RFC3920 (9.3)
Mikael Berthe <mikael@lilotux.net>
parents:
426
diff
changeset
|
866 |
* stanza error conditions specified below; this element MUST be |
d03663d2e7d9
Display error messages as specified in RFC3920 (9.3)
Mikael Berthe <mikael@lilotux.net>
parents:
426
diff
changeset
|
867 |
* qualified by the 'urn:ietf:params:xml:ns:xmpp-stanzas' namespace. |
d03663d2e7d9
Display error messages as specified in RFC3920 (9.3)
Mikael Berthe <mikael@lilotux.net>
parents:
426
diff
changeset
|
868 |
*/ |
d03663d2e7d9
Display error messages as specified in RFC3920 (9.3)
Mikael Berthe <mikael@lilotux.net>
parents:
426
diff
changeset
|
869 |
p = xmlnode_get_name(xmlnode_get_firstchild(x)); |
d03663d2e7d9
Display error messages as specified in RFC3920 (9.3)
Mikael Berthe <mikael@lilotux.net>
parents:
426
diff
changeset
|
870 |
if (p) |
d03663d2e7d9
Display error messages as specified in RFC3920 (9.3)
Mikael Berthe <mikael@lilotux.net>
parents:
426
diff
changeset
|
871 |
scr_LogPrint(LPRINT_LOGNORM, "Received error packet [%s]", p); |
d03663d2e7d9
Display error messages as specified in RFC3920 (9.3)
Mikael Berthe <mikael@lilotux.net>
parents:
426
diff
changeset
|
872 |
|
d03663d2e7d9
Display error messages as specified in RFC3920 (9.3)
Mikael Berthe <mikael@lilotux.net>
parents:
426
diff
changeset
|
873 |
// For backward compatibility |
426
2706ef3e25a7
Better handling of server error codes/messages
Mikael Berthe <mikael@lilotux.net>
parents:
421
diff
changeset
|
874 |
if ((s = xmlnode_get_attrib(x, "code")) != NULL) { |
2706ef3e25a7
Better handling of server error codes/messages
Mikael Berthe <mikael@lilotux.net>
parents:
421
diff
changeset
|
875 |
code = atoi(s); |
2706ef3e25a7
Better handling of server error codes/messages
Mikael Berthe <mikael@lilotux.net>
parents:
421
diff
changeset
|
876 |
// Default message |
430
d03663d2e7d9
Display error messages as specified in RFC3920 (9.3)
Mikael Berthe <mikael@lilotux.net>
parents:
426
diff
changeset
|
877 |
desc = defaulterrormsg(code); |
d03663d2e7d9
Display error messages as specified in RFC3920 (9.3)
Mikael Berthe <mikael@lilotux.net>
parents:
426
diff
changeset
|
878 |
} |
426
2706ef3e25a7
Better handling of server error codes/messages
Mikael Berthe <mikael@lilotux.net>
parents:
421
diff
changeset
|
879 |
|
430
d03663d2e7d9
Display error messages as specified in RFC3920 (9.3)
Mikael Berthe <mikael@lilotux.net>
parents:
426
diff
changeset
|
880 |
// Error tag data is better, if available |
d03663d2e7d9
Display error messages as specified in RFC3920 (9.3)
Mikael Berthe <mikael@lilotux.net>
parents:
426
diff
changeset
|
881 |
s = xmlnode_get_data(x); |
d03663d2e7d9
Display error messages as specified in RFC3920 (9.3)
Mikael Berthe <mikael@lilotux.net>
parents:
426
diff
changeset
|
882 |
if (s && *s) desc = s; |
426
2706ef3e25a7
Better handling of server error codes/messages
Mikael Berthe <mikael@lilotux.net>
parents:
421
diff
changeset
|
883 |
|
430
d03663d2e7d9
Display error messages as specified in RFC3920 (9.3)
Mikael Berthe <mikael@lilotux.net>
parents:
426
diff
changeset
|
884 |
// And sometimes there is a text message |
d03663d2e7d9
Display error messages as specified in RFC3920 (9.3)
Mikael Berthe <mikael@lilotux.net>
parents:
426
diff
changeset
|
885 |
s = xmlnode_get_tag_data(x, "text"); |
772
464be13343a9
Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents:
756
diff
changeset
|
886 |
if (s && *s) desc = s; |
426
2706ef3e25a7
Better handling of server error codes/messages
Mikael Berthe <mikael@lilotux.net>
parents:
421
diff
changeset
|
887 |
|
430
d03663d2e7d9
Display error messages as specified in RFC3920 (9.3)
Mikael Berthe <mikael@lilotux.net>
parents:
426
diff
changeset
|
888 |
scr_LogPrint(LPRINT_LOGNORM, "Error code from server: %d %s", code, desc); |
426
2706ef3e25a7
Better handling of server error codes/messages
Mikael Berthe <mikael@lilotux.net>
parents:
421
diff
changeset
|
889 |
} |
2706ef3e25a7
Better handling of server error codes/messages
Mikael Berthe <mikael@lilotux.net>
parents:
421
diff
changeset
|
890 |
|
533
c478e8f7f074
Make some functions static
Mikael Berthe <mikael@lilotux.net>
parents:
532
diff
changeset
|
891 |
static void statehandler(jconn conn, int state) |
31 | 892 |
{ |
893 |
static int previous_state = -1; |
|
894 |
||
374
bd5638c21834
Improve logging system (traces)
Mikael Berthe <mikael@lilotux.net>
parents:
364
diff
changeset
|
895 |
scr_LogPrint(LPRINT_DEBUG, "StateHandler called (state=%d).", state); |
31 | 896 |
|
897 |
switch(state) { |
|
898 |
case JCONN_STATE_OFF: |
|
192 | 899 |
if (previous_state != JCONN_STATE_OFF) |
374
bd5638c21834
Improve logging system (traces)
Mikael Berthe <mikael@lilotux.net>
parents:
364
diff
changeset
|
900 |
scr_LogPrint(LPRINT_LOGNORM, "[Jabber] Not connected to the server"); |
37 | 901 |
|
112 | 902 |
online = FALSE; |
159 | 903 |
mystatus = offline; |
519
5c338d31de56
Show current global status message in "/status"
Mikael Berthe <mikael@lilotux.net>
parents:
513
diff
changeset
|
904 |
if (mystatusmsg) { |
5c338d31de56
Show current global status message in "/status"
Mikael Berthe <mikael@lilotux.net>
parents:
513
diff
changeset
|
905 |
g_free(mystatusmsg); |
5c338d31de56
Show current global status message in "/status"
Mikael Berthe <mikael@lilotux.net>
parents:
513
diff
changeset
|
906 |
mystatusmsg = NULL; |
5c338d31de56
Show current global status message in "/status"
Mikael Berthe <mikael@lilotux.net>
parents:
513
diff
changeset
|
907 |
} |
164 | 908 |
roster_free(); |
909 |
update_roster = TRUE; |
|
598 | 910 |
scr_ShowBuddyWindow(); |
31 | 911 |
break; |
912 |
||
913 |
case JCONN_STATE_CONNECTED: |
|
374
bd5638c21834
Improve logging system (traces)
Mikael Berthe <mikael@lilotux.net>
parents:
364
diff
changeset
|
914 |
scr_LogPrint(LPRINT_LOGNORM, "[Jabber] Connected to the server"); |
31 | 915 |
break; |
916 |
||
917 |
case JCONN_STATE_AUTH: |
|
374
bd5638c21834
Improve logging system (traces)
Mikael Berthe <mikael@lilotux.net>
parents:
364
diff
changeset
|
918 |
scr_LogPrint(LPRINT_LOGNORM, "[Jabber] Authenticating to the server"); |
31 | 919 |
break; |
920 |
||
921 |
case JCONN_STATE_ON: |
|
374
bd5638c21834
Improve logging system (traces)
Mikael Berthe <mikael@lilotux.net>
parents:
364
diff
changeset
|
922 |
scr_LogPrint(LPRINT_LOGNORM, "[Jabber] Communication with the server " |
bd5638c21834
Improve logging system (traces)
Mikael Berthe <mikael@lilotux.net>
parents:
364
diff
changeset
|
923 |
"established"); |
112 | 924 |
online = TRUE; |
31 | 925 |
break; |
926 |
||
35 | 927 |
case JCONN_STATE_CONNECTING: |
357
e8adc3c96e68
Better messages for server connection states
Mikael Berthe <mikael@lilotux.net>
parents:
353
diff
changeset
|
928 |
if (previous_state != state) |
408
73433860665c
Tune previous usleep() change
Mikael Berthe <mikael@lilotux.net>
parents:
407
diff
changeset
|
929 |
scr_LogPrint(LPRINT_LOGNORM, "[Jabber] Connecting to the server"); |
35 | 930 |
break; |
931 |
||
31 | 932 |
default: |
933 |
break; |
|
934 |
} |
|
935 |
previous_state = state; |
|
936 |
} |
|
937 |
||
644
68fb0c1dfb15
MUC: better nickname check when entering a room
Mikael Berthe <mikael@lilotux.net>
parents:
643
diff
changeset
|
938 |
inline static xmlnode xml_get_xmlns(xmlnode xmldata, const char *xmlns) |
625
028c01940490
Show presence timestamps in "/info" and "/room whois"
Mikael Berthe <mikael@lilotux.net>
parents:
624
diff
changeset
|
939 |
{ |
028c01940490
Show presence timestamps in "/info" and "/room whois"
Mikael Berthe <mikael@lilotux.net>
parents:
624
diff
changeset
|
940 |
xmlnode x; |
028c01940490
Show presence timestamps in "/info" and "/room whois"
Mikael Berthe <mikael@lilotux.net>
parents:
624
diff
changeset
|
941 |
char *p; |
028c01940490
Show presence timestamps in "/info" and "/room whois"
Mikael Berthe <mikael@lilotux.net>
parents:
624
diff
changeset
|
942 |
|
028c01940490
Show presence timestamps in "/info" and "/room whois"
Mikael Berthe <mikael@lilotux.net>
parents:
624
diff
changeset
|
943 |
x = xmlnode_get_firstchild(xmldata); |
028c01940490
Show presence timestamps in "/info" and "/room whois"
Mikael Berthe <mikael@lilotux.net>
parents:
624
diff
changeset
|
944 |
for ( ; x; x = xmlnode_get_nextsibling(x)) { |
028c01940490
Show presence timestamps in "/info" and "/room whois"
Mikael Berthe <mikael@lilotux.net>
parents:
624
diff
changeset
|
945 |
if ((p = xmlnode_get_name(x)) && !strcmp(p, "x")) |
644
68fb0c1dfb15
MUC: better nickname check when entering a room
Mikael Berthe <mikael@lilotux.net>
parents:
643
diff
changeset
|
946 |
if ((p = xmlnode_get_attrib(x, "xmlns")) && !strcmp(p, xmlns)) { |
625
028c01940490
Show presence timestamps in "/info" and "/room whois"
Mikael Berthe <mikael@lilotux.net>
parents:
624
diff
changeset
|
947 |
break; |
028c01940490
Show presence timestamps in "/info" and "/room whois"
Mikael Berthe <mikael@lilotux.net>
parents:
624
diff
changeset
|
948 |
} |
028c01940490
Show presence timestamps in "/info" and "/room whois"
Mikael Berthe <mikael@lilotux.net>
parents:
624
diff
changeset
|
949 |
} |
644
68fb0c1dfb15
MUC: better nickname check when entering a room
Mikael Berthe <mikael@lilotux.net>
parents:
643
diff
changeset
|
950 |
return x; |
68fb0c1dfb15
MUC: better nickname check when entering a room
Mikael Berthe <mikael@lilotux.net>
parents:
643
diff
changeset
|
951 |
} |
68fb0c1dfb15
MUC: better nickname check when entering a room
Mikael Berthe <mikael@lilotux.net>
parents:
643
diff
changeset
|
952 |
|
68fb0c1dfb15
MUC: better nickname check when entering a room
Mikael Berthe <mikael@lilotux.net>
parents:
643
diff
changeset
|
953 |
static time_t xml_get_timestamp(xmlnode xmldata) |
68fb0c1dfb15
MUC: better nickname check when entering a room
Mikael Berthe <mikael@lilotux.net>
parents:
643
diff
changeset
|
954 |
{ |
68fb0c1dfb15
MUC: better nickname check when entering a room
Mikael Berthe <mikael@lilotux.net>
parents:
643
diff
changeset
|
955 |
xmlnode x; |
68fb0c1dfb15
MUC: better nickname check when entering a room
Mikael Berthe <mikael@lilotux.net>
parents:
643
diff
changeset
|
956 |
char *p; |
68fb0c1dfb15
MUC: better nickname check when entering a room
Mikael Berthe <mikael@lilotux.net>
parents:
643
diff
changeset
|
957 |
|
68fb0c1dfb15
MUC: better nickname check when entering a room
Mikael Berthe <mikael@lilotux.net>
parents:
643
diff
changeset
|
958 |
x = xml_get_xmlns(xmldata, NS_DELAY); |
625
028c01940490
Show presence timestamps in "/info" and "/room whois"
Mikael Berthe <mikael@lilotux.net>
parents:
624
diff
changeset
|
959 |
if ((p = xmlnode_get_attrib(x, "stamp")) != NULL) |
028c01940490
Show presence timestamps in "/info" and "/room whois"
Mikael Berthe <mikael@lilotux.net>
parents:
624
diff
changeset
|
960 |
return from_iso8601(p, 1); |
028c01940490
Show presence timestamps in "/info" and "/room whois"
Mikael Berthe <mikael@lilotux.net>
parents:
624
diff
changeset
|
961 |
return 0; |
028c01940490
Show presence timestamps in "/info" and "/room whois"
Mikael Berthe <mikael@lilotux.net>
parents:
624
diff
changeset
|
962 |
} |
028c01940490
Show presence timestamps in "/info" and "/room whois"
Mikael Berthe <mikael@lilotux.net>
parents:
624
diff
changeset
|
963 |
|
579
0c67755e0fa7
Introduce a handle_presence_muc() function
Mikael Berthe <mikael@lilotux.net>
parents:
578
diff
changeset
|
964 |
static void handle_presence_muc(const char *from, xmlnode xmldata, |
581
ad07c868ff43
Tell the user when he or she has been kicked/banned
Mikael Berthe <mikael@lilotux.net>
parents:
580
diff
changeset
|
965 |
const char *roomjid, const char *rname, |
625
028c01940490
Show presence timestamps in "/info" and "/room whois"
Mikael Berthe <mikael@lilotux.net>
parents:
624
diff
changeset
|
966 |
enum imstatus ust, char *ustmsg, |
028c01940490
Show presence timestamps in "/info" and "/room whois"
Mikael Berthe <mikael@lilotux.net>
parents:
624
diff
changeset
|
967 |
time_t usttime, char bpprio) |
579
0c67755e0fa7
Introduce a handle_presence_muc() function
Mikael Berthe <mikael@lilotux.net>
parents:
578
diff
changeset
|
968 |
{ |
0c67755e0fa7
Introduce a handle_presence_muc() function
Mikael Berthe <mikael@lilotux.net>
parents:
578
diff
changeset
|
969 |
xmlnode y; |
0c67755e0fa7
Introduce a handle_presence_muc() function
Mikael Berthe <mikael@lilotux.net>
parents:
578
diff
changeset
|
970 |
char *p; |
0c67755e0fa7
Introduce a handle_presence_muc() function
Mikael Berthe <mikael@lilotux.net>
parents:
578
diff
changeset
|
971 |
const char *m; |
0c67755e0fa7
Introduce a handle_presence_muc() function
Mikael Berthe <mikael@lilotux.net>
parents:
578
diff
changeset
|
972 |
enum imrole mbrole = role_none; |
0c67755e0fa7
Introduce a handle_presence_muc() function
Mikael Berthe <mikael@lilotux.net>
parents:
578
diff
changeset
|
973 |
enum imaffiliation mbaffil = affil_none; |
581
ad07c868ff43
Tell the user when he or she has been kicked/banned
Mikael Berthe <mikael@lilotux.net>
parents:
580
diff
changeset
|
974 |
const char *mbjid = NULL, *mbnick = NULL; |
ad07c868ff43
Tell the user when he or she has been kicked/banned
Mikael Berthe <mikael@lilotux.net>
parents:
580
diff
changeset
|
975 |
const char *actorjid = NULL, *reason = NULL; |
837
7c74eef1d0e0
New option "muc_auto_whois"
Mikael Berthe <mikael@lilotux.net>
parents:
834
diff
changeset
|
976 |
bool new_member = FALSE; // True if somebody else joins the room (not us) |
581
ad07c868ff43
Tell the user when he or she has been kicked/banned
Mikael Berthe <mikael@lilotux.net>
parents:
580
diff
changeset
|
977 |
unsigned int statuscode = 0; |
579
0c67755e0fa7
Introduce a handle_presence_muc() function
Mikael Berthe <mikael@lilotux.net>
parents:
578
diff
changeset
|
978 |
GSList *room_elt; |
581
ad07c868ff43
Tell the user when he or she has been kicked/banned
Mikael Berthe <mikael@lilotux.net>
parents:
580
diff
changeset
|
979 |
int log_muc_conf; |
579
0c67755e0fa7
Introduce a handle_presence_muc() function
Mikael Berthe <mikael@lilotux.net>
parents:
578
diff
changeset
|
980 |
|
581
ad07c868ff43
Tell the user when he or she has been kicked/banned
Mikael Berthe <mikael@lilotux.net>
parents:
580
diff
changeset
|
981 |
log_muc_conf = settings_opt_get_int("log_muc_conf"); |
ad07c868ff43
Tell the user when he or she has been kicked/banned
Mikael Berthe <mikael@lilotux.net>
parents:
580
diff
changeset
|
982 |
|
ad07c868ff43
Tell the user when he or she has been kicked/banned
Mikael Berthe <mikael@lilotux.net>
parents:
580
diff
changeset
|
983 |
room_elt = roster_find(roomjid, jidsearch, 0); |
579
0c67755e0fa7
Introduce a handle_presence_muc() function
Mikael Berthe <mikael@lilotux.net>
parents:
578
diff
changeset
|
984 |
if (!room_elt) { |
644
68fb0c1dfb15
MUC: better nickname check when entering a room
Mikael Berthe <mikael@lilotux.net>
parents:
643
diff
changeset
|
985 |
// Add room if it doesn't already exist FIXME shouldn't happen! |
603 | 986 |
room_elt = roster_add_user(roomjid, NULL, NULL, ROSTER_TYPE_ROOM, sub_none); |
579
0c67755e0fa7
Introduce a handle_presence_muc() function
Mikael Berthe <mikael@lilotux.net>
parents:
578
diff
changeset
|
987 |
} else { |
0c67755e0fa7
Introduce a handle_presence_muc() function
Mikael Berthe <mikael@lilotux.net>
parents:
578
diff
changeset
|
988 |
// Make sure this is a room (it can be a conversion user->room) |
0c67755e0fa7
Introduce a handle_presence_muc() function
Mikael Berthe <mikael@lilotux.net>
parents:
578
diff
changeset
|
989 |
buddy_settype(room_elt->data, ROSTER_TYPE_ROOM); |
0c67755e0fa7
Introduce a handle_presence_muc() function
Mikael Berthe <mikael@lilotux.net>
parents:
578
diff
changeset
|
990 |
} |
0c67755e0fa7
Introduce a handle_presence_muc() function
Mikael Berthe <mikael@lilotux.net>
parents:
578
diff
changeset
|
991 |
|
0c67755e0fa7
Introduce a handle_presence_muc() function
Mikael Berthe <mikael@lilotux.net>
parents:
578
diff
changeset
|
992 |
// Get room member's information |
0c67755e0fa7
Introduce a handle_presence_muc() function
Mikael Berthe <mikael@lilotux.net>
parents:
578
diff
changeset
|
993 |
y = xmlnode_get_tag(xmldata, "item"); |
0c67755e0fa7
Introduce a handle_presence_muc() function
Mikael Berthe <mikael@lilotux.net>
parents:
578
diff
changeset
|
994 |
if (y) { |
581
ad07c868ff43
Tell the user when he or she has been kicked/banned
Mikael Berthe <mikael@lilotux.net>
parents:
580
diff
changeset
|
995 |
xmlnode z; |
579
0c67755e0fa7
Introduce a handle_presence_muc() function
Mikael Berthe <mikael@lilotux.net>
parents:
578
diff
changeset
|
996 |
p = xmlnode_get_attrib(y, "affiliation"); |
0c67755e0fa7
Introduce a handle_presence_muc() function
Mikael Berthe <mikael@lilotux.net>
parents:
578
diff
changeset
|
997 |
if (p) { |
0c67755e0fa7
Introduce a handle_presence_muc() function
Mikael Berthe <mikael@lilotux.net>
parents:
578
diff
changeset
|
998 |
if (!strcmp(p, "owner")) mbaffil = affil_owner; |
0c67755e0fa7
Introduce a handle_presence_muc() function
Mikael Berthe <mikael@lilotux.net>
parents:
578
diff
changeset
|
999 |
else if (!strcmp(p, "admin")) mbaffil = affil_admin; |
0c67755e0fa7
Introduce a handle_presence_muc() function
Mikael Berthe <mikael@lilotux.net>
parents:
578
diff
changeset
|
1000 |
else if (!strcmp(p, "member")) mbaffil = affil_member; |
0c67755e0fa7
Introduce a handle_presence_muc() function
Mikael Berthe <mikael@lilotux.net>
parents:
578
diff
changeset
|
1001 |
else if (!strcmp(p, "outcast")) mbaffil = affil_outcast; |
0c67755e0fa7
Introduce a handle_presence_muc() function
Mikael Berthe <mikael@lilotux.net>
parents:
578
diff
changeset
|
1002 |
else if (!strcmp(p, "none")) mbaffil = affil_none; |
0c67755e0fa7
Introduce a handle_presence_muc() function
Mikael Berthe <mikael@lilotux.net>
parents:
578
diff
changeset
|
1003 |
else scr_LogPrint(LPRINT_LOGNORM, "<%s>: Unknown affiliation \"%s\"", |
0c67755e0fa7
Introduce a handle_presence_muc() function
Mikael Berthe <mikael@lilotux.net>
parents:
578
diff
changeset
|
1004 |
from, p); |
0c67755e0fa7
Introduce a handle_presence_muc() function
Mikael Berthe <mikael@lilotux.net>
parents:
578
diff
changeset
|
1005 |
} |
0c67755e0fa7
Introduce a handle_presence_muc() function
Mikael Berthe <mikael@lilotux.net>
parents:
578
diff
changeset
|
1006 |
p = xmlnode_get_attrib(y, "role"); |
0c67755e0fa7
Introduce a handle_presence_muc() function
Mikael Berthe <mikael@lilotux.net>
parents:
578
diff
changeset
|
1007 |
if (p) { |
0c67755e0fa7
Introduce a handle_presence_muc() function
Mikael Berthe <mikael@lilotux.net>
parents:
578
diff
changeset
|
1008 |
if (!strcmp(p, "moderator")) mbrole = role_moderator; |
0c67755e0fa7
Introduce a handle_presence_muc() function
Mikael Berthe <mikael@lilotux.net>
parents:
578
diff
changeset
|
1009 |
else if (!strcmp(p, "participant")) mbrole = role_participant; |
0c67755e0fa7
Introduce a handle_presence_muc() function
Mikael Berthe <mikael@lilotux.net>
parents:
578
diff
changeset
|
1010 |
else if (!strcmp(p, "visitor")) mbrole = role_visitor; |
0c67755e0fa7
Introduce a handle_presence_muc() function
Mikael Berthe <mikael@lilotux.net>
parents:
578
diff
changeset
|
1011 |
else if (!strcmp(p, "none")) mbrole = role_none; |
0c67755e0fa7
Introduce a handle_presence_muc() function
Mikael Berthe <mikael@lilotux.net>
parents:
578
diff
changeset
|
1012 |
else scr_LogPrint(LPRINT_LOGNORM, "<%s>: Unknown role \"%s\"", |
0c67755e0fa7
Introduce a handle_presence_muc() function
Mikael Berthe <mikael@lilotux.net>
parents:
578
diff
changeset
|
1013 |
from, p); |
0c67755e0fa7
Introduce a handle_presence_muc() function
Mikael Berthe <mikael@lilotux.net>
parents:
578
diff
changeset
|
1014 |
} |
581
ad07c868ff43
Tell the user when he or she has been kicked/banned
Mikael Berthe <mikael@lilotux.net>
parents:
580
diff
changeset
|
1015 |
mbjid = xmlnode_get_attrib(y, "jid"); |
ad07c868ff43
Tell the user when he or she has been kicked/banned
Mikael Berthe <mikael@lilotux.net>
parents:
580
diff
changeset
|
1016 |
mbnick = xmlnode_get_attrib(y, "nick"); |
ad07c868ff43
Tell the user when he or she has been kicked/banned
Mikael Berthe <mikael@lilotux.net>
parents:
580
diff
changeset
|
1017 |
// For kick/ban, there can be actor and reason tags |
ad07c868ff43
Tell the user when he or she has been kicked/banned
Mikael Berthe <mikael@lilotux.net>
parents:
580
diff
changeset
|
1018 |
reason = xmlnode_get_tag_data(y, "reason"); |
ad07c868ff43
Tell the user when he or she has been kicked/banned
Mikael Berthe <mikael@lilotux.net>
parents:
580
diff
changeset
|
1019 |
z = xmlnode_get_tag(y, "actor"); |
ad07c868ff43
Tell the user when he or she has been kicked/banned
Mikael Berthe <mikael@lilotux.net>
parents:
580
diff
changeset
|
1020 |
if (z) |
ad07c868ff43
Tell the user when he or she has been kicked/banned
Mikael Berthe <mikael@lilotux.net>
parents:
580
diff
changeset
|
1021 |
actorjid = xmlnode_get_attrib(z, "jid"); |
579
0c67755e0fa7
Introduce a handle_presence_muc() function
Mikael Berthe <mikael@lilotux.net>
parents:
578
diff
changeset
|
1022 |
} |
0c67755e0fa7
Introduce a handle_presence_muc() function
Mikael Berthe <mikael@lilotux.net>
parents:
578
diff
changeset
|
1023 |
|
581
ad07c868ff43
Tell the user when he or she has been kicked/banned
Mikael Berthe <mikael@lilotux.net>
parents:
580
diff
changeset
|
1024 |
// Get the status code |
ad07c868ff43
Tell the user when he or she has been kicked/banned
Mikael Berthe <mikael@lilotux.net>
parents:
580
diff
changeset
|
1025 |
// 201: a room has been created |
ad07c868ff43
Tell the user when he or she has been kicked/banned
Mikael Berthe <mikael@lilotux.net>
parents:
580
diff
changeset
|
1026 |
// 301: the user has been banned from the room |
ad07c868ff43
Tell the user when he or she has been kicked/banned
Mikael Berthe <mikael@lilotux.net>
parents:
580
diff
changeset
|
1027 |
// 303: new room nickname |
ad07c868ff43
Tell the user when he or she has been kicked/banned
Mikael Berthe <mikael@lilotux.net>
parents:
580
diff
changeset
|
1028 |
// 307: the user has been kicked from the room |
ad07c868ff43
Tell the user when he or she has been kicked/banned
Mikael Berthe <mikael@lilotux.net>
parents:
580
diff
changeset
|
1029 |
// 321,322,332: the user has been removed from the room |
579
0c67755e0fa7
Introduce a handle_presence_muc() function
Mikael Berthe <mikael@lilotux.net>
parents:
578
diff
changeset
|
1030 |
y = xmlnode_get_tag(xmldata, "status"); |
0c67755e0fa7
Introduce a handle_presence_muc() function
Mikael Berthe <mikael@lilotux.net>
parents:
578
diff
changeset
|
1031 |
if (y) { |
0c67755e0fa7
Introduce a handle_presence_muc() function
Mikael Berthe <mikael@lilotux.net>
parents:
578
diff
changeset
|
1032 |
p = xmlnode_get_attrib(y, "code"); |
581
ad07c868ff43
Tell the user when he or she has been kicked/banned
Mikael Berthe <mikael@lilotux.net>
parents:
580
diff
changeset
|
1033 |
if (p) |
ad07c868ff43
Tell the user when he or she has been kicked/banned
Mikael Berthe <mikael@lilotux.net>
parents:
580
diff
changeset
|
1034 |
statuscode = atoi(p); |
ad07c868ff43
Tell the user when he or she has been kicked/banned
Mikael Berthe <mikael@lilotux.net>
parents:
580
diff
changeset
|
1035 |
} |
ad07c868ff43
Tell the user when he or she has been kicked/banned
Mikael Berthe <mikael@lilotux.net>
parents:
580
diff
changeset
|
1036 |
|
ad07c868ff43
Tell the user when he or she has been kicked/banned
Mikael Berthe <mikael@lilotux.net>
parents:
580
diff
changeset
|
1037 |
// Check for nickname change |
ad07c868ff43
Tell the user when he or she has been kicked/banned
Mikael Berthe <mikael@lilotux.net>
parents:
580
diff
changeset
|
1038 |
if (statuscode == 303 && mbnick) { |
ad07c868ff43
Tell the user when he or she has been kicked/banned
Mikael Berthe <mikael@lilotux.net>
parents:
580
diff
changeset
|
1039 |
gchar *mbuf; |
772
464be13343a9
Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents:
756
diff
changeset
|
1040 |
mbuf = g_strdup_printf("%s is now known as %s", rname, mbnick); |
632
cfab93886a88
MUC: use timestamp when available
Mikael Berthe <mikael@lilotux.net>
parents:
628
diff
changeset
|
1041 |
scr_WriteIncomingMessage(roomjid, mbuf, usttime, |
581
ad07c868ff43
Tell the user when he or she has been kicked/banned
Mikael Berthe <mikael@lilotux.net>
parents:
580
diff
changeset
|
1042 |
HBB_PREFIX_INFO|HBB_PREFIX_NOFLAG); |
ad07c868ff43
Tell the user when he or she has been kicked/banned
Mikael Berthe <mikael@lilotux.net>
parents:
580
diff
changeset
|
1043 |
if (log_muc_conf) hlog_write_message(roomjid, 0, FALSE, mbuf); |
ad07c868ff43
Tell the user when he or she has been kicked/banned
Mikael Berthe <mikael@lilotux.net>
parents:
580
diff
changeset
|
1044 |
g_free(mbuf); |
772
464be13343a9
Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents:
756
diff
changeset
|
1045 |
buddy_resource_setname(room_elt->data, rname, mbnick); |
464be13343a9
Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents:
756
diff
changeset
|
1046 |
// Maybe it's _our_ nickname... |
464be13343a9
Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents:
756
diff
changeset
|
1047 |
m = buddy_getnickname(room_elt->data); |
464be13343a9
Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents:
756
diff
changeset
|
1048 |
if (m && !strcmp(rname, m)) |
464be13343a9
Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents:
756
diff
changeset
|
1049 |
buddy_setnickname(room_elt->data, mbnick); |
579
0c67755e0fa7
Introduce a handle_presence_muc() function
Mikael Berthe <mikael@lilotux.net>
parents:
578
diff
changeset
|
1050 |
} |
0c67755e0fa7
Introduce a handle_presence_muc() function
Mikael Berthe <mikael@lilotux.net>
parents:
578
diff
changeset
|
1051 |
|
0c67755e0fa7
Introduce a handle_presence_muc() function
Mikael Berthe <mikael@lilotux.net>
parents:
578
diff
changeset
|
1052 |
// Check for departure/arrival |
581
ad07c868ff43
Tell the user when he or she has been kicked/banned
Mikael Berthe <mikael@lilotux.net>
parents:
580
diff
changeset
|
1053 |
if (!mbnick && mbrole == role_none) { |
579
0c67755e0fa7
Introduce a handle_presence_muc() function
Mikael Berthe <mikael@lilotux.net>
parents:
578
diff
changeset
|
1054 |
gchar *mbuf; |
586 | 1055 |
enum { leave=0, kick, ban } how = leave; |
583
32ae027a3238
MUC: clean up departure message code
Mikael Berthe <mikael@lilotux.net>
parents:
581
diff
changeset
|
1056 |
bool we_left = FALSE; |
32ae027a3238
MUC: clean up departure message code
Mikael Berthe <mikael@lilotux.net>
parents:
581
diff
changeset
|
1057 |
|
32ae027a3238
MUC: clean up departure message code
Mikael Berthe <mikael@lilotux.net>
parents:
581
diff
changeset
|
1058 |
if (statuscode == 307) |
32ae027a3238
MUC: clean up departure message code
Mikael Berthe <mikael@lilotux.net>
parents:
581
diff
changeset
|
1059 |
how = kick; |
32ae027a3238
MUC: clean up departure message code
Mikael Berthe <mikael@lilotux.net>
parents:
581
diff
changeset
|
1060 |
else if (statuscode == 301) |
32ae027a3238
MUC: clean up departure message code
Mikael Berthe <mikael@lilotux.net>
parents:
581
diff
changeset
|
1061 |
how = ban; |
579
0c67755e0fa7
Introduce a handle_presence_muc() function
Mikael Berthe <mikael@lilotux.net>
parents:
578
diff
changeset
|
1062 |
|
0c67755e0fa7
Introduce a handle_presence_muc() function
Mikael Berthe <mikael@lilotux.net>
parents:
578
diff
changeset
|
1063 |
// If this is a leave, check if it is ourself |
0c67755e0fa7
Introduce a handle_presence_muc() function
Mikael Berthe <mikael@lilotux.net>
parents:
578
diff
changeset
|
1064 |
m = buddy_getnickname(room_elt->data); |
583
32ae027a3238
MUC: clean up departure message code
Mikael Berthe <mikael@lilotux.net>
parents:
581
diff
changeset
|
1065 |
|
579
0c67755e0fa7
Introduce a handle_presence_muc() function
Mikael Berthe <mikael@lilotux.net>
parents:
578
diff
changeset
|
1066 |
if (m && !strcmp(rname, m)) { |
583
32ae027a3238
MUC: clean up departure message code
Mikael Berthe <mikael@lilotux.net>
parents:
581
diff
changeset
|
1067 |
we_left = TRUE; // _We_ have left! (kicked, banned, etc.) |
644
68fb0c1dfb15
MUC: better nickname check when entering a room
Mikael Berthe <mikael@lilotux.net>
parents:
643
diff
changeset
|
1068 |
buddy_setinsideroom(room_elt->data, FALSE); |
579
0c67755e0fa7
Introduce a handle_presence_muc() function
Mikael Berthe <mikael@lilotux.net>
parents:
578
diff
changeset
|
1069 |
buddy_setnickname(room_elt->data, NULL); |
0c67755e0fa7
Introduce a handle_presence_muc() function
Mikael Berthe <mikael@lilotux.net>
parents:
578
diff
changeset
|
1070 |
buddy_del_all_resources(room_elt->data); |
600
483a87c99990
Free room personal data when receiving the unavailable stanza, not before
Mikael Berthe <mikael@lilotux.net>
parents:
599
diff
changeset
|
1071 |
buddy_settopic(room_elt->data, NULL); |
721
9cf31c9b1dc4
Use room topic as a description in the chat status line
Mikael Berthe <mikael@lilotux.net>
parents:
713
diff
changeset
|
1072 |
scr_UpdateChatStatus(FALSE); |
583
32ae027a3238
MUC: clean up departure message code
Mikael Berthe <mikael@lilotux.net>
parents:
581
diff
changeset
|
1073 |
update_roster = TRUE; |
32ae027a3238
MUC: clean up departure message code
Mikael Berthe <mikael@lilotux.net>
parents:
581
diff
changeset
|
1074 |
} |
581
ad07c868ff43
Tell the user when he or she has been kicked/banned
Mikael Berthe <mikael@lilotux.net>
parents:
580
diff
changeset
|
1075 |
|
583
32ae027a3238
MUC: clean up departure message code
Mikael Berthe <mikael@lilotux.net>
parents:
581
diff
changeset
|
1076 |
// The message depends on _who_ left, and _how_ |
32ae027a3238
MUC: clean up departure message code
Mikael Berthe <mikael@lilotux.net>
parents:
581
diff
changeset
|
1077 |
if (how) { |
32ae027a3238
MUC: clean up departure message code
Mikael Berthe <mikael@lilotux.net>
parents:
581
diff
changeset
|
1078 |
gchar *mbuf_end; |
32ae027a3238
MUC: clean up departure message code
Mikael Berthe <mikael@lilotux.net>
parents:
581
diff
changeset
|
1079 |
// Forced leave |
32ae027a3238
MUC: clean up departure message code
Mikael Berthe <mikael@lilotux.net>
parents:
581
diff
changeset
|
1080 |
if (actorjid) { |
32ae027a3238
MUC: clean up departure message code
Mikael Berthe <mikael@lilotux.net>
parents:
581
diff
changeset
|
1081 |
mbuf_end = g_strdup_printf("%s from %s by <%s>.\nReason: %s", |
32ae027a3238
MUC: clean up departure message code
Mikael Berthe <mikael@lilotux.net>
parents:
581
diff
changeset
|
1082 |
(how == ban ? "banned" : "kicked"), |
772
464be13343a9
Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents:
756
diff
changeset
|
1083 |
roomjid, actorjid, reason); |
583
32ae027a3238
MUC: clean up departure message code
Mikael Berthe <mikael@lilotux.net>
parents:
581
diff
changeset
|
1084 |
} else { |
32ae027a3238
MUC: clean up departure message code
Mikael Berthe <mikael@lilotux.net>
parents:
581
diff
changeset
|
1085 |
mbuf_end = g_strdup_printf("%s from %s.", |
32ae027a3238
MUC: clean up departure message code
Mikael Berthe <mikael@lilotux.net>
parents:
581
diff
changeset
|
1086 |
(how == ban ? "banned" : "kicked"), |
32ae027a3238
MUC: clean up departure message code
Mikael Berthe <mikael@lilotux.net>
parents:
581
diff
changeset
|
1087 |
roomjid); |
32ae027a3238
MUC: clean up departure message code
Mikael Berthe <mikael@lilotux.net>
parents:
581
diff
changeset
|
1088 |
} |
32ae027a3238
MUC: clean up departure message code
Mikael Berthe <mikael@lilotux.net>
parents:
581
diff
changeset
|
1089 |
if (we_left) |
32ae027a3238
MUC: clean up departure message code
Mikael Berthe <mikael@lilotux.net>
parents:
581
diff
changeset
|
1090 |
mbuf = g_strdup_printf("You have been %s", mbuf_end); |
32ae027a3238
MUC: clean up departure message code
Mikael Berthe <mikael@lilotux.net>
parents:
581
diff
changeset
|
1091 |
else |
32ae027a3238
MUC: clean up departure message code
Mikael Berthe <mikael@lilotux.net>
parents:
581
diff
changeset
|
1092 |
mbuf = g_strdup_printf("%s has been %s", rname, mbuf_end); |
32ae027a3238
MUC: clean up departure message code
Mikael Berthe <mikael@lilotux.net>
parents:
581
diff
changeset
|
1093 |
|
32ae027a3238
MUC: clean up departure message code
Mikael Berthe <mikael@lilotux.net>
parents:
581
diff
changeset
|
1094 |
g_free(mbuf_end); |
32ae027a3238
MUC: clean up departure message code
Mikael Berthe <mikael@lilotux.net>
parents:
581
diff
changeset
|
1095 |
} else { |
32ae027a3238
MUC: clean up departure message code
Mikael Berthe <mikael@lilotux.net>
parents:
581
diff
changeset
|
1096 |
// Natural leave |
32ae027a3238
MUC: clean up departure message code
Mikael Berthe <mikael@lilotux.net>
parents:
581
diff
changeset
|
1097 |
if (we_left) { |
616
a61a257ec38b
MUC: display reason, if any, when a room has been destroyed
Mikael Berthe <mikael@lilotux.net>
parents:
612
diff
changeset
|
1098 |
xmlnode destroynode = xmlnode_get_tag(xmldata, "destroy"); |
a61a257ec38b
MUC: display reason, if any, when a room has been destroyed
Mikael Berthe <mikael@lilotux.net>
parents:
612
diff
changeset
|
1099 |
if (destroynode) { |
772
464be13343a9
Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents:
756
diff
changeset
|
1100 |
if ((reason = xmlnode_get_tag_data(destroynode, "reason"))) { |
616
a61a257ec38b
MUC: display reason, if any, when a room has been destroyed
Mikael Berthe <mikael@lilotux.net>
parents:
612
diff
changeset
|
1101 |
mbuf = g_strdup_printf("You have left %s, " |
a61a257ec38b
MUC: display reason, if any, when a room has been destroyed
Mikael Berthe <mikael@lilotux.net>
parents:
612
diff
changeset
|
1102 |
"the room has been destroyed: %s", |
772
464be13343a9
Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents:
756
diff
changeset
|
1103 |
roomjid, reason); |
616
a61a257ec38b
MUC: display reason, if any, when a room has been destroyed
Mikael Berthe <mikael@lilotux.net>
parents:
612
diff
changeset
|
1104 |
} else { |
a61a257ec38b
MUC: display reason, if any, when a room has been destroyed
Mikael Berthe <mikael@lilotux.net>
parents:
612
diff
changeset
|
1105 |
mbuf = g_strdup_printf("You have left %s, " |
a61a257ec38b
MUC: display reason, if any, when a room has been destroyed
Mikael Berthe <mikael@lilotux.net>
parents:
612
diff
changeset
|
1106 |
"the room has been destroyed", roomjid); |
a61a257ec38b
MUC: display reason, if any, when a room has been destroyed
Mikael Berthe <mikael@lilotux.net>
parents:
612
diff
changeset
|
1107 |
} |
a61a257ec38b
MUC: display reason, if any, when a room has been destroyed
Mikael Berthe <mikael@lilotux.net>
parents:
612
diff
changeset
|
1108 |
} else { |
599 | 1109 |
mbuf = g_strdup_printf("You have left %s", roomjid); |
616
a61a257ec38b
MUC: display reason, if any, when a room has been destroyed
Mikael Berthe <mikael@lilotux.net>
parents:
612
diff
changeset
|
1110 |
} |
583
32ae027a3238
MUC: clean up departure message code
Mikael Berthe <mikael@lilotux.net>
parents:
581
diff
changeset
|
1111 |
} else { |
32ae027a3238
MUC: clean up departure message code
Mikael Berthe <mikael@lilotux.net>
parents:
581
diff
changeset
|
1112 |
if (ustmsg) |
32ae027a3238
MUC: clean up departure message code
Mikael Berthe <mikael@lilotux.net>
parents:
581
diff
changeset
|
1113 |
mbuf = g_strdup_printf("%s has left: %s", rname, ustmsg); |
581
ad07c868ff43
Tell the user when he or she has been kicked/banned
Mikael Berthe <mikael@lilotux.net>
parents:
580
diff
changeset
|
1114 |
else |
583
32ae027a3238
MUC: clean up departure message code
Mikael Berthe <mikael@lilotux.net>
parents:
581
diff
changeset
|
1115 |
mbuf = g_strdup_printf("%s has left", rname); |
581
ad07c868ff43
Tell the user when he or she has been kicked/banned
Mikael Berthe <mikael@lilotux.net>
parents:
580
diff
changeset
|
1116 |
} |
583
32ae027a3238
MUC: clean up departure message code
Mikael Berthe <mikael@lilotux.net>
parents:
581
diff
changeset
|
1117 |
} |
32ae027a3238
MUC: clean up departure message code
Mikael Berthe <mikael@lilotux.net>
parents:
581
diff
changeset
|
1118 |
|
632
cfab93886a88
MUC: use timestamp when available
Mikael Berthe <mikael@lilotux.net>
parents:
628
diff
changeset
|
1119 |
scr_WriteIncomingMessage(roomjid, mbuf, usttime, |
583
32ae027a3238
MUC: clean up departure message code
Mikael Berthe <mikael@lilotux.net>
parents:
581
diff
changeset
|
1120 |
HBB_PREFIX_INFO|HBB_PREFIX_NOFLAG); |
32ae027a3238
MUC: clean up departure message code
Mikael Berthe <mikael@lilotux.net>
parents:
581
diff
changeset
|
1121 |
|
32ae027a3238
MUC: clean up departure message code
Mikael Berthe <mikael@lilotux.net>
parents:
581
diff
changeset
|
1122 |
if (log_muc_conf) hlog_write_message(roomjid, 0, FALSE, mbuf); |
32ae027a3238
MUC: clean up departure message code
Mikael Berthe <mikael@lilotux.net>
parents:
581
diff
changeset
|
1123 |
|
32ae027a3238
MUC: clean up departure message code
Mikael Berthe <mikael@lilotux.net>
parents:
581
diff
changeset
|
1124 |
if (we_left) { |
581
ad07c868ff43
Tell the user when he or she has been kicked/banned
Mikael Berthe <mikael@lilotux.net>
parents:
580
diff
changeset
|
1125 |
scr_LogPrint(LPRINT_LOGNORM, "%s", mbuf); |
ad07c868ff43
Tell the user when he or she has been kicked/banned
Mikael Berthe <mikael@lilotux.net>
parents:
580
diff
changeset
|
1126 |
g_free(mbuf); |
579
0c67755e0fa7
Introduce a handle_presence_muc() function
Mikael Berthe <mikael@lilotux.net>
parents:
578
diff
changeset
|
1127 |
return; |
0c67755e0fa7
Introduce a handle_presence_muc() function
Mikael Berthe <mikael@lilotux.net>
parents:
578
diff
changeset
|
1128 |
} |
0c67755e0fa7
Introduce a handle_presence_muc() function
Mikael Berthe <mikael@lilotux.net>
parents:
578
diff
changeset
|
1129 |
g_free(mbuf); |
0c67755e0fa7
Introduce a handle_presence_muc() function
Mikael Berthe <mikael@lilotux.net>
parents:
578
diff
changeset
|
1130 |
} else if (buddy_getstatus(room_elt->data, rname) == offline && |
0c67755e0fa7
Introduce a handle_presence_muc() function
Mikael Berthe <mikael@lilotux.net>
parents:
578
diff
changeset
|
1131 |
ust != offline) { |
0c67755e0fa7
Introduce a handle_presence_muc() function
Mikael Berthe <mikael@lilotux.net>
parents:
578
diff
changeset
|
1132 |
gchar *mbuf; |
645
d26a1c9611db
Small handle_presence_muc() update
Mikael Berthe <mikael@lilotux.net>
parents:
644
diff
changeset
|
1133 |
const char *ournick = buddy_getnickname(room_elt->data); |
d26a1c9611db
Small handle_presence_muc() update
Mikael Berthe <mikael@lilotux.net>
parents:
644
diff
changeset
|
1134 |
|
d26a1c9611db
Small handle_presence_muc() update
Mikael Berthe <mikael@lilotux.net>
parents:
644
diff
changeset
|
1135 |
if (!ournick) { |
d26a1c9611db
Small handle_presence_muc() update
Mikael Berthe <mikael@lilotux.net>
parents:
644
diff
changeset
|
1136 |
// I think it shouldn't happen, but let's put a warning for a while... |
d26a1c9611db
Small handle_presence_muc() update
Mikael Berthe <mikael@lilotux.net>
parents:
644
diff
changeset
|
1137 |
mbuf = g_strdup_printf("MUC ERR: you have no nickname, " |
d26a1c9611db
Small handle_presence_muc() update
Mikael Berthe <mikael@lilotux.net>
parents:
644
diff
changeset
|
1138 |
"please send a bug report!"); |
772
464be13343a9
Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents:
756
diff
changeset
|
1139 |
scr_LogPrint(LPRINT_LOGNORM, "%s", mbuf); |
645
d26a1c9611db
Small handle_presence_muc() update
Mikael Berthe <mikael@lilotux.net>
parents:
644
diff
changeset
|
1140 |
scr_WriteIncomingMessage(roomjid, mbuf, 0, HBB_PREFIX_INFO); |
d26a1c9611db
Small handle_presence_muc() update
Mikael Berthe <mikael@lilotux.net>
parents:
644
diff
changeset
|
1141 |
g_free(mbuf); |
d26a1c9611db
Small handle_presence_muc() update
Mikael Berthe <mikael@lilotux.net>
parents:
644
diff
changeset
|
1142 |
buddylist_build(); |
d26a1c9611db
Small handle_presence_muc() update
Mikael Berthe <mikael@lilotux.net>
parents:
644
diff
changeset
|
1143 |
scr_DrawRoster(); |
d26a1c9611db
Small handle_presence_muc() update
Mikael Berthe <mikael@lilotux.net>
parents:
644
diff
changeset
|
1144 |
return; |
d26a1c9611db
Small handle_presence_muc() update
Mikael Berthe <mikael@lilotux.net>
parents:
644
diff
changeset
|
1145 |
} |
d26a1c9611db
Small handle_presence_muc() update
Mikael Berthe <mikael@lilotux.net>
parents:
644
diff
changeset
|
1146 |
|
644
68fb0c1dfb15
MUC: better nickname check when entering a room
Mikael Berthe <mikael@lilotux.net>
parents:
643
diff
changeset
|
1147 |
if (!buddy_getinsideroom(room_elt->data)) { |
68fb0c1dfb15
MUC: better nickname check when entering a room
Mikael Berthe <mikael@lilotux.net>
parents:
643
diff
changeset
|
1148 |
// We weren't inside the room yet. Now we are. |
68fb0c1dfb15
MUC: better nickname check when entering a room
Mikael Berthe <mikael@lilotux.net>
parents:
643
diff
changeset
|
1149 |
// However, this could be a presence packet from another room member |
68fb0c1dfb15
MUC: better nickname check when entering a room
Mikael Berthe <mikael@lilotux.net>
parents:
643
diff
changeset
|
1150 |
|
68fb0c1dfb15
MUC: better nickname check when entering a room
Mikael Berthe <mikael@lilotux.net>
parents:
643
diff
changeset
|
1151 |
buddy_setinsideroom(room_elt->data, TRUE); |
654
d7fe7b88e4fc
MUC: Set the new_message flag when joining a room
Mikael Berthe <mikael@lilotux.net>
parents:
653
diff
changeset
|
1152 |
// Set the message flag unless we're already in the room buffer window |
d7fe7b88e4fc
MUC: Set the new_message flag when joining a room
Mikael Berthe <mikael@lilotux.net>
parents:
653
diff
changeset
|
1153 |
scr_setmsgflag_if_needed(roomjid); |
633
514aa246081d
Log to the tracelog file when joining a room
Mikael Berthe <mikael@lilotux.net>
parents:
632
diff
changeset
|
1154 |
// Add a message to the tracelog file |
644
68fb0c1dfb15
MUC: better nickname check when entering a room
Mikael Berthe <mikael@lilotux.net>
parents:
643
diff
changeset
|
1155 |
mbuf = g_strdup_printf("You have joined %s as \"%s\"", roomjid, ournick); |
653
d5db5be78eb0
MUC: Be more verbose when joining a room
Mikael Berthe <mikael@lilotux.net>
parents:
652
diff
changeset
|
1156 |
scr_LogPrint(LPRINT_LOGNORM, "%s", mbuf); |
633
514aa246081d
Log to the tracelog file when joining a room
Mikael Berthe <mikael@lilotux.net>
parents:
632
diff
changeset
|
1157 |
g_free(mbuf); |
644
68fb0c1dfb15
MUC: better nickname check when entering a room
Mikael Berthe <mikael@lilotux.net>
parents:
643
diff
changeset
|
1158 |
mbuf = g_strdup_printf("You have joined as \"%s\"", ournick); |
68fb0c1dfb15
MUC: better nickname check when entering a room
Mikael Berthe <mikael@lilotux.net>
parents:
643
diff
changeset
|
1159 |
|
68fb0c1dfb15
MUC: better nickname check when entering a room
Mikael Berthe <mikael@lilotux.net>
parents:
643
diff
changeset
|
1160 |
// The 1st presence message could be for another room member |
68fb0c1dfb15
MUC: better nickname check when entering a room
Mikael Berthe <mikael@lilotux.net>
parents:
643
diff
changeset
|
1161 |
if (strcmp(ournick, rname)) { |
68fb0c1dfb15
MUC: better nickname check when entering a room
Mikael Berthe <mikael@lilotux.net>
parents:
643
diff
changeset
|
1162 |
// Display current mbuf and create a new message for the member |
651
936df057dda0
MUC: Fix a timestamp issue when joining a room
Mikael Berthe <mikael@lilotux.net>
parents:
649
diff
changeset
|
1163 |
// Note: the usttime timestamp is related to the other member, |
936df057dda0
MUC: Fix a timestamp issue when joining a room
Mikael Berthe <mikael@lilotux.net>
parents:
649
diff
changeset
|
1164 |
// so we use 0 here. |
936df057dda0
MUC: Fix a timestamp issue when joining a room
Mikael Berthe <mikael@lilotux.net>
parents:
649
diff
changeset
|
1165 |
scr_WriteIncomingMessage(roomjid, mbuf, 0, |
644
68fb0c1dfb15
MUC: better nickname check when entering a room
Mikael Berthe <mikael@lilotux.net>
parents:
643
diff
changeset
|
1166 |
HBB_PREFIX_INFO|HBB_PREFIX_NOFLAG); |
68fb0c1dfb15
MUC: better nickname check when entering a room
Mikael Berthe <mikael@lilotux.net>
parents:
643
diff
changeset
|
1167 |
if (log_muc_conf) hlog_write_message(roomjid, 0, FALSE, mbuf); |
68fb0c1dfb15
MUC: better nickname check when entering a room
Mikael Berthe <mikael@lilotux.net>
parents:
643
diff
changeset
|
1168 |
g_free(mbuf); |
68fb0c1dfb15
MUC: better nickname check when entering a room
Mikael Berthe <mikael@lilotux.net>
parents:
643
diff
changeset
|
1169 |
mbuf = g_strdup_printf("%s has joined", rname); |
837
7c74eef1d0e0
New option "muc_auto_whois"
Mikael Berthe <mikael@lilotux.net>
parents:
834
diff
changeset
|
1170 |
new_member = TRUE; |
644
68fb0c1dfb15
MUC: better nickname check when entering a room
Mikael Berthe <mikael@lilotux.net>
parents:
643
diff
changeset
|
1171 |
} |
579
0c67755e0fa7
Introduce a handle_presence_muc() function
Mikael Berthe <mikael@lilotux.net>
parents:
578
diff
changeset
|
1172 |
} else { |
837
7c74eef1d0e0
New option "muc_auto_whois"
Mikael Berthe <mikael@lilotux.net>
parents:
834
diff
changeset
|
1173 |
if (strcmp(ournick, rname)) { |
645
d26a1c9611db
Small handle_presence_muc() update
Mikael Berthe <mikael@lilotux.net>
parents:
644
diff
changeset
|
1174 |
mbuf = g_strdup_printf("%s has joined", rname); |
837
7c74eef1d0e0
New option "muc_auto_whois"
Mikael Berthe <mikael@lilotux.net>
parents:
834
diff
changeset
|
1175 |
new_member = TRUE; |
7c74eef1d0e0
New option "muc_auto_whois"
Mikael Berthe <mikael@lilotux.net>
parents:
834
diff
changeset
|
1176 |
} else |
645
d26a1c9611db
Small handle_presence_muc() update
Mikael Berthe <mikael@lilotux.net>
parents:
644
diff
changeset
|
1177 |
mbuf = NULL; |
579
0c67755e0fa7
Introduce a handle_presence_muc() function
Mikael Berthe <mikael@lilotux.net>
parents:
578
diff
changeset
|
1178 |
} |
645
d26a1c9611db
Small handle_presence_muc() update
Mikael Berthe <mikael@lilotux.net>
parents:
644
diff
changeset
|
1179 |
|
d26a1c9611db
Small handle_presence_muc() update
Mikael Berthe <mikael@lilotux.net>
parents:
644
diff
changeset
|
1180 |
if (mbuf) { |
d26a1c9611db
Small handle_presence_muc() update
Mikael Berthe <mikael@lilotux.net>
parents:
644
diff
changeset
|
1181 |
scr_WriteIncomingMessage(roomjid, mbuf, usttime, |
d26a1c9611db
Small handle_presence_muc() update
Mikael Berthe <mikael@lilotux.net>
parents:
644
diff
changeset
|
1182 |
HBB_PREFIX_INFO|HBB_PREFIX_NOFLAG); |
d26a1c9611db
Small handle_presence_muc() update
Mikael Berthe <mikael@lilotux.net>
parents:
644
diff
changeset
|
1183 |
if (log_muc_conf) hlog_write_message(roomjid, 0, FALSE, mbuf); |
d26a1c9611db
Small handle_presence_muc() update
Mikael Berthe <mikael@lilotux.net>
parents:
644
diff
changeset
|
1184 |
g_free(mbuf); |
d26a1c9611db
Small handle_presence_muc() update
Mikael Berthe <mikael@lilotux.net>
parents:
644
diff
changeset
|
1185 |
} |
579
0c67755e0fa7
Introduce a handle_presence_muc() function
Mikael Berthe <mikael@lilotux.net>
parents:
578
diff
changeset
|
1186 |
} |
0c67755e0fa7
Introduce a handle_presence_muc() function
Mikael Berthe <mikael@lilotux.net>
parents:
578
diff
changeset
|
1187 |
|
0c67755e0fa7
Introduce a handle_presence_muc() function
Mikael Berthe <mikael@lilotux.net>
parents:
578
diff
changeset
|
1188 |
// Update room member status |
590
a5707d61e469
Fix a few UTF-8 related issues
Mikael Berthe <mikael@lilotux.net>
parents:
589
diff
changeset
|
1189 |
if (rname) { |
625
028c01940490
Show presence timestamps in "/info" and "/room whois"
Mikael Berthe <mikael@lilotux.net>
parents:
624
diff
changeset
|
1190 |
roster_setstatus(roomjid, rname, bpprio, ust, ustmsg, usttime, |
772
464be13343a9
Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents:
756
diff
changeset
|
1191 |
mbrole, mbaffil, mbjid); |
837
7c74eef1d0e0
New option "muc_auto_whois"
Mikael Berthe <mikael@lilotux.net>
parents:
834
diff
changeset
|
1192 |
if (new_member && settings_opt_get_int("muc_auto_whois")) { |
7c74eef1d0e0
New option "muc_auto_whois"
Mikael Berthe <mikael@lilotux.net>
parents:
834
diff
changeset
|
1193 |
// FIXME: This will fail for some UTF-8 nicknames. |
7c74eef1d0e0
New option "muc_auto_whois"
Mikael Berthe <mikael@lilotux.net>
parents:
834
diff
changeset
|
1194 |
gchar *joiner_nick = from_utf8(rname); |
7c74eef1d0e0
New option "muc_auto_whois"
Mikael Berthe <mikael@lilotux.net>
parents:
834
diff
changeset
|
1195 |
room_whois(room_elt->data, joiner_nick); |
7c74eef1d0e0
New option "muc_auto_whois"
Mikael Berthe <mikael@lilotux.net>
parents:
834
diff
changeset
|
1196 |
g_free(joiner_nick); |
7c74eef1d0e0
New option "muc_auto_whois"
Mikael Berthe <mikael@lilotux.net>
parents:
834
diff
changeset
|
1197 |
} |
590
a5707d61e469
Fix a few UTF-8 related issues
Mikael Berthe <mikael@lilotux.net>
parents:
589
diff
changeset
|
1198 |
} else |
579
0c67755e0fa7
Introduce a handle_presence_muc() function
Mikael Berthe <mikael@lilotux.net>
parents:
578
diff
changeset
|
1199 |
scr_LogPrint(LPRINT_LOGNORM, "MUC DBG: no rname!"); /* DBG */ |
0c67755e0fa7
Introduce a handle_presence_muc() function
Mikael Berthe <mikael@lilotux.net>
parents:
578
diff
changeset
|
1200 |
|
0c67755e0fa7
Introduce a handle_presence_muc() function
Mikael Berthe <mikael@lilotux.net>
parents:
578
diff
changeset
|
1201 |
buddylist_build(); |
0c67755e0fa7
Introduce a handle_presence_muc() function
Mikael Berthe <mikael@lilotux.net>
parents:
578
diff
changeset
|
1202 |
scr_DrawRoster(); |
0c67755e0fa7
Introduce a handle_presence_muc() function
Mikael Berthe <mikael@lilotux.net>
parents:
578
diff
changeset
|
1203 |
} |
0c67755e0fa7
Introduce a handle_presence_muc() function
Mikael Berthe <mikael@lilotux.net>
parents:
578
diff
changeset
|
1204 |
|
547
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
1205 |
static void handle_packet_presence(jconn conn, char *type, char *from, |
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
1206 |
xmlnode xmldata) |
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
1207 |
{ |
579
0c67755e0fa7
Introduce a handle_presence_muc() function
Mikael Berthe <mikael@lilotux.net>
parents:
578
diff
changeset
|
1208 |
char *p, *r; |
0c67755e0fa7
Introduce a handle_presence_muc() function
Mikael Berthe <mikael@lilotux.net>
parents:
578
diff
changeset
|
1209 |
char *ustmsg; |
547
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
1210 |
const char *rname; |
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
1211 |
enum imstatus ust; |
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
1212 |
char bpprio; |
625
028c01940490
Show presence timestamps in "/info" and "/room whois"
Mikael Berthe <mikael@lilotux.net>
parents:
624
diff
changeset
|
1213 |
time_t timestamp = 0; |
644
68fb0c1dfb15
MUC: better nickname check when entering a room
Mikael Berthe <mikael@lilotux.net>
parents:
643
diff
changeset
|
1214 |
xmlnode muc_packet; |
68fb0c1dfb15
MUC: better nickname check when entering a room
Mikael Berthe <mikael@lilotux.net>
parents:
643
diff
changeset
|
1215 |
|
68fb0c1dfb15
MUC: better nickname check when entering a room
Mikael Berthe <mikael@lilotux.net>
parents:
643
diff
changeset
|
1216 |
rname = strchr(from, '/'); |
68fb0c1dfb15
MUC: better nickname check when entering a room
Mikael Berthe <mikael@lilotux.net>
parents:
643
diff
changeset
|
1217 |
if (rname) rname++; |
547
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
1218 |
|
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
1219 |
r = jidtodisp(from); |
644
68fb0c1dfb15
MUC: better nickname check when entering a room
Mikael Berthe <mikael@lilotux.net>
parents:
643
diff
changeset
|
1220 |
|
68fb0c1dfb15
MUC: better nickname check when entering a room
Mikael Berthe <mikael@lilotux.net>
parents:
643
diff
changeset
|
1221 |
// Check for MUC presence packet |
68fb0c1dfb15
MUC: better nickname check when entering a room
Mikael Berthe <mikael@lilotux.net>
parents:
643
diff
changeset
|
1222 |
muc_packet = xml_get_xmlns(xmldata, "http://jabber.org/protocol/muc#user"); |
68fb0c1dfb15
MUC: better nickname check when entering a room
Mikael Berthe <mikael@lilotux.net>
parents:
643
diff
changeset
|
1223 |
|
547
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
1224 |
if (type && !strcmp(type, TMSG_ERROR)) { |
644
68fb0c1dfb15
MUC: better nickname check when entering a room
Mikael Berthe <mikael@lilotux.net>
parents:
643
diff
changeset
|
1225 |
xmlnode x; |
547
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
1226 |
scr_LogPrint(LPRINT_LOGNORM, "Error presence packet from <%s>", r); |
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
1227 |
if ((x = xmlnode_get_tag(xmldata, TMSG_ERROR)) != NULL) |
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
1228 |
display_server_error(x); |
644
68fb0c1dfb15
MUC: better nickname check when entering a room
Mikael Berthe <mikael@lilotux.net>
parents:
643
diff
changeset
|
1229 |
|
68fb0c1dfb15
MUC: better nickname check when entering a room
Mikael Berthe <mikael@lilotux.net>
parents:
643
diff
changeset
|
1230 |
// Let's check it isn't a nickname conflict. |
68fb0c1dfb15
MUC: better nickname check when entering a room
Mikael Berthe <mikael@lilotux.net>
parents:
643
diff
changeset
|
1231 |
// XXX Note: We should handle the <conflict/> string condition. |
68fb0c1dfb15
MUC: better nickname check when entering a room
Mikael Berthe <mikael@lilotux.net>
parents:
643
diff
changeset
|
1232 |
if ((p = xmlnode_get_attrib(x, "code")) != NULL) { |
68fb0c1dfb15
MUC: better nickname check when entering a room
Mikael Berthe <mikael@lilotux.net>
parents:
643
diff
changeset
|
1233 |
if (atoi(p) == 409) { |
68fb0c1dfb15
MUC: better nickname check when entering a room
Mikael Berthe <mikael@lilotux.net>
parents:
643
diff
changeset
|
1234 |
// 409 = conlict (nickname is in use or registered by another user) |
68fb0c1dfb15
MUC: better nickname check when entering a room
Mikael Berthe <mikael@lilotux.net>
parents:
643
diff
changeset
|
1235 |
// If we are not inside this room, we should reset the nickname |
68fb0c1dfb15
MUC: better nickname check when entering a room
Mikael Berthe <mikael@lilotux.net>
parents:
643
diff
changeset
|
1236 |
GSList *room_elt = roster_find(r, jidsearch, 0); |
68fb0c1dfb15
MUC: better nickname check when entering a room
Mikael Berthe <mikael@lilotux.net>
parents:
643
diff
changeset
|
1237 |
if (room_elt && !buddy_getinsideroom(room_elt->data)) |
68fb0c1dfb15
MUC: better nickname check when entering a room
Mikael Berthe <mikael@lilotux.net>
parents:
643
diff
changeset
|
1238 |
buddy_setnickname(room_elt->data, NULL); |
68fb0c1dfb15
MUC: better nickname check when entering a room
Mikael Berthe <mikael@lilotux.net>
parents:
643
diff
changeset
|
1239 |
} |
68fb0c1dfb15
MUC: better nickname check when entering a room
Mikael Berthe <mikael@lilotux.net>
parents:
643
diff
changeset
|
1240 |
} |
68fb0c1dfb15
MUC: better nickname check when entering a room
Mikael Berthe <mikael@lilotux.net>
parents:
643
diff
changeset
|
1241 |
|
547
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
1242 |
g_free(r); |
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
1243 |
return; |
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
1244 |
} |
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
1245 |
|
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
1246 |
p = xmlnode_get_tag_data(xmldata, "priority"); |
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
1247 |
if (p && *p) bpprio = (gchar)atoi(p); |
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
1248 |
else bpprio = 0; |
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
1249 |
|
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
1250 |
ust = available; |
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
1251 |
p = xmlnode_get_tag_data(xmldata, "show"); |
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
1252 |
if (p) { |
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
1253 |
if (!strcmp(p, "away")) ust = away; |
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
1254 |
else if (!strcmp(p, "dnd")) ust = dontdisturb; |
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
1255 |
else if (!strcmp(p, "xa")) ust = notavail; |
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
1256 |
else if (!strcmp(p, "chat")) ust = freeforchat; |
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
1257 |
} |
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
1258 |
|
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
1259 |
if (type && !strcmp(type, "unavailable")) |
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
1260 |
ust = offline; |
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
1261 |
|
772
464be13343a9
Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents:
756
diff
changeset
|
1262 |
ustmsg = xmlnode_get_tag_data(xmldata, "status"); |
547
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
1263 |
|
625
028c01940490
Show presence timestamps in "/info" and "/room whois"
Mikael Berthe <mikael@lilotux.net>
parents:
624
diff
changeset
|
1264 |
// Timestamp? |
028c01940490
Show presence timestamps in "/info" and "/room whois"
Mikael Berthe <mikael@lilotux.net>
parents:
624
diff
changeset
|
1265 |
timestamp = xml_get_timestamp(xmldata); |
028c01940490
Show presence timestamps in "/info" and "/room whois"
Mikael Berthe <mikael@lilotux.net>
parents:
624
diff
changeset
|
1266 |
|
644
68fb0c1dfb15
MUC: better nickname check when entering a room
Mikael Berthe <mikael@lilotux.net>
parents:
643
diff
changeset
|
1267 |
if (muc_packet) { |
579
0c67755e0fa7
Introduce a handle_presence_muc() function
Mikael Berthe <mikael@lilotux.net>
parents:
578
diff
changeset
|
1268 |
// This is a MUC presence message |
644
68fb0c1dfb15
MUC: better nickname check when entering a room
Mikael Berthe <mikael@lilotux.net>
parents:
643
diff
changeset
|
1269 |
handle_presence_muc(from, muc_packet, r, rname, |
68fb0c1dfb15
MUC: better nickname check when entering a room
Mikael Berthe <mikael@lilotux.net>
parents:
643
diff
changeset
|
1270 |
ust, ustmsg, timestamp, bpprio); |
579
0c67755e0fa7
Introduce a handle_presence_muc() function
Mikael Berthe <mikael@lilotux.net>
parents:
578
diff
changeset
|
1271 |
} else { |
0c67755e0fa7
Introduce a handle_presence_muc() function
Mikael Berthe <mikael@lilotux.net>
parents:
578
diff
changeset
|
1272 |
// Not a MUC message, so this is a regular buddy... |
0c67755e0fa7
Introduce a handle_presence_muc() function
Mikael Berthe <mikael@lilotux.net>
parents:
578
diff
changeset
|
1273 |
// Call hk_statuschange() if status has changed or if the |
0c67755e0fa7
Introduce a handle_presence_muc() function
Mikael Berthe <mikael@lilotux.net>
parents:
578
diff
changeset
|
1274 |
// status message is different |
0c67755e0fa7
Introduce a handle_presence_muc() function
Mikael Berthe <mikael@lilotux.net>
parents:
578
diff
changeset
|
1275 |
const char *m = roster_getstatusmsg(r, rname); |
0c67755e0fa7
Introduce a handle_presence_muc() function
Mikael Berthe <mikael@lilotux.net>
parents:
578
diff
changeset
|
1276 |
if ((ust != roster_getstatus(r, rname)) || |
0c67755e0fa7
Introduce a handle_presence_muc() function
Mikael Berthe <mikael@lilotux.net>
parents:
578
diff
changeset
|
1277 |
(!ustmsg && m && m[0]) || (ustmsg && (!m || strcmp(ustmsg, m)))) |
625
028c01940490
Show presence timestamps in "/info" and "/room whois"
Mikael Berthe <mikael@lilotux.net>
parents:
624
diff
changeset
|
1278 |
hk_statuschange(r, rname, bpprio, timestamp, ust, ustmsg); |
547
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
1279 |
} |
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
1280 |
|
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
1281 |
g_free(r); |
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
1282 |
} |
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
1283 |
|
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
1284 |
static void handle_packet_message(jconn conn, char *type, char *from, |
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
1285 |
xmlnode xmldata) |
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
1286 |
{ |
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
1287 |
char *p, *r, *s; |
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
1288 |
xmlnode x; |
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
1289 |
char *body=NULL; |
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
1290 |
char *enc = NULL; |
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
1291 |
char *tmp = NULL; |
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
1292 |
time_t timestamp = 0; |
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
1293 |
|
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
1294 |
body = xmlnode_get_tag_data(xmldata, "body"); |
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
1295 |
|
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
1296 |
p = xmlnode_get_tag_data(xmldata, "subject"); |
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
1297 |
if (p != NULL) { |
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
1298 |
if (type && !strcmp(type, TMSG_GROUPCHAT)) { // Room topic |
549
448e299e45da
MUC: "/room topic" shows the current room topic
Mikael Berthe <mikael@lilotux.net>
parents:
547
diff
changeset
|
1299 |
GSList *roombuddy; |
547
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
1300 |
gchar *mbuf; |
772
464be13343a9
Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents:
756
diff
changeset
|
1301 |
gchar *subj = p; |
547
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
1302 |
// Get the room (s) and the nickname (r) |
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
1303 |
s = g_strdup(from); |
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
1304 |
r = strchr(s, '/'); |
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
1305 |
if (r) *r++ = 0; |
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
1306 |
else r = s; |
549
448e299e45da
MUC: "/room topic" shows the current room topic
Mikael Berthe <mikael@lilotux.net>
parents:
547
diff
changeset
|
1307 |
// Set the new topic |
448e299e45da
MUC: "/room topic" shows the current room topic
Mikael Berthe <mikael@lilotux.net>
parents:
547
diff
changeset
|
1308 |
roombuddy = roster_find(s, jidsearch, 0); |
448e299e45da
MUC: "/room topic" shows the current room topic
Mikael Berthe <mikael@lilotux.net>
parents:
547
diff
changeset
|
1309 |
if (roombuddy) |
772
464be13343a9
Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents:
756
diff
changeset
|
1310 |
buddy_settopic(roombuddy->data, subj); |
547
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
1311 |
// Display inside the room window |
560
64cb4de94972
Better topic attribution
Mikael Berthe <mikael@lilotux.net>
parents:
549
diff
changeset
|
1312 |
if (r == s) { |
64cb4de94972
Better topic attribution
Mikael Berthe <mikael@lilotux.net>
parents:
549
diff
changeset
|
1313 |
// No specific resource (this is certainly history) |
772
464be13343a9
Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents:
756
diff
changeset
|
1314 |
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
|
1315 |
} else { |
772
464be13343a9
Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents:
756
diff
changeset
|
1316 |
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
|
1317 |
} |
547
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
1318 |
scr_WriteIncomingMessage(s, mbuf, 0, |
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
1319 |
HBB_PREFIX_INFO|HBB_PREFIX_NOFLAG); |
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
1320 |
if (settings_opt_get_int("log_muc_conf")) |
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
1321 |
hlog_write_message(s, 0, FALSE, mbuf); |
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
1322 |
g_free(s); |
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
1323 |
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
|
1324 |
// 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
|
1325 |
scr_UpdateChatStatus(TRUE); |
547
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
1326 |
} else { // Chat message |
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
1327 |
tmp = g_new(char, (body ? strlen(body) : 0) + strlen(p) + 4); |
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
1328 |
*tmp = '['; |
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
1329 |
strcpy(tmp+1, p); |
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
1330 |
strcat(tmp, "]\n"); |
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
1331 |
if (body) strcat(tmp, body); |
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
1332 |
body = tmp; |
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
1333 |
} |
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
1334 |
} |
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
1335 |
|
644
68fb0c1dfb15
MUC: better nickname check when entering a room
Mikael Berthe <mikael@lilotux.net>
parents:
643
diff
changeset
|
1336 |
// Not used yet... |
68fb0c1dfb15
MUC: better nickname check when entering a room
Mikael Berthe <mikael@lilotux.net>
parents:
643
diff
changeset
|
1337 |
x = xml_get_xmlns(xmldata, NS_ENCRYPTED); |
68fb0c1dfb15
MUC: better nickname check when entering a room
Mikael Berthe <mikael@lilotux.net>
parents:
643
diff
changeset
|
1338 |
if (x && (p = xmlnode_get_data(x)) != NULL) { |
68fb0c1dfb15
MUC: better nickname check when entering a room
Mikael Berthe <mikael@lilotux.net>
parents:
643
diff
changeset
|
1339 |
enc = p; |
547
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
1340 |
} |
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
1341 |
|
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
1342 |
// Timestamp? |
625
028c01940490
Show presence timestamps in "/info" and "/room whois"
Mikael Berthe <mikael@lilotux.net>
parents:
624
diff
changeset
|
1343 |
timestamp = xml_get_timestamp(xmldata); |
547
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
1344 |
|
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
1345 |
if (type && !strcmp(type, TMSG_ERROR)) { |
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
1346 |
if ((x = xmlnode_get_tag(xmldata, TMSG_ERROR)) != NULL) |
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
1347 |
display_server_error(x); |
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
1348 |
} |
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
1349 |
if (from && body) |
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
1350 |
gotmessage(type, from, body, enc, timestamp); |
774
46304b773a44
Remove useless checks before g_free() calls
Mikael Berthe <mikael@lilotux.net>
parents:
772
diff
changeset
|
1351 |
g_free(tmp); |
547
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
1352 |
} |
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
1353 |
|
752 | 1354 |
static void evscallback_subscription(eviqs *evp, guint evcontext) |
749
6c633adaae10
Use events system for subscription requests
Mikael Berthe <mikael@lilotux.net>
parents:
745
diff
changeset
|
1355 |
{ |
6c633adaae10
Use events system for subscription requests
Mikael Berthe <mikael@lilotux.net>
parents:
745
diff
changeset
|
1356 |
char *barejid; |
6c633adaae10
Use events system for subscription requests
Mikael Berthe <mikael@lilotux.net>
parents:
745
diff
changeset
|
1357 |
char *buf; |
6c633adaae10
Use events system for subscription requests
Mikael Berthe <mikael@lilotux.net>
parents:
745
diff
changeset
|
1358 |
|
6c633adaae10
Use events system for subscription requests
Mikael Berthe <mikael@lilotux.net>
parents:
745
diff
changeset
|
1359 |
if (evcontext == EVS_CONTEXT_TIMEOUT) { |
6c633adaae10
Use events system for subscription requests
Mikael Berthe <mikael@lilotux.net>
parents:
745
diff
changeset
|
1360 |
scr_LogPrint(LPRINT_LOGNORM, "Event %s timed out, cancelled.", |
6c633adaae10
Use events system for subscription requests
Mikael Berthe <mikael@lilotux.net>
parents:
745
diff
changeset
|
1361 |
evp->id); |
6c633adaae10
Use events system for subscription requests
Mikael Berthe <mikael@lilotux.net>
parents:
745
diff
changeset
|
1362 |
return; |
6c633adaae10
Use events system for subscription requests
Mikael Berthe <mikael@lilotux.net>
parents:
745
diff
changeset
|
1363 |
} |
6c633adaae10
Use events system for subscription requests
Mikael Berthe <mikael@lilotux.net>
parents:
745
diff
changeset
|
1364 |
if (evcontext == EVS_CONTEXT_CANCEL) { |
6c633adaae10
Use events system for subscription requests
Mikael Berthe <mikael@lilotux.net>
parents:
745
diff
changeset
|
1365 |
scr_LogPrint(LPRINT_LOGNORM, "Event %s cancelled.", evp->id); |
6c633adaae10
Use events system for subscription requests
Mikael Berthe <mikael@lilotux.net>
parents:
745
diff
changeset
|
1366 |
return; |
6c633adaae10
Use events system for subscription requests
Mikael Berthe <mikael@lilotux.net>
parents:
745
diff
changeset
|
1367 |
} |
6c633adaae10
Use events system for subscription requests
Mikael Berthe <mikael@lilotux.net>
parents:
745
diff
changeset
|
1368 |
if (!(evcontext & EVS_CONTEXT_USER)) |
6c633adaae10
Use events system for subscription requests
Mikael Berthe <mikael@lilotux.net>
parents:
745
diff
changeset
|
1369 |
return; |
6c633adaae10
Use events system for subscription requests
Mikael Berthe <mikael@lilotux.net>
parents:
745
diff
changeset
|
1370 |
|
6c633adaae10
Use events system for subscription requests
Mikael Berthe <mikael@lilotux.net>
parents:
745
diff
changeset
|
1371 |
// Sanity check |
6c633adaae10
Use events system for subscription requests
Mikael Berthe <mikael@lilotux.net>
parents:
745
diff
changeset
|
1372 |
if (!evp->data) { |
6c633adaae10
Use events system for subscription requests
Mikael Berthe <mikael@lilotux.net>
parents:
745
diff
changeset
|
1373 |
// Shouldn't happen, data should be set to the barejid. |
6c633adaae10
Use events system for subscription requests
Mikael Berthe <mikael@lilotux.net>
parents:
745
diff
changeset
|
1374 |
scr_LogPrint(LPRINT_LOGNORM, "Error in evs callback."); |
6c633adaae10
Use events system for subscription requests
Mikael Berthe <mikael@lilotux.net>
parents:
745
diff
changeset
|
1375 |
return; |
6c633adaae10
Use events system for subscription requests
Mikael Berthe <mikael@lilotux.net>
parents:
745
diff
changeset
|
1376 |
} |
6c633adaae10
Use events system for subscription requests
Mikael Berthe <mikael@lilotux.net>
parents:
745
diff
changeset
|
1377 |
|
6c633adaae10
Use events system for subscription requests
Mikael Berthe <mikael@lilotux.net>
parents:
745
diff
changeset
|
1378 |
// Ok, let's work now. |
6c633adaae10
Use events system for subscription requests
Mikael Berthe <mikael@lilotux.net>
parents:
745
diff
changeset
|
1379 |
// evcontext: 0, 1 == reject, accept |
6c633adaae10
Use events system for subscription requests
Mikael Berthe <mikael@lilotux.net>
parents:
745
diff
changeset
|
1380 |
|
6c633adaae10
Use events system for subscription requests
Mikael Berthe <mikael@lilotux.net>
parents:
745
diff
changeset
|
1381 |
barejid = evp->data; |
6c633adaae10
Use events system for subscription requests
Mikael Berthe <mikael@lilotux.net>
parents:
745
diff
changeset
|
1382 |
|
6c633adaae10
Use events system for subscription requests
Mikael Berthe <mikael@lilotux.net>
parents:
745
diff
changeset
|
1383 |
if (evcontext & ~EVS_CONTEXT_USER) { |
6c633adaae10
Use events system for subscription requests
Mikael Berthe <mikael@lilotux.net>
parents:
745
diff
changeset
|
1384 |
// Accept subscription request |
6c633adaae10
Use events system for subscription requests
Mikael Berthe <mikael@lilotux.net>
parents:
745
diff
changeset
|
1385 |
jb_subscr_send_auth(barejid); |
6c633adaae10
Use events system for subscription requests
Mikael Berthe <mikael@lilotux.net>
parents:
745
diff
changeset
|
1386 |
buf = g_strdup_printf("<%s> is allowed to receive your presence updates", |
6c633adaae10
Use events system for subscription requests
Mikael Berthe <mikael@lilotux.net>
parents:
745
diff
changeset
|
1387 |
barejid); |
6c633adaae10
Use events system for subscription requests
Mikael Berthe <mikael@lilotux.net>
parents:
745
diff
changeset
|
1388 |
} else { |
6c633adaae10
Use events system for subscription requests
Mikael Berthe <mikael@lilotux.net>
parents:
745
diff
changeset
|
1389 |
// Reject subscription request |
6c633adaae10
Use events system for subscription requests
Mikael Berthe <mikael@lilotux.net>
parents:
745
diff
changeset
|
1390 |
jb_subscr_cancel_auth(barejid); |
6c633adaae10
Use events system for subscription requests
Mikael Berthe <mikael@lilotux.net>
parents:
745
diff
changeset
|
1391 |
buf = g_strdup_printf("<%s> won't receive your presence updates", barejid); |
823
19c615fd071e
New option "delete_on_reject"
Mikael Berthe <mikael@lilotux.net>
parents:
819
diff
changeset
|
1392 |
if (settings_opt_get_int("delete_on_reject")) { |
19c615fd071e
New option "delete_on_reject"
Mikael Berthe <mikael@lilotux.net>
parents:
819
diff
changeset
|
1393 |
// Remove the buddy from the roster if there is no current subscription |
19c615fd071e
New option "delete_on_reject"
Mikael Berthe <mikael@lilotux.net>
parents:
819
diff
changeset
|
1394 |
if (roster_getsubscription(barejid) == sub_none) |
19c615fd071e
New option "delete_on_reject"
Mikael Berthe <mikael@lilotux.net>
parents:
819
diff
changeset
|
1395 |
jb_delbuddy(barejid); |
19c615fd071e
New option "delete_on_reject"
Mikael Berthe <mikael@lilotux.net>
parents:
819
diff
changeset
|
1396 |
} |
749
6c633adaae10
Use events system for subscription requests
Mikael Berthe <mikael@lilotux.net>
parents:
745
diff
changeset
|
1397 |
} |
6c633adaae10
Use events system for subscription requests
Mikael Berthe <mikael@lilotux.net>
parents:
745
diff
changeset
|
1398 |
scr_WriteIncomingMessage(barejid, buf, 0, HBB_PREFIX_INFO); |
6c633adaae10
Use events system for subscription requests
Mikael Berthe <mikael@lilotux.net>
parents:
745
diff
changeset
|
1399 |
scr_LogPrint(LPRINT_LOGNORM, "%s", buf); |
6c633adaae10
Use events system for subscription requests
Mikael Berthe <mikael@lilotux.net>
parents:
745
diff
changeset
|
1400 |
g_free(buf); |
6c633adaae10
Use events system for subscription requests
Mikael Berthe <mikael@lilotux.net>
parents:
745
diff
changeset
|
1401 |
} |
6c633adaae10
Use events system for subscription requests
Mikael Berthe <mikael@lilotux.net>
parents:
745
diff
changeset
|
1402 |
|
547
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
1403 |
static void handle_packet_s10n(jconn conn, char *type, char *from, |
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
1404 |
xmlnode xmldata) |
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
1405 |
{ |
611
ad737139a144
Improve subscription management
Mikael Berthe <mikael@lilotux.net>
parents:
610
diff
changeset
|
1406 |
char *r; |
ad737139a144
Improve subscription management
Mikael Berthe <mikael@lilotux.net>
parents:
610
diff
changeset
|
1407 |
char *buf; |
818
55cd45481a07
Fix a buddylist bug when receiving a subscription request
Mikael Berthe <mikael@lilotux.net>
parents:
793
diff
changeset
|
1408 |
int newbuddy; |
611
ad737139a144
Improve subscription management
Mikael Berthe <mikael@lilotux.net>
parents:
610
diff
changeset
|
1409 |
|
ad737139a144
Improve subscription management
Mikael Berthe <mikael@lilotux.net>
parents:
610
diff
changeset
|
1410 |
r = jidtodisp(from); |
547
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
1411 |
|
818
55cd45481a07
Fix a buddylist bug when receiving a subscription request
Mikael Berthe <mikael@lilotux.net>
parents:
793
diff
changeset
|
1412 |
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
|
1413 |
|
547
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
1414 |
if (!strcmp(type, "subscribe")) { |
611
ad737139a144
Improve subscription management
Mikael Berthe <mikael@lilotux.net>
parents:
610
diff
changeset
|
1415 |
/* The sender wishes to subscribe to our presence */ |
ad737139a144
Improve subscription management
Mikael Berthe <mikael@lilotux.net>
parents:
610
diff
changeset
|
1416 |
char *msg; |
547
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
1417 |
int isagent; |
749
6c633adaae10
Use events system for subscription requests
Mikael Berthe <mikael@lilotux.net>
parents:
745
diff
changeset
|
1418 |
eviqs *evn; |
611
ad737139a144
Improve subscription management
Mikael Berthe <mikael@lilotux.net>
parents:
610
diff
changeset
|
1419 |
|
547
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
1420 |
isagent = (roster_gettype(r) & ROSTER_TYPE_AGENT) != 0; |
617
d3a8b43bf9e7
Add "/authorization" command
Mikael Berthe <mikael@lilotux.net>
parents:
616
diff
changeset
|
1421 |
msg = xmlnode_get_tag_data(xmldata, "status"); |
611
ad737139a144
Improve subscription management
Mikael Berthe <mikael@lilotux.net>
parents:
610
diff
changeset
|
1422 |
|
617
d3a8b43bf9e7
Add "/authorization" command
Mikael Berthe <mikael@lilotux.net>
parents:
616
diff
changeset
|
1423 |
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
|
1424 |
from); |
d3a8b43bf9e7
Add "/authorization" command
Mikael Berthe <mikael@lilotux.net>
parents:
616
diff
changeset
|
1425 |
scr_WriteIncomingMessage(r, buf, 0, HBB_PREFIX_INFO); |
d3a8b43bf9e7
Add "/authorization" command
Mikael Berthe <mikael@lilotux.net>
parents:
616
diff
changeset
|
1426 |
scr_LogPrint(LPRINT_LOGNORM, "%s", buf); |
d3a8b43bf9e7
Add "/authorization" command
Mikael Berthe <mikael@lilotux.net>
parents:
616
diff
changeset
|
1427 |
g_free(buf); |
d3a8b43bf9e7
Add "/authorization" command
Mikael Berthe <mikael@lilotux.net>
parents:
616
diff
changeset
|
1428 |
|
611
ad737139a144
Improve subscription management
Mikael Berthe <mikael@lilotux.net>
parents:
610
diff
changeset
|
1429 |
if (msg) { |
772
464be13343a9
Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents:
756
diff
changeset
|
1430 |
buf = g_strdup_printf("<%s> said: %s", from, msg); |
464be13343a9
Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents:
756
diff
changeset
|
1431 |
scr_WriteIncomingMessage(r, buf, 0, HBB_PREFIX_INFO); |
464be13343a9
Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents:
756
diff
changeset
|
1432 |
replace_nl_with_dots(buf); |
464be13343a9
Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents:
756
diff
changeset
|
1433 |
scr_LogPrint(LPRINT_LOGNORM, "%s", buf); |
464be13343a9
Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents:
756
diff
changeset
|
1434 |
g_free(buf); |
547
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
1435 |
} |
611
ad737139a144
Improve subscription management
Mikael Berthe <mikael@lilotux.net>
parents:
610
diff
changeset
|
1436 |
|
749
6c633adaae10
Use events system for subscription requests
Mikael Berthe <mikael@lilotux.net>
parents:
745
diff
changeset
|
1437 |
// Create a new event item |
6c633adaae10
Use events system for subscription requests
Mikael Berthe <mikael@lilotux.net>
parents:
745
diff
changeset
|
1438 |
evn = evs_new(EVS_TYPE_SUBSCRIPTION, EVS_MAX_TIMEOUT); |
751
4a7271e69694
Avoid reusing events ids
Mikael Berthe <mikael@lilotux.net>
parents:
749
diff
changeset
|
1439 |
if (evn) { |
752 | 1440 |
evn->callback = &evscallback_subscription; |
751
4a7271e69694
Avoid reusing events ids
Mikael Berthe <mikael@lilotux.net>
parents:
749
diff
changeset
|
1441 |
evn->data = g_strdup(r); |
754
5b962b978573
Add event description when receiving a subscription request
Mikael Berthe <mikael@lilotux.net>
parents:
752
diff
changeset
|
1442 |
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
|
1443 |
"presence updates", r); |
751
4a7271e69694
Avoid reusing events ids
Mikael Berthe <mikael@lilotux.net>
parents:
749
diff
changeset
|
1444 |
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
|
1445 |
} else { |
4a7271e69694
Avoid reusing events ids
Mikael Berthe <mikael@lilotux.net>
parents:
749
diff
changeset
|
1446 |
buf = g_strdup_printf("Unable to create a new event!"); |
4a7271e69694
Avoid reusing events ids
Mikael Berthe <mikael@lilotux.net>
parents:
749
diff
changeset
|
1447 |
} |
611
ad737139a144
Improve subscription management
Mikael Berthe <mikael@lilotux.net>
parents:
610
diff
changeset
|
1448 |
scr_WriteIncomingMessage(r, buf, 0, HBB_PREFIX_INFO); |
617
d3a8b43bf9e7
Add "/authorization" command
Mikael Berthe <mikael@lilotux.net>
parents:
616
diff
changeset
|
1449 |
scr_LogPrint(LPRINT_LOGNORM, "%s", buf); |
611
ad737139a144
Improve subscription management
Mikael Berthe <mikael@lilotux.net>
parents:
610
diff
changeset
|
1450 |
g_free(buf); |
547
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
1451 |
} else if (!strcmp(type, "unsubscribe")) { |
611
ad737139a144
Improve subscription management
Mikael Berthe <mikael@lilotux.net>
parents:
610
diff
changeset
|
1452 |
/* The sender is unsubscribing from our presence */ |
617
d3a8b43bf9e7
Add "/authorization" command
Mikael Berthe <mikael@lilotux.net>
parents:
616
diff
changeset
|
1453 |
jb_subscr_cancel_auth(from); |
611
ad737139a144
Improve subscription management
Mikael Berthe <mikael@lilotux.net>
parents:
610
diff
changeset
|
1454 |
buf = g_strdup_printf("<%s> is unsubscribing from your " |
ad737139a144
Improve subscription management
Mikael Berthe <mikael@lilotux.net>
parents:
610
diff
changeset
|
1455 |
"presence updates", from); |
ad737139a144
Improve subscription management
Mikael Berthe <mikael@lilotux.net>
parents:
610
diff
changeset
|
1456 |
scr_WriteIncomingMessage(r, buf, 0, HBB_PREFIX_INFO); |
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 | 1459 |
} else if (!strcmp(type, "subscribed")) { |
611
ad737139a144
Improve subscription management
Mikael Berthe <mikael@lilotux.net>
parents:
610
diff
changeset
|
1460 |
/* The sender has allowed us to receive their presence */ |
ad737139a144
Improve subscription management
Mikael Berthe <mikael@lilotux.net>
parents:
610
diff
changeset
|
1461 |
buf = g_strdup_printf("<%s> has allowed you to receive their " |
ad737139a144
Improve subscription management
Mikael Berthe <mikael@lilotux.net>
parents:
610
diff
changeset
|
1462 |
"presence updates", from); |
ad737139a144
Improve subscription management
Mikael Berthe <mikael@lilotux.net>
parents:
610
diff
changeset
|
1463 |
scr_WriteIncomingMessage(r, buf, 0, HBB_PREFIX_INFO); |
ad737139a144
Improve subscription management
Mikael Berthe <mikael@lilotux.net>
parents:
610
diff
changeset
|
1464 |
scr_LogPrint(LPRINT_LOGNORM, "%s", buf); |
ad737139a144
Improve subscription management
Mikael Berthe <mikael@lilotux.net>
parents:
610
diff
changeset
|
1465 |
g_free(buf); |
603 | 1466 |
} else if (!strcmp(type, "unsubscribed")) { |
611
ad737139a144
Improve subscription management
Mikael Berthe <mikael@lilotux.net>
parents:
610
diff
changeset
|
1467 |
/* The subscription request has been denied or a previously-granted |
ad737139a144
Improve subscription management
Mikael Berthe <mikael@lilotux.net>
parents:
610
diff
changeset
|
1468 |
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
|
1469 |
roster_unsubscribed(from); |
611
ad737139a144
Improve subscription management
Mikael Berthe <mikael@lilotux.net>
parents:
610
diff
changeset
|
1470 |
buf = g_strdup_printf("<%s> has cancelled your subscription to " |
ad737139a144
Improve subscription management
Mikael Berthe <mikael@lilotux.net>
parents:
610
diff
changeset
|
1471 |
"their presence updates", from); |
ad737139a144
Improve subscription management
Mikael Berthe <mikael@lilotux.net>
parents:
610
diff
changeset
|
1472 |
scr_WriteIncomingMessage(r, buf, 0, HBB_PREFIX_INFO); |
ad737139a144
Improve subscription management
Mikael Berthe <mikael@lilotux.net>
parents:
610
diff
changeset
|
1473 |
scr_LogPrint(LPRINT_LOGNORM, "%s", buf); |
ad737139a144
Improve subscription management
Mikael Berthe <mikael@lilotux.net>
parents:
610
diff
changeset
|
1474 |
g_free(buf); |
603 | 1475 |
} else { |
611
ad737139a144
Improve subscription management
Mikael Berthe <mikael@lilotux.net>
parents:
610
diff
changeset
|
1476 |
scr_LogPrint(LPRINT_LOGNORM, "Received unrecognized packet from <%s>, " |
ad737139a144
Improve subscription management
Mikael Berthe <mikael@lilotux.net>
parents:
610
diff
changeset
|
1477 |
"type=%s", from, (type ? type : "")); |
818
55cd45481a07
Fix a buddylist bug when receiving a subscription request
Mikael Berthe <mikael@lilotux.net>
parents:
793
diff
changeset
|
1478 |
newbuddy = FALSE; |
55cd45481a07
Fix a buddylist bug when receiving a subscription request
Mikael Berthe <mikael@lilotux.net>
parents:
793
diff
changeset
|
1479 |
} |
55cd45481a07
Fix a buddylist bug when receiving a subscription request
Mikael Berthe <mikael@lilotux.net>
parents:
793
diff
changeset
|
1480 |
|
55cd45481a07
Fix a buddylist bug when receiving a subscription request
Mikael Berthe <mikael@lilotux.net>
parents:
793
diff
changeset
|
1481 |
if (newbuddy) { |
55cd45481a07
Fix a buddylist bug when receiving a subscription request
Mikael Berthe <mikael@lilotux.net>
parents:
793
diff
changeset
|
1482 |
buddylist_build(); |
55cd45481a07
Fix a buddylist bug when receiving a subscription request
Mikael Berthe <mikael@lilotux.net>
parents:
793
diff
changeset
|
1483 |
update_roster = TRUE; |
547
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
1484 |
} |
611
ad737139a144
Improve subscription management
Mikael Berthe <mikael@lilotux.net>
parents:
610
diff
changeset
|
1485 |
g_free(r); |
547
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
1486 |
} |
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
1487 |
|
533
c478e8f7f074
Make some functions static
Mikael Berthe <mikael@lilotux.net>
parents:
532
diff
changeset
|
1488 |
static void packethandler(jconn conn, jpacket packet) |
31 | 1489 |
{ |
772
464be13343a9
Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents:
756
diff
changeset
|
1490 |
char *p; |
464be13343a9
Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents:
756
diff
changeset
|
1491 |
/* |
464be13343a9
Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents:
756
diff
changeset
|
1492 |
char *r, *s; |
547
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
1493 |
const char *m; |
772
464be13343a9
Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents:
756
diff
changeset
|
1494 |
*/ |
547
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
1495 |
char *from=NULL, *type=NULL; |
31 | 1496 |
|
469
a926523d2392
Use UTF8 to handle resources and room nicknames
Mikael Berthe <mikael@lilotux.net>
parents:
468
diff
changeset
|
1497 |
jb_reset_keepalive(); // reset keepalive timeout |
31 | 1498 |
jpacket_reset(packet); |
1499 |
||
671
c5da36fd437a
Do not process packet if type = 0
Mikael Berthe <mikael@lilotux.net>
parents:
668
diff
changeset
|
1500 |
if (!packet->type) { |
c5da36fd437a
Do not process packet if type = 0
Mikael Berthe <mikael@lilotux.net>
parents:
668
diff
changeset
|
1501 |
scr_LogPrint(LPRINT_LOG, "Packet type = 0"); |
c5da36fd437a
Do not process packet if type = 0
Mikael Berthe <mikael@lilotux.net>
parents:
668
diff
changeset
|
1502 |
return; |
c5da36fd437a
Do not process packet if type = 0
Mikael Berthe <mikael@lilotux.net>
parents:
668
diff
changeset
|
1503 |
} |
c5da36fd437a
Do not process packet if type = 0
Mikael Berthe <mikael@lilotux.net>
parents:
668
diff
changeset
|
1504 |
|
547
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
1505 |
p = xmlnode_get_attrib(packet->x, "type"); |
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
1506 |
if (p) type = p; |
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
1507 |
|
469
a926523d2392
Use UTF8 to handle resources and room nicknames
Mikael Berthe <mikael@lilotux.net>
parents:
468
diff
changeset
|
1508 |
p = xmlnode_get_attrib(packet->x, "from"); |
772
464be13343a9
Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents:
756
diff
changeset
|
1509 |
if (p) from = p; |
469
a926523d2392
Use UTF8 to handle resources and room nicknames
Mikael Berthe <mikael@lilotux.net>
parents:
468
diff
changeset
|
1510 |
|
a926523d2392
Use UTF8 to handle resources and room nicknames
Mikael Berthe <mikael@lilotux.net>
parents:
468
diff
changeset
|
1511 |
if (!from && packet->type != JPACKET_IQ) { |
a926523d2392
Use UTF8 to handle resources and room nicknames
Mikael Berthe <mikael@lilotux.net>
parents:
468
diff
changeset
|
1512 |
scr_LogPrint(LPRINT_LOGNORM, "Error in packet (could be UTF8-related)"); |
a926523d2392
Use UTF8 to handle resources and room nicknames
Mikael Berthe <mikael@lilotux.net>
parents:
468
diff
changeset
|
1513 |
return; |
a926523d2392
Use UTF8 to handle resources and room nicknames
Mikael Berthe <mikael@lilotux.net>
parents:
468
diff
changeset
|
1514 |
} |
31 | 1515 |
|
1516 |
switch (packet->type) { |
|
1517 |
case JPACKET_MESSAGE: |
|
547
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
1518 |
handle_packet_message(conn, type, from, packet->x); |
31 | 1519 |
break; |
1520 |
||
1521 |
case JPACKET_IQ: |
|
547
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
1522 |
handle_packet_iq(conn, type, from, packet->x); |
31 | 1523 |
break; |
1524 |
||
1525 |
case JPACKET_PRESENCE: |
|
547
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
1526 |
handle_packet_presence(conn, type, from, packet->x); |
31 | 1527 |
break; |
1528 |
||
1529 |
case JPACKET_S10N: |
|
547
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
1530 |
handle_packet_s10n(conn, type, from, packet->x); |
31 | 1531 |
break; |
1532 |
||
1533 |
default: |
|
547
1df26ff0ed8c
Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents:
539
diff
changeset
|
1534 |
scr_LogPrint(LPRINT_LOG, "Unhandled packet type (%d)", packet->type); |
31 | 1535 |
} |
1536 |
} |
|
1537 |
||
580 | 1538 |
/* vim: set expandtab cindent cinoptions=>2\:2(0: For Vim users... */ |