REG_ALL = 7 /* REG_NICKUSER plus next bit along */
};
+enum UserType {
+ USERTYPE_LOCAL = 1,
+ USERTYPE_REMOTE = 2,
+ USERTYPE_SERVER = 3
+};
+
/** Holds information relevent to <connect allow> and <connect deny> tags in the config file.
*/
struct CoreExport ConnectClass : public refcountbase
*/
char type;
+ /** True if this class uses fake lag to manage flood, false if it kills */
+ bool fakelag;
+
/** Connect class name
*/
std::string name;
/** Seconds worth of penalty before penalty system activates
*/
- unsigned long penaltythreshold;
+ unsigned int penaltythreshold;
+
+ /** Maximum rate of commands (units: millicommands per second) */
+ unsigned int commandrate;
/** Local max when connecting by this connection class
*/
/** Create a new connect class with inherited settings.
*/
ConnectClass(ConfigTag* tag, char type, const std::string& mask, const ConnectClass& parent);
-
+
/** Update the settings in this block to match the given block */
void Update(const ConnectClass* newSettings);
const std::string& GetPass() { return pass; }
const std::string& GetHost() { return host; }
const int GetPort() { return port; }
-
+
/** Returns the registration timeout
*/
time_t GetRegTimeout()
/** Returns the penalty threshold value
*/
- unsigned long GetPenaltyThreshold()
+ unsigned int GetPenaltyThreshold()
+ {
+ return (penaltythreshold ? penaltythreshold : 10);
+ }
+
+ unsigned int GetCommandRate()
{
- return penaltythreshold;
+ return commandrate ? commandrate : 1000;
}
/** Returusn the maximum number of local sessions
* connection is stored here primarily, from the user's socket ID (file descriptor) through to the
* user's nickname and hostname.
*/
-class CoreExport User : public StreamSocket
+class CoreExport User : public Extensible
{
private:
/** Cached nick!ident@dhost value using the displayed hostname
*/
std::string cachedip;
- /** When we erase the user (in the destructor),
- * we call this method to subtract one from all
- * mode characters this user is making use of.
- */
- void DecrementModes();
public:
/** Hostname of connection.
*/
unsigned int lastping:1;
+ /** What type of user is this? */
+ const unsigned int usertype:2;
+
/** Get client IP string from sockaddr, using static internal buffer
* @return The IP string
*/
/** Get CIDR mask, using default range, for this user
*/
- irc::string GetCIDRMask();
+ irc::sockets::cidr_mask GetCIDRMask();
/** Sets the client IP for this user
* @return true if the conversion was successful
*/
bool SetClientIP(const char* sip);
- /** Default constructor
+ /** Constructor
* @throw CoreException if the UID allocated to the user already exists
- * @param Instance Creator instance
- * @param uid User UUID, or empty to allocate one automatically
- * @param srv Server that this user is from
*/
- User(const std::string &uid, const std::string& srv);
+ User(const std::string &uid, const std::string& srv, int objtype);
/** 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)
*/
void ShowRULES();
- virtual void OnDataReady();
- virtual void OnError(BufferedSocketError error);
/** Default destructor
*/
virtual ~User();
virtual CullResult cull();
};
-/** Represents a non-local user.
- * (in fact, any FD less than -1 does)
- */
-#define FD_MAGIC_NUMBER -42
-/** Represents a fake user (i.e. a server)
- */
-#define FD_FAKEUSER_NUMBER -7
+class CoreExport UserIOHandler : public StreamSocket
+{
+ public:
+ LocalUser* const user;
+ UserIOHandler(LocalUser* me) : user(me) {}
+ void OnDataReady();
+ void OnError(BufferedSocketError error);
+
+ /** Adds to the user's write buffer.
+ * You may add any amount of text up to this users sendq value, if you exceed the
+ * sendq value, the user will be removed, and further buffer adds will be dropped.
+ * @param data The data to add to the write buffer
+ */
+ void AddWriteBuf(const std::string &data);
+};
class CoreExport LocalUser : public User
{
InvitedList invites;
public:
- LocalUser();
+ LocalUser(int fd, irc::sockets::sockaddrs* client, irc::sockets::sockaddrs* server);
CullResult cull();
+ UserIOHandler eh;
+
/** Stats counter for bytes inbound
*/
int bytes_in;
*/
time_t nping;
- /** This value contains how far into the penalty threshold the user is. Once its over
- * the penalty threshold then commands are held and processed on-timer.
+ /** This value contains how far into the penalty threshold the user is.
+ * This is used either to enable fake lag or for excess flood quits
*/
- int Penalty;
+ unsigned int CommandFloodPenalty;
/** Stored reverse lookup from res_forward. Should not be used after resolution.
*/
*/
void SetClass(const std::string &explicit_name = "");
- void OnDataReady();
void SendText(const std::string& line);
void Write(const std::string& text);
void Write(const char*, ...) CUSTOM_PRINTF(2, 3);
- /** Adds to the user's write buffer.
- * You may add any amount of text up to this users sendq value, if you exceed the
- * sendq value, the user will be removed, and further buffer adds will be dropped.
- * @param data The data to add to the write buffer
- */
- void AddWriteBuf(const std::string &data);
-
/** Returns the list of channels this user has been invited to but has not yet joined.
* @return A list of channels the user is invited to
*/
* @return True if the user can set or unset this mode.
*/
bool HasModePermission(unsigned char mode, ModeType type);
+
+ inline int GetFd() { return eh.GetFd(); }
};
class CoreExport RemoteUser : public User
{
public:
- RemoteUser(const std::string& uid, const std::string& srv) : User(uid, srv)
+ RemoteUser(const std::string& uid, const std::string& srv) : User(uid, srv, USERTYPE_REMOTE)
{
- SetFd(FD_MAGIC_NUMBER);
}
virtual void SendText(const std::string& line);
};
class CoreExport FakeUser : public User
{
public:
- FakeUser(const std::string &uid, const std::string& srv) : User(uid, srv)
+ FakeUser(const std::string &uid, const std::string& srv) : User(uid, srv, USERTYPE_SERVER)
{
- SetFd(FD_FAKEUSER_NUMBER);
nick = srv;
}
/** Is a local user */
inline LocalUser* IS_LOCAL(User* u)
{
- return u->GetFd() > -1 ? static_cast<LocalUser*>(u) : NULL;
+ return u->usertype == USERTYPE_LOCAL ? static_cast<LocalUser*>(u) : NULL;
}
/** Is a remote user */
inline RemoteUser* IS_REMOTE(User* u)
{
- return u->GetFd() == FD_MAGIC_NUMBER ? static_cast<RemoteUser*>(u) : NULL;
+ return u->usertype == USERTYPE_REMOTE ? static_cast<RemoteUser*>(u) : NULL;
}
/** Is a server fakeuser */
inline FakeUser* IS_SERVER(User* u)
{
- return u->GetFd() == FD_FAKEUSER_NUMBER ? static_cast<FakeUser*>(u) : NULL;
+ return u->usertype == USERTYPE_SERVER ? static_cast<FakeUser*>(u) : NULL;
}
/** Is an oper */
#define IS_OPER(x) (x->oper)