X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=include%2Fusers.h;h=ed7b6bf5e4ae8b752f19624d5e0c83e5f12d3d43;hb=d3ca6510fa23308481d10da0bb7770d251fb659b;hp=0fc6e37238e8d2475ea5eaed5c50122cd3b67a5b;hpb=9fad3ecb9215a0034bf407f192926b04cb5efaed;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/include/users.h b/include/users.h index 0fc6e3723..ed7b6bf5e 100644 --- a/include/users.h +++ b/include/users.h @@ -2,7 +2,7 @@ * | Inspire Internet Relay Chat Daemon | * +------------------------------------+ * - * InspIRCd: (C) 2002-2009 InspIRCd Development Team + * InspIRCd: (C) 2002-2010 InspIRCd Development Team * See: http://wiki.inspircd.org/Credits * * This program is free but copyrighted software; see @@ -25,7 +25,9 @@ enum ClassTypes { /** connect:allow */ CC_ALLOW = 0, /** connect:deny */ - CC_DENY = 1 + CC_DENY = 1, + /** named connect block (for opers, etc) */ + CC_NAMED = 2 }; /** RFC1459 channel modes @@ -56,6 +58,12 @@ enum RegistrationState { REG_ALL = 7 /* REG_NICKUSER plus next bit along */ }; +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. */ struct CoreExport ConnectClass : public refcountbase @@ -65,6 +73,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; @@ -81,14 +92,6 @@ struct CoreExport ConnectClass : public refcountbase */ unsigned int pingtime; - /** (Optional) Password for this line - */ - std::string pass; - - /** (Optional) Hash Method for this line - */ - std::string hash; - /** Maximum size of sendq for users in this class (bytes) * Users cannot send commands if they go over this limit */ @@ -105,7 +108,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 */ @@ -119,10 +125,6 @@ struct CoreExport ConnectClass : public refcountbase */ unsigned int maxchans; - /** Port number this connect class applies to - */ - int port; - /** How many users may be in this connect class before they are refused? * (0 = no limit = default) */ @@ -134,16 +136,13 @@ 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); - const std::string& GetName() { return name; } - const std::string& GetPass() { return pass; } const std::string& GetHost() { return host; } - const int GetPort() { return port; } - + /** Returns the registration timeout */ time_t GetRegTimeout() @@ -182,12 +181,17 @@ struct CoreExport ConnectClass : public refcountbase /** Returns the penalty threshold value */ - unsigned long GetPenaltyThreshold() + unsigned int GetPenaltyThreshold() { - return penaltythreshold; + return penaltythreshold ? penaltythreshold : (fakelag ? 10 : 20); } - /** Returusn the maximum number of local sessions + unsigned int GetCommandRate() + { + return commandrate ? commandrate : 1000; + } + + /** Return the maximum number of local sessions */ unsigned long GetMaxLocal() { @@ -207,7 +211,7 @@ struct CoreExport ConnectClass : public refcountbase * 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 @@ -230,11 +234,6 @@ class CoreExport User : public StreamSocket */ std::string cachedip; - /** When we erase the user (in the destructor), - * we call this method to subtract one from all - * mode characters this user is making use of. - */ - void DecrementModes(); public: /** Hostname of connection. @@ -357,6 +356,9 @@ 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 */ @@ -371,13 +373,10 @@ class CoreExport User : public StreamSocket */ bool SetClientIP(const char* sip); - /** 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 - * @param srv Server that this user is from */ - User(const std::string &uid, const std::string& srv); + 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) @@ -501,14 +500,6 @@ class CoreExport User : public StreamSocket */ void Oper(OperInfo* info); - /** Change this users hash key to a new string. - * You should not call this function directly. It is used by the core - * to update the users hash entry on a nickchange. - * @param New new user_hash key - * @return Pointer to User in hash (usually 'this') - */ - User* UpdateNickHash(const char* New); - /** Force a nickname change. * If the nickname change fails (for example, because the nick in question * already exists) this function will return false, and you must then either @@ -516,7 +507,7 @@ class CoreExport User : public StreamSocket * @param newnick The nickname to change to * @return True if the nickchange was successful. */ - bool ForceNickChange(const char* newnick); + inline bool ForceNickChange(const char* newnick) { return ChangeNick(newnick, true); } /** Oper down. * This will clear the +o usermode and unset the user's oper type @@ -658,6 +649,13 @@ class CoreExport User : public StreamSocket */ bool ChangeName(const char* gecos); + /** Change a user's nick + * @param newnick The new nick + * @param force True if the change is being forced (should not be blocked by modes like +N) + * @return True if the change succeeded + */ + bool ChangeNick(const std::string& newnick, bool force = false); + /** Send a command to all local users from this user * The command given must be able to send text with the * first parameter as a servermask (e.g. $*), so basically @@ -692,29 +690,29 @@ class CoreExport User : public StreamSocket */ virtual ConnectClass* GetClass(); - /** Show the message of the day to this user - */ - void ShowMOTD(); - - /** Show the server RULES file to this user - */ - 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); +}; + +typedef unsigned int already_sent_t; class CoreExport LocalUser : public User { @@ -725,9 +723,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; @@ -773,10 +773,13 @@ 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; + + static already_sent_t already_sent_id; + already_sent_t already_sent; /** Stored reverse lookup from res_forward. Should not be used after resolution. */ @@ -799,18 +802,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 */ @@ -866,9 +861,8 @@ class CoreExport LocalUser : public User class CoreExport RemoteUser : public User { public: - RemoteUser(const std::string& uid, const std::string& srv) : User(uid, srv) + 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); }; @@ -876,9 +870,8 @@ class CoreExport RemoteUser : public User class CoreExport FakeUser : public User { public: - FakeUser(const std::string &uid, const std::string& srv) : User(uid, srv) + FakeUser(const std::string &uid, const std::string& srv) : User(uid, srv, USERTYPE_SERVER) { - SetFd(FD_FAKEUSER_NUMBER); nick = srv; } @@ -892,17 +885,17 @@ class CoreExport FakeUser : public User /** 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) @@ -914,12 +907,8 @@ inline FakeUser* IS_SERVER(User* u) class CoreExport UserResolver : public Resolver { private: - /** User this class is 'attached' to. - */ - LocalUser* bound_user; - /** File descriptor teh lookup is bound to - */ - int bound_fd; + /** UUID we are looking up */ + std::string uuid; /** True if the lookup is forward, false if is a reverse lookup */ bool fwd;