]>
Commit | Line | Data |
---|---|---|
212380e3 AC |
1 | /* |
2 | * charybdis: A useful ircd. | |
3 | * client.h: The ircd client header. | |
4 | * | |
5 | * Copyright (C) 1990 Jarkko Oikarinen and University of Oulu, Co Center | |
6 | * Copyright (C) 1996-2002 Hybrid Development Team | |
7 | * Copyright (C) 2002-2004 ircd-ratbox development team | |
8 | * Copyright (C) 2005 William Pitcock and Jilles Tjoelker | |
9 | * | |
10 | * This program is free software; you can redistribute it and/or modify | |
11 | * it under the terms of the GNU General Public License as published by | |
12 | * the Free Software Foundation; either version 2 of the License, or | |
13 | * (at your option) any later version. | |
14 | * | |
15 | * This program is distributed in the hope that it will be useful, | |
16 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
17 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
18 | * GNU General Public License for more details. | |
19 | * | |
20 | * You should have received a copy of the GNU General Public License | |
21 | * along with this program; if not, write to the Free Software | |
22 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 | |
23 | * USA | |
212380e3 AC |
24 | */ |
25 | ||
26 | #ifndef INCLUDED_client_h | |
27 | #define INCLUDED_client_h | |
28 | ||
9b8e9eb3 | 29 | #include "defaults.h" |
212380e3 AC |
30 | |
31 | #include "ircd_defs.h" | |
212380e3 | 32 | #include "channel.h" |
1eeb0469 | 33 | #include "dns.h" |
212380e3 | 34 | #include "snomask.h" |
4562c604 | 35 | #include "match.h" |
212380e3 | 36 | #include "ircd.h" |
ef242716 | 37 | #include "privilege.h" |
212380e3 | 38 | |
212380e3 AC |
39 | /* we store ipv6 ips for remote clients, so this needs to be v6 always */ |
40 | #define HOSTIPLEN 53 /* sizeof("ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255.ipv6") */ | |
154dc91e EM |
41 | #define PASSWDLEN 128 |
42 | #define CIPHERKEYLEN 64 /* 512bit */ | |
212380e3 AC |
43 | |
44 | #define IDLEN 10 | |
45 | ||
179becdf | 46 | #define TGCHANGE_NUM 10 /* how many targets we keep track of */ |
c9f01c4f | 47 | #define TGCHANGE_REPLY 5 /* how many reply targets */ |
179becdf JT |
48 | #define TGCHANGE_INITIAL 10 /* initial free targets (normal) */ |
49 | #define TGCHANGE_INITIAL_LOW 4 /* initial free targets (possible spambot) */ | |
ad1d39a7 | 50 | |
212380e3 AC |
51 | /* |
52 | * pre declare structs | |
53 | */ | |
54 | struct ConfItem; | |
55 | struct Whowas; | |
56 | struct DNSReply; | |
57 | struct Listener; | |
58 | struct Client; | |
59 | struct User; | |
60 | struct Server; | |
61 | struct LocalUser; | |
212380e3 | 62 | struct PreClient; |
999fab77 | 63 | struct ListClient; |
994544c2 | 64 | struct scache_entry; |
c53ca1e0 | 65 | struct ws_ctl; |
212380e3 | 66 | |
53789fdd SA |
67 | typedef int SSL_OPEN_CB(struct Client *, int status); |
68 | ||
212380e3 AC |
69 | /* |
70 | * Client structures | |
71 | */ | |
72 | struct User | |
73 | { | |
5b96d9a6 AC |
74 | rb_dlink_list channel; /* chain of channel pointer blocks */ |
75 | rb_dlink_list invited; /* chain of invite pointer blocks */ | |
c127b45b | 76 | char *away; /* pointer to away message */ |
212380e3 | 77 | int refcnt; /* Number of times this block is referenced */ |
212380e3 | 78 | |
ed3ca2ff EK |
79 | char *opername; /* name of operator{} block being used or tried (challenge) */ |
80 | struct PrivilegeSet *privset; | |
81 | ||
212380e3 AC |
82 | char suser[NICKLEN+1]; |
83 | }; | |
84 | ||
85 | struct Server | |
86 | { | |
8f103562 | 87 | struct User *user; /* who activated this connection */ |
212380e3 | 88 | char by[NICKLEN]; |
5b96d9a6 AC |
89 | rb_dlink_list servers; |
90 | rb_dlink_list users; | |
212380e3 AC |
91 | int caps; /* capabilities bit-field */ |
92 | char *fullcaps; | |
994544c2 | 93 | struct scache_entry *nameinfo; |
212380e3 AC |
94 | }; |
95 | ||
212380e3 AC |
96 | struct ZipStats |
97 | { | |
8bd5767b JT |
98 | unsigned long long in; |
99 | unsigned long long in_wire; | |
100 | unsigned long long out; | |
101 | unsigned long long out_wire; | |
102 | double in_ratio; | |
212380e3 AC |
103 | double out_ratio; |
104 | }; | |
105 | ||
106 | struct Client | |
107 | { | |
5b96d9a6 AC |
108 | rb_dlink_node node; |
109 | rb_dlink_node lnode; | |
8f103562 JT |
110 | struct User *user; /* ...defined, if this is a User */ |
111 | struct Server *serv; /* ...defined, if this is a server */ | |
112 | struct Client *servptr; /* Points to server this Client is on */ | |
113 | struct Client *from; /* == self, if Local Client, *NEVER* NULL! */ | |
212380e3 | 114 | |
b47f8a4f AC |
115 | rb_dlink_list whowas_clist; |
116 | ||
212380e3 AC |
117 | time_t tsinfo; /* TS on the nick, SVINFO on server */ |
118 | unsigned int umodes; /* opers, normal users subset */ | |
66f7fe67 | 119 | uint64_t flags; /* client flags */ |
212380e3 AC |
120 | |
121 | unsigned int snomask; /* server notice mask */ | |
122 | ||
123 | int hopcount; /* number of servers to this 0 = local */ | |
124 | unsigned short status; /* Client type */ | |
125 | unsigned char handler; /* Handler index */ | |
126 | unsigned long serial; /* used to enforce 1 send per nick */ | |
127 | ||
128 | /* client->name is the unique name for a client nick or host */ | |
fe5fc851 | 129 | char name[NAMELEN + 1]; |
212380e3 | 130 | |
55abcbb2 KB |
131 | /* |
132 | * client->username is the username from ident or the USER message, | |
133 | * If the client is idented the USER message is ignored, otherwise | |
134 | * the username part of the USER message is put here prefixed with a | |
212380e3 AC |
135 | * tilde depending on the I:line, Once a client has registered, this |
136 | * field should be considered read-only. | |
137 | */ | |
138 | char username[USERLEN + 1]; /* client's username */ | |
139 | ||
140 | /* | |
141 | * client->host contains the resolved name or ip address | |
142 | * as a string for the user, it may be fiddled with for oper spoofing etc. | |
143 | */ | |
144 | char host[HOSTLEN + 1]; /* client's hostname */ | |
145 | char orighost[HOSTLEN + 1]; /* original hostname (before dynamic spoofing) */ | |
146 | char sockhost[HOSTIPLEN + 1]; /* clients ip */ | |
147 | char info[REALLEN + 1]; /* Free form additional client info */ | |
148 | ||
149 | char id[IDLEN]; /* UID/SID, unique on the network */ | |
150 | ||
151 | /* list of who has this client on their allow list, its counterpart | |
152 | * is in LocalUser | |
153 | */ | |
5b96d9a6 | 154 | rb_dlink_list on_allow_list; |
212380e3 | 155 | |
c24efdc0 JT |
156 | time_t first_received_message_time; |
157 | int received_number_of_privmsgs; | |
158 | int flood_noticed; | |
159 | ||
8f103562 JT |
160 | struct LocalUser *localClient; |
161 | struct PreClient *preClient; | |
aa9c9ed2 JT |
162 | |
163 | time_t large_ctcp_sent; /* ctcp to large group sent, relax flood checks */ | |
8eda114a | 164 | char *certfp; /* client certificate fingerprint */ |
212380e3 AC |
165 | }; |
166 | ||
167 | struct LocalUser | |
168 | { | |
de7cf7e0 AC |
169 | rb_dlink_node tnode; /* This is the node for the local list type the client is on */ |
170 | rb_dlink_list connids; /* This is the list of connids to free */ | |
171 | ||
212380e3 AC |
172 | /* |
173 | * The following fields are allocated only for local clients | |
174 | * (directly connected to *this* server with a socket. | |
175 | */ | |
176 | /* Anti flooding part, all because of lamers... */ | |
55abcbb2 | 177 | time_t last_join_time; /* when this client last |
212380e3 | 178 | joined a channel */ |
55abcbb2 | 179 | time_t last_leave_time; /* when this client last |
212380e3 | 180 | * left a channel */ |
55abcbb2 | 181 | int join_leave_count; /* count of JOIN/LEAVE in less than |
212380e3 | 182 | MIN_JOIN_LEAVE_TIME seconds */ |
55abcbb2 | 183 | int oper_warn_count_down; /* warn opers of this possible |
212380e3 AC |
184 | spambot every time this gets to 0 */ |
185 | time_t last_caller_id_time; | |
212380e3 AC |
186 | |
187 | time_t lasttime; /* last time we parsed something */ | |
188 | time_t firsttime; /* time client was created */ | |
189 | ||
190 | /* Send and receive linebuf queues .. */ | |
191 | buf_head_t buf_sendq; | |
192 | buf_head_t buf_recvq; | |
d3f6b808 | 193 | |
212380e3 AC |
194 | /* |
195 | * we want to use unsigned int here so the sizes have a better chance of | |
196 | * staying the same on 64 bit machines. The current trend is to use | |
197 | * I32LP64, (32 bit ints, 64 bit longs and pointers) and since ircd | |
55abcbb2 | 198 | * will NEVER run on an operating system where ints are less than 32 bits, |
212380e3 | 199 | * it's a relatively safe bet to use ints. Since right shift operations are |
55abcbb2 KB |
200 | * performed on these, it's not safe to allow them to become negative, |
201 | * which is possible for long running server connections. Unsigned values | |
212380e3 | 202 | * generally overflow gracefully. --Bleep |
d3f6b808 EM |
203 | * |
204 | * We have modern conveniences. Let's use uint32_t. --Elizafox | |
212380e3 | 205 | */ |
d3f6b808 EM |
206 | uint32_t sendM; /* Statistics: protocol messages send */ |
207 | uint32_t sendK; /* Statistics: total k-bytes send */ | |
208 | uint32_t receiveM; /* Statistics: protocol messages received */ | |
209 | uint32_t receiveK; /* Statistics: total k-bytes received */ | |
210 | uint16_t sendB; /* counters to count upto 1-k lots of bytes */ | |
211 | uint16_t receiveB; /* sent and received. */ | |
8f103562 JT |
212 | struct Listener *listener; /* listener accepted from */ |
213 | struct ConfItem *att_conf; /* attached conf */ | |
212380e3 AC |
214 | struct server_conf *att_sconf; |
215 | ||
e7046ee5 | 216 | struct rb_sockaddr_storage ip; |
212380e3 AC |
217 | time_t last_nick_change; |
218 | int number_of_nick_changes; | |
219 | ||
220 | /* | |
221 | * XXX - there is no reason to save this, it should be checked when it's | |
222 | * received and not stored, this is not used after registration | |
223 | * | |
224 | * agreed. lets get rid of it someday! --nenolod | |
225 | */ | |
226 | char *passwd; | |
40c1fd47 | 227 | char *auth_user; |
212380e3 AC |
228 | char *challenge; |
229 | char *fullcaps; | |
ebe33dbf | 230 | char *cipher_string; |
212380e3 AC |
231 | |
232 | int caps; /* capabilities bit-field */ | |
5b96d9a6 | 233 | rb_fde_t *F; /* >= 0, for local clients */ |
212380e3 AC |
234 | |
235 | /* time challenge response is valid for */ | |
236 | time_t chal_time; | |
237 | ||
d42e6915 | 238 | time_t next_away; /* Don't allow next away before... */ |
212380e3 AC |
239 | time_t last; |
240 | ||
241 | /* clients allowed to talk through +g */ | |
5b96d9a6 | 242 | rb_dlink_list allow_list; |
212380e3 AC |
243 | |
244 | /* nicknames theyre monitoring */ | |
5b96d9a6 | 245 | rb_dlink_list monitor_list; |
212380e3 AC |
246 | |
247 | /* | |
248 | * Anti-flood stuff. We track how many messages were parsed and how | |
249 | * many we were allowed in the current second, and apply a simple decay | |
250 | * to avoid flooding. | |
251 | * -- adrian | |
252 | */ | |
212380e3 AC |
253 | int sent_parsed; /* how many messages we've parsed in this second */ |
254 | time_t last_knock; /* time of last knock */ | |
da20854e | 255 | uint32_t random_ping; |
212380e3 | 256 | |
ae78a571 | 257 | /* target change stuff */ |
c9f01c4f JT |
258 | /* targets we're aware of (fnv32(use_id(target_p))): |
259 | * 0..TGCHANGE_NUM-1 regular slots | |
260 | * TGCHANGE_NUM..TGCHANGE_NUM+TGCHANGE_REPLY-1 reply slots | |
261 | */ | |
262 | uint32_t targets[TGCHANGE_NUM + TGCHANGE_REPLY]; | |
179becdf | 263 | unsigned int targets_free; /* free targets */ |
212380e3 AC |
264 | time_t target_last; /* last time we cleared a slot */ |
265 | ||
e88a1f1b KB |
266 | /* ratelimit items */ |
267 | time_t ratelimit; | |
268 | unsigned int join_who_credits; | |
269 | ||
999fab77 AC |
270 | struct ListClient *safelist_data; |
271 | ||
212380e3 AC |
272 | char *mangledhost; /* non-NULL if host mangling module loaded and |
273 | applicable to this client */ | |
c6d72037 | 274 | |
3318e109 | 275 | struct _ssl_ctl *ssl_ctl; /* which ssl daemon we're associate with */ |
32eadd33 | 276 | struct _ssl_ctl *z_ctl; /* second ctl for ssl+zlib */ |
c53ca1e0 | 277 | struct ws_ctl *ws_ctl; /* ctl for wsockd */ |
53789fdd | 278 | SSL_OPEN_CB *ssl_callback; /* ssl connection is now open */ |
104c6d46 | 279 | uint32_t localflags; |
c6d72037 | 280 | struct ZipStats *zipstats; /* zipstats */ |
104c6d46 | 281 | uint16_t cork_count; /* used for corking/uncorking connections */ |
c6d72037 | 282 | struct ev_entry *event; /* used for associated events */ |
ef242716 | 283 | |
c6bc97fd AC |
284 | char sasl_agent[IDLEN]; |
285 | unsigned char sasl_out; | |
286 | unsigned char sasl_complete; | |
9d07a42d MM |
287 | |
288 | unsigned int sasl_messages; | |
289 | unsigned int sasl_failures; | |
290 | time_t sasl_next_retry; | |
212380e3 AC |
291 | }; |
292 | ||
762468f8 SA |
293 | #define AUTHC_F_DEFERRED 0x01 |
294 | #define AUTHC_F_COMPLETE 0x02 | |
295 | ||
154dc91e EM |
296 | struct AuthClient |
297 | { | |
298 | uint32_t cid; /* authd id */ | |
299 | time_t timeout; /* When to terminate authd query */ | |
300 | bool accepted; /* did authd accept us? */ | |
301 | char cause; /* rejection cause */ | |
302 | char *data; /* reason data */ | |
303 | char *reason; /* reason we were rejected */ | |
762468f8 | 304 | int flags; |
154dc91e EM |
305 | }; |
306 | ||
212380e3 AC |
307 | struct PreClient |
308 | { | |
309 | char spoofnick[NICKLEN + 1]; | |
310 | char spoofuser[USERLEN + 1]; | |
311 | char spoofhost[HOSTLEN + 1]; | |
312 | ||
154dc91e | 313 | struct AuthClient auth; |
3540120a JT |
314 | |
315 | struct rb_sockaddr_storage lip; /* address of our side of the connection */ | |
d4b2529a SA |
316 | |
317 | char id[IDLEN]; /* UID/SID, unique on the network (unverified) */ | |
212380e3 AC |
318 | }; |
319 | ||
999fab77 AC |
320 | struct ListClient |
321 | { | |
322 | char *chname; | |
323 | unsigned int users_min, users_max; | |
324 | time_t created_min, created_max, topic_min, topic_max; | |
325 | int operspy; | |
326 | }; | |
327 | ||
212380e3 AC |
328 | /* |
329 | * status macros. | |
330 | */ | |
331 | #define STAT_CONNECTING 0x01 | |
332 | #define STAT_HANDSHAKE 0x02 | |
333 | #define STAT_ME 0x04 | |
334 | #define STAT_UNKNOWN 0x08 | |
335 | #define STAT_REJECT 0x10 | |
336 | #define STAT_SERVER 0x20 | |
337 | #define STAT_CLIENT 0x40 | |
338 | ||
339 | ||
340 | #define IsRegisteredUser(x) ((x)->status == STAT_CLIENT) | |
341 | #define IsRegistered(x) (((x)->status > STAT_UNKNOWN) && ((x)->status != STAT_REJECT)) | |
342 | #define IsConnecting(x) ((x)->status == STAT_CONNECTING) | |
343 | #define IsHandshake(x) ((x)->status == STAT_HANDSHAKE) | |
344 | #define IsMe(x) ((x)->status == STAT_ME) | |
345 | #define IsUnknown(x) ((x)->status == STAT_UNKNOWN) | |
346 | #define IsServer(x) ((x)->status == STAT_SERVER) | |
347 | #define IsClient(x) ((x)->status == STAT_CLIENT) | |
348 | #define IsReject(x) ((x)->status == STAT_REJECT) | |
349 | ||
350 | #define IsAnyServer(x) (IsServer(x) || IsHandshake(x) || IsConnecting(x)) | |
351 | ||
352 | #define IsOper(x) ((x)->umodes & UMODE_OPER) | |
353 | #define IsAdmin(x) ((x)->umodes & UMODE_ADMIN) | |
354 | ||
355 | #define SetReject(x) {(x)->status = STAT_REJECT; \ | |
356 | (x)->handler = UNREGISTERED_HANDLER; } | |
357 | ||
358 | #define SetConnecting(x) {(x)->status = STAT_CONNECTING; \ | |
359 | (x)->handler = UNREGISTERED_HANDLER; } | |
360 | ||
361 | #define SetHandshake(x) {(x)->status = STAT_HANDSHAKE; \ | |
362 | (x)->handler = UNREGISTERED_HANDLER; } | |
363 | ||
364 | #define SetMe(x) {(x)->status = STAT_ME; \ | |
365 | (x)->handler = UNREGISTERED_HANDLER; } | |
366 | ||
367 | #define SetUnknown(x) {(x)->status = STAT_UNKNOWN; \ | |
368 | (x)->handler = UNREGISTERED_HANDLER; } | |
369 | ||
370 | #define SetServer(x) {(x)->status = STAT_SERVER; \ | |
371 | (x)->handler = SERVER_HANDLER; } | |
372 | ||
373 | #define SetClient(x) {(x)->status = STAT_CLIENT; \ | |
374 | (x)->handler = IsOper((x)) ? \ | |
375 | OPER_HANDLER : CLIENT_HANDLER; } | |
376 | #define SetRemoteClient(x) {(x)->status = STAT_CLIENT; \ | |
377 | (x)->handler = RCLIENT_HANDLER; } | |
378 | ||
379 | #define STAT_CLIENT_PARSE (STAT_UNKNOWN | STAT_CLIENT) | |
380 | #define STAT_SERVER_PARSE (STAT_CONNECTING | STAT_HANDSHAKE | STAT_SERVER) | |
381 | ||
382 | #define PARSE_AS_CLIENT(x) ((x)->status & STAT_CLIENT_PARSE) | |
383 | #define PARSE_AS_SERVER(x) ((x)->status & STAT_SERVER_PARSE) | |
384 | ||
385 | ||
386 | /* | |
387 | * ts stuff | |
388 | */ | |
389 | #define TS_CURRENT 6 | |
212380e3 | 390 | #define TS_MIN 6 |
212380e3 AC |
391 | |
392 | #define TS_DOESTS 0x10000000 | |
393 | #define DoesTS(x) ((x)->tsinfo & TS_DOESTS) | |
394 | ||
395 | #define has_id(source) ((source)->id[0] != '\0') | |
396 | #define use_id(source) ((source)->id[0] != '\0' ? (source)->id : (source)->name) | |
397 | ||
398 | /* if target is TS6, use id if it has one, else name */ | |
399 | #define get_id(source, target) ((IsServer(target->from) && has_id(target->from)) ? \ | |
400 | use_id(source) : (source)->name) | |
401 | ||
402 | /* housekeeping flags */ | |
403 | ||
66f7fe67 EM |
404 | #define FLAGS_PINGSENT 0x00000001 /* Unreplied ping sent */ |
405 | #define FLAGS_DEAD 0x00000002 /* Local socket is dead--Exiting soon */ | |
406 | #define FLAGS_KILLED 0x00000004 /* Prevents "QUIT" from being sent for this */ | |
407 | #define FLAGS_SENTUSER 0x00000008 /* Client sent a USER command. */ | |
408 | #define FLAGS_CLICAP 0x00000010 /* In CAP negotiation, wait for CAP END */ | |
409 | #define FLAGS_CLOSING 0x00000020 /* set when closing to suppress errors */ | |
410 | #define FLAGS_PING_COOKIE 0x00000040 /* has sent ping cookie */ | |
411 | #define FLAGS_GOTID 0x00000080 /* successful ident lookup achieved */ | |
412 | #define FLAGS_FLOODDONE 0x00000100 /* flood grace period over / reported */ | |
413 | #define FLAGS_NORMALEX 0x00000200 /* Client exited normally */ | |
414 | #define FLAGS_MARK 0x00000400 /* marked client */ | |
415 | #define FLAGS_HIDDEN 0x00000800 /* hidden server */ | |
416 | #define FLAGS_EOB 0x00001000 /* EOB */ | |
417 | #define FLAGS_MYCONNECT 0x00002000 /* MyConnect */ | |
418 | #define FLAGS_IOERROR 0x00004000 /* IO error */ | |
419 | #define FLAGS_SERVICE 0x00008000 /* network service */ | |
420 | #define FLAGS_TGCHANGE 0x00010000 /* we're allowed to clear something */ | |
421 | #define FLAGS_DYNSPOOF 0x00020000 /* dynamic spoof, only opers see ip */ | |
422 | #define FLAGS_TGEXCESSIVE 0x00040000 /* whether the client has attemped to change targets excessively fast */ | |
423 | #define FLAGS_CLICAP_DATA 0x00080000 /* requested CAP LS 302 */ | |
424 | #define FLAGS_EXTENDCHANS 0x00100000 | |
425 | #define FLAGS_EXEMPTRESV 0x00200000 | |
426 | #define FLAGS_EXEMPTKLINE 0x00400000 | |
427 | #define FLAGS_EXEMPTFLOOD 0x00800000 | |
428 | #define FLAGS_IP_SPOOFING 0x01000000 | |
429 | #define FLAGS_EXEMPTSPAMBOT 0x02000000 | |
430 | #define FLAGS_EXEMPTSHIDE 0x04000000 | |
431 | #define FLAGS_EXEMPTJUPE 0x08000000 | |
432 | ||
212380e3 | 433 | |
3318e109 AC |
434 | /* flags for local clients, this needs stuff moved from above to here at some point */ |
435 | #define LFLAGS_SSL 0x00000001 | |
436 | #define LFLAGS_FLUSH 0x00000002 | |
c6d72037 | 437 | #define LFLAGS_CORK 0x00000004 |
c6ad9b0c | 438 | #define LFLAGS_SCTP 0x00000008 |
d6c81378 | 439 | #define LFLAGS_INSECURE 0x00000010 /* for marking SSL clients as insecure before registration */ |
c6d72037 | 440 | |
212380e3 AC |
441 | /* umodes, settable flags */ |
442 | /* lots of this moved to snomask -- jilles */ | |
443 | #define UMODE_SERVNOTICE 0x0001 /* server notices */ | |
044aa2c7 VY |
444 | #define UMODE_WALLOP 0x0002 /* send wallops to them */ |
445 | #define UMODE_OPERWALL 0x0004 /* Operwalls */ | |
446 | #define UMODE_INVISIBLE 0x0008 /* makes user invisible */ | |
044aa2c7 VY |
447 | #define UMODE_LOCOPS 0x0020 /* show locops */ |
448 | #define UMODE_SERVICE 0x0040 | |
449 | #define UMODE_DEAF 0x0080 | |
450 | #define UMODE_NOFORWARD 0x0100 /* don't forward */ | |
212380e3 AC |
451 | |
452 | /* user information flags, only settable by remote mode or local oper */ | |
044aa2c7 VY |
453 | #define UMODE_OPER 0x1000 /* Operator */ |
454 | #define UMODE_ADMIN 0x2000 /* Admin on server */ | |
455 | #define UMODE_SSLCLIENT 0x4000 /* using SSL */ | |
212380e3 | 456 | |
212380e3 AC |
457 | #define DEFAULT_OPER_UMODES (UMODE_SERVNOTICE | UMODE_OPERWALL | \ |
458 | UMODE_WALLOP | UMODE_LOCOPS) | |
459 | #define DEFAULT_OPER_SNOMASK SNO_GENERAL | |
460 | ||
212380e3 AC |
461 | /* |
462 | * flags macros. | |
463 | */ | |
464 | #define IsPerson(x) (IsClient(x) && (x)->user != NULL) | |
212380e3 AC |
465 | #define HasServlink(x) ((x)->flags & FLAGS_SERVLINK) |
466 | #define SetServlink(x) ((x)->flags |= FLAGS_SERVLINK) | |
467 | #define MyConnect(x) ((x)->flags & FLAGS_MYCONNECT) | |
468 | #define SetMyConnect(x) ((x)->flags |= FLAGS_MYCONNECT) | |
469 | #define ClearMyConnect(x) ((x)->flags &= ~FLAGS_MYCONNECT) | |
470 | ||
471 | #define MyClient(x) (MyConnect(x) && IsClient(x)) | |
472 | #define SetMark(x) ((x)->flags |= FLAGS_MARK) | |
473 | #define ClearMark(x) ((x)->flags &= ~FLAGS_MARK) | |
474 | #define IsMarked(x) ((x)->flags & FLAGS_MARK) | |
475 | #define SetHidden(x) ((x)->flags |= FLAGS_HIDDEN) | |
476 | #define ClearHidden(x) ((x)->flags &= ~FLAGS_HIDDEN) | |
477 | #define IsHidden(x) ((x)->flags & FLAGS_HIDDEN) | |
478 | #define ClearEob(x) ((x)->flags &= ~FLAGS_EOB) | |
479 | #define SetEob(x) ((x)->flags |= FLAGS_EOB) | |
480 | #define HasSentEob(x) ((x)->flags & FLAGS_EOB) | |
481 | #define IsDead(x) ((x)->flags & FLAGS_DEAD) | |
482 | #define SetDead(x) ((x)->flags |= FLAGS_DEAD) | |
483 | #define IsClosing(x) ((x)->flags & FLAGS_CLOSING) | |
484 | #define SetClosing(x) ((x)->flags |= FLAGS_CLOSING) | |
485 | #define IsIOError(x) ((x)->flags & FLAGS_IOERROR) | |
486 | #define SetIOError(x) ((x)->flags |= FLAGS_IOERROR) | |
487 | #define IsAnyDead(x) (IsIOError(x) || IsDead(x) || IsClosing(x)) | |
488 | #define IsTGChange(x) ((x)->flags & FLAGS_TGCHANGE) | |
489 | #define SetTGChange(x) ((x)->flags |= FLAGS_TGCHANGE) | |
490 | #define ClearTGChange(x) ((x)->flags &= ~FLAGS_TGCHANGE) | |
491 | #define IsDynSpoof(x) ((x)->flags & FLAGS_DYNSPOOF) | |
492 | #define SetDynSpoof(x) ((x)->flags |= FLAGS_DYNSPOOF) | |
493 | #define ClearDynSpoof(x) ((x)->flags &= ~FLAGS_DYNSPOOF) | |
ab894d74 KB |
494 | #define IsTGExcessive(x) ((x)->flags & FLAGS_TGEXCESSIVE) |
495 | #define SetTGExcessive(x) ((x)->flags |= FLAGS_TGEXCESSIVE) | |
496 | #define ClearTGExcessive(x) ((x)->flags &= ~FLAGS_TGEXCESSIVE) | |
212380e3 | 497 | |
3318e109 AC |
498 | /* local flags */ |
499 | ||
500 | #define IsSSL(x) ((x)->localClient->localflags & LFLAGS_SSL) | |
501 | #define SetSSL(x) ((x)->localClient->localflags |= LFLAGS_SSL) | |
502 | #define ClearSSL(x) ((x)->localClient->localflags &= ~LFLAGS_SSL) | |
503 | ||
504 | #define IsFlush(x) ((x)->localClient->localflags & LFLAGS_FLUSH) | |
505 | #define SetFlush(x) ((x)->localClient->localflags |= LFLAGS_FLUSH) | |
c6d72037 VY |
506 | #define ClearFlush(x) ((x)->localClient->localflags &= ~LFLAGS_FLUSH) |
507 | ||
c6ad9b0c SA |
508 | #define IsSCTP(x) ((x)->localClient->localflags & LFLAGS_SCTP) |
509 | #define SetSCTP(x) ((x)->localClient->localflags |= LFLAGS_SCTP) | |
510 | #define ClearSCTP(x) ((x)->localClient->localflags &= ~LFLAGS_SCTP) | |
511 | ||
d6c81378 EK |
512 | #define IsInsecure(x) ((x)->localClient->localflags & LFLAGS_INSECURE) |
513 | #define SetInsecure(x) ((x)->localClient->localflags |= LFLAGS_INSECURE) | |
514 | #define ClearInsecure(x) ((x)->localClient->localflags &= ~LFLAGS_INSECURE) | |
515 | ||
212380e3 AC |
516 | /* oper flags */ |
517 | #define MyOper(x) (MyConnect(x) && IsOper(x)) | |
518 | ||
519 | #define SetOper(x) {(x)->umodes |= UMODE_OPER; \ | |
520 | if (MyClient((x))) (x)->handler = OPER_HANDLER;} | |
521 | ||
522 | #define ClearOper(x) {(x)->umodes &= ~(UMODE_OPER|UMODE_ADMIN); \ | |
523 | if (MyClient((x)) && !IsOper((x)) && !IsServer((x))) \ | |
524 | (x)->handler = CLIENT_HANDLER; } | |
525 | ||
212380e3 AC |
526 | /* umode flags */ |
527 | #define IsInvisible(x) ((x)->umodes & UMODE_INVISIBLE) | |
528 | #define SetInvisible(x) ((x)->umodes |= UMODE_INVISIBLE) | |
529 | #define ClearInvisible(x) ((x)->umodes &= ~UMODE_INVISIBLE) | |
af7aaa84 AC |
530 | #define IsSSLClient(x) ((x)->umodes & UMODE_SSLCLIENT) |
531 | #define SetSSLClient(x) ((x)->umodes |= UMODE_SSLCLIENT) | |
532 | #define ClearSSLClient(x) ((x)->umodes &= ~UMODE_SSLCLIENT) | |
212380e3 | 533 | #define SendWallops(x) ((x)->umodes & UMODE_WALLOP) |
212380e3 AC |
534 | #define SendLocops(x) ((x)->umodes & UMODE_LOCOPS) |
535 | #define SendServNotice(x) ((x)->umodes & UMODE_SERVNOTICE) | |
536 | #define SendOperwall(x) ((x)->umodes & UMODE_OPERWALL) | |
212380e3 AC |
537 | #define IsService(x) ((x)->umodes & UMODE_SERVICE) |
538 | #define IsDeaf(x) ((x)->umodes & UMODE_DEAF) | |
539 | #define IsNoForward(x) ((x)->umodes & UMODE_NOFORWARD) | |
212380e3 | 540 | |
212380e3 AC |
541 | #define SetGotId(x) ((x)->flags |= FLAGS_GOTID) |
542 | #define IsGotId(x) (((x)->flags & FLAGS_GOTID) != 0) | |
543 | ||
66f7fe67 EM |
544 | #define IsExemptKline(x) ((x)->flags & FLAGS_EXEMPTKLINE) |
545 | #define SetExemptKline(x) ((x)->flags |= FLAGS_EXEMPTKLINE) | |
546 | #define IsExemptFlood(x) ((x)->flags & FLAGS_EXEMPTFLOOD) | |
547 | #define SetExemptFlood(x) ((x)->flags |= FLAGS_EXEMPTFLOOD) | |
548 | #define IsExemptSpambot(x) ((x)->flags & FLAGS_EXEMPTSPAMBOT) | |
549 | #define SetExemptSpambot(x) ((x)->flags |= FLAGS_EXEMPTSPAMBOT) | |
550 | #define IsExemptShide(x) ((x)->flags & FLAGS_EXEMPTSHIDE) | |
551 | #define SetExemptShide(x) ((x)->flags |= FLAGS_EXEMPTSHIDE) | |
552 | #define IsExemptJupe(x) ((x)->flags & FLAGS_EXEMPTJUPE) | |
553 | #define SetExemptJupe(x) ((x)->flags |= FLAGS_EXEMPTJUPE) | |
554 | #define IsExemptResv(x) ((x)->flags & FLAGS_EXEMPTRESV) | |
555 | #define SetExemptResv(x) ((x)->flags |= FLAGS_EXEMPTRESV) | |
556 | #define IsIPSpoof(x) ((x)->flags & FLAGS_IP_SPOOFING) | |
557 | #define SetIPSpoof(x) ((x)->flags |= FLAGS_IP_SPOOFING) | |
558 | #define IsExtendChans(x) ((x)->flags & FLAGS_EXTENDCHANS) | |
559 | #define SetExtendChans(x) ((x)->flags |= FLAGS_EXTENDCHANS) | |
212380e3 | 560 | |
212380e3 AC |
561 | /* for local users: flood grace period is over |
562 | * for servers: mentioned in networknotice.c notice | |
563 | */ | |
095328a7 JT |
564 | #define IsFloodDone(x) ((x)->flags & FLAGS_FLOODDONE) |
565 | #define SetFloodDone(x) ((x)->flags |= FLAGS_FLOODDONE) | |
212380e3 | 566 | |
3318e109 AC |
567 | /* These also operate on the uplink from which it came */ |
568 | #define IsCork(x) (MyConnect(x) ? (x)->localClient->cork_count : (x)->from->localClient->cork_count) | |
569 | #define SetCork(x) (MyConnect(x) ? (x)->localClient->cork_count++ : (x)->from->localClient->cork_count++ ) | |
c6d72037 VY |
570 | #define ClearCork(x) (MyConnect(x) ? (x)->localClient->cork_count-- : (x)->from->localClient->cork_count--) |
571 | ||
212380e3 AC |
572 | /* |
573 | * definitions for get_client_name | |
574 | */ | |
575 | #define HIDE_IP 0 | |
576 | #define SHOW_IP 1 | |
577 | #define MASK_IP 2 | |
578 | ||
10df26d0 EK |
579 | enum |
580 | { | |
581 | D_LINED, | |
582 | K_LINED | |
583 | }; | |
584 | ||
212380e3 | 585 | extern void check_banned_lines(void); |
212380e3 | 586 | extern void check_klines(void); |
10df26d0 | 587 | extern void check_one_kline(struct ConfItem *kline); |
212380e3 AC |
588 | extern void check_dlines(void); |
589 | extern void check_xlines(void); | |
330692a1 | 590 | extern void resv_nick_fnc(const char *mask, const char *reason, int temp_time); |
212380e3 AC |
591 | |
592 | extern const char *get_client_name(struct Client *client, int show_ip); | |
212380e3 AC |
593 | extern const char *log_client_name(struct Client *, int); |
594 | extern int is_remote_connect(struct Client *); | |
595 | extern void init_client(void); | |
8f103562 | 596 | extern struct Client *make_client(struct Client *from); |
212380e3 | 597 | extern void free_pre_client(struct Client *client); |
212380e3 | 598 | |
10df26d0 | 599 | extern void notify_banned_client(struct Client *, struct ConfItem *, int ban); |
212380e3 AC |
600 | extern int exit_client(struct Client *, struct Client *, struct Client *, const char *); |
601 | ||
602 | extern void error_exit_client(struct Client *, int); | |
603 | ||
212380e3 AC |
604 | extern void count_local_client_memory(size_t * count, size_t * memory); |
605 | extern void count_remote_client_memory(size_t * count, size_t * memory); | |
606 | ||
2d28539c JT |
607 | extern int clean_nick(const char *, int loc_client); |
608 | ||
8f103562 JT |
609 | extern struct Client *find_chasing(struct Client *, const char *, int *); |
610 | extern struct Client *find_person(const char *); | |
611 | extern struct Client *find_named_person(const char *); | |
612 | extern struct Client *next_client(struct Client *, const char *); | |
212380e3 | 613 | |
0e7cb7e6 | 614 | #define accept_message(s, t) ((s) == (t) || (rb_dlinkFind((s), &((t)->localClient->allow_list)))) |
212380e3 AC |
615 | extern void del_all_accepts(struct Client *client_p); |
616 | ||
cef7a7bc | 617 | extern void dead_link(struct Client *client_p, int sendqex); |
212380e3 | 618 | extern int show_ip(struct Client *source_p, struct Client *target_p); |
2635cc80 | 619 | extern int show_ip_conf(struct ConfItem *aconf, struct Client *source_p); |
364e59f8 | 620 | extern int show_ip_whowas(struct Whowas *whowas, struct Client *source_p); |
212380e3 | 621 | |
212380e3 | 622 | extern void free_user(struct User *, struct Client *); |
8f103562 JT |
623 | extern struct User *make_user(struct Client *); |
624 | extern struct Server *make_server(struct Client *); | |
212380e3 AC |
625 | extern void close_connection(struct Client *); |
626 | extern void init_uid(void); | |
627 | extern char *generate_uid(void); | |
628 | ||
3318e109 | 629 | void allocate_away(struct Client *); |
300a5433 VY |
630 | void free_away(struct Client *); |
631 | ||
de7cf7e0 AC |
632 | uint32_t connid_get(struct Client *client_p); |
633 | void connid_put(uint32_t id); | |
634 | void client_release_connids(struct Client *client_p); | |
635 | ||
212380e3 | 636 | #endif /* INCLUDED_client_h */ |