diff options
Diffstat (limited to 'src/sessions.cpp')
-rw-r--r-- | src/sessions.cpp | 29 |
1 files changed, 14 insertions, 15 deletions
diff --git a/src/sessions.cpp b/src/sessions.cpp index a90364160..a6032b572 100644 --- a/src/sessions.cpp +++ b/src/sessions.cpp @@ -91,9 +91,10 @@ Session *findsession(const Anope::string &host) * causes the the session limit to be exceeded, kill the connecting user. */ -void add_session(const Anope::string &nick, const Anope::string &host, const Anope::string &hostip) +void add_session(User *u) { - Session *session = findsession(host); + const Anope::string &hostip = u->ip() ? u->ip.addr() : ""; + Session *session = findsession(u->host); if (session) { @@ -101,7 +102,7 @@ void add_session(const Anope::string &nick, const Anope::string &host, const Ano if (Config->DefSessionLimit && session->count >= Config->DefSessionLimit) { kill = true; - Exception *exception = find_hostip_exception(host, hostip); + Exception *exception = find_hostip_exception(u->host, hostip); if (exception) { kill = false; @@ -113,9 +114,9 @@ void add_session(const Anope::string &nick, const Anope::string &host, const Ano if (kill) { if (!Config->SessionLimitExceeded.empty()) - ircdproto->SendMessage(OperServ, nick, Config->SessionLimitExceeded.c_str(), host.c_str()); + u->SendMessage(OperServ, Config->SessionLimitExceeded.c_str(), u->host.c_str()); if (!Config->SessionLimitDetailsLoc.empty()) - ircdproto->SendMessage(OperServ, nick, "%s", Config->SessionLimitDetailsLoc.c_str()); + u->SendMessage(OperServ, "%s", Config->SessionLimitDetailsLoc.c_str()); /* Previously on IRCds that send a QUIT (InspIRCD) when a user is killed, the session for a host was * decremented in do_quit, which caused problems and fixed here @@ -125,12 +126,12 @@ void add_session(const Anope::string &nick, const Anope::string &host, const Ano * decremented in do_kill or in do_quit - Adam */ ++session->count; - kill_user(Config->s_OperServ, nick, "Session limit exceeded"); + kill_user(Config->s_OperServ, u, "Session limit exceeded"); ++session->hits; if (Config->MaxSessionKill && session->hits >= Config->MaxSessionKill && SGLine) { - Anope::string akillmask = "*@" + host; + const Anope::string &akillmask = "*@" + u->host; XLine *x = new XLine(akillmask, Config->s_OperServ, Anope::CurTime + Config->SessionAutoKillExpiry, "Session limit exceeded"); SGLine->AddXLine(x); ircdproto->SendGlobops(OperServ, "Added a temporary AKILL for \2%s\2 due to excessive connections", akillmask.c_str()); @@ -144,7 +145,7 @@ void add_session(const Anope::string &nick, const Anope::string &host, const Ano else { session = new Session(); - session->host = host; + session->host = u->host; session->count = 1; session->hits = 0; @@ -152,7 +153,7 @@ void add_session(const Anope::string &nick, const Anope::string &host, const Ano } } -void del_session(const Anope::string &host) +void del_session(User *u) { if (!Config->LimitSessions) { @@ -160,7 +161,7 @@ void del_session(const Anope::string &host) return; } - if (host.empty()) + if (!u) { Log(LOG_DEBUG) << "del_session called with NULL values"; return; @@ -168,14 +169,14 @@ void del_session(const Anope::string &host) Log(LOG_DEBUG_2) << "del_session() called"; - Session *session = findsession(host); + Session *session = findsession(u->host); if (!session) { if (debug) { - ircdproto->SendGlobops(OperServ, "WARNING: Tried to delete non-existant session: \2%s", host.c_str()); - Log() << "session: Tried to delete non-existant session: " << host; + ircdproto->SendGlobops(OperServ, "WARNING: Tried to delete non-existant session: \2%s", u->host.c_str()); + Log() << "session: Tried to delete non-existant session: " << u->host; } return; } @@ -188,8 +189,6 @@ void del_session(const Anope::string &host) SessionList.erase(session->host); - Log(LOG_DEBUG_2) << "del_session(): free session structure"; - delete session; Log(LOG_DEBUG_2) << "del_session() done"; |