X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=include%2Fusers.h;h=0d2bff0129f351bd55a74cf2fc22b16df3ded2b3;hb=552ab1e39852733203d2037aa0bbaa1b63fd94a2;hp=f28a12c75c2608a9aa4a11807ef41e0d1298f302;hpb=7eebbe7da15a834c717f0fa279a300ee18c08b04;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/include/users.h b/include/users.h index f28a12c75..0d2bff012 100644 --- a/include/users.h +++ b/include/users.h @@ -2,7 +2,7 @@ * | Inspire Internet Relay Chat Daemon | * +------------------------------------+ * - * InspIRCd: (C) 2002-2007 InspIRCd Development Team + * InspIRCd: (C) 2002-2008 InspIRCd Development Team * See: http://www.inspircd.org/wiki/index.php/Credits * * This program is free but copyrighted software; see @@ -14,15 +14,12 @@ #ifndef __USERS_H__ #define __USERS_H__ -#include -#include "inspircd_config.h" #include "socket.h" -#include "channels.h" -#include "inspstring.h" #include "connection.h" -#include "hashcomp.h" #include "dns.h" +#include "mode.h" + /** Channel status for a user */ enum ChanStatus { @@ -76,47 +73,8 @@ enum RegistrationState { }; /* Required forward declaration */ -class InspIRCd; - -/** Derived from Resolver, and performs user forward/reverse lookups. - */ -class CoreExport UserResolver : public Resolver -{ - private: - /** User this class is 'attached' to. - */ - User* bound_user; - /** File descriptor teh lookup is bound to - */ - int bound_fd; - /** True if the lookup is forward, false if is a reverse lookup - */ - bool fwd; - public: - /** Create a resolver. - * @param Instance The creating instance - * @param user The user to begin lookup on - * @param to_resolve The IP or host to resolve - * @param qt The query type - * @param cache Modified by the constructor if the result was cached - */ - UserResolver(InspIRCd* Instance, User* user, std::string to_resolve, QueryType qt, bool &cache); - - /** Called on successful lookup - * @param result Result string - * @param ttl Time to live for result - * @param cached True if the result was found in the cache - * @param resultnum Result number, we are only interested in result 0 - */ - void OnLookupComplete(const std::string &result, unsigned int ttl, bool cached, int resultnum = 0); - - /** Called on failed lookup - * @param e Error code - * @param errormessage Error message string - */ - void OnError(ResolverError e, const std::string &errormessage); -}; - +class Channel; +class UserResolver; /** Holds information relevent to <connect allow> and <connect deny> tags in the config file. */ @@ -145,6 +103,10 @@ class CoreExport ConnectClass : public classbase */ std::string pass; + /** (Optional) Hash Method for this line + */ + std::string hash; + /** Threshold value for flood disconnect */ unsigned int threshold; @@ -179,7 +141,7 @@ public: */ ConnectClass(const ConnectClass* source) : classbase(), type(source->type), name(source->name), registration_timeout(source->registration_timeout), flood(source->flood), host(source->host), - pingtime(source->pingtime), pass(source->pass), threshold(source->threshold), sendqmax(source->sendqmax), + pingtime(source->pingtime), pass(source->pass), hash(source->hash), threshold(source->threshold), sendqmax(source->sendqmax), recvqmax(source->recvqmax), maxlocal(source->maxlocal), maxglobal(source->maxglobal), maxchans(source->maxchans), port(source->port), RefCount(0), disabled(false), limit(0) { @@ -187,7 +149,7 @@ public: /** Create a new connect class with no settings. */ - ConnectClass() : type(CC_DENY), name("unnamed"), registration_timeout(0), flood(0), host(""), pingtime(0), pass(""), + ConnectClass() : type(CC_DENY), name("unnamed"), registration_timeout(0), flood(0), host(""), pingtime(0), pass(""), hash(""), threshold(0), sendqmax(0), recvqmax(0), maxlocal(0), maxglobal(0), RefCount(0), disabled(false), limit(0) { } @@ -199,6 +161,7 @@ public: * @param hst The IP mask to allow * @param ping The ping frequency * @param pas The password to be used + * @param hsh The hash to be used * @param thres The flooding threshold * @param sendq The maximum sendq value * @param recvq The maximum recvq value @@ -206,9 +169,9 @@ public: * @param maxg The maximum global sessions */ ConnectClass(const std::string &thename, unsigned int timeout, unsigned int fld, const std::string &hst, unsigned int ping, - const std::string &pas, unsigned int thres, unsigned long sendq, unsigned long recvq, + const std::string &pas, const std::string &hsh, unsigned int thres, unsigned long sendq, unsigned long recvq, unsigned long maxl, unsigned long maxg, unsigned int maxc, int p = 0) : - type(CC_ALLOW), name(thename), registration_timeout(timeout), flood(fld), host(hst), pingtime(ping), pass(pas), + type(CC_ALLOW), name(thename), registration_timeout(timeout), flood(fld), host(hst), pingtime(ping), pass(pas), hash(hsh), threshold(thres), sendqmax(sendq), recvqmax(recvq), maxlocal(maxl), maxglobal(maxg), maxchans(maxc), port(p), RefCount(0), disabled(false), limit(0) { } /** Create a new connect class to DENY connections @@ -216,7 +179,7 @@ public: * @param hst The IP mask to deny */ ConnectClass(const std::string &thename, const std::string &hst) : type(CC_DENY), name(thename), registration_timeout(0), - flood(0), host(hst), pingtime(0), pass(""), threshold(0), sendqmax(0), recvqmax(0), maxlocal(0), maxglobal(0), maxchans(0), port(0), RefCount(0), disabled(false), limit(0) + flood(0), host(hst), pingtime(0), pass(""), hash(""), threshold(0), sendqmax(0), recvqmax(0), maxlocal(0), maxglobal(0), maxchans(0), port(0), RefCount(0), disabled(false), limit(0) { } @@ -226,7 +189,7 @@ public: */ ConnectClass(const std::string &thename, const ConnectClass* source) : type(source->type), name(thename), registration_timeout(source->registration_timeout), flood(source->flood), host(source->host), - pingtime(source->pingtime), pass(source->pass), threshold(source->threshold), sendqmax(source->sendqmax), + pingtime(source->pingtime), pass(source->pass), hash(source->hash), threshold(source->threshold), sendqmax(source->sendqmax), recvqmax(source->recvqmax), maxlocal(source->maxlocal), maxglobal(source->maxglobal), maxchans(source->maxchans), port(source->port), RefCount(0), disabled(false), limit(0) { @@ -246,7 +209,7 @@ public: */ void Update(unsigned int timeout, unsigned int fld, const std::string &hst, unsigned int ping, const std::string &pas, unsigned int thres, unsigned long sendq, unsigned long recvq, - unsigned long maxl, unsigned long maxg, unsigned int maxc, int p, unsigned long limit) + unsigned long maxl, unsigned long maxg, unsigned int maxc, int p, unsigned long llimit) { if (timeout) registration_timeout = timeout; @@ -273,7 +236,13 @@ public: if (p) port = p; - this->limit = limit; + this->limit = llimit; + } + + void Update(const std::string &n, const std::string &hst) + { + name = n; + host = hst; } /** Reference counter. Contains an int as to how many users are connected to this class. :) @@ -356,6 +325,13 @@ public: return pass; } + /** Returns the hash or an empty string + */ + const std::string& GetHash() + { + return hash; + } + /** Returns the flood threshold value */ unsigned int GetThreshold() @@ -392,9 +368,9 @@ public: } }; -/** Holds a complete list of all channels to which a user has been invited and has not yet joined. +/** Holds a complete list of all channels to which a user has been invited and has not yet joined, and the time at which they'll expire. */ -typedef std::vector InvitedList; +typedef std::vector< std::pair > InvitedList; /** Holds a complete list of all allow and deny tags from the configuration file (connection classes) */ @@ -461,19 +437,19 @@ class CoreExport User : public connection /** Cached nick!ident@host value using the real hostname */ - char* cached_fullhost; + std::string cached_fullhost; /** Cached nick!ident@ip value using the real IP address */ - char* cached_hostip; + std::string cached_hostip; /** Cached nick!ident@host value using the masked hostname */ - char* cached_makehost; + std::string cached_makehost; /** Cached nick!ident@realhost value using the real hostname */ - char* cached_fullrealhost; + std::string cached_fullrealhost; /** When we erase the user (in the destructor), * we call this method to subtract one from all @@ -481,17 +457,23 @@ class CoreExport User : public connection */ void DecrementModes(); - /** Oper-only quit message for this user if non-null - */ - char* operquit; - /** Max channels for this user */ unsigned int MaxChans; std::map* AllowedOperCommands; + /** Allowed user modes from oper classes. */ + bool* AllowedUserModes; + + /** Allowed channel modes from oper classes. */ + bool* AllowedChanModes; + public: + /** Module responsible for raw i/o + */ + Module* io; + /** Contains a pointer to the connect class a user is on from - this will be NULL for remote connections. * The pointer is guarenteed to *always* be valid. :) */ @@ -530,27 +512,27 @@ class CoreExport User : public connection * An invalid nickname indicates an unregistered connection prior to the NICK command. * Use InspIRCd::IsNick() to validate nicknames. */ - char nick[NICKMAX]; - + std::string nick; + /** The user's unique identifier. * This is the unique identifier which the user has across the network. */ - char uuid[UUID_LENGTH]; - + std::string uuid; + /** The users ident reply. * Two characters are added to the user-defined limit to compensate for the tilde etc. */ - char ident[IDENTMAX+2]; - + std::string ident; + /** The host displayed to non-opers (used for cloaking etc). * This usually matches the value of User::host. */ - char dhost[65]; - + std::string dhost; + /** The users full name (GECOS). */ - char fullname[MAXGECOS+1]; - + std::string fullname; + /** 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. @@ -560,12 +542,12 @@ class CoreExport User : public connection * The following RFC characters o, w, s, i have constants defined via an * enum, such as UM_SERVERNOTICE and UM_OPETATOR. */ - char modes[64]; + unsigned char modes[64]; /** What snomasks are set on this user. * This functions the same as the above modes. */ - char snomasks[64]; + unsigned char snomasks[64]; /** Channels this user is on, and the permissions they have there */ @@ -578,7 +560,12 @@ class CoreExport User : public connection /** The user's away message. * If this string is empty, the user is not marked as away. */ - char awaymsg[MAXAWAY+1]; + std::string awaymsg; + + /** Time the user last went away. + * This is ONLY RELIABLE if user IS_AWAY()! + */ + time_t awaytime; /** Timestamp of current time + connection class timeout. * This user must send USER/NICK before this timestamp is @@ -591,8 +578,8 @@ class CoreExport User : public connection * we can say 'yay' or 'nay' to any commands they issue. * The value of this is the value of a valid 'type name=' tag. */ - char oper[NICKMAX]; - + std::string oper; + /** True when DNS lookups are completed. * The UserResolver classes res_forward and res_reverse will * set this value once they complete. @@ -603,8 +590,8 @@ class CoreExport User : public connection * This is stored even if the block doesnt need a password, so that * modules may check it. */ - char password[64]; - + std::string password; + /** User's receive queue. * Lines from the IRCd awaiting processing are stored here. * Upgraded april 2005, old system a bit hairy. @@ -616,6 +603,18 @@ class CoreExport User : public connection */ std::string sendq; + /** Message user will quit with. Not to be set externally. + */ + std::string quitmsg; + + /** Quit message shown to opers - not to be set externally. + */ + std::string operquitmsg; + + /** Whether or not to send an snotice about this user's quitting + */ + bool quietquit; + /** Flood counters - lines received */ unsigned int lines_in; @@ -624,18 +623,21 @@ class CoreExport User : public connection */ time_t reset_due; - /** If this is set to true, then all read operations for the user + /** If this is set to true, then all socket operations for the user * are dropped into the bit-bucket. - * This is used by the global CullList, but please note that setting this value - * alone will NOT cause the user to quit. This means it can be used seperately, - * for example by shun modules etc. + * This value is set by QuitUser, and is not needed seperately from that call. + * Please note that setting this value alone will NOT cause the user to quit. */ - bool muted; + bool quitting; /** IPV4 or IPV6 ip address. Use SetSockAddr to set this and GetProtocolFamily/ * GetIPString/GetPort to obtain its values. */ sockaddr* ip; + + /** Set by GetIPString() to avoid constantly re-grabbing IP via sockets voodoo. + */ + std::string cachedip; /** Initialize the clients sockaddr * @param protocol_family The protocol family of the IP address, AF_INET or AF_INET6 @@ -657,7 +659,7 @@ class CoreExport User : public connection /** Get IP string from sockaddr, using static internal buffer * @return The IP string */ - const char* GetIPString(); + const char* GetIPString(bool translate4in6 = true); /* Write error string */ @@ -687,12 +689,16 @@ class CoreExport User : public connection */ User(InspIRCd* Instance, const std::string &uid = ""); + /** Check if the user matches a G or K line, and disconnect them if they do + */ + void CheckLines(); + /** Returns the full displayed host of the user * This member function returns the hostname of the user as seen by other users * on the server, in nick!ident&at;host form. * @return The full masked host of the user */ - virtual char* GetFullHost(); + virtual const std::string& GetFullHost(); /** Returns the full real host of the user * This member function returns the hostname of the user as seen by other users @@ -700,7 +706,7 @@ class CoreExport User : public connection * e.g. through a module, then this method will ignore it and return the true hostname. * @return The full real host of the user */ - virtual char* GetFullRealHost(); + virtual const std::string& GetFullRealHost(); /** This clears any cached results that are used for GetFullRealHost() etc. * The results of these calls are cached as generating them can be generally expensive. @@ -757,8 +763,9 @@ class CoreExport User : public connection /** Adds a channel to a users invite list (invites them to a channel) * @param channel A channel name to add + * @param timeout When the invite should expire (0 == never) */ - virtual void InviteTo(const irc::string &channel); + virtual void InviteTo(const irc::string &channel, time_t timeout); /** Removes a channel from a users invite list. * This member function is called on successfully joining an invite only channel @@ -775,6 +782,15 @@ class CoreExport User : public connection */ bool HasPermission(const std::string &command); + /** Returns true or false if a user can set a privileged user or channel mode. + * This is done by looking up their oper type from User::oper, then referencing + * this to their oper classes, and checking the modes they can set. + * @param mode The mode the check + * @param type ModeType (MODETYPE_CHANNEL or MODETYPE_USER). + * @return True if the user can set or unset this mode. + */ + bool HasModePermission(unsigned char mode, ModeType type); + /** Calls read() to read some data for this user using their fd. * @param buffer The buffer to read into * @param size The size of data to read @@ -791,7 +807,7 @@ class CoreExport User : public connection * @param a The string to add to the users read buffer * @return True if the string was successfully added to the read buffer */ - bool AddBuffer(std::string a); + bool AddBuffer(const std::string &a); /** This method returns true if the buffer contains at least one carriage return * character (e.g. one complete line may be read) @@ -858,13 +874,13 @@ class CoreExport User : public connection * Takes a buffer to use and fills the given buffer with the hostmask in the format user@host * @return the usermask in the format user@host */ - char* MakeHost(); + const std::string& MakeHost(); /** Creates a usermask with real ip. * Takes a buffer to use and fills the given buffer with the ipmask in the format user@ip * @return the usermask in the format user@ip */ - char* MakeHostIP(); + const std::string& MakeHostIP(); /** Shuts down and closes the user's socket * This will not cause the user to be deleted. Use InspIRCd::QuitUser for this, @@ -872,14 +888,6 @@ class CoreExport User : public connection */ void CloseSocket(); - /** Disconnect a user gracefully - * @param user The user to remove - * @param r The quit reason to show to normal users - * @param oreason The quit reason to show to opers - * @return Although this function has no return type, on exit the user provided will no longer exist. - */ - static void QuitUser(InspIRCd* Instance, User *user, const std::string &r, const char* oreason = ""); - /** Add the user to WHOWAS system */ void AddToWhoWas(); @@ -888,7 +896,7 @@ class CoreExport User : public connection * This will also give the +o usermode. * @param opertype The oper type to oper as */ - void Oper(const std::string &opertype); + void Oper(const std::string &opertype, const std::string &opername); /** Call this method to find the matching for a user, and to check them against it. */ @@ -916,39 +924,11 @@ class CoreExport User : public connection */ bool ForceNickChange(const char* newnick); - /** Add a client to the system. - * This will create a new User, insert it into the user_hash, - * initialize it as not yet registered, and add it to the socket engine. - * @param Instance a pointer to the server instance - * @param socket The socket id (file descriptor) this user is on - * @param port The port number this user connected on - * @param iscached This variable is reserved for future use - * @param ip The IP address of the user - * @return This function has no return value, but a call to AddClient may remove the user. - */ - static void AddClient(InspIRCd* Instance, int socket, int port, bool iscached, int socketfamily, sockaddr* ip); - /** Oper down. * This will clear the +o usermode and unset the user's oper type */ void UnOper(); - /** Return the number of global clones of this user - * @return The global clone count of this user - */ - unsigned long GlobalCloneCount(); - - /** Return the number of local clones of this user - * @return The local clone count of this user - */ - unsigned long LocalCloneCount(); - - /** Remove all clone counts from the user, you should - * use this if you change the user's IP address in - * User::ip after they have registered. - */ - void RemoveCloneCounts(); - /** Write text to this user, appending CR/LF. * @param text A std::string to send to the user */ @@ -958,7 +938,7 @@ class CoreExport User : public connection * @param text The format string for text to send to the user * @param ... POD-type format arguments */ - void Write(const char *text, ...); + void Write(const char *text, ...) CUSTOM_PRINTF(2, 3); /** Write text to this user, appending CR/LF and prepending :server.name * @param text A std::string to send to the user @@ -969,7 +949,11 @@ class CoreExport User : public connection * @param text The format string for text to send to the user * @param ... POD-type format arguments */ - void WriteServ(const char* text, ...); + void WriteServ(const char* text, ...) CUSTOM_PRINTF(2, 3); + + void WriteNumeric(unsigned int numeric, const char* text, ...) CUSTOM_PRINTF(3, 4); + + void WriteNumeric(unsigned int numeric, const std::string &text); /** Write text to this user, appending CR/LF and prepending :nick!user@host of the user provided in the first parameter. * @param user The user to prepend the :nick!user@host of @@ -982,7 +966,7 @@ class CoreExport User : public connection * @param text The format string for text to send to the user * @param ... POD-type format arguments */ - void WriteFrom(User *user, const char* text, ...); + void WriteFrom(User *user, const char* text, ...) CUSTOM_PRINTF(3, 4); /** Write text to the user provided in the first parameter, appending CR/LF, and prepending THIS user's :nick!user@host. * @param dest The user to route the message to @@ -995,7 +979,7 @@ class CoreExport User : public connection * @param text The format string for text to send to the user * @param ... POD-type format arguments */ - void WriteTo(User *dest, const char *data, ...); + void WriteTo(User *dest, const char *data, ...) CUSTOM_PRINTF(3, 4); /** Write to all users that can see this user (including this user in the list), appending CR/LF * @param text A std::string to send to the users @@ -1006,13 +990,13 @@ class CoreExport User : public connection * @param text The format string for text to send to the users * @param ... POD-type format arguments */ - void WriteCommon(const char* text, ...); + void WriteCommon(const char* text, ...) CUSTOM_PRINTF(2, 3); /** Write to all users that can see this user (not including this user in the list), appending CR/LF * @param text The format string for text to send to the users * @param ... POD-type format arguments */ - void WriteCommonExcept(const char* text, ...); + void WriteCommonExcept(const char* text, ...) CUSTOM_PRINTF(2, 3); /** Write to all users that can see this user (not including this user in the list), appending CR/LF * @param text A std::string to send to the users @@ -1031,7 +1015,7 @@ class CoreExport User : public connection * @param text The format string to send in the WALLOPS message * @param ... Format arguments */ - void WriteWallOps(const char* text, ...); + void WriteWallOps(const char* text, ...) CUSTOM_PRINTF(2, 3); /** Write a WALLOPS message from this user to all local opers. * If this user is not opered, the function will return without doing anything. @@ -1081,7 +1065,7 @@ class CoreExport User : public connection * @param text The text format string to send * @param ... Format arguments */ - void SendAll(const char* command, char* text, ...); + void SendAll(const char* command, const char* text, ...) CUSTOM_PRINTF(3, 4); /** Compile a channel list for this user, and send it to the user 'source' * Used internally by WHOIS @@ -1129,7 +1113,7 @@ class CoreExport User : public connection /** Get oper-specific quit message shown only to opers when the user quits. * (overrides any sent by QuitUser) */ - const char* GetOperQuit(); + const std::string& GetOperQuit(); /** Increases a user's command penalty by a set amount. */ @@ -1151,8 +1135,47 @@ class CoreExport User : public connection virtual ~User(); }; +/** Derived from Resolver, and performs user forward/reverse lookups. + */ +class CoreExport UserResolver : public Resolver +{ + private: + /** User this class is 'attached' to. + */ + User* bound_user; + /** File descriptor teh lookup is bound to + */ + int bound_fd; + /** True if the lookup is forward, false if is a reverse lookup + */ + bool fwd; + public: + /** Create a resolver. + * @param Instance The creating instance + * @param user The user to begin lookup on + * @param to_resolve The IP or host to resolve + * @param qt The query type + * @param cache Modified by the constructor if the result was cached + */ + UserResolver(InspIRCd* Instance, User* user, std::string to_resolve, QueryType qt, bool &cache); + + /** Called on successful lookup + * @param result Result string + * @param ttl Time to live for result + * @param cached True if the result was found in the cache + * @param resultnum Result number, we are only interested in result 0 + */ + void OnLookupComplete(const std::string &result, unsigned int ttl, bool cached, int resultnum = 0); + + /** Called on failed lookup + * @param e Error code + * @param errormessage Error message string + */ + void OnError(ResolverError e, const std::string &errormessage); +}; + /* Configuration callbacks */ -class ServerConfig; +//class ServerConfig; #endif