X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=include%2Fusers.h;h=ed672450ee00839611cf6f7e0d005fc2a54b53bd;hb=67a4a9b62355ea57a2f4521ca5fc53bd4eac3a1f;hp=5338deb4c145e3d3a0eb93f4392bfde5706006fb;hpb=94a601fb3b67e72e075af28174094117cd09f5f2;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/include/users.h b/include/users.h index 5338deb4c..ed672450e 100644 --- a/include/users.h +++ b/include/users.h @@ -15,22 +15,10 @@ #define __USERS_H__ #include "socket.h" +#include "inspsocket.h" #include "dns.h" #include "mode.h" -/** Channel status for a user - */ -enum ChanStatus { - /** Op */ - STATUS_OP = 4, - /** Halfop */ - STATUS_HOP = 2, - /** Voice */ - STATUS_VOICE = 1, - /** None */ - STATUS_NORMAL = 0 -}; - /** connect class types */ enum ClassTypes { @@ -71,11 +59,13 @@ enum RegistrationState { /* Required forward declaration */ class Channel; class UserResolver; +class ConfigTag; /** Holds information relevent to <connect allow> and <connect deny> tags in the config file. */ -struct CoreExport ConnectClass : public classbase +struct CoreExport ConnectClass : public refcountbase { + reference config; /** Type of line, either CC_ALLOW or CC_DENY */ char type; @@ -105,8 +95,14 @@ struct CoreExport ConnectClass : public classbase std::string hash; /** Maximum size of sendq for users in this class (bytes) + * Users cannot send commands if they go over this limit */ - unsigned long sendqmax; + unsigned long softsendqmax; + + /** Maximum size of sendq for users in this class (bytes) + * Users are killed if they go over this limit + */ + unsigned long hardsendqmax; /** Maximum size of recvq for users in this class (bytes) */ @@ -133,18 +129,12 @@ struct CoreExport ConnectClass : public classbase */ unsigned long limit; - /** Reference counter. - * This will be 1 if no users are connected, as long as it is a valid connect block - * When it reaches 0, the object should be deleted - */ - unsigned long RefCount; - /** Create a new connect class with no settings. */ - ConnectClass(char type, const std::string& mask); + ConnectClass(ConfigTag* tag, char type, const std::string& mask); /** Create a new connect class with inherited settings. */ - ConnectClass(char type, const std::string& mask, const ConnectClass& parent); + 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); @@ -169,11 +159,19 @@ struct CoreExport ConnectClass : public classbase return (pingtime ? pingtime : 120); } - /** Returns the maximum sendq value + /** Returns the maximum sendq value (soft limit) + * Note that this is in addition to internal OS buffers + */ + unsigned long GetSendqSoftMax() + { + return (softsendqmax ? softsendqmax : 4096); + } + + /** Returns the maximum sendq value (hard limit) */ - unsigned long GetSendqMax() + unsigned long GetSendqHardMax() { - return (sendqmax ? sendqmax : 262114); + return (hardsendqmax ? hardsendqmax : 0x100000); } /** Returns the maximum recvq value @@ -200,19 +198,19 @@ struct CoreExport ConnectClass : public classbase /** 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< std::pair > InvitedList; +CoreExport typedef std::vector< std::pair > InvitedList; /** Holds a complete list of all allow and deny tags from the configuration file (connection classes) */ -typedef std::vector ClassVector; +CoreExport typedef std::vector > ClassVector; /** Typedef for the list of user-channel records for a user */ -typedef std::map UserChanList; +CoreExport typedef std::set UserChanList; /** Shorthand for an iterator into a UserChanList */ -typedef UserChanList::iterator UCListIter; +CoreExport typedef UserChanList::iterator UCListIter; /* Required forward declaration */ @@ -223,7 +221,7 @@ class User; * 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 EventHandler +class CoreExport User : public StreamSocket { private: /** A list of channels the user has a pending invite to. @@ -268,16 +266,9 @@ class CoreExport User : public EventHandler std::bitset<64> AllowedChanModes; public: - /** Pointer to creator. - * This is required to make use of core functions - * from within the User class. - */ - InspIRCd* ServerInstance; - /** 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. :) */ - ConnectClass *MyClass; + reference MyClass; /** Hostname of connection. * This should be valid as per RFC1035. @@ -300,16 +291,6 @@ class CoreExport User : public EventHandler */ 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; @@ -390,7 +371,7 @@ class CoreExport User : public EventHandler /** The server the user is connected to. */ - const char* server; + std::string server; /** The user's away message. * If this string is empty, the user is not marked as away. @@ -409,39 +390,43 @@ class CoreExport User : public EventHandler */ std::string oper; - /** True when DNS lookups are completed. - * The UserResolver classes res_forward and res_reverse will - * set this value once they complete. - */ - bool dns_done; - /** Password specified by the user when they registered. * This is stored even if the block doesnt need a password, so that * 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. + /** 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. */ - std::string recvq; + int Penalty; - /** User's send queue. - * Lines waiting to be sent are stored here until their buffer is flushed. + /** 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. */ - std::string sendq; + unsigned int registered:3; + + /** True when DNS lookups are completed. + * The UserResolver classes res_forward and res_reverse will + * set this value once they complete. + */ + unsigned int dns_done:1; /** Whether or not to send an snotice about this user's quitting */ - bool quietquit; + unsigned int quietquit:1; /** 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. * Please note that setting this value alone will NOT cause the user to quit. */ - bool quitting; + unsigned int quitting:1; + + /** This is true if the user matched an exception (E:Line). It is used to save time on ban checks. + */ + unsigned int exempt:1; /** Server address and port that this user is connected to. * If unknown, address family is AF_UNKNOWN @@ -463,10 +448,6 @@ class CoreExport User : public EventHandler * @return The port number of this user. */ int GetServerPort(); - /** - * @return The server IP address - */ - std::string GetServerIP(); /** Get client IP string from sockaddr, using static internal buffer * @return The IP string @@ -482,21 +463,12 @@ class CoreExport User : public EventHandler */ const char *GetCIDRMask(int range); - /** This is true if the user matched an exception (E:Line). It is used to save time on ban checks. - */ - bool exempt; - - /** 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. - */ - int Penalty; - /** Default 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(InspIRCd* Instance, const std::string &uid = ""); + User(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) @@ -612,44 +584,6 @@ class CoreExport User : public EventHandler */ 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 - * @return The number of bytes read, or -1 if an error occured. - */ - int ReadData(void* buffer, size_t size); - - /** This method adds data to the read buffer of the user. - * The buffer can grow to any size within limits of the available memory, - * managed by the size of a std::string, however if any individual line in - * the buffer grows over 600 bytes in length (which is 88 chars over the - * RFC-specified limit per line) then the method will return false and the - * text will not be inserted. - * @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(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) - * @return True if there is at least one complete line in the users buffer - */ - bool BufferIsReady(); - - /** This function clears the entire buffer by setting it to an empty string. - */ - void ClearBuffer(); - - /** This method returns the first available string at the tail end of the buffer - * and advances the tail end of the buffer past the string. This means it is - * a one way operation in a similar way to strtok(), and multiple calls return - * multiple lines if they are available. The results of this function if there - * are no lines to be read are unknown, always use BufferIsReady() to check if - * it is ok to read the buffer before calling GetBuffer(). - * @return The string at the tail end of this users buffer - */ - std::string GetBuffer(); - /** 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. @@ -657,14 +591,6 @@ class CoreExport User : public EventHandler */ void AddWriteBuf(const std::string &data); - /** Flushes as much of the user's buffer to the file descriptor as possible. - * This function may not always flush the entire buffer, rather instead as much of it - * as it possibly can. If the send() call fails to send the entire buffer, the buffer - * position is advanced forwards and the rest of the data sent at the next call to - * this method. - */ - void FlushWriteBuf(); - /** 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 */ @@ -688,12 +614,6 @@ class CoreExport User : public EventHandler */ 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, - * which will call CloseSocket() for you. - */ - void CloseSocket(); - /** Add the user to WHOWAS system */ void AddToWhoWas(); @@ -790,7 +710,7 @@ class CoreExport User : public EventHandler /** 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 */ - void WriteCommon(const std::string &text); + void WriteCommonRaw(const std::string &line, bool include_self = true); /** Write to all users that can see this user (including this user in the list), appending CR/LF * @param text The format string for text to send to the users @@ -804,11 +724,6 @@ class CoreExport User : public EventHandler */ 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 - */ - void WriteCommonExcept(const std::string &text); - /** Write a quit message to all common users, as in User::WriteCommonExcept but with a specific * quit message for opers only. * @param normal_text Normal user quit message @@ -881,12 +796,12 @@ class CoreExport User : public EventHandler */ 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 - * @param The user to send the channel list to if it is not too long + /** Compile a channel list for this user. Used internally by WHOIS + * @param source The user to prepare the channel list for + * @param spy Whether to return the spy channel list rather than the normal one * @return This user's channel list */ - std::string ChannelList(User* source); + std::string ChannelList(User* source, bool spy); /** Split the channel list in cl which came from dest, and spool it to this user * Used internally by WHOIS @@ -927,16 +842,13 @@ class CoreExport User : public EventHandler */ void DecreasePenalty(int decrease); - /** Handle socket event. - * From EventHandler class. - * @param et Event type - * @param errornum Error number for EVENT_ERROR events - */ - void HandleEvent(EventType et, int errornum = 0); + void OnDataReady(); + void OnError(BufferedSocketError error); /** Default destructor */ virtual ~User(); + virtual bool cull(); }; /** Derived from Resolver, and performs user forward/reverse lookups. @@ -961,7 +873,7 @@ class CoreExport UserResolver : public Resolver * @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); + UserResolver(User* user, std::string to_resolve, QueryType qt, bool &cache); /** Called on successful lookup * @param result Result string @@ -977,7 +889,4 @@ class CoreExport UserResolver : public Resolver void OnError(ResolverError e, const std::string &errormessage); }; -/* Configuration callbacks */ -//class ServerConfig; - #endif