InspIRCd  3.0
users.h
1 /*
2  * InspIRCd -- Internet Relay Chat Daemon
3  *
4  * Copyright (C) 2019-2020 Matt Schatz <[email protected]>
5  * Copyright (C) 2019 linuxdaemon <[email protected]>
6  * Copyright (C) 2013 Daniel Vassdal <[email protected]>
7  * Copyright (C) 2012-2016, 2018 Attila Molnar <[email protected]>
8  * Copyright (C) 2012-2013, 2016-2020 Sadie Powell <[email protected]es>
9  * Copyright (C) 2012, 2018-2019 Robby <[email protected]>
10  * Copyright (C) 2012 DjSlash <[email protected]>
11  * Copyright (C) 2012 ChrisTX <[email protected]>
12  * Copyright (C) 2009-2010 Daniel De Graaf <[email protected]>
13  * Copyright (C) 2009 Uli Schlachter <[email protected]>
14  * Copyright (C) 2008 Thomas Stagner <[email protected]>
15  * Copyright (C) 2008 John Brooks <[email protected]>
16  * Copyright (C) 2007-2009 Robin Burchell <[email protected]>
17  * Copyright (C) 2007, 2009 Dennis Friis <[email protected]>
18  * Copyright (C) 2006-2008 Craig Edwards <[email protected]>
19  *
20  * This file is part of InspIRCd. InspIRCd is free software: you can
21  * redistribute it and/or modify it under the terms of the GNU General Public
22  * License as published by the Free Software Foundation, version 2.
23  *
24  * This program is distributed in the hope that it will be useful, but WITHOUT
25  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
26  * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
27  * details.
28  *
29  * You should have received a copy of the GNU General Public License
30  * along with this program. If not, see <http://www.gnu.org/licenses/>.
31  */
32 
33 
34 #pragma once
35 
36 #include "socket.h"
37 #include "inspsocket.h"
38 #include "mode.h"
39 #include "membership.h"
40 
43 enum ClassTypes {
45  CC_ALLOW = 0,
47  CC_DENY = 1,
49  CC_NAMED = 2
50 };
51 
55 enum RegistrationState {
56 
57 #ifndef _WIN32 // Burlex: This is already defined in win32, luckily it is still 0.
58  REG_NONE = 0, /* Has sent nothing */
59 #endif
60 
61  REG_USER = 1, /* Has sent USER */
62  REG_NICK = 2, /* Has sent NICK */
63  REG_NICKUSER = 3, /* Bitwise combination of REG_NICK and REG_USER */
64  REG_ALL = 7 /* REG_NICKUSER plus next bit along */
65 };
66 
67 enum UserType {
68  USERTYPE_LOCAL = 1,
69  USERTYPE_REMOTE = 2,
70  USERTYPE_SERVER = 3
71 };
72 
75 struct CoreExport ConnectClass : public refcountbase
76 {
77  reference<ConfigTag> config;
80  char type;
81 
83  bool fakelag;
84 
87  std::string name;
88 
91  unsigned int registration_timeout;
92 
95  std::string host;
96 
99  unsigned int pingtime;
100 
104  unsigned long softsendqmax;
105 
109  unsigned long hardsendqmax;
110 
113  unsigned long recvqmax;
114 
117  unsigned int penaltythreshold;
118 
120  unsigned int commandrate;
121 
124  unsigned long maxlocal;
125 
128  unsigned long maxglobal;
129 
133 
136  unsigned int maxchans;
137 
141  unsigned long limit;
142 
146 
151 
153  std::string password;
154 
156  std::string passwordhash;
157 
160  ConnectClass(ConfigTag* tag, char type, const std::string& mask);
163  ConnectClass(ConfigTag* tag, char type, const std::string& mask, const ConnectClass& parent);
164 
166  void Update(const ConnectClass* newSettings);
167 
168  const std::string& GetName() { return name; }
169  const std::string& GetHost() { return host; }
170 
173  time_t GetRegTimeout()
174  {
175  return (registration_timeout ? registration_timeout : 90);
176  }
177 
180  unsigned int GetPingTime()
181  {
182  return (pingtime ? pingtime : 120);
183  }
184 
188  unsigned long GetSendqSoftMax()
189  {
190  return (softsendqmax ? softsendqmax : 4096);
191  }
192 
195  unsigned long GetSendqHardMax()
196  {
197  return (hardsendqmax ? hardsendqmax : 0x100000);
198  }
199 
202  unsigned long GetRecvqMax()
203  {
204  return (recvqmax ? recvqmax : 4096);
205  }
206 
209  unsigned int GetPenaltyThreshold()
210  {
211  return penaltythreshold ? penaltythreshold : (fakelag ? 10 : 20);
212  }
213 
214  unsigned int GetCommandRate()
215  {
216  return commandrate ? commandrate : 1000;
217  }
218 
221  unsigned long GetMaxLocal()
222  {
223  return maxlocal;
224  }
225 
228  unsigned long GetMaxGlobal()
229  {
230  return maxglobal;
231  }
232 };
233 
239 class CoreExport User : public Extensible
240 {
241  private:
244  std::string cached_fullhost;
245 
248  std::string cached_hostip;
249 
252  std::string cached_makehost;
253 
256  std::string cached_fullrealhost;
257 
260  std::string cachedip;
261 
263  std::string displayhost;
264 
266  std::string realhost;
267 
269  std::string realname;
270 
277  std::bitset<ModeParser::MODEID_MAX> modes;
278 
279  public:
284  {
285  public:
290  virtual void Execute(LocalUser* user) = 0;
291  };
292 
296 
299  time_t age;
300 
305  time_t signon;
306 
312 
317  std::string nick;
318 
322  const std::string uuid;
323 
327  std::string ident;
328 
332  std::bitset<64> snomasks;
333 
337 
341 
345  std::string awaymsg;
346 
350  time_t awaytime;
351 
355 
360  unsigned int registered:3;
361 
367  unsigned int quitting:1;
368 
370  const unsigned int usertype:2;
371 
375  const std::string& GetIPString();
376 
380  const std::string& GetHost(bool uncloak) const;
381 
383  const std::string& GetDisplayedHost() const;
384 
386  const std::string& GetRealHost() const;
387 
389  const std::string& GetRealName() const;
390 
393  irc::sockets::cidr_mask GetCIDRMask();
394 
398  virtual bool SetClientIP(const std::string& address);
399 
400  virtual void SetClientIP(const irc::sockets::sockaddrs& sa);
401 
405  User(const std::string& uid, Server* srv, UserType objtype);
406 
412  virtual const std::string& GetFullHost();
413 
420  virtual const std::string& GetFullRealHost();
421 
425  void InvalidateCache();
426 
431  bool IsAway() const { return (!awaymsg.empty()); }
432 
437  bool IsOper() const { return oper; }
438 
443  bool IsNoticeMaskSet(unsigned char sm);
444 
450  std::string GetModeLetters(bool includeparams = false) const;
451 
456  bool IsModeSet(unsigned char m) const;
457  bool IsModeSet(const ModeHandler* mh) const;
458  bool IsModeSet(const ModeHandler& mh) const { return IsModeSet(&mh); }
459  bool IsModeSet(UserModeReference& moderef) const;
460 
465  void SetMode(ModeHandler* mh, bool value);
466  void SetMode(ModeHandler& mh, bool value) { SetMode(&mh, value); }
467 
474  virtual bool HasCommandPermission(const std::string& command);
475 
483  virtual bool HasPrivPermission(const std::string& privstr);
484 
491  virtual bool HasModePermission(const ModeHandler* mh) const;
492 
497  virtual bool HasSnomaskPermission(char chr) const;
498 
503  const std::string& MakeHost();
504 
509  const std::string& MakeHostIP();
510 
514  void Oper(OperInfo* info);
515 
519  void UnOper();
520 
524  void WriteNotice(const std::string& text);
525 
529  virtual void WriteRemoteNotice(const std::string& text);
530 
531  virtual void WriteRemoteNumeric(const Numeric::Numeric& numeric);
532 
533  template <typename T1>
534  void WriteRemoteNumeric(unsigned int numeric, T1 p1)
535  {
536  Numeric::Numeric n(numeric);
537  n.push(p1);
538  WriteRemoteNumeric(n);
539  }
540 
541  template <typename T1, typename T2>
542  void WriteRemoteNumeric(unsigned int numeric, T1 p1, T2 p2)
543  {
544  Numeric::Numeric n(numeric);
545  n.push(p1);
546  n.push(p2);
547  WriteRemoteNumeric(n);
548  }
549 
550  template <typename T1, typename T2, typename T3>
551  void WriteRemoteNumeric(unsigned int numeric, T1 p1, T2 p2, T3 p3)
552  {
553  Numeric::Numeric n(numeric);
554  n.push(p1);
555  n.push(p2);
556  n.push(p3);
557  WriteRemoteNumeric(n);
558  }
559 
560  template <typename T1, typename T2, typename T3, typename T4>
561  void WriteRemoteNumeric(unsigned int numeric, T1 p1, T2 p2, T3 p3, T4 p4)
562  {
563  Numeric::Numeric n(numeric);
564  n.push(p1);
565  n.push(p2);
566  n.push(p3);
567  n.push(p4);
568  WriteRemoteNumeric(n);
569  }
570 
571  template <typename T1, typename T2, typename T3, typename T4, typename T5>
572  void WriteRemoteNumeric(unsigned int numeric, T1 p1, T2 p2, T3 p3, T4 p4, T5 p5)
573  {
574  Numeric::Numeric n(numeric);
575  n.push(p1);
576  n.push(p2);
577  n.push(p3);
578  n.push(p4);
579  n.push(p5);
580  WriteRemoteNumeric(n);
581  }
582 
583  void WriteNumeric(const Numeric::Numeric& numeric);
584 
585  template <typename T1>
586  void WriteNumeric(unsigned int numeric, T1 p1)
587  {
588  Numeric::Numeric n(numeric);
589  n.push(p1);
590  WriteNumeric(n);
591  }
592 
593  template <typename T1, typename T2>
594  void WriteNumeric(unsigned int numeric, T1 p1, T2 p2)
595  {
596  Numeric::Numeric n(numeric);
597  n.push(p1);
598  n.push(p2);
599  WriteNumeric(n);
600  }
601 
602  template <typename T1, typename T2, typename T3>
603  void WriteNumeric(unsigned int numeric, T1 p1, T2 p2, T3 p3)
604  {
605  Numeric::Numeric n(numeric);
606  n.push(p1);
607  n.push(p2);
608  n.push(p3);
609  WriteNumeric(n);
610  }
611 
612  template <typename T1, typename T2, typename T3, typename T4>
613  void WriteNumeric(unsigned int numeric, T1 p1, T2 p2, T3 p3, T4 p4)
614  {
615  Numeric::Numeric n(numeric);
616  n.push(p1);
617  n.push(p2);
618  n.push(p3);
619  n.push(p4);
620  WriteNumeric(n);
621  }
622 
623  template <typename T1, typename T2, typename T3, typename T4, typename T5>
624  void WriteNumeric(unsigned int numeric, T1 p1, T2 p2, T3 p3, T4 p4, T5 p5)
625  {
626  Numeric::Numeric n(numeric);
627  n.push(p1);
628  n.push(p2);
629  n.push(p3);
630  n.push(p4);
631  n.push(p5);
632  WriteNumeric(n);
633  }
634 
639  void WriteCommonRaw(ClientProtocol::Event& protoev, bool include_self = true);
640 
649  void ForEachNeighbor(ForEachNeighborHandler& handler, bool include_self = true);
650 
655  bool SharesChannelWith(User *other);
656 
661  bool ChangeDisplayedHost(const std::string& host);
662 
667  void ChangeRealHost(const std::string& host, bool resetdisplay);
668 
676  bool ChangeIdent(const std::string& newident);
677 
682  bool ChangeRealName(const std::string& real);
683 
689  bool ChangeNick(const std::string& newnick, time_t newts = 0);
690 
694  void PurgeEmptyChannels();
695 
698  virtual ~User();
699  CullResult cull() CXX11_OVERRIDE;
700 
702  bool Deserialize(Data& data) CXX11_OVERRIDE;
703 
705  bool Serialize(Serializable::Data& data) CXX11_OVERRIDE;
706 };
707 
708 class CoreExport UserIOHandler : public StreamSocket
709 {
710  private:
711  size_t checked_until;
712  public:
713  LocalUser* const user;
715  : StreamSocket(StreamSocket::SS_USER)
716  , checked_until(0)
717  , user(me)
718  {
719  }
720  void OnDataReady() CXX11_OVERRIDE;
721  bool OnSetEndPoint(const irc::sockets::sockaddrs& local, const irc::sockets::sockaddrs& remote) CXX11_OVERRIDE;
722  void OnError(BufferedSocketError error) CXX11_OVERRIDE;
723 
729  void AddWriteBuf(const std::string &data);
730 
734  void SwapInternals(UserIOHandler& other);
735 };
736 
737 typedef unsigned int already_sent_t;
738 
739 class CoreExport LocalUser : public User, public insp::intrusive_list_node<LocalUser>
740 {
744  void Write(const ClientProtocol::SerializedMessage& serialized);
745 
751  void Send(ClientProtocol::Event& protoev, ClientProtocol::MessageList& msglist);
752 
755  static ClientProtocol::MessageList sendmsglist;
756 
757  public:
759  LocalUser(int fd, const std::string& uuid, Serializable::Data& data);
760 
761  CullResult cull() CXX11_OVERRIDE;
762 
763  UserIOHandler eh;
764 
768 
771  unsigned int bytes_in;
772 
775  unsigned int bytes_out;
776 
779  unsigned int cmds_in;
780 
783  unsigned int cmds_out;
784 
789  std::string password;
790 
794 
798  ConnectClass* GetClass() const { return MyClass; }
799 
802  void CheckClass(bool clone_count = true);
803 
807 
812  unsigned int quitting_sendq:1;
813 
816  unsigned int lastping:1;
817 
820  unsigned int exempt:1;
821 
823  time_t nextping;
824 
827  time_t idle_lastmsg;
828 
832  unsigned int CommandFloodPenalty;
833 
834  already_sent_t already_sent;
835 
840  bool CheckLines(bool doZline = false);
841 
845  void FullConnect();
846 
851  void SetClass(const std::string &explicit_name = "");
852 
853  bool SetClientIP(const std::string& address) CXX11_OVERRIDE;
854 
855  void SetClientIP(const irc::sockets::sockaddrs& sa) CXX11_OVERRIDE;
856 
861  void WriteRemoteNotice(const std::string& text) CXX11_OVERRIDE;
862 
869  bool HasCommandPermission(const std::string& command) CXX11_OVERRIDE;
870 
878  bool HasPrivPermission(const std::string& privstr) CXX11_OVERRIDE;
879 
886  bool HasModePermission(const ModeHandler* mh) const CXX11_OVERRIDE;
887 
889  bool HasSnomaskPermission(char chr) const CXX11_OVERRIDE;
890 
895  void OverruleNick();
896 
900  void Send(ClientProtocol::Event& protoev);
901 
906  void Send(ClientProtocol::EventProvider& protoevprov, ClientProtocol::Message& msg);
907 
909  bool Deserialize(Data& data) CXX11_OVERRIDE;
910 
912  bool Serialize(Serializable::Data& data) CXX11_OVERRIDE;
913 };
914 
915 class RemoteUser : public User
916 {
917  public:
918  RemoteUser(const std::string& uid, Server* srv) : User(uid, srv, USERTYPE_REMOTE)
919  {
920  }
921 };
922 
923 class CoreExport FakeUser : public User
924 {
925  public:
926  FakeUser(const std::string& uid, Server* srv)
927  : User(uid, srv, USERTYPE_SERVER)
928  {
929  nick = srv->GetName();
930  }
931 
932  FakeUser(const std::string& uid, const std::string& sname, const std::string& sdesc)
933  : User(uid, new Server(uid, sname, sdesc), USERTYPE_SERVER)
934  {
935  nick = sname;
936  }
937 
938  CullResult cull() CXX11_OVERRIDE;
939  const std::string& GetFullHost() CXX11_OVERRIDE;
940  const std::string& GetFullRealHost() CXX11_OVERRIDE;
941 };
942 
943 /* Faster than dynamic_cast */
945 inline LocalUser* IS_LOCAL(User* u)
946 {
947  return (u != NULL && u->usertype == USERTYPE_LOCAL) ? static_cast<LocalUser*>(u) : NULL;
948 }
950 inline RemoteUser* IS_REMOTE(User* u)
951 {
952  return (u != NULL && u->usertype == USERTYPE_REMOTE) ? static_cast<RemoteUser*>(u) : NULL;
953 }
955 inline FakeUser* IS_SERVER(User* u)
956 {
957  return (u != NULL && u->usertype == USERTYPE_SERVER) ? static_cast<FakeUser*>(u) : NULL;
958 }
959 
960 inline bool User::IsModeSet(const ModeHandler* mh) const
961 {
962  return ((mh->GetId() != ModeParser::MODEID_MAX) && (modes[mh->GetId()]));
963 }
964 
965 inline bool User::IsModeSet(UserModeReference& moderef) const
966 {
967  if (!moderef)
968  return false;
969  return IsModeSet(*moderef);
970 }
971 
972 inline void User::SetMode(ModeHandler* mh, bool value)
973 {
974  if (mh && mh->GetId() != ModeParser::MODEID_MAX)
975  modes[mh->GetId()] = value;
976 }
User::chans
ChanList chans
Definition: users.h:336
ConnectClass::limit
unsigned long limit
Definition: users.h:141
User::Serialize
bool Serialize(Serializable::Data &data) CXX11_OVERRIDE
Definition: serializable.cpp:174
ClientProtocol::EventProvider
Definition: clientprotocol.h:625
OperInfo
Definition: configreader.h:179
ConnectClass::name
std::string name
Definition: users.h:87
Extensible
Definition: extensible.h:139
FakeUser
Definition: users.h:923
LocalUser::bytes_out
unsigned int bytes_out
Definition: users.h:775
irc::sockets::cidr_mask
Definition: socket.h:82
ConnectClass::fakelag
bool fakelag
Definition: users.h:83
User::signon
time_t signon
Definition: users.h:305
ConnectClass
Definition: users.h:75
User::ident
std::string ident
Definition: users.h:327
Serializable
Definition: serialize.h:23
insp::flat_set< int >
RemoteUser
Definition: users.h:915
Server
Definition: server.h:24
ClientProtocol::Event
Definition: clientprotocol.h:462
User::IsAway
bool IsAway() const
Definition: users.h:431
UserIOHandler
Definition: users.h:708
User::HasSnomaskPermission
virtual bool HasSnomaskPermission(char chr) const
Definition: users.cpp:231
ConnectClass::GetPenaltyThreshold
unsigned int GetPenaltyThreshold()
Definition: users.h:209
Serializable::Data
Definition: serialize.h:30
Server::GetName
const std::string & GetName() const
Definition: server.h:76
User::awaymsg
std::string awaymsg
Definition: users.h:345
ConnectClass::commandrate
unsigned int commandrate
Definition: users.h:120
ConnectClass::penaltythreshold
unsigned int penaltythreshold
Definition: users.h:117
LocalUser::idle_lastmsg
time_t idle_lastmsg
Definition: users.h:827
reference< ConfigTag >
ConnectClass::maxchans
unsigned int maxchans
Definition: users.h:136
User::HasModePermission
virtual bool HasModePermission(const ModeHandler *mh) const
Definition: users.cpp:178
LocalUser::cmds_in
unsigned int cmds_in
Definition: users.h:779
ConnectClass::GetRecvqMax
unsigned long GetRecvqMax()
Definition: users.h:202
UserModeReference
Definition: dynref.h:130
refcountbase
Definition: base.h:91
ConnectClass::type
char type
Definition: users.h:80
User::cull
CullResult cull() CXX11_OVERRIDE
Definition: users.cpp:361
LocalUser::serializer
ClientProtocol::Serializer * serializer
Definition: users.h:767
User::age
time_t age
Definition: users.h:299
StreamSocket
Definition: inspsocket.h:113
User::oper
reference< OperInfo > oper
Definition: users.h:354
ConnectClass::password
std::string password
Definition: users.h:153
ConnectClass::ports
insp::flat_set< int > ports
Definition: users.h:150
irc::sockets::sockaddrs
Definition: socket.h:62
User::IsOper
bool IsOper() const
Definition: users.h:437
ConnectClass::resolvehostnames
bool resolvehostnames
Definition: users.h:145
User::HasPrivPermission
virtual bool HasPrivPermission(const std::string &privstr)
Definition: users.cpp:218
User::ForEachNeighborHandler
Definition: users.h:283
ConnectClass::GetSendqSoftMax
unsigned long GetSendqSoftMax()
Definition: users.h:188
LocalUser::exempt
unsigned int exempt
Definition: users.h:820
ConnectClass::softsendqmax
unsigned long softsendqmax
Definition: users.h:104
User::GetFullHost
virtual const std::string & GetFullHost()
Definition: users.cpp:160
ConnectClass::maxlocal
unsigned long maxlocal
Definition: users.h:124
ConnectClass::maxconnwarn
bool maxconnwarn
Definition: users.h:132
ConnectClass::hardsendqmax
unsigned long hardsendqmax
Definition: users.h:109
User::client_sa
irc::sockets::sockaddrs client_sa
Definition: users.h:311
User::nick
std::string nick
Definition: users.h:317
LocalUser::MyClass
reference< ConnectClass > MyClass
Definition: users.h:793
ConnectClass::GetMaxGlobal
unsigned long GetMaxGlobal()
Definition: users.h:228
User::snomasks
std::bitset< 64 > snomasks
Definition: users.h:332
insp::intrusive_list_node
Definition: intrusive_list.h:33
ConfigTag
Definition: configreader.h:43
User::SetMode
void SetMode(ModeHandler *mh, bool value)
Definition: users.h:972
insp::intrusive_list< Membership >
User::IsModeSet
bool IsModeSet(unsigned char m) const
Definition: users.cpp:49
LocalUser::cmds_out
unsigned int cmds_out
Definition: users.h:783
ConnectClass::host
std::string host
Definition: users.h:95
ModeHandler::GetId
Id GetId() const
Definition: mode.h:248
User::User
User(const std::string &uid, Server *srv, UserType objtype)
Definition: users.cpp:79
LocalUser::password
std::string password
Definition: users.h:789
User::usertype
const unsigned int usertype
Definition: users.h:370
User::WriteRemoteNotice
virtual void WriteRemoteNotice(const std::string &text)
Definition: users.cpp:889
User::SetClientIP
virtual bool SetClientIP(const std::string &address)
Definition: users.cpp:757
ConnectClass::recvqmax
unsigned long recvqmax
Definition: users.h:113
ConnectClass::GetRegTimeout
time_t GetRegTimeout()
Definition: users.h:173
User
Definition: users.h:239
User::uuid
const std::string uuid
Definition: users.h:322
CullResult
Definition: base.h:37
ConnectClass::GetPingTime
unsigned int GetPingTime()
Definition: users.h:180
ConnectClass::GetMaxLocal
unsigned long GetMaxLocal()
Definition: users.h:221
LocalUser::server_sa
irc::sockets::sockaddrs server_sa
Definition: users.h:806
User::awaytime
time_t awaytime
Definition: users.h:350
ClientProtocol::Message
Definition: clientprotocol.h:181
LocalUser::nextping
time_t nextping
Definition: users.h:823
Extensible::cull
CullResult cull() CXX11_OVERRIDE
Definition: base.cpp:204
User::server
Server * server
Definition: users.h:340
User::ChanList
insp::intrusive_list< Membership > ChanList
Definition: users.h:295
ConnectClass::maxglobal
unsigned long maxglobal
Definition: users.h:128
ConnectClass::passwordhash
std::string passwordhash
Definition: users.h:156
LocalUser::lastping
unsigned int lastping
Definition: users.h:816
ConnectClass::pingtime
unsigned int pingtime
Definition: users.h:99
LocalUser::bytes_in
unsigned int bytes_in
Definition: users.h:771
Numeric::Numeric
Definition: numeric.h:30
User::quitting
unsigned int quitting
Definition: users.h:367
LocalUser::CommandFloodPenalty
unsigned int CommandFloodPenalty
Definition: users.h:832
ConnectClass::registration_timeout
unsigned int registration_timeout
Definition: users.h:91
LocalUser::quitting_sendq
unsigned int quitting_sendq
Definition: users.h:812
ClientProtocol::Serializer
Definition: clientprotocol.h:679
User::Deserialize
bool Deserialize(Data &data) CXX11_OVERRIDE
Definition: serializable.cpp:108
LocalUser::GetClass
ConnectClass * GetClass() const
Definition: users.h:798
ConnectClass::GetSendqHardMax
unsigned long GetSendqHardMax()
Definition: users.h:195
ModeParser::MODEID_MAX
static const ModeHandler::Id MODEID_MAX
Definition: mode.h:560
ModeHandler
Definition: mode.h:99
User::GetFullRealHost
virtual const std::string & GetFullRealHost()
Definition: users.cpp:169
LocalUser
Definition: users.h:739
User::registered
unsigned int registered
Definition: users.h:360
User::HasCommandPermission
virtual bool HasCommandPermission(const std::string &command)
Definition: users.cpp:202