]> git.netwichtig.de Git - user/henk/code/inspircd.git/blob - include/usermanager.h
df13124677c75a8d68831f4021b2c9dad257b57f
[user/henk/code/inspircd.git] / include / usermanager.h
1 /*
2  * InspIRCd -- Internet Relay Chat Daemon
3  *
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>
12  *
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.
16  *
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
20  * details.
21  *
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/>.
24  */
25
26
27 #pragma once
28
29 #include <list>
30
31 class CoreExport UserManager : public fakederef<UserManager>
32 {
33  public:
34         struct CloneCounts
35         {
36                 unsigned int global;
37                 unsigned int local;
38                 CloneCounts() : global(0), local(0) { }
39         };
40
41         /** Container that maps IP addresses to clone counts
42          */
43         typedef std::map<irc::sockets::cidr_mask, CloneCounts> CloneMap;
44
45         /** Sequence container in which each element is a User*
46          */
47         typedef std::vector<User*> OperList;
48
49         /** A list containing users who are on a U-lined servers. */
50         typedef std::vector<User*> ULineList;
51
52         /** A list holding local users
53         */
54         typedef insp::intrusive_list<LocalUser> LocalList;
55
56  private:
57         /** Map of IP addresses for clone counting
58          */
59         CloneMap clonemap;
60
61         /** A CloneCounts that contains zero for both local and global
62          */
63         const CloneCounts zeroclonecounts;
64
65         /** Local client list, a list containing only local clients
66          */
67         LocalList local_users;
68
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.
71          */
72         already_sent_t already_sent_id;
73
74  public:
75         /** Constructor, initializes variables
76          */
77         UserManager();
78
79         /** Destructor, destroys all users in clientlist
80          */
81         ~UserManager();
82
83         /** Nickname string -> User* map. Contains all users, including unregistered ones.
84          */
85         user_hash clientlist;
86
87         /** UUID -> User* map. Contains all users, including unregistered ones.
88          */
89         user_hash uuidlist;
90
91         /** Oper list, a vector containing all local and remote opered users
92          */
93         OperList all_opers;
94
95         /** A list of users on U-lined servers. */
96         ULineList all_ulines;
97
98         /** Number of unregistered users online right now.
99          * (Unregistered means before USER/NICK/dns)
100          */
101         unsigned int unregistered_count;
102
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.
105          */
106         void DoBackgroundUserStuff();
107
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.
111          *
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
118          */
119         void AddUser(int socket, ListenSocket* via, irc::sockets::sockaddrs* client, irc::sockets::sockaddrs* server);
120
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
126          */
127         void QuitUser(User* user, const std::string& quitreason, const std::string* operreason = NULL);
128
129         /** Add a user to the clone map
130          * @param user The user to add
131          */
132         void AddClone(User* user);
133
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
138          */
139         void RemoveCloneCounts(User *user);
140
141         /** Rebuild clone counts. Required when \<cidr> settings change.
142          */
143         void RehashCloneCounts();
144
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
149          * your own.
150          */
151         const CloneCounts& GetCloneCounts(User* user) const;
152
153         /** Return a map containing IP addresses and their clone counts
154          * @return The clone count map
155          */
156         const CloneMap& GetCloneMap() const { return clonemap; }
157
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
160          */
161         unsigned int UserCount() const { return this->clientlist.size(); }
162
163         /** Return a count of fully registered connections on the network
164          * @return The number of registered users on the network
165          */
166         unsigned int RegisteredUserCount() { return this->clientlist.size() - this->UnregisteredUserCount() - this->ULineCount(); }
167
168         /** Return a count of opered (umode +o) users on the network
169          * @return The number of opers on the network
170          */
171         unsigned int OperCount() const { return this->all_opers.size(); }
172
173         /** Return a count of local unregistered (before NICK/USER) users
174          * @return The number of local unregistered (unknown) connections
175          */
176         unsigned int UnregisteredUserCount() const { return this->unregistered_count; }
177
178         /** Return a count of users on a u-lined servers.
179          * @return The number of users on u-lined servers.
180          */
181         unsigned int ULineCount() const { return this->all_ulines.size(); }
182
183         /** Return a count of local registered users
184          * @return The number of registered local users
185          */
186         unsigned int LocalUserCount() const { return (this->local_users.size() - this->UnregisteredUserCount()); }
187
188         /** Get a hash map containing all users, keyed by their nickname
189          * @return A hash map mapping nicknames to User pointers
190          */
191         user_hash& GetUsers() { return clientlist; }
192
193         /** Get a list containing all local users
194          * @return A const list of local users
195          */
196         const LocalList& GetLocalUsers() const { return local_users; }
197
198         /** Send a server notice to all local users
199          * @param text The text format string to send
200          * @param ... The format arguments
201          */
202         void ServerNoticeAll(const char* text, ...) CUSTOM_PRINTF(2, 3);
203
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
206          */
207         already_sent_t NextAlreadySentId();
208 };