X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=include%2Fusers.h;h=e1171e2c33785c8da36a58b64f171000d46bb509;hb=8ab1381e8d277152d99a72f33f3d1c0564060fee;hp=241eed0c6ffd65c29e7fcb504ffe679074010399;hpb=984cc96a1f832abf9b5fcfddcd8260c5b12bd2a9;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/include/users.h b/include/users.h index 241eed0c6..e1171e2c3 100644 --- a/include/users.h +++ b/include/users.h @@ -56,11 +56,11 @@ enum RegistrationState { REG_ALL = 7 /* REG_NICKUSER plus next bit along */ }; -/* Required forward declaration */ -class Channel; -class UserResolver; -struct ConfigTag; -class OperInfo; +enum UserType { + USERTYPE_LOCAL = 1, + USERTYPE_REMOTE = 2, + USERTYPE_SERVER = 3 +}; /** Holds information relevent to <connect allow> and <connect deny> tags in the config file. */ @@ -71,6 +71,9 @@ struct CoreExport ConnectClass : public refcountbase */ char type; + /** True if this class uses fake lag to manage flood, false if it kills */ + bool fakelag; + /** Connect class name */ std::string name; @@ -111,7 +114,10 @@ struct CoreExport ConnectClass : public refcountbase /** Seconds worth of penalty before penalty system activates */ - unsigned long penaltythreshold; + unsigned int penaltythreshold; + + /** Maximum rate of commands (units: millicommands per second) */ + unsigned int commandrate; /** Local max when connecting by this connection class */ @@ -140,7 +146,7 @@ struct CoreExport ConnectClass : public refcountbase /** Create a new connect class with inherited settings. */ ConnectClass(ConfigTag* tag, char type, const std::string& mask, const ConnectClass& parent); - + /** Update the settings in this block to match the given block */ void Update(const ConnectClass* newSettings); @@ -149,7 +155,7 @@ struct CoreExport ConnectClass : public refcountbase const std::string& GetPass() { return pass; } const std::string& GetHost() { return host; } const int GetPort() { return port; } - + /** Returns the registration timeout */ time_t GetRegTimeout() @@ -188,9 +194,14 @@ struct CoreExport ConnectClass : public refcountbase /** Returns the penalty threshold value */ - unsigned long GetPenaltyThreshold() + unsigned int GetPenaltyThreshold() + { + return (penaltythreshold ? penaltythreshold : 10); + } + + unsigned int GetCommandRate() { - return penaltythreshold; + return commandrate ? commandrate : 1000; } /** Returusn the maximum number of local sessions @@ -208,32 +219,12 @@ struct CoreExport ConnectClass : public refcountbase } }; -/** 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. - */ -CoreExport typedef std::vector< std::pair > InvitedList; - -/** Holds a complete list of all allow and deny tags from the configuration file (connection classes) - */ -CoreExport typedef std::vector > ClassVector; - -/** Typedef for the list of user-channel records for a user - */ -CoreExport typedef std::set UserChanList; - -/** Shorthand for an iterator into a UserChanList - */ -CoreExport typedef UserChanList::iterator UCListIter; - -/* Required forward declaration - */ -class User; - /** 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. */ -class CoreExport User : public StreamSocket +class CoreExport User : public Extensible { private: /** Cached nick!ident@dhost value using the displayed hostname @@ -283,7 +274,7 @@ class CoreExport User : public StreamSocket time_t idle_lastmsg; /** Client address that the user is connected from. - * Do not modify this value directly, use SetClientIP() to change it + * Do not modify this value directly, use SetClientIP() to change it. * Port is not valid for remote users. */ irc::sockets::sockaddrs client_sa; @@ -297,7 +288,7 @@ class CoreExport User : public StreamSocket /** The user's unique identifier. * This is the unique identifier which the user has across the network. */ - std::string uuid; + const std::string uuid; /** The users ident reply. * Two characters are added to the user-defined limit to compensate for the tilde etc. @@ -336,7 +327,7 @@ class CoreExport User : public StreamSocket /** The server the user is connected to. */ - std::string server; + const std::string server; /** The user's away message. * If this string is empty, the user is not marked as away. @@ -383,31 +374,27 @@ class CoreExport User : public StreamSocket */ unsigned int lastping:1; + /** What type of user is this? */ + const unsigned int usertype:2; + /** Get client IP string from sockaddr, using static internal buffer * @return The IP string */ const char* GetIPString(); + /** Get CIDR mask, using default range, for this user + */ + irc::sockets::cidr_mask GetCIDRMask(); + /** Sets the client IP for this user * @return true if the conversion was successful */ bool SetClientIP(const char* sip); - /** 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 - * This may be used for CIDR clone detection, etc. - * - * (XXX, brief note: when we do the sockets rewrite, this should move down a - * level so it may be used on more derived objects. -- w00t) - */ - const char *GetCIDRMask(int range); - - /** Default constructor + /** Constructor * @throw CoreException if the UID allocated to the user already exists - * @param Instance Creator instance - * @param uid User UUID, or empty to allocate one automatically */ - User(const std::string &uid); + User(const std::string &uid, const std::string& srv, int objtype); /** 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) @@ -420,7 +407,7 @@ class CoreExport User : public StreamSocket * 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 @@ -428,7 +415,7 @@ class CoreExport User : public StreamSocket * 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. @@ -730,21 +717,27 @@ class CoreExport User : public StreamSocket */ void ShowRULES(); - virtual void OnDataReady(); - virtual void OnError(BufferedSocketError error); /** Default destructor */ virtual ~User(); virtual CullResult cull(); }; -/** Represents a non-local user. - * (in fact, any FD less than -1 does) - */ -#define FD_MAGIC_NUMBER -42 -/** Represents a fake user (i.e. a server) - */ -#define FD_FAKEUSER_NUMBER -7 +class CoreExport UserIOHandler : public StreamSocket +{ + public: + LocalUser* const user; + UserIOHandler(LocalUser* me) : user(me) {} + void OnDataReady(); + void OnError(BufferedSocketError error); + + /** Adds to the user's write buffer. + * You may add any amount of text up to this users sendq value, if you exceed the + * sendq value, the user will be removed, and further buffer adds will be dropped. + * @param data The data to add to the write buffer + */ + void AddWriteBuf(const std::string &data); +}; class CoreExport LocalUser : public User { @@ -755,9 +748,11 @@ class CoreExport LocalUser : public User InvitedList invites; public: - LocalUser(); + LocalUser(int fd, irc::sockets::sockaddrs* client, irc::sockets::sockaddrs* server); CullResult cull(); + UserIOHandler eh; + /** Stats counter for bytes inbound */ int bytes_in; @@ -803,10 +798,10 @@ class CoreExport LocalUser : public User */ time_t nping; - /** This value contains how far into the penalty threshold the user is. Once its over - * the penalty threshold then commands are held and processed on-timer. + /** This value contains how far into the penalty threshold the user is. + * This is used either to enable fake lag or for excess flood quits */ - int Penalty; + unsigned int CommandFloodPenalty; /** Stored reverse lookup from res_forward. Should not be used after resolution. */ @@ -829,18 +824,10 @@ class CoreExport LocalUser : public User */ void SetClass(const std::string &explicit_name = ""); - void OnDataReady(); void SendText(const std::string& line); void Write(const std::string& text); void Write(const char*, ...) CUSTOM_PRINTF(2, 3); - /** Adds to the user's write buffer. - * You may add any amount of text up to this users sendq value, if you exceed the - * sendq value, the user will be removed, and further buffer adds will be dropped. - * @param data The data to add to the write buffer - */ - void AddWriteBuf(const std::string &data); - /** Returns the list of channels this user has been invited to but has not yet joined. * @return A list of channels the user is invited to */ @@ -891,14 +878,15 @@ class CoreExport LocalUser : public User * @return True if the user can set or unset this mode. */ bool HasModePermission(unsigned char mode, ModeType type); + + inline int GetFd() { return eh.GetFd(); } }; class CoreExport RemoteUser : public User { public: - RemoteUser(const std::string& uid) : User(uid) + RemoteUser(const std::string& uid, const std::string& srv) : User(uid, srv, USERTYPE_REMOTE) { - SetFd(FD_MAGIC_NUMBER); } virtual void SendText(const std::string& line); }; @@ -906,32 +894,32 @@ class CoreExport RemoteUser : public User class CoreExport FakeUser : public User { public: - FakeUser(const std::string &uid) : User(uid) + FakeUser(const std::string &uid, const std::string& srv) : User(uid, srv, USERTYPE_SERVER) { - SetFd(FD_FAKEUSER_NUMBER); + nick = srv; } + virtual CullResult cull(); virtual void SendText(const std::string& line); - virtual const std::string GetFullHost(); - virtual const std::string GetFullRealHost(); - void SetFakeServer(std::string name); + virtual const std::string& GetFullHost(); + virtual const std::string& GetFullRealHost(); }; /* Faster than dynamic_cast */ /** Is a local user */ inline LocalUser* IS_LOCAL(User* u) { - return u->GetFd() > -1 ? static_cast(u) : NULL; + return u->usertype == USERTYPE_LOCAL ? static_cast(u) : NULL; } /** Is a remote user */ inline RemoteUser* IS_REMOTE(User* u) { - return u->GetFd() == FD_MAGIC_NUMBER ? static_cast(u) : NULL; + return u->usertype == USERTYPE_REMOTE ? static_cast(u) : NULL; } /** Is a server fakeuser */ inline FakeUser* IS_SERVER(User* u) { - return u->GetFd() == FD_FAKEUSER_NUMBER ? static_cast(u) : NULL; + return u->usertype == USERTYPE_SERVER ? static_cast(u) : NULL; } /** Is an oper */ #define IS_OPER(x) (x->oper)