/*
* InspIRCd -- Internet Relay Chat Daemon
*
- * Copyright (C) 2009 Daniel De Graaf <danieldg@inspircd.org>
- * Copyright (C) 2007-2008 Robin Burchell <robin+git@viroteck.net>
+ * Copyright (C) 2019 linuxdaemon <linuxdaemon.irc@gmail.com>
+ * Copyright (C) 2019 Matt Schatz <genius3000@g3k.solutions>
+ * Copyright (C) 2013 Daniel Vassdal <shutter@canternet.org>
+ * Copyright (C) 2012-2016, 2018 Attila Molnar <attilamolnar@hush.com>
+ * Copyright (C) 2012-2013, 2016-2019 Sadie Powell <sadie@witchery.services>
+ * Copyright (C) 2012, 2018-2019 Robby <robby@chatbelgie.be>
+ * Copyright (C) 2012 DjSlash <djslash@djslash.org>
+ * Copyright (C) 2012 ChrisTX <xpipe@hotmail.de>
+ * Copyright (C) 2009-2010 Daniel De Graaf <danieldg@inspircd.org>
+ * Copyright (C) 2009 Uli Schlachter <psychon@inspircd.org>
* Copyright (C) 2008 Thomas Stagner <aquanight@inspircd.org>
- * Copyright (C) 2003-2007 Craig Edwards <craigedwards@brainbox.cc>
- * Copyright (C) 2007 Burlex <???@???>
- * Copyright (C) 2007 Dennis Friis <peavey@inspircd.org>
+ * Copyright (C) 2008 John Brooks <special@inspircd.org>
+ * Copyright (C) 2007-2009 Robin Burchell <robin+git@viroteck.net>
+ * Copyright (C) 2007, 2009 Dennis Friis <peavey@inspircd.org>
+ * Copyright (C) 2006-2008 Craig Edwards <brain@inspircd.org>
*
* 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
*/
insp::flat_set<int> ports;
+ /** If non-empty then the password a user must specify in PASS to be assigned to this class. */
+ std::string password;
+
+ /** If non-empty then the hash algorithm that the password field is hashed with. */
+ std::string passwordhash;
+
/** Create a new connect class with no settings.
*/
ConnectClass(ConfigTag* tag, char type, const std::string& mask);
/** Sets the client IP for this user
* @return true if the conversion was successful
*/
- virtual bool SetClientIP(const std::string& address, bool recheck_eline = true);
+ virtual bool SetClientIP(const std::string& address);
- virtual void SetClientIP(const irc::sockets::sockaddrs& sa, bool recheck_eline = true);
+ virtual void SetClientIP(const irc::sockets::sockaddrs& sa);
/** Constructor
* @throw CoreException if the UID allocated to the user already exists
* @param command A command (should be all CAPS)
* @return True if this user can execute the command
*/
- virtual bool HasPermission(const std::string &command);
+ virtual bool HasCommandPermission(const std::string& command);
/** Returns true if a user has a given permission.
* This is used to check whether or not users may perform certain actions which admins may not wish to give to
* all operators, yet are not commands. An example might be oper override, mass messaging (/notice $*), etc.
*
* @param privstr The priv to chec, e.g. "users/override/topic". These are loaded free-form from the config file.
- * @param noisy If set to true, the user is notified that they do not have the specified permission where applicable. If false, no notification is sent.
* @return True if this user has the permission in question.
*/
- virtual bool HasPrivPermission(const std::string &privstr, bool noisy = false);
+ virtual bool HasPrivPermission(const std::string& privstr);
/** Returns true or false if a user can set a privileged user or channel mode.
* This is done by looking up their oper type from User::oper, then referencing
*/
virtual bool HasModePermission(const ModeHandler* mh) const;
+ /** Determines whether this user can set the specified snomask.
+ * @param chr The server notice mask character to look up.
+ * @return True if the user can set the specified snomask; otherwise, false.
+ */
+ virtual bool HasSnomaskPermission(char chr) const;
+
/** Creates a usermask with real host.
* Takes a buffer to use and fills the given buffer with the hostmask in the format user\@host
* @return the usermask in the format user\@host
*/
virtual ~User();
CullResult cull() CXX11_OVERRIDE;
+
+ /** @copydoc Serializable::Deserialize */
+ bool Deserialize(Data& data) CXX11_OVERRIDE;
+
+ /** @copydoc Serializable::Deserialize */
+ bool Serialize(Serializable::Data& data) CXX11_OVERRIDE;
};
class CoreExport UserIOHandler : public StreamSocket
{
+ private:
+ size_t checked_until;
public:
LocalUser* const user;
UserIOHandler(LocalUser* me)
: StreamSocket(StreamSocket::SS_USER)
+ , checked_until(0)
, user(me)
{
}
void OnDataReady() CXX11_OVERRIDE;
- void OnSetEndPoint(const irc::sockets::sockaddrs& local, const irc::sockets::sockaddrs& remote) CXX11_OVERRIDE;
+ bool OnSetEndPoint(const irc::sockets::sockaddrs& local, const irc::sockets::sockaddrs& remote) CXX11_OVERRIDE;
void OnError(BufferedSocketError error) CXX11_OVERRIDE;
/** Adds to the user's write buffer.
* @param data The data to add to the write buffer
*/
void AddWriteBuf(const std::string &data);
+
+ /** Swaps the internals of this UserIOHandler with another one.
+ * @param other A UserIOHandler to swap internals with.
+ */
+ void SwapInternals(UserIOHandler& other);
};
typedef unsigned int already_sent_t;
public:
LocalUser(int fd, irc::sockets::sockaddrs* client, irc::sockets::sockaddrs* server);
+ LocalUser(int fd, const std::string& uuid, Serializable::Data& data);
+
CullResult cull() CXX11_OVERRIDE;
UserIOHandler eh;
*/
irc::sockets::sockaddrs server_sa;
- /**
- * @return The port number of this user.
- */
- int GetServerPort();
-
/** Recursion fix: user is out of SendQ and will be quit as soon as possible.
* This can't be handled normally because QuitUser itself calls Write on other
* users, which could trigger their SendQ to overrun.
*/
unsigned int lastping:1;
- /** This is true if the user matched an exception (E:Line). It is used to save time on ban checks.
+ /** This is true if the user matched an exception (E-line). It is used to save time on ban checks.
*/
unsigned int exempt:1;
- /** Used by PING checking code
- */
- time_t nping;
+ /** The time at which this user should be pinged next. */
+ time_t nextping;
/** Time that the connection last sent a message, used to calculate idle time
*/
already_sent_t already_sent;
- /** Check if the user matches a G or K line, and disconnect them if they do.
- * @param doZline True if ZLines should be checked (if IP has changed since initial connect)
+ /** Check if the user matches a G- or K-line, and disconnect them if they do.
+ * @param doZline True if Z-lines should be checked (if IP has changed since initial connect)
* Returns true if the user matched a ban, false else.
*/
bool CheckLines(bool doZline = false);
/** Use this method to fully connect a user.
- * This will send the message of the day, check G/K/E lines, etc.
+ * This will send the message of the day, check G/K/E-lines, etc.
*/
void FullConnect();
*/
void SetClass(const std::string &explicit_name = "");
- bool SetClientIP(const std::string& address, bool recheck_eline = true) CXX11_OVERRIDE;
+ bool SetClientIP(const std::string& address) CXX11_OVERRIDE;
- void SetClientIP(const irc::sockets::sockaddrs& sa, bool recheck_eline = true) CXX11_OVERRIDE;
+ void SetClientIP(const irc::sockets::sockaddrs& sa) CXX11_OVERRIDE;
/** Send a NOTICE message from the local server to the user.
* The message will be sent even if the user is connected to a remote server.
* @param command A command (should be all CAPS)
* @return True if this user can execute the command
*/
- bool HasPermission(const std::string &command) CXX11_OVERRIDE;
+ bool HasCommandPermission(const std::string& command) CXX11_OVERRIDE;
/** Returns true if a user has a given permission.
* This is used to check whether or not users may perform certain actions which admins may not wish to give to
* all operators, yet are not commands. An example might be oper override, mass messaging (/notice $*), etc.
*
* @param privstr The priv to chec, e.g. "users/override/topic". These are loaded free-form from the config file.
- * @param noisy If set to true, the user is notified that they do not have the specified permission where applicable. If false, no notification is sent.
* @return True if this user has the permission in question.
*/
- bool HasPrivPermission(const std::string &privstr, bool noisy = false) CXX11_OVERRIDE;
+ bool HasPrivPermission(const std::string& privstr) CXX11_OVERRIDE;
/** Returns true or false if a user can set a privileged user or channel mode.
* This is done by looking up their oper type from User::oper, then referencing
*/
bool HasModePermission(const ModeHandler* mh) const CXX11_OVERRIDE;
+ /** @copydoc User::HasSnomaskPermission */
+ bool HasSnomaskPermission(char chr) const CXX11_OVERRIDE;
+
/** Change nick to uuid, unset REG_NICK and send a nickname overruled numeric.
* This is called when another user (either local or remote) needs the nick of this user and this user
* isn't registered.
* @param msg Message to send.
*/
void Send(ClientProtocol::EventProvider& protoevprov, ClientProtocol::Message& msg);
+
+ /** @copydoc Serializable::Deserialize */
+ bool Deserialize(Data& data) CXX11_OVERRIDE;
+
+ /** @copydoc Serializable::Deserialize */
+ bool Serialize(Serializable::Data& data) CXX11_OVERRIDE;
};
class RemoteUser : public User
class CoreExport FakeUser : public User
{
public:
- FakeUser(const std::string& uid, Server* srv) : User(uid, srv, USERTYPE_SERVER)
+ FakeUser(const std::string& uid, Server* srv)
+ : User(uid, srv, USERTYPE_SERVER)
{
nick = srv->GetName();
}
FakeUser(const std::string& uid, const std::string& sname, const std::string& sdesc)
- : User(uid, new Server(sname, sdesc), USERTYPE_SERVER)
+ : User(uid, new Server(uid, sname, sdesc), USERTYPE_SERVER)
{
nick = sname;
}
/** Is a local user */
inline LocalUser* IS_LOCAL(User* u)
{
- return u->usertype == USERTYPE_LOCAL ? static_cast<LocalUser*>(u) : NULL;
+ return (u != NULL && u->usertype == USERTYPE_LOCAL) ? static_cast<LocalUser*>(u) : NULL;
}
/** Is a remote user */
inline RemoteUser* IS_REMOTE(User* u)
{
- return u->usertype == USERTYPE_REMOTE ? static_cast<RemoteUser*>(u) : NULL;
+ return (u != NULL && u->usertype == USERTYPE_REMOTE) ? static_cast<RemoteUser*>(u) : NULL;
}
/** Is a server fakeuser */
inline FakeUser* IS_SERVER(User* u)
{
- return u->usertype == USERTYPE_SERVER ? static_cast<FakeUser*>(u) : NULL;
+ return (u != NULL && u->usertype == USERTYPE_SERVER) ? static_cast<FakeUser*>(u) : NULL;
}
inline bool User::IsModeSet(const ModeHandler* mh) const