X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=include%2Fusers.h;h=207d782b057dfc994de8e4932be930f3a5fa0d24;hb=6dd331262aa8f989657891e27b8891ee6a00016c;hp=508681dddb3474467bd97e498fbba24e66d704d0;hpb=78c14ffcc5429f4855e2f3a6c822a1d37f9f591a;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/include/users.h b/include/users.h index 508681ddd..207d782b0 100644 --- a/include/users.h +++ b/include/users.h @@ -2,8 +2,8 @@ * | Inspire Internet Relay Chat Daemon | * +------------------------------------+ * - * InspIRCd: (C) 2002-2008 InspIRCd Development Team - * See: http://www.inspircd.org/wiki/index.php/Credits + * InspIRCd: (C) 2002-2009 InspIRCd Development Team + * See: http://wiki.inspircd.org/Credits * * This program is free but copyrighted software; see * the file COPYING for details. @@ -15,7 +15,6 @@ #define __USERS_H__ #include "socket.h" -#include "connection.h" #include "dns.h" #include "mode.h" @@ -81,21 +80,23 @@ class CoreExport ConnectClass : public classbase /** Type of line, either CC_ALLOW or CC_DENY */ char type; + /** Connect class name */ std::string name; + /** Max time to register the connection in seconds */ unsigned int registration_timeout; - /** Number of lines in buffer before excess flood is triggered - */ - unsigned int flood; + /** Host mask for this line */ std::string host; + /** Number of seconds between pings for this line */ unsigned int pingtime; + /** (Optional) Password for this line */ std::string pass; @@ -104,10 +105,6 @@ class CoreExport ConnectClass : public classbase */ std::string hash; - /** Threshold value for flood disconnect - */ - unsigned int threshold; - /** Maximum size of sendq for users in this class (bytes) */ unsigned long sendqmax; @@ -137,8 +134,8 @@ public: /** Create a new connect class based on an existing connect class. This is required for std::vector (at least under windows). */ 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), hash(source->hash), threshold(source->threshold), sendqmax(source->sendqmax), + registration_timeout(source->registration_timeout), host(source->host), + pingtime(source->pingtime), pass(source->pass), hash(source->hash), sendqmax(source->sendqmax), recvqmax(source->recvqmax), maxlocal(source->maxlocal), maxglobal(source->maxglobal), maxchans(source->maxchans), port(source->port), RefCount(0), disabled(false), limit(source->limit) { @@ -146,37 +143,35 @@ public: /** Create a new connect class with no settings. */ - 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) + ConnectClass() : type(CC_DENY), name("unnamed"), registration_timeout(0), host(""), pingtime(0), pass(""), hash(""), + sendqmax(0), recvqmax(0), maxlocal(0), maxglobal(0), RefCount(0), disabled(false), limit(0) { } /** Create a new connect class to ALLOW connections. * @param thename Name of the connect class * @param timeout The registration timeout - * @param fld The flood value * @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 * @param maxl The maximum local sessions * @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, const std::string &hsh, unsigned int thres, unsigned long sendq, unsigned long recvq, + ConnectClass(const std::string &thename, unsigned int timeout,const std::string &hst, unsigned int ping, + const std::string &pas, const std::string &hsh, 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), hash(hsh), - threshold(thres), sendqmax(sendq), recvqmax(recvq), maxlocal(maxl), maxglobal(maxg), maxchans(maxc), port(p), RefCount(0), disabled(false), limit(0) { } + type(CC_ALLOW), name(thename), registration_timeout(timeout), host(hst), pingtime(ping), pass(pas), hash(hsh), + 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 * @param thename Name of the connect class * @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(""), hash(""), threshold(0), sendqmax(0), recvqmax(0), maxlocal(0), maxglobal(0), maxchans(0), port(0), RefCount(0), disabled(false), limit(0) + host(hst), pingtime(0), pass(""), hash(""), sendqmax(0), recvqmax(0), maxlocal(0), maxglobal(0), maxchans(0), port(0), RefCount(0), disabled(false), limit(0) { } @@ -185,8 +180,8 @@ public: * @param source Another connect class to inherit all but the name from */ 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), hash(source->hash), threshold(source->threshold), sendqmax(source->sendqmax), + registration_timeout(source->registration_timeout), host(source->host), + pingtime(source->pingtime), pass(source->pass), hash(source->hash), sendqmax(source->sendqmax), recvqmax(source->recvqmax), maxlocal(source->maxlocal), maxglobal(source->maxglobal), maxchans(source->maxchans), port(source->port), RefCount(0), disabled(false), limit(source->limit) { @@ -204,22 +199,18 @@ public: /* Update an existing entry with new values */ - 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, + void Update(unsigned int timeout, const std::string &hst, unsigned int ping, + const std::string &pas, unsigned long sendq, unsigned long recvq, unsigned long maxl, unsigned long maxg, unsigned int maxc, int p, unsigned long llimit) { if (timeout) registration_timeout = timeout; - if (fld) - flood = fld; if (!hst.empty()) host = hst; if (ping) pingtime = ping; if (!pas.empty()) pass = pas; - if (thres) - threshold = thres; if (sendq) sendqmax = sendq; if (recvq) @@ -280,13 +271,6 @@ public: return (registration_timeout ? registration_timeout : 90); } - /** Returns the flood limit - */ - unsigned int GetFlood() - { - return (threshold ? flood : 999); - } - /** Returns the allowed or denied IP mask */ const std::string& GetHost() @@ -329,13 +313,6 @@ public: return hash; } - /** Returns the flood threshold value - */ - unsigned int GetThreshold() - { - return (threshold ? threshold : 1); - } - /** Returns the maximum sendq value */ unsigned long GetSendqMax() @@ -409,11 +386,9 @@ class CoreExport VisData /** 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 - * user's nickname and hostname. Use the FindNick method of the InspIRCd class to locate a specific user - * by nickname, or the FindDescriptor method of the InspIRCd class to find a specific user by their - * file descriptor value. + * user's nickname and hostname. */ -class CoreExport User : public connection +class CoreExport User : public EventHandler { private: /** Pointer to creator. @@ -428,15 +403,15 @@ class CoreExport User : public connection */ InvitedList invites; - /** Cached nick!ident@host value using the real hostname + /** Cached nick!ident@dhost value using the displayed hostname */ std::string cached_fullhost; - /** Cached nick!ident@ip value using the real IP address + /** Cached ident@ip value using the real IP address */ std::string cached_hostip; - /** Cached nick!ident@host value using the masked hostname + /** Cached ident@realhost value using the real hostname */ std::string cached_makehost; @@ -454,13 +429,14 @@ class CoreExport User : public connection */ void DecrementModes(); - std::map* AllowedOperCommands; + std::set *AllowedOperCommands; + std::set *AllowedPrivs; /** Allowed user modes from oper classes. */ - bool* AllowedUserModes; + std::bitset<64> AllowedUserModes; /** Allowed channel modes from oper classes. */ - bool* AllowedChanModes; + std::bitset<64> AllowedChanModes; public: /** Contains a pointer to the connect class a user is on from - this will be NULL for remote connections. @@ -472,7 +448,56 @@ class CoreExport User : public connection */ VisData* Visibility; - /** Stored reverse lookup from res_forward + /** Hostname of connection. + * This should be valid as per RFC1035. + */ + std::string host; + + /** Stats counter for bytes inbound + */ + int bytes_in; + + /** Stats counter for bytes outbound + */ + int bytes_out; + + /** Stats counter for commands inbound + */ + int cmds_in; + + /** Stats counter for commands outbound + */ + int cmds_out; + + /** True if user has authenticated, false if otherwise + */ + bool haspassed; + + /** Used by User to indicate the registration status of the connection + * It is a bitfield of the REG_NICK, REG_USER and REG_ALL bits to indicate + * the connection state. + */ + char registered; + + /** Time the connection was last pinged + */ + time_t lastping; + + /** Time the connection was created, set in the constructor. This + * may be different from the time the user's classbase object was + * created. + */ + time_t signon; + + /** Time that the connection last sent a message, used to calculate idle time + */ + time_t idle_lastmsg; + + /** Used by PING checking code + */ + time_t nping; + + /** Stored reverse lookup from res_forward. Should not be used after resolution. */ std::string stored_host; @@ -487,26 +512,26 @@ class CoreExport User : public connection * Use InspIRCd::IsNick() to validate nicknames. */ std::string nick; - + /** The user's unique identifier. * This is the unique identifier which the user has across the network. */ std::string uuid; - + /** The users ident reply. * Two characters are added to the user-defined limit to compensate for the tilde etc. */ std::string ident; - + /** The host displayed to non-opers (used for cloaking etc). * This usually matches the value of User::host. */ std::string dhost; - + /** The users full name (GECOS). */ std::string fullname; - + /** The user's mode list. * NOT a null terminated string. * Also NOT an array. @@ -536,7 +561,7 @@ class CoreExport User : public connection * If this string is empty, the user is not marked as away. */ std::string awaymsg; - + /** Time the user last went away. * This is ONLY RELIABLE if user IS_AWAY()! */ @@ -548,7 +573,7 @@ class CoreExport User : public connection * The value of this is the value of a valid 'type name=' tag. */ std::string oper; - + /** True when DNS lookups are completed. * The UserResolver classes res_forward and res_reverse will * set this value once they complete. @@ -560,7 +585,7 @@ class CoreExport User : public connection * modules may check it. */ std::string password; - + /** User's receive queue. * Lines from the IRCd awaiting processing are stored here. * Upgraded april 2005, old system a bit hairy. @@ -584,14 +609,6 @@ class CoreExport User : public connection */ bool quietquit; - /** Flood counters - lines received - */ - unsigned int lines_in; - - /** Flood counters - time lines_in is due to be reset - */ - time_t reset_due; - /** If this is set to true, then all socket operations for the user * are dropped into the bit-bucket. * This value is set by QuitUser, and is not needed seperately from that call. @@ -624,7 +641,7 @@ class CoreExport User : public connection /** Get IP string from sockaddr, using static internal buffer * @return The IP string */ - const char* GetIPString(bool translate4in6 = true); + const char* GetIPString(); /** Get a CIDR mask from the IP of this user, using a static internal buffer. * e.g., GetCIDRMask(16) for 223.254.214.52 returns 223.254.0.0/16 @@ -644,14 +661,6 @@ class CoreExport User : public connection */ int Penalty; - /** True if we are flushing penalty lines - */ - bool OverPenalty; - - /** If this bool is set then penalty rules do not apply to this user - */ - bool ExemptFromPenalty; - /** Default constructor * @throw CoreException if the UID allocated to the user already exists * @param Instance Creator instance @@ -660,16 +669,17 @@ 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. + * @param doZline True if ZLines should be checked (if IP has changed since initial connect) * Returns true if the user matched a ban, false else. */ - bool CheckLines(); + bool CheckLines(bool doZline = false); /** 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 const std::string& 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 @@ -677,7 +687,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 const std::string& 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. @@ -753,6 +763,16 @@ class CoreExport User : public connection */ bool HasPermission(const std::string &command); + /** Returns true if a user has a given permission. + * This is used to check whether or not users may perform certain actions which admins may not wish to give to + * all operators, yet are not commands. An example might be oper override, mass messaging (/notice $*), etc. + * + * @param privstr The priv to chec, e.g. "users/override/topic". These are loaded free-form from the config file. + * @param noisy If set to true, the user is notified that they do not have the specified permission where applicable. If false, no notification is sent. + * @return True if this user has the permission in question. + */ + bool HasPrivPermission(const std::string &privstr, bool noisy = false); + /** 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. @@ -1134,4 +1154,3 @@ class CoreExport UserResolver : public Resolver //class ServerConfig; #endif -