]> git.netwichtig.de Git - user/henk/code/inspircd.git/blob - include/users.h
9229cbe11423ae865f18afd78a05a8f5506c34d7
[user/henk/code/inspircd.git] / include / users.h
1 /*       +------------------------------------+
2  *       | Inspire Internet Relay Chat Daemon |
3  *       +------------------------------------+
4  *
5  *  InspIRCd is copyright (C) 2002-2006 ChatSpike-Dev.
6  *                       E-mail:
7  *                <brain@chatspike.net>
8  *                <Craig@chatspike.net>
9  *     
10  * Written by Craig Edwards, Craig McLure, and others.
11  * This program is free but copyrighted software; see
12  *            the file COPYING for details.
13  *
14  * ---------------------------------------------------
15  */
16
17 #ifndef __USERS_H__ 
18 #define __USERS_H__ 
19
20 #include <string>
21
22 #ifdef THREADED_DNS
23 #include <pthread.h>
24 #endif
25
26 #include "inspircd_config.h" 
27 #include "socket.h"
28 #include "channels.h"
29 #include "inspstring.h"
30 #include "connection.h"
31 #include "hashcomp.h"
32 #include "dns.h"
33 #include "cull_list.h"
34
35 enum ChanStatus {
36         STATUS_OP     = 4,
37         STATUS_HOP    = 2,
38         STATUS_VOICE  = 1,
39         STATUS_NORMAL = 0
40 };
41
42 enum ClassTypes {
43         CC_ALLOW = 0,
44         CC_DENY  = 1
45 };
46
47 /** RFC1459 channel modes
48  *  */
49 enum UserModes {
50         UM_SERVERNOTICE = 's'-65,
51         UM_WALLOPS = 'w'-65,
52         UM_INVISIBLE = 'i'-65,
53         UM_OPERATOR = 'o'-65,
54 };
55
56 enum RegistrationState {
57         REG_NONE = 0,           /* Has sent nothing */
58         REG_USER = 1,           /* Has sent USER */
59         REG_NICK = 2,           /* Has sent NICK */
60         REG_NICKUSER = 3,       /* Bitwise combination of REG_NICK and REG_USER */
61         REG_ALL = 7             /* REG_NICKUSER plus next bit along */
62 };
63
64 /** Holds a channel name to which a user has been invited.
65  */
66 class Invited : public classbase
67 {
68  public:
69          irc::string channel;
70 };
71
72 class UserResolver : public Resolver
73 {
74  private:
75         userrec* bound_user;
76         int bound_fd;
77  public:
78         UserResolver(userrec* user, std::string to_resolve, bool forward);
79
80         void OnLookupComplete(const std::string &result);
81         void OnError(ResolverError e);
82 };
83
84
85 /** Holds information relevent to &lt;connect allow&gt; and &lt;connect deny&gt; tags in the config file.
86  */
87 class ConnectClass : public classbase
88 {
89  public:
90         /** Type of line, either CC_ALLOW or CC_DENY
91          */
92         char type;
93         /** Max time to register the connection in seconds
94          */
95         int registration_timeout;
96         /** Number of lines in buffer before excess flood is triggered
97          */
98         int flood;
99         /** Host mask for this line
100          */
101         std::string host;
102         /** Number of seconds between pings for this line
103          */
104         int pingtime;
105         /** (Optional) Password for this line
106          */
107         std::string pass;
108
109         /** Threshold value for flood disconnect
110          */
111         int threshold;
112
113         /** Maximum size of sendq for users in this class (bytes)
114          */
115         long sendqmax;
116
117         /** Maximum size of recvq for users in this class (bytes)
118          */
119         long recvqmax;
120
121         /** Local max when connecting by this connection class
122          */
123         long maxlocal;
124
125         /** Global max when connecting by this connection class
126          */
127         long maxglobal;
128         
129         ConnectClass() : registration_timeout(0), flood(0), host(""), pingtime(0), pass(""), threshold(0), sendqmax(0), recvqmax(0)
130         {
131         }
132 };
133
134 /** Holds a complete list of all channels to which a user has been invited and has not yet joined.
135  */
136 typedef std::vector<Invited> InvitedList;
137
138
139
140 /** Holds a complete list of all allow and deny tags from the configuration file (connection classes)
141  */
142 typedef std::vector<ConnectClass> ClassVector;
143
144 /** Typedef for the list of user-channel records for a user
145  */
146 typedef std::vector<ucrec*> UserChanList;
147
148 /** Holds all information about a user
149  * This class stores all information about a user connected to the irc server. Everything about a
150  * connection is stored here primarily, from the user's socket ID (file descriptor) through to the
151  * user's nickname and hostname. Use the Find method of the server class to locate a specific user
152  * by nickname.
153  */
154 class userrec : public connection
155 {
156  private:
157
158         /** A list of channels the user has a pending invite to.
159          */
160         InvitedList invites;
161  public:
162         /** Resolvers for looking up this users hostname
163          */
164         UserResolver* res_forward;
165         UserResolver* res_reverse;
166         std::string stored_host;
167
168         void StartDNSLookup();
169         
170         /** The users nickname.
171          * An invalid nickname indicates an unregistered connection prior to the NICK command.
172          */
173         
174         char nick[NICKMAX];
175         
176         /** The users ident reply.
177          * Two characters are added to the user-defined limit to compensate for the tilde etc.
178          */
179         char ident[IDENTMAX+2];
180
181         /** The host displayed to non-opers (used for cloaking etc).
182          * This usually matches the value of userrec::host.
183          */
184         char dhost[65];
185         
186         /** The users full name.
187          */
188         char fullname[MAXGECOS+1];
189         
190         /** The user's mode list.
191          * This is NOT a null terminated string! In the 1.1 version of InspIRCd
192          * this is an array of values in a similar way to channel modes.
193          * A value of 1 in field (modeletter-65) indicates that the mode is
194          * set, for example, to work out if mode +s is set, we  check the field
195          * userrec::modes['s'-65] != 0.
196          * The following RFC characters o, w, s, i have constants defined via an
197          * enum, such as UM_SERVERNOTICE and UM_OPETATOR.
198          */
199         char modes[64];
200
201         /** What snomasks are set on this user.
202          * This functions the same as the above modes.
203          */
204         char snomasks[64];
205
206         UserChanList chans;
207         
208         /** The server the user is connected to.
209          */
210         const char* server;
211         
212         /** The user's away message.
213          * If this string is empty, the user is not marked as away.
214          */
215         char awaymsg[MAXAWAY+1];
216         
217         /** Number of lines the user can place into the buffer
218          * (up to the global NetBufferSize bytes) before they
219          * are disconnected for excess flood
220          */
221         int flood;
222         
223         /** Number of seconds this user is given to send USER/NICK
224          * If they do not send their details in this time limit they
225          * will be disconnected
226          */
227         unsigned int timeout;
228         
229         /** The oper type they logged in as, if they are an oper.
230          * This is used to check permissions in operclasses, so that
231          * we can say 'yay' or 'nay' to any commands they issue.
232          * The value of this is the value of a valid 'type name=' tag.
233          */
234         char oper[NICKMAX];
235
236         /** True when DNS lookups are completed.
237          */
238         bool dns_done;
239
240         /** Number of seconds between PINGs for this user (set from &lt;connect:allow&gt; tag
241          */
242         unsigned int pingmax;
243
244         /** Password specified by the user when they registered.
245          * This is stored even if the <connect> block doesnt need a password, so that
246          * modules may check it.
247          */
248         char password[64];
249
250         /** User's receive queue.
251          * Lines from the IRCd awaiting processing are stored here.
252          * Upgraded april 2005, old system a bit hairy.
253          */
254         std::string recvq;
255
256         /** User's send queue.
257          * Lines waiting to be sent are stored here until their buffer is flushed.
258          */
259         std::string sendq;
260
261         /** Flood counters
262          */
263         int lines_in;
264         time_t reset_due;
265         long threshold;
266
267         /** IPV4 ip address
268          */
269         insp_inaddr ip4;
270
271         /* Write error string
272          */
273         std::string WriteError;
274
275         /** Maximum size this user's sendq can become
276          */
277         long sendqmax;
278
279         /** Maximum size this user's recvq can become
280          */
281         long recvqmax;
282
283         /** Default constructor
284          */
285         userrec();
286         
287         /** Returns the full displayed host of the user
288          * This member function returns the hostname of the user as seen by other users
289          * on the server, in nick!ident&at;host form.
290          */
291         virtual char* GetFullHost();
292         
293         /** Returns the full real host of the user
294          * This member function returns the hostname of the user as seen by other users
295          * on the server, in nick!ident&at;host form. If any form of hostname cloaking is in operation,
296          * e.g. through a module, then this method will ignore it and return the true hostname.
297          */
298         virtual char* GetFullRealHost();
299
300         /*
301          * Create a displayable mode string for this users umodes
302          */
303         const char* FormatNoticeMasks();
304
305         bool userrec::ProcessNoticeMasks(const char *sm);
306
307         bool IsNoticeMaskSet(unsigned char sm);
308
309         void SetNoticeMask(unsigned char sm, bool value);
310
311         /*
312          * Create a displayable mode string for this users umodes
313          */
314         const char* FormatModes();
315
316         bool IsModeSet(unsigned char m);
317
318         void SetMode(unsigned char m, bool value);
319         
320         /** Returns true if a user is invited to a channel.
321          */
322         virtual bool IsInvited(irc::string &channel);
323         
324         /** Adds a channel to a users invite list (invites them to a channel)
325          */
326         virtual void InviteTo(irc::string &channel);
327         
328         /** Removes a channel from a users invite list.
329          * This member function is called on successfully joining an invite only channel
330          * to which the user has previously been invited, to clear the invitation.
331          */
332         virtual void RemoveInvite(irc::string &channel);
333         
334         /** Returns true or false for if a user can execute a privilaged oper command.
335          * This is done by looking up their oper type from userrec::oper, then referencing
336          * this to their oper classes and checking the commands they can execute.
337          */
338         bool HasPermission(const std::string &command);
339
340         /** Calls read() to read some data for this user using their fd.
341          */
342         int ReadData(void* buffer, size_t size);
343
344         /** This method adds data to the buffer of the user.
345          * The buffer can grow to any size within limits of the available memory,
346          * managed by the size of a std::string, however if any individual line in
347          * the buffer grows over 600 bytes in length (which is 88 chars over the
348          * RFC-specified limit per line) then the method will return false and the
349          * text will not be inserted.
350          */
351         bool AddBuffer(const std::string &a);
352
353         /** This method returns true if the buffer contains at least one carriage return
354          * character (e.g. one complete line may be read)
355          */
356         bool BufferIsReady();
357
358         /** This function clears the entire buffer by setting it to an empty string.
359          */
360         void ClearBuffer();
361
362         /** This method returns the first available string at the tail end of the buffer
363          * and advances the tail end of the buffer past the string. This means it is
364          * a one way operation in a similar way to strtok(), and multiple calls return
365          * multiple lines if they are available. The results of this function if there
366          * are no lines to be read are unknown, always use BufferIsReady() to check if
367          * it is ok to read the buffer before calling GetBuffer().
368          */
369         std::string GetBuffer();
370
371         /** Sets the write error for a connection. This is done because the actual disconnect
372          * of a client may occur at an inopportune time such as half way through /LIST output.
373          * The WriteErrors of clients are checked at a more ideal time (in the mainloop) and
374          * errored clients purged.
375          */
376         void SetWriteError(const std::string &error);
377
378         /** Returns the write error which last occured on this connection or an empty string
379          * if none occured.
380          */
381         const char* GetWriteError();
382
383         /** Adds to the user's write buffer.
384          * You may add any amount of text up to this users sendq value, if you exceed the
385          * sendq value, SetWriteError() will be called to set the users error string to
386          * "SendQ exceeded", and further buffer adds will be dropped.
387          */
388         void AddWriteBuf(const std::string &data);
389
390         /** Flushes as much of the user's buffer to the file descriptor as possible.
391          * This function may not always flush the entire buffer, rather instead as much of it
392          * as it possibly can. If the send() call fails to send the entire buffer, the buffer
393          * position is advanced forwards and the rest of the data sent at the next call to
394          * this method.
395          */
396         void FlushWriteBuf();
397
398         /** Returns the list of channels this user has been invited to but has not yet joined.
399          */
400         InvitedList* GetInviteList();
401
402         /** Creates a wildcard host.
403          * Takes a buffer to use and fills the given buffer with the host in the format *!*@hostname
404          */
405         char* MakeWildHost();
406
407         /** Creates a host.
408          * Takes a buffer to use and fills the given buffer with the host in the format nick!user@host
409          */
410         void MakeHost(char* nhost);
411
412         /** Shuts down and closes the user's socket
413          */
414         void CloseSocket();
415
416         /** Default destructor
417          */
418         virtual ~userrec();
419
420 #ifdef THREADED_DNS
421         /** Thread used for threaded lookups
422          */
423         pthread_t dnsthread;
424 #endif
425 };
426
427 /** Used to hold WHOWAS information
428  */
429 class WhoWasGroup : public classbase
430 {
431  public:
432         char* host;
433         char* dhost;
434         char* ident;
435         const char* server;
436         char* gecos;
437         time_t signon;
438
439         WhoWasGroup(userrec* user);
440         ~WhoWasGroup();
441 };
442
443 typedef std::deque<WhoWasGroup*> whowas_set;
444 typedef std::map<irc::string,whowas_set*> whowas_users;
445
446 void AddOper(userrec* user);
447 void DeleteOper(userrec* user);
448 void kill_link(userrec *user,const char* r);
449 void kill_link_silent(userrec *user,const char* r);
450 void AddWhoWas(userrec* u);
451 void MaintainWhoWas(time_t TIME);
452 void AddClient(int socket, int port, bool iscached, insp_inaddr ip4);
453 void FullConnectUser(userrec* user, CullList* Goners);
454 userrec* ReHashNick(const char* Old, const char* New);
455 void force_nickchange(userrec* user,const char* newnick);
456
457 /* Configuration callbacks */
458 bool InitTypes(const char* tag);
459 bool InitClasses(const char* tag);
460 bool DoType(const char* tag, char** entries, void** values, int* types);
461 bool DoClass(const char* tag, char** entries, void** values, int* types);
462 bool DoneClassesAndTypes(const char* tag);
463
464 long FindMatchingGlobal(userrec* user);
465 long FindMatchingLocal(userrec* user);
466
467 #endif