2 * InspIRCd -- Internet Relay Chat Daemon
4 * Copyright (C) 2015 Adam <Adam@anope.org>
5 * Copyright (C) 2013-2016 Attila Molnar <attilamolnar@hush.com>
6 * Copyright (C) 2012-2013, 2017, 2019-2020 Sadie Powell <sadie@witchery.services>
7 * Copyright (C) 2012 Robby <robby@chatbelgie.be>
8 * Copyright (C) 2010 Craig Edwards <brain@inspircd.org>
9 * Copyright (C) 2009 Daniel De Graaf <danieldg@inspircd.org>
10 * Copyright (C) 2008 Thomas Stagner <aquanight@inspircd.org>
11 * Copyright (C) 2008 Robin Burchell <robin+git@viroteck.net>
13 * This file is part of InspIRCd. InspIRCd is free software: you can
14 * redistribute it and/or modify it under the terms of the GNU General Public
15 * License as published by the Free Software Foundation, version 2.
17 * This program is distributed in the hope that it will be useful, but WITHOUT
18 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
19 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
22 * You should have received a copy of the GNU General Public License
23 * along with this program. If not, see <http://www.gnu.org/licenses/>.
31 class CoreExport UserManager : public fakederef<UserManager>
38 CloneCounts() : global(0), local(0) { }
41 /** Container that maps IP addresses to clone counts
43 typedef std::map<irc::sockets::cidr_mask, CloneCounts> CloneMap;
45 /** Sequence container in which each element is a User*
47 typedef std::vector<User*> OperList;
49 /** A list containing users who are on a U-lined servers. */
50 typedef std::vector<User*> ULineList;
52 /** A list holding local users
54 typedef insp::intrusive_list<LocalUser> LocalList;
57 /** Map of IP addresses for clone counting
61 /** A CloneCounts that contains zero for both local and global
63 const CloneCounts zeroclonecounts;
65 /** Local client list, a list containing only local clients
67 LocalList local_users;
69 /** Last used already sent id, used when sending messages to neighbors to help determine whether the message has
70 * been sent to a particular user or not. See User::ForEachNeighbor() for more info.
72 already_sent_t already_sent_id;
75 /** Constructor, initializes variables
79 /** Destructor, destroys all users in clientlist
83 /** Nickname string -> User* map. Contains all users, including unregistered ones.
87 /** UUID -> User* map. Contains all users, including unregistered ones.
91 /** Oper list, a vector containing all local and remote opered users
95 /** A list of users on U-lined servers. */
98 /** Number of unregistered users online right now.
99 * (Unregistered means before USER/NICK/dns)
101 unsigned int unregistered_count;
103 /** Perform background user events for all local users such as PING checks, registration timeouts,
104 * penalty management and recvq processing for users who have data in their recvq due to throttling.
106 void DoBackgroundUserStuff();
108 /** Handle a client connection.
109 * Creates a new LocalUser object, inserts it into the appropriate containers,
110 * initializes it as not yet registered, and adds it to the socket engine.
112 * The new user may immediately be quit after being created, for example if the user limit
113 * is reached or if the user is banned.
114 * @param socket File descriptor of the connection
115 * @param via Listener socket that this user connected to
116 * @param client The IP address and client port of the user
117 * @param server The server IP address and port used by the user
119 void AddUser(int socket, ListenSocket* via, irc::sockets::sockaddrs* client, irc::sockets::sockaddrs* server);
121 /** Disconnect a user gracefully.
122 * 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.
123 * @param user The user to remove
124 * @param quitreason The quit reason to show to normal users
125 * @param operreason The quit reason to show to opers, can be NULL if same as quitreason
127 void QuitUser(User* user, const std::string& quitreason, const std::string* operreason = NULL);
129 /** Add a user to the clone map
130 * @param user The user to add
132 void AddClone(User* user);
134 /** Remove all clone counts from the user, you should
135 * use this if you change the user's IP address
136 * after they have registered.
137 * @param user The user to remove
139 void RemoveCloneCounts(User *user);
141 /** Rebuild clone counts. Required when \<cidr> settings change.
143 void RehashCloneCounts();
145 /** Return the number of local and global clones of this user
146 * @param user The user to get the clone counts for
147 * @return The clone counts of this user. The returned reference is volatile - you
148 * must assume that it becomes invalid as soon as you call any function other than
151 const CloneCounts& GetCloneCounts(User* user) const;
153 /** Return a map containing IP addresses and their clone counts
154 * @return The clone count map
156 const CloneMap& GetCloneMap() const { return clonemap; }
158 /** Return a count of all global users, unknown and known connections
159 * @return The number of users on the network, including local unregistered users
161 unsigned int UserCount() const { return this->clientlist.size(); }
163 /** Return a count of fully registered connections on the network
164 * @return The number of registered users on the network
166 unsigned int RegisteredUserCount() { return this->clientlist.size() - this->UnregisteredUserCount() - this->ULineCount(); }
168 /** Return a count of opered (umode +o) users on the network
169 * @return The number of opers on the network
171 unsigned int OperCount() const { return this->all_opers.size(); }
173 /** Return a count of local unregistered (before NICK/USER) users
174 * @return The number of local unregistered (unknown) connections
176 unsigned int UnregisteredUserCount() const { return this->unregistered_count; }
178 /** Return a count of users on a u-lined servers.
179 * @return The number of users on u-lined servers.
181 unsigned int ULineCount() const { return this->all_ulines.size(); }
183 /** Return a count of local registered users
184 * @return The number of registered local users
186 unsigned int LocalUserCount() const { return (this->local_users.size() - this->UnregisteredUserCount()); }
188 /** Get a hash map containing all users, keyed by their nickname
189 * @return A hash map mapping nicknames to User pointers
191 user_hash& GetUsers() { return clientlist; }
193 /** Get a list containing all local users
194 * @return A const list of local users
196 const LocalList& GetLocalUsers() const { return local_users; }
198 /** Send a server notice to all local users
199 * @param text The text format string to send
200 * @param ... The format arguments
202 void ServerNoticeAll(const char* text, ...) CUSTOM_PRINTF(2, 3);
204 /** Retrieves the next already sent id, guaranteed to be not equal to any user's already_sent field
205 * @return Next already_sent id
207 already_sent_t NextAlreadySentId();