]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - include/usermanager.h
Use IsCTCP in blockcolor for ignoring CTCPs.
[user/henk/code/inspircd.git] / include / usermanager.h
index 452be27fe320ec97eafe88b4c606b22e18257da8..e73d541ee81b69225895c02c2972f3644a8355de 100644 (file)
-/*       +------------------------------------+
- *       | Inspire Internet Relay Chat Daemon |
- *       +------------------------------------+
+/*
+ * InspIRCd -- Internet Relay Chat Daemon
  *
- *  InspIRCd: (C) 2002-2009 InspIRCd Development Team
- * See: http://www.inspircd.org/wiki/index.php/Credits
+ *   Copyright (C) 2015 Adam <Adam@anope.org>
+ *   Copyright (C) 2012-2016 Attila Molnar <attilamolnar@hush.com>
+ *   Copyright (C) 2012-2013, 2017, 2019-2020 Sadie Powell <sadie@witchery.services>
+ *   Copyright (C) 2012 Robby <robby@chatbelgie.be>
+ *   Copyright (C) 2010 Craig Edwards <brain@inspircd.org>
+ *   Copyright (C) 2009 Daniel De Graaf <danieldg@inspircd.org>
+ *   Copyright (C) 2008 Thomas Stagner <aquanight@inspircd.org>
+ *   Copyright (C) 2008 Robin Burchell <robin+git@viroteck.net>
  *
- * This program is free but copyrighted software; see
- *         the file COPYING for details.
+ * This file is part of InspIRCd.  InspIRCd is free software: you can
+ * redistribute it and/or modify it under the terms of the GNU General Public
+ * License as published by the Free Software Foundation, version 2.
  *
- * ---------------------------------------------------
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
+ * details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-#ifndef __USERMANAGER_H
-#define __USERMANAGER_H
 
-#include <list>
+#pragma once
 
-/** A list of ip addresses cross referenced against clone counts */
-typedef std::map<irc::string, unsigned int> clonemap;
+#include <list>
 
-class CoreExport UserManager : public Extensible
+class CoreExport UserManager : public fakederef<UserManager>
 {
+ public:
+       struct CloneCounts
+       {
+               unsigned int global;
+               unsigned int local;
+               CloneCounts() : global(0), local(0) { }
+       };
+
+       /** Container that maps IP addresses to clone counts
+        */
+       typedef std::map<irc::sockets::cidr_mask, CloneCounts> CloneMap;
+
+       /** Sequence container in which each element is a User*
+        */
+       typedef std::vector<User*> OperList;
+
+       /** A list containing users who are on a U-lined servers. */
+       typedef std::vector<User*> ULineList;
+
+       /** A list holding local users
+       */
+       typedef insp::intrusive_list<LocalUser> LocalList;
+
  private:
-       InspIRCd *ServerInstance;
+       /** Map of IP addresses for clone counting
+        */
+       CloneMap clonemap;
 
-       /** Map of local ip addresses for clone counting
+       /** A CloneCounts that contains zero for both local and global
         */
-       clonemap local_clones;
+       const CloneCounts zeroclonecounts;
+
+       /** Local client list, a list containing only local clients
+        */
+       LocalList local_users;
+
+       /** Last used already sent id, used when sending messages to neighbors to help determine whether the message has
+        * been sent to a particular user or not. See User::ForEachNeighbor() for more info.
+        */
+       already_sent_t already_sent_id;
+
  public:
-       UserManager(InspIRCd *Instance) : ServerInstance(Instance)
-       {
-       }
-       
-       ~UserManager()
-       {
-               for (user_hash::iterator i = clientlist->begin();i != clientlist->end();i++)
-               {
-                       delete i->second;
-               }
-               clientlist->clear();
-       }
+       /** Constructor, initializes variables
+        */
+       UserManager();
 
-       /** Client list, a hash_map containing all clients, local and remote
+       /** Destructor, destroys all users in clientlist
         */
-       user_hash* clientlist;
+       ~UserManager();
 
-       /** Client list stored by UUID. Contains all clients, and is updated
-        * automatically by the constructor and destructor of User.
+       /** Nickname string -> User* map. Contains all users, including unregistered ones.
         */
-       user_hash* uuidlist;
+       user_hash clientlist;
 
-       /** Local client list, a vector containing only local clients
+       /** UUID -> User* map. Contains all users, including unregistered ones.
         */
-       std::vector<User*> local_users;
+       user_hash uuidlist;
 
        /** Oper list, a vector containing all local and remote opered users
         */
-       std::list<User*> all_opers;
+       OperList all_opers;
+
+       /** A list of users on U-lined servers. */
+       ULineList all_ulines;
 
        /** Number of unregistered users online right now.
         * (Unregistered means before USER/NICK/dns)
         */
-       int unregistered_count;
+       unsigned int unregistered_count;
 
-       /** Map of global ip addresses for clone counting
-        * XXX - this should be private, but m_clones depends on it currently.
+       /** Perform background user events for all local users such as PING checks, registration timeouts,
+        * penalty management and recvq processing for users who have data in their recvq due to throttling.
         */
-       clonemap global_clones;
+       void DoBackgroundUserStuff();
 
-       /** 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.
+       /** Handle a client connection.
+        * Creates a new LocalUser object, inserts it into the appropriate containers,
+        * initializes it as not yet registered, and adds it to the socket engine.
+        *
+        * The new user may immediately be quit after being created, for example if the user limit
+        * is reached or if the user is banned.
+        * @param socket File descriptor of the connection
+        * @param via Listener socket that this user connected to
+        * @param client The IP address and client port of the user
+        * @param server The server IP address and port used by the user
         */
-       void AddUser(InspIRCd* Instance, int socket, int port, bool iscached, sockaddr* ip, const std::string &targetip);
+       void AddUser(int socket, ListenSocket* via, irc::sockets::sockaddrs* client, irc::sockets::sockaddrs* server);
 
-       /** Disconnect a user gracefully
-        * @param user The user to remove
-        * @param r The quit reason to show to normal users
-        * @param oreason The quit reason to show to opers
-        * @return Although this function has no return type, on exit the user provided will no longer exist.
-        */
-       void QuitUser(User *user, const std::string &quitreason, const char* operreason = "");
-
-       /** Add a user to the local clone map
-        * @param user The user to add
+       /** Disconnect a user gracefully.
+        * When this method returns the user provided will be quit, but the User object will continue to be valid and will be deleted at the end of the current main loop iteration.
+        * @param user The user to remove
+        * @param quitreason The quit reason to show to normal users
+        * @param operreason The quit reason to show to opers, can be NULL if same as quitreason
         */
-       void AddLocalClone(User *user);
+       void QuitUser(User* user, const std::string& quitreason, const std::string* operreason = NULL);
 
-       /** Add a user to the global clone map
+       /** Add a user to the clone map
         * @param user The user to add
         */
-       void AddGlobalClone(User *user);
+       void AddClone(User* user);
 
        /** Remove all clone counts from the user, you should
-        * use this if you change the user's IP address 
+        * use this if you change the user's IP address
         * after they have registered.
         * @param user The user to remove
         */
        void RemoveCloneCounts(User *user);
 
-       /** Return the number of global clones of this user
-        * @param user The user to get a count for
-        * @return The global clone count of this user
+       /** Rebuild clone counts. Required when \<cidr> settings change.
         */
-       unsigned long GlobalCloneCount(User *user);
+       void RehashCloneCounts();
 
-       /** Return the number of local clones of this user
-        * @param user The user to get a count for
-        * @return The local clone count of this user
+       /** Return the number of local and global clones of this user
+        * @param user The user to get the clone counts for
+        * @return The clone counts of this user. The returned reference is volatile - you
+        * must assume that it becomes invalid as soon as you call any function other than
+        * your own.
         */
-       unsigned long LocalCloneCount(User *user);
+       const CloneCounts& GetCloneCounts(User* user) const;
 
-       /** Return a count of users, unknown and known connections
-        * @return The number of users
+       /** Return a map containing IP addresses and their clone counts
+        * @return The clone count map
         */
-       unsigned int UserCount();
+       const CloneMap& GetCloneMap() const { return clonemap; }
 
-       /** Return a count of fully registered connections only
-        * @return The number of registered users
+       /** Return a count of all global users, unknown and known connections
+        * @return The number of users on the network, including local unregistered users
         */
-       unsigned int RegisteredUserCount();
+       unsigned int UserCount() const { return this->clientlist.size(); }
 
-       /** Return a count of opered (umode +o) users only
-        * @return The number of opers
+       /** Return a count of fully registered connections on the network
+        * @return The number of registered users on the network
         */
-       unsigned int OperCount();
+       unsigned int RegisteredUserCount() { return this->clientlist.size() - this->UnregisteredUserCount() - this->ULineCount(); }
 
-       /** Return a count of unregistered (before NICK/USER) users only
-        * @return The number of unregistered (unknown) connections
+       /** Return a count of opered (umode +o) users on the network
+        * @return The number of opers on the network
         */
-       unsigned int UnregisteredUserCount();
+       unsigned int OperCount() const { return this->all_opers.size(); }
 
-       /** Return a count of local users on this server only
-        * @return The number of local users
+       /** Return a count of local unregistered (before NICK/USER) users
+        * @return The number of local unregistered (unknown) connections
         */
-       unsigned int LocalUserCount();
+       unsigned int UnregisteredUserCount() const { return this->unregistered_count; }
 
+       /** Return a count of users on a u-lined servers.
+        * @return The number of users on u-lined servers.
+        */
+       unsigned int ULineCount() const { return this->all_ulines.size(); }
 
+       /** Return a count of local registered users
+        * @return The number of registered local users
+        */
+       unsigned int LocalUserCount() const { return (this->local_users.size() - this->UnregisteredUserCount()); }
 
+       /** Get a hash map containing all users, keyed by their nickname
+        * @return A hash map mapping nicknames to User pointers
+        */
+       user_hash& GetUsers() { return clientlist; }
 
-       /** Number of users with a certain mode set on them
+       /** Get a list containing all local users
+        * @return A const list of local users
         */
-       int ModeCount(const char mode);
+       const LocalList& GetLocalUsers() const { return local_users; }
 
        /** Send a server notice to all local users
         * @param text The text format string to send
@@ -155,21 +201,8 @@ class CoreExport UserManager : public Extensible
         */
        void ServerNoticeAll(const char* text, ...) CUSTOM_PRINTF(2, 3);
 
-       /** Send a server message (PRIVMSG) to all local users
-        * @param text The text format string to send
-        * @param ... The format arguments
+       /** Retrieves the next already sent id, guaranteed to be not equal to any user's already_sent field
+        * @return Next already_sent id
         */
-       void ServerPrivmsgAll(const char* text, ...) CUSTOM_PRINTF(2, 3);
-
-       /** Send text to all users with a specific set of modes
-        * @param modes The modes to check against, without a +, e.g. 'og'
-        * @param flags one of WM_OR or WM_AND. If you specify WM_OR, any one of the
-        * mode characters in the first parameter causes receipt of the message, and
-        * if you specify WM_OR, all the modes must be present.
-        * @param text The text format string to send
-        * @param ... The format arguments
-        */
-       void WriteMode(const char* modes, int flags, const char* text, ...) CUSTOM_PRINTF(4, 5);
+       already_sent_t NextAlreadySentId();
 };
-
-#endif