]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - include/users.h
removed sys/select.h on windows platform
[user/henk/code/inspircd.git] / include / users.h
index d927890f0117b5895d6b82b83a8fcdc60c68d2e9..3d98f963211f208e11ffeffe383b1bf686eaeab8 100644 (file)
@@ -2,7 +2,7 @@
  *       | Inspire Internet Relay Chat Daemon |
  *       +------------------------------------+
  *
- *  InspIRCd: (C) 2002-2007 InspIRCd Development Team
+ *  InspIRCd: (C) 2002-2008 InspIRCd Development Team
  * See: http://www.inspircd.org/wiki/index.php/Credits
  *
  * This program is free but copyrighted software; see
@@ -145,6 +145,10 @@ class CoreExport ConnectClass : public classbase
         */
        std::string pass;
 
+       /** (Optional) Hash Method for this line
+        */
+       std::string hash;
+
        /** Threshold value for flood disconnect
         */
        unsigned int threshold;
@@ -177,18 +181,20 @@ public:
 
        /** Create a new connect class based on an existing connect class. This is required for std::vector (at least under windows).
         */
-       ConnectClass(const ConnectClass& source) : type(source.type), name(source.name),
-               registration_timeout(source.registration_timeout), flood(source.flood), host(source.host),
-               pingtime(source.pingtime), pass(source.pass), threshold(source.threshold), sendqmax(source.sendqmax),
-               recvqmax(source.recvqmax), maxlocal(source.maxlocal), maxglobal(source.maxglobal), maxchans(source.maxchans),
-               port(source.port)
+       ConnectClass(const ConnectClass* source) : classbase(), type(source->type), name(source->name),
+               registration_timeout(source->registration_timeout), flood(source->flood), host(source->host),
+               pingtime(source->pingtime), pass(source->pass), hash(source->hash), threshold(source->threshold), sendqmax(source->sendqmax),
+               recvqmax(source->recvqmax), maxlocal(source->maxlocal), maxglobal(source->maxglobal), maxchans(source->maxchans),
+               port(source->port), RefCount(0), disabled(false), limit(0)
        {
        }
 
        /** Create a new connect class with no settings.
         */
-       ConnectClass() : type(CC_DENY), name("unnamed"), registration_timeout(0), flood(0), host(""), pingtime(0), pass(""),
-                       threshold(0), sendqmax(0), recvqmax(0), maxlocal(0), maxglobal(0) { }
+       ConnectClass() : type(CC_DENY), name("unnamed"), registration_timeout(0), flood(0), host(""), pingtime(0), pass(""), hash(""),
+                       threshold(0), sendqmax(0), recvqmax(0), maxlocal(0), maxglobal(0), RefCount(0), disabled(false), limit(0)
+       {
+       }
 
        /** Create a new connect class to ALLOW connections.
         * @param thename Name of the connect class
@@ -197,6 +203,7 @@ public:
         * @param hst The IP mask to allow
         * @param ping The ping frequency
         * @param pas The password to be used
+        * @param hsh The hash to be used
         * @param thres The flooding threshold
         * @param sendq The maximum sendq value
         * @param recvq The maximum recvq value
@@ -204,35 +211,47 @@ public:
         * @param maxg The maximum global sessions
         */
        ConnectClass(const std::string &thename, unsigned int timeout, unsigned int fld, const std::string &hst, unsigned int ping,
-                       const std::string &pas, unsigned int thres, unsigned long sendq, unsigned long recvq,
+                       const std::string &pas, const std::string &hsh, unsigned int thres, unsigned long sendq, unsigned long recvq,
                        unsigned long maxl, unsigned long maxg, unsigned int maxc, int p = 0) :
-                       type(CC_ALLOW), name(thename), registration_timeout(timeout), flood(fld), host(hst), pingtime(ping), pass(pas),
-                       threshold(thres), sendqmax(sendq), recvqmax(recvq), maxlocal(maxl), maxglobal(maxg), maxchans(maxc), port(p) { }
+                       type(CC_ALLOW), name(thename), registration_timeout(timeout), flood(fld), host(hst), pingtime(ping), pass(pas), hash(hsh),
+                       threshold(thres), sendqmax(sendq), recvqmax(recvq), maxlocal(maxl), maxglobal(maxg), maxchans(maxc), port(p), RefCount(0), disabled(false), limit(0) { }
 
        /** Create a new connect class to DENY connections
         * @param thename Name of the connect class
         * @param hst The IP mask to deny
         */
        ConnectClass(const std::string &thename, const std::string &hst) : type(CC_DENY), name(thename), registration_timeout(0),
-                       flood(0), host(hst), pingtime(0), pass(""), threshold(0), sendqmax(0), recvqmax(0), maxlocal(0), maxglobal(0), maxchans(0), port(0) { }
+                       flood(0), host(hst), pingtime(0), pass(""), hash(""), threshold(0), sendqmax(0), recvqmax(0), maxlocal(0), maxglobal(0), maxchans(0), port(0), RefCount(0), disabled(false), limit(0)
+       {
+       }
 
        /* Create a new connect class based on another class
         * @param thename The name of the connect class
         * @param source Another connect class to inherit all but the name from
         */
-       ConnectClass(const std::string &thename, const ConnectClass &source) : type(source.type), name(thename),
-                               registration_timeout(source.registration_timeout), flood(source.flood), host(source.host),
-                               pingtime(source.pingtime), pass(source.pass), threshold(source.threshold), sendqmax(source.sendqmax),
-                               recvqmax(source.recvqmax), maxlocal(source.maxlocal), maxglobal(source.maxglobal), maxchans(source.maxchans),
-                               port(source.port)
+       ConnectClass(const std::string &thename, const ConnectClass* source) : type(source->type), name(thename),
+                               registration_timeout(source->registration_timeout), flood(source->flood), host(source->host),
+                               pingtime(source->pingtime), pass(source->pass), hash(source->hash), threshold(source->threshold), sendqmax(source->sendqmax),
+                               recvqmax(source->recvqmax), maxlocal(source->maxlocal), maxglobal(source->maxglobal), maxchans(source->maxchans),
+                               port(source->port), RefCount(0), disabled(false), limit(0)
+       {
+       }
+
+       void SetDisabled(bool t)
+       {
+               this->disabled = t;
+       }
+
+       bool GetDisabled()
        {
+               return this->disabled;
        }
 
        /* Update an existing entry with new values
         */
        void Update(unsigned int timeout, unsigned int fld, const std::string &hst, unsigned int ping,
                                const std::string &pas, unsigned int thres, unsigned long sendq, unsigned long recvq,
-                               unsigned long maxl, unsigned long maxg, unsigned int maxc, int p)
+                               unsigned long maxl, unsigned long maxg, unsigned int maxc, int p, unsigned long limit)
        {
                if (timeout)
                        registration_timeout = timeout;
@@ -258,8 +277,24 @@ public:
                        maxchans = maxc;
                if (p)
                        port = p;
+
+               this->limit = limit;
        }
 
+       /** Reference counter. Contains an int as to how many users are connected to this class. :)
+        * This will be 0 if no users are connected. If a <connect> is removed from the config, and there
+        * are 0 users on it - it will go away in RAM. :)
+        */
+       unsigned long RefCount;
+
+       /** If this is true, any attempt to set a user to this class will fail. Default false. This is really private, it's only in the public section thanks to the way this class is written
+        */
+       bool disabled;
+
+       /** How many users may be in this connect class before they are refused? (0 = disabled = default)
+        */
+       unsigned long limit;
+
        int GetMaxChans()
        {
                return maxchans;
@@ -326,6 +361,13 @@ public:
                return pass;
        }
 
+       /** Returns the hash or an empty string
+        */
+       const std::string& GetHash()
+       {
+               return hash;
+       }
+
        /** Returns the flood threshold value
         */
        unsigned int GetThreshold()
@@ -360,29 +402,6 @@ public:
        {
                return maxglobal;
        }
-
-       bool operator== (ConnectClass &other)
-       {
-               return (other.GetName() == name);
-       }
-
-       void operator=(const ConnectClass & other)
-       {
-               type = other.type;
-               name = other.name;
-               registration_timeout = other.registration_timeout;
-               flood = other.flood;
-               host = other.host;
-               pingtime = other.pingtime;
-               pass = other.pass;
-               threshold = other.threshold;
-               sendqmax = other.sendqmax;
-               recvqmax = other.recvqmax;
-               maxlocal = other.maxlocal;
-               maxglobal = other.maxglobal;
-               maxchans = other.maxchans;
-               port = other.port;
-       }
 };
 
 /** Holds a complete list of all channels to which a user has been invited and has not yet joined.
@@ -391,7 +410,7 @@ typedef std::vector<irc::string> InvitedList;
 
 /** Holds a complete list of all allow and deny tags from the configuration file (connection classes)
  */
-typedef std::vector<ConnectClass> ClassVector;
+typedef std::vector<ConnectClass*> ClassVector;
 
 /** Typedef for the list of user-channel records for a user
  */
@@ -474,15 +493,18 @@ class CoreExport User : public connection
         */
        void DecrementModes();
 
-       /** Oper-only quit message for this user if non-null
-        */
-       char* operquit;
-
        /** Max channels for this user
         */
        unsigned int MaxChans;
 
+       std::map<std::string, bool>* AllowedOperCommands;
+
  public:
+       /** 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;
+
        /** Resolvers for looking up this users IP address
         * This will occur if and when res_reverse completes.
         * When this class completes its lookup, User::dns_done
@@ -566,12 +588,6 @@ class CoreExport User : public connection
         */
        char awaymsg[MAXAWAY+1];
 
-       /** Number of lines the user can place into the buffer
-        * (up to the global NetBufferSize bytes) before they
-        * are disconnected for excess flood
-        */
-       int flood;
-
        /** Timestamp of current time + connection class timeout.
         * This user must send USER/NICK before this timestamp is
         * reached or they will be disconnected.
@@ -591,10 +607,6 @@ class CoreExport User : public connection
         */
        bool dns_done;
 
-       /** Number of seconds between PINGs for this user (set from &lt;connect:allow&gt; tag
-        */
-       unsigned int pingmax;
-
        /** Password specified by the user when they registered.
         * This is stored even if the <connect> block doesnt need a password, so that
         * modules may check it.
@@ -612,25 +624,32 @@ class CoreExport User : public connection
         */
        std::string sendq;
 
+       /** Message user will quit with. Not to be set externally.
+        */
+       std::string quitmsg;
+
+       /** Quit message shown to opers - not to be set externally.
+        */
+       std::string operquitmsg;
+
+       /** Whether or not to send an snotice about this user's quitting
+        */
+       bool quietquit;
+
        /** Flood counters - lines received
         */
-       int lines_in;
+       unsigned int lines_in;
 
        /** Flood counters - time lines_in is due to be reset
         */
        time_t reset_due;
 
-       /** Flood counters - Highest value lines_in may reach before the user gets disconnected
-        */
-       long threshold;
-
-       /** If this is set to true, then all read operations for the user
+       /** If this is set to true, then all socket operations for the user
         * are dropped into the bit-bucket.
-        * This is used by the global CullList, but please note that setting this value
-        * alone will NOT cause the user to quit. This means it can be used seperately,
-        * for example by shun modules etc.
+        * 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 muted;
+       bool quitting;
 
        /** IPV4 or IPV6 ip address. Use SetSockAddr to set this and GetProtocolFamily/
         * GetIPString/GetPort to obtain its values.
@@ -663,21 +682,7 @@ class CoreExport User : public connection
         */
        std::string WriteError;
 
-       /** Maximum size this user's sendq can become.
-        * Copied from the connect class on connect.
-        */
-       long sendqmax;
-
-       /** Maximum size this user's recvq can become.
-        * Copied from the connect class on connect.
-        */
-       long recvqmax;
-
-       /** This is true if the user matched an exception when they connected to the ircd.
-        * It isnt valid after this point, and you should not attempt to do anything with it
-        * after this point, because the eline might be removed at a later time, and/or no
-        * longer be applicable to this user. It is only used to save doing the eline lookup
-        * twice (instead we do it once and set this value).
+       /** This is true if the user matched an exception (E:Line). It is used to save time on ban checks.
         */
        bool exempt;
 
@@ -902,11 +907,11 @@ class CoreExport User : public connection
         * This will also give the +o usermode.
         * @param opertype The oper type to oper as
         */
-       void Oper(const std::string &opertype);
+       void Oper(const std::string &opertype, const std::string &opername);
 
        /** Call this method to find the matching <connect> for a user, and to check them against it.
         */
-       void CheckClass(const std::string &explicit_class = "");
+       void CheckClass();
 
        /** Use this method to fully connect a user.
         * This will send the message of the day, check G/K/E lines, etc.
@@ -930,39 +935,11 @@ class CoreExport User : public connection
         */
        bool ForceNickChange(const char* newnick);
 
-       /** Add a client to the system.
-        * This will create a new User, insert it into the user_hash,
-        * initialize it as not yet registered, and add it to the socket engine.
-        * @param Instance a pointer to the server instance
-        * @param socket The socket id (file descriptor) this user is on
-        * @param port The port number this user connected on
-        * @param iscached This variable is reserved for future use
-        * @param ip The IP address of the user
-        * @return This function has no return value, but a call to AddClient may remove the user.
-        */
-       static void AddClient(InspIRCd* Instance, int socket, int port, bool iscached, int socketfamily, sockaddr* 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
-        * @return The global clone count of this user
-        */
-       unsigned long GlobalCloneCount();
-
-       /** Return the number of local clones of this user
-        * @return The local clone count of this user
-        */
-       unsigned long LocalCloneCount();
-
-       /** Remove all clone counts from the user, you should
-        * use this if you change the user's IP address in
-        * User::ip after they have registered.
-        */
-       void RemoveCloneCounts();
-
        /** Write text to this user, appending CR/LF.
         * @param text A std::string to send to the user
         */
@@ -1116,11 +1093,16 @@ class CoreExport User : public connection
         */
        void PurgeEmptyChannels();
 
-       /** Get the connect class which matches this user's host or IP address
-        * @param explicit_name Set this string to tie the user to a specific class name
-        * @return A reference to this user's connect class
+       /** Get the connect class which this user belongs to.
+        * @return A pointer to this user's connect class
+        */
+       ConnectClass *GetClass();
+
+       /** Set the connect class to which this user belongs to.
+        * @param explicit_name Set this string to tie the user to a specific class name. Otherwise, the class is fitted by checking <connect> tags from the configuration file.
+        * @return A reference to this user's current connect class.
         */
-       ConnectClass* GetClass(const std::string &explicit_name = "");
+       ConnectClass *SetClass(const std::string &explicit_name = "");
 
        /** Show the message of the day to this user
         */
@@ -1140,6 +1122,14 @@ class CoreExport User : public connection
         */
        const char* GetOperQuit();
 
+       /** Increases a user's command penalty by a set amount.
+        */
+       void IncreasePenalty(int increase);
+
+       /** Decreases a user's command penalty by a set amount.
+        */
+       void DecreasePenalty(int decrease);
+
        /** Handle socket event.
         * From EventHandler class.
         * @param et Event type