X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=include%2Fusers.h;h=c81ad988b7785429841bd78058e3a3c3140755e5;hb=be1e2e4ee5eb8b990692e6f5ae20931abe4c9e3c;hp=dfd5c5e89e6d1dc4cc3943400fef5cbfbb7c6efc;hpb=4aaf01aafa2d9656fcd6d26fbc32c1f2f2b2aeba;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/include/users.h b/include/users.h index dfd5c5e89..c81ad988b 100644 --- a/include/users.h +++ b/include/users.h @@ -14,19 +14,22 @@ * --------------------------------------------------- */ -#include "inspircd_config.h" -#include "channels.h" -#include "inspstring.h" -#include "connection.h" +#ifndef __USERS_H__ +#define __USERS_H__ + #include + #ifdef THREADED_DNS #include #endif - -#ifndef __USERS_H__ -#define __USERS_H__ +#include "inspircd_config.h" +#include "socket.h" +#include "channels.h" +#include "inspstring.h" +#include "connection.h" #include "hashcomp.h" +#include "dns.h" #include "cull_list.h" enum ChanStatus { @@ -41,6 +44,23 @@ enum ClassTypes { CC_DENY = 1 }; +/** RFC1459 channel modes + * */ +enum UserModes { + UM_SERVERNOTICE = 's'-65, + UM_WALLOPS = 'w'-65, + UM_INVISIBLE = 'i'-65, + UM_OPERATOR = 'o'-65, +}; + +enum RegistrationState { + REG_NONE = 0, /* Has sent nothing */ + REG_USER = 1, /* Has sent USER */ + REG_NICK = 2, /* Has sent NICK */ + REG_NICKUSER = 3, /* Bitwise combination of REG_NICK and REG_USER */ + REG_ALL = 7 /* REG_NICKUSER plus next bit along */ +}; + /** Holds a channel name to which a user has been invited. */ class Invited : public classbase @@ -49,6 +69,21 @@ class Invited : public classbase irc::string channel; }; +class UserResolver : public Resolver +{ + private: + userrec* bound_user; + int bound_fd; + public: + UserResolver(userrec* user, std::string to_resolve, bool forward) : Resolver(to_resolve, forward), bound_user(user) + { + this->bound_fd = user->fd; + } + + void OnLookupComplete(const std::string &result); + void OnError(ResolverError e); +}; + /** Holds information relevent to <connect allow> and <connect deny> tags in the config file. */ @@ -109,6 +144,10 @@ typedef std::vector InvitedList; */ typedef std::vector ClassVector; +/** Typedef for the list of user-channel records for a user + */ +typedef std::vector UserChanList; + /** Holds all information about a user * This class stores all information about a user connected to the irc server. Everything about a * connection is stored here primarily, from the user's socket ID (file descriptor) through to the @@ -123,6 +162,13 @@ class userrec : public connection */ InvitedList invites; public: + /** Resolvers for looking up this users hostname + */ + UserResolver* res_forward; + UserResolver* res_reverse; + std::string stored_host; + + void StartDNSLookup(); /** The users nickname. * An invalid nickname indicates an unregistered connection prior to the NICK command. @@ -138,33 +184,33 @@ class userrec : public connection /** The host displayed to non-opers (used for cloaking etc). * This usually matches the value of userrec::host. */ - char dhost[64]; + char dhost[65]; /** The users full name. */ char fullname[MAXGECOS+1]; - /** The user's mode string. - * This may contain any of the following RFC characters: o, w, s, i - * Your module may define other mode characters as it sees fit. - * it is limited to length 54, as there can only be a maximum of 52 - * user modes (26 upper, 26 lower case) a null terminating char, and - * an optional + character. + /** The user's mode list. + * This is NOT a null terminated string! In the 1.1 version of InspIRCd + * this is an array of values in a similar way to channel modes. + * A value of 1 in field (modeletter-65) indicates that the mode is + * set, for example, to work out if mode +s is set, we check the field + * userrec::modes['s'-65] != 0. + * The following RFC characters o, w, s, i have constants defined via an + * enum, such as UM_SERVERNOTICE and UM_OPETATOR. */ - char modes[54]; + char modes[64]; - /** This contains a bitmask of the RFC modes +swi, - * which can be used for fast lookup when iterating all the users. - * It is maintained by the mode parser and matches the character - * modes stored in 'modes'. + /** What snomasks are set on this user. + * This functions the same as the above modes. */ - char modebits; - - std::vector chans; + char snomasks[64]; + + UserChanList chans; /** The server the user is connected to. */ - char* server; + const char* server; /** The user's away message. * If this string is empty, the user is not marked as away. @@ -223,7 +269,7 @@ class userrec : public connection /** IPV4 ip address */ - in_addr ip4; + insp_inaddr ip4; /* Write error string */ @@ -237,6 +283,8 @@ class userrec : public connection */ long recvqmax; + /** Default constructor + */ userrec(); /** Returns the full displayed host of the user @@ -251,6 +299,26 @@ class userrec : public connection * e.g. through a module, then this method will ignore it and return the true hostname. */ virtual char* GetFullRealHost(); + + /* + * Create a displayable mode string for this users umodes + */ + const char* FormatNoticeMasks(); + + bool userrec::ProcessNoticeMasks(const char *sm); + + bool IsNoticeMaskSet(unsigned char sm); + + void SetNoticeMask(unsigned char sm, bool value); + + /* + * Create a displayable mode string for this users umodes + */ + const char* FormatModes(); + + bool IsModeSet(unsigned char m); + + void SetMode(unsigned char m, bool value); /** Returns true if a user is invited to a channel. */ @@ -334,28 +402,40 @@ class userrec : public connection */ InvitedList* GetInviteList(); - void MakeHost(char* nhost); - + /** Creates a wildcard host. + * Takes a buffer to use and fills the given buffer with the host in the format *!*@hostname + */ char* MakeWildHost(); + /** Creates a host. + * Takes a buffer to use and fills the given buffer with the host in the format nick!user@host + */ + void MakeHost(char* nhost); + /** Shuts down and closes the user's socket */ void CloseSocket(); + /** Default destructor + */ virtual ~userrec(); #ifdef THREADED_DNS + /** Thread used for threaded lookups + */ pthread_t dnsthread; #endif }; -class WhoWasGroup +/** Used to hold WHOWAS information + */ +class WhoWasGroup : public classbase { public: char* host; char* dhost; char* ident; - char* server; + const char* server; char* gecos; time_t signon; @@ -372,9 +452,9 @@ void kill_link(userrec *user,const char* r); void kill_link_silent(userrec *user,const char* r); void AddWhoWas(userrec* u); void MaintainWhoWas(time_t TIME); -void AddClient(int socket, int port, bool iscached, in_addr ip4); +void AddClient(int socket, int port, bool iscached, insp_inaddr ip4); void FullConnectUser(userrec* user, CullList* Goners); -userrec* ReHashNick(char* Old, char* New); +userrec* ReHashNick(const char* Old, const char* New); void force_nickchange(userrec* user,const char* newnick); /* Configuration callbacks */ @@ -384,4 +464,7 @@ bool DoType(const char* tag, char** entries, void** values, int* types); bool DoClass(const char* tag, char** entries, void** values, int* types); bool DoneClassesAndTypes(const char* tag); +long FindMatchingGlobal(userrec* user); +long FindMatchingLocal(userrec* user); + #endif