X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=include%2Fusers.h;h=c81ad988b7785429841bd78058e3a3c3140755e5;hb=be1e2e4ee5eb8b990692e6f5ae20931abe4c9e3c;hp=0d812c0a4c89f388ccb81491898eaaa2554c181c;hpb=3cf1ae04704b4f1706daa1077b90fd14d1e72cef;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/include/users.h b/include/users.h index 0d812c0a4..c81ad988b 100644 --- a/include/users.h +++ b/include/users.h @@ -29,6 +29,7 @@ #include "inspstring.h" #include "connection.h" #include "hashcomp.h" +#include "dns.h" #include "cull_list.h" enum ChanStatus { @@ -43,6 +44,23 @@ enum ClassTypes { CC_DENY = 1 }; +/** RFC1459 channel modes + * */ +enum UserModes { + UM_SERVERNOTICE = 's'-65, + UM_WALLOPS = 'w'-65, + UM_INVISIBLE = 'i'-65, + UM_OPERATOR = 'o'-65, +}; + +enum RegistrationState { + REG_NONE = 0, /* Has sent nothing */ + REG_USER = 1, /* Has sent USER */ + REG_NICK = 2, /* Has sent NICK */ + REG_NICKUSER = 3, /* Bitwise combination of REG_NICK and REG_USER */ + REG_ALL = 7 /* REG_NICKUSER plus next bit along */ +}; + /** Holds a channel name to which a user has been invited. */ class Invited : public classbase @@ -51,6 +69,21 @@ class Invited : public classbase irc::string channel; }; +class UserResolver : public Resolver +{ + private: + userrec* bound_user; + int bound_fd; + public: + UserResolver(userrec* user, std::string to_resolve, bool forward) : Resolver(to_resolve, forward), bound_user(user) + { + this->bound_fd = user->fd; + } + + void OnLookupComplete(const std::string &result); + void OnError(ResolverError e); +}; + /** Holds information relevent to <connect allow> and <connect deny> tags in the config file. */ @@ -129,6 +162,13 @@ class userrec : public connection */ InvitedList invites; public: + /** Resolvers for looking up this users hostname + */ + UserResolver* res_forward; + UserResolver* res_reverse; + std::string stored_host; + + void StartDNSLookup(); /** The users nickname. * An invalid nickname indicates an unregistered connection prior to the NICK command. @@ -150,22 +190,22 @@ class userrec : public connection */ char fullname[MAXGECOS+1]; - /** The user's mode string. - * This may contain any of the following RFC characters: o, w, s, i - * Your module may define other mode characters as it sees fit. - * it is limited to length 54, as there can only be a maximum of 52 - * user modes (26 upper, 26 lower case) a null terminating char, and - * an optional + character. + /** The user's mode list. + * This is NOT a null terminated string! In the 1.1 version of InspIRCd + * this is an array of values in a similar way to channel modes. + * A value of 1 in field (modeletter-65) indicates that the mode is + * set, for example, to work out if mode +s is set, we check the field + * userrec::modes['s'-65] != 0. + * The following RFC characters o, w, s, i have constants defined via an + * enum, such as UM_SERVERNOTICE and UM_OPETATOR. */ - char modes[54]; + char modes[64]; - /** This contains a bitmask of the RFC modes +swi, - * which can be used for fast lookup when iterating all the users. - * It is maintained by the mode parser and matches the character - * modes stored in 'modes'. + /** What snomasks are set on this user. + * This functions the same as the above modes. */ - char modebits; - + char snomasks[64]; + UserChanList chans; /** The server the user is connected to. @@ -229,7 +269,7 @@ class userrec : public connection /** IPV4 ip address */ - in_addr ip4; + insp_inaddr ip4; /* Write error string */ @@ -259,6 +299,26 @@ class userrec : public connection * e.g. through a module, then this method will ignore it and return the true hostname. */ virtual char* GetFullRealHost(); + + /* + * Create a displayable mode string for this users umodes + */ + const char* FormatNoticeMasks(); + + bool userrec::ProcessNoticeMasks(const char *sm); + + bool IsNoticeMaskSet(unsigned char sm); + + void SetNoticeMask(unsigned char sm, bool value); + + /* + * Create a displayable mode string for this users umodes + */ + const char* FormatModes(); + + bool IsModeSet(unsigned char m); + + void SetMode(unsigned char m, bool value); /** Returns true if a user is invited to a channel. */ @@ -369,7 +429,7 @@ class userrec : public connection /** Used to hold WHOWAS information */ -class WhoWasGroup +class WhoWasGroup : public classbase { public: char* host; @@ -392,9 +452,9 @@ void kill_link(userrec *user,const char* r); void kill_link_silent(userrec *user,const char* r); void AddWhoWas(userrec* u); void MaintainWhoWas(time_t TIME); -void AddClient(int socket, int port, bool iscached, in_addr ip4); +void AddClient(int socket, int port, bool iscached, insp_inaddr ip4); void FullConnectUser(userrec* user, CullList* Goners); -userrec* ReHashNick(char* Old, char* New); +userrec* ReHashNick(const char* Old, const char* New); void force_nickchange(userrec* user,const char* newnick); /* Configuration callbacks */