diff options
-rw-r--r-- | include/users.h | 146 |
1 files changed, 137 insertions, 9 deletions
diff --git a/include/users.h b/include/users.h index a01b0f28b..30111870d 100644 --- a/include/users.h +++ b/include/users.h @@ -164,9 +164,18 @@ class userrec : public connection /** Resolvers for looking up this users hostname */ UserResolver* res_forward; + + /** Resolvers for looking up this users hostname + */ UserResolver* res_reverse; + + /** Stored reverse lookup from res_forward + */ std::string stored_host; + /** Starts a DNS lookup of the user's IP. + * When complete, sets userrec::dns_done to true. + */ void StartDNSLookup(); /** The users nickname. @@ -205,6 +214,8 @@ class userrec : public connection */ char snomasks[64]; + /** Channels this user is on, and the permissions they have there + */ UserChanList chans; /** The server the user is connected to. @@ -271,22 +282,30 @@ class userrec : public connection sockaddr* ip; /** Initialize the clients sockaddr + * @param protocol_family The protocol family of the IP address, AF_INET or AF_INET6 + * @param ip A human-readable IP address for this user matching the protcol_family + * @param port The port number of this user or zero for a remote user */ void SetSockAddr(int protocol_family, const char* ip, int port); /** Get port number from sockaddr + * @return The port number of this user. */ int GetPort(); /** Get protocol family from sockaddr + * @return The protocol family of this user, either AF_INET or AF_INET6 */ int GetProtocolFamily(); /** Get IP string from sockaddr, using static internal buffer + * @return The IP string */ const char* GetIPString(); /** Get IP string from sockaddr, using caller-specified buffer + * @param buf A buffer to use + * @return The IP string */ const char* GetIPString(char* buf); @@ -303,12 +322,14 @@ class userrec : public connection long recvqmax; /** Default constructor + * @throw Nothing at present */ userrec(); /** 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(); @@ -316,64 +337,97 @@ class userrec : public connection * This member function returns the hostname of the user as seen by other users * on the server, in nick!ident&at;host form. If any form of hostname cloaking is in operation, * 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(); - /* - * Create a displayable mode string for this users umodes + /** Create a displayable mode string for this users snomasks + * @return The notice mask character sequence */ const char* FormatNoticeMasks(); + /** Process a snomask modifier string, e.g. +abc-de + * @param sm A sequence of notice mask characters + * @return True if the notice masks were successfully applied + */ bool userrec::ProcessNoticeMasks(const char *sm); + /** Returns true if a notice mask is set + * @param sm A notice mask character to check + * @return True if the notice mask is set + */ bool IsNoticeMaskSet(unsigned char sm); + /** Changed a specific notice mask value + * @param sm The server notice mask to change + * @param value An on/off value for this mask + */ void SetNoticeMask(unsigned char sm, bool value); - /* - * Create a displayable mode string for this users umodes + /** Create a displayable mode string for this users umodes + * @param The mode string */ const char* FormatModes(); + /** Returns true if a specific mode is set + * @param m The user mode + * @return True if the mode is set + */ bool IsModeSet(unsigned char m); + /** Set a specific usermode to on or off + * @param m The user mode + * @param value On or off setting of the mode + */ void SetMode(unsigned char m, bool value); /** Returns true if a user is invited to a channel. + * @param channel A channel name to look up + * @return True if the user is invited to the given channel */ virtual bool IsInvited(irc::string &channel); /** Adds a channel to a users invite list (invites them to a channel) + * @param channel A channel name to add */ virtual void InviteTo(irc::string &channel); /** Removes a channel from a users invite list. * This member function is called on successfully joining an invite only channel * to which the user has previously been invited, to clear the invitation. + * @param channel The channel to remove the invite to */ virtual void RemoveInvite(irc::string &channel); /** Returns true or false for if a user can execute a privilaged oper command. * This is done by looking up their oper type from userrec::oper, then referencing * this to their oper classes and checking the commands they can execute. + * @param command A command (should be all CAPS) + * @return True if this user can execute the command */ bool HasPermission(const std::string &command); /** 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 buffer of the user. + /** 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(); @@ -387,6 +441,7 @@ class userrec : public connection * 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(); @@ -394,11 +449,13 @@ class userrec : public connection * of a client may occur at an inopportune time such as half way through /LIST output. * The WriteErrors of clients are checked at a more ideal time (in the mainloop) and * errored clients purged. + * @param error The error string to set. */ void SetWriteError(const std::string &error); /** Returns the write error which last occured on this connection or an empty string * if none occured. + * @return The error string which has occured for this user */ const char* GetWriteError(); @@ -406,6 +463,7 @@ class userrec : public connection * You may add any amount of text up to this users sendq value, if you exceed the * sendq value, SetWriteError() will be called to set the users error string to * "SendQ exceeded", and further buffer adds will be dropped. + * @param data The data to add to the write buffer */ void AddWriteBuf(const std::string &data); @@ -418,16 +476,19 @@ class userrec : public connection 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 */ InvitedList* GetInviteList(); /** Creates a wildcard host. * Takes a buffer to use and fills the given buffer with the host in the format *!*@hostname + * @return The wildcarded hostname in *!*@host form */ char* MakeWildHost(); /** Creates a host. * Takes a buffer to use and fills the given buffer with the host in the format nick!user@host + * @param Buffer to fill with host information */ void MakeHost(char* nhost); @@ -436,22 +497,64 @@ class userrec : public connection void CloseSocket(); /** Disconnect a user gracefully + * @param user The user to remove + * @param r The quit reason */ static void QuitUser(userrec *user, const std::string &r); + /** Add the user to WHOWAS system + */ void AddToWhoWas(); + /** Oper up the user using the given opertype. + * This will also give the +o usermode. + * @param opertype The oper type to oper as + */ void Oper(const std::string &opertype); + /** Use this method to fully connect a user. + * This will send the message of the day, check G/K/E lines, etc. + * @param Goners If the user is disconnected by this method call, the + * value of 'this' will be pushed onto this CullList. This is used by + * the core to connect many users in rapid succession without invalidating + * iterators. + */ void FullConnect(CullList* Goners); + + /** 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 userrec in hash (usually 'this') + */ userrec* 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 + * output an error message, or quit the user for nickname collision. + * @param newnick The nickname to change to + * @return True if the nickchange was successful. + */ bool ForceNickChange(const char* newnick); + /** Add a client to the system. + * This will create a new userrec, insert it into the user_hash, + * initialize it as not yet registered, and add it to the socket engine. + */ static void AddClient(int socket, int port, bool iscached, insp_inaddr 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 + */ long GlobalCloneCount(); + + /** Return the number of local clones of this user + */ long LocalCloneCount(); /** Default destructor @@ -459,31 +562,56 @@ class userrec : public connection virtual ~userrec(); }; -/** Used to hold WHOWAS information - */ namespace irc { + /** Holds whowas related functions and classes + */ namespace whowas { + /** Used to hold WHOWAS information + */ class WhoWasGroup : public classbase { public: + /** Real host + */ char* host; + /** Displayed host + */ char* dhost; + /** Ident + */ char* ident; + /** Server name + */ const char* server; + /** Fullname (GECOS) + */ char* gecos; + /** Signon time + */ time_t signon; + /** Initialize this WhoQasFroup with a user + */ WhoWasGroup(userrec* user); + /** Destructor + */ ~WhoWasGroup(); }; - + + /** A group of users related by nickname + */ typedef std::deque<WhoWasGroup*> whowas_set; + + /** Sets of users in the whowas system + */ typedef std::map<irc::string,whowas_set*> whowas_users; - + + /** Called every hour by the core to remove expired entries + */ void MaintainWhoWas(time_t TIME); }; }; |