diff options
| author | Adam <Adam@anope.org> | 2014-05-20 21:10:49 -0400 |
|---|---|---|
| committer | Adam <Adam@anope.org> | 2014-05-20 21:16:00 -0400 |
| commit | 866f3f32ab3713e9867747f150df3698e456744e (patch) | |
| tree | 20aabb18d88ee72a4fd412e17ebe30585496bd97 /modules | |
| parent | 20ce170024779aebbc1462146905c976836a552f (diff) | |
Speed up akill xline checks
Cache xline nick, user, host, etc instead of rebuilding it everytime its
requested. Store users ip in sockaddr form and not string form to
prevent having to rebuild sockaddrs when checking xlines.
Also do not try to convert empty config values in Config::Get as this
can be rather common if a non string configuration value is not set, and
the cost of the ConvertException is great.
Diffstat (limited to 'modules')
| -rw-r--r-- | modules/commands/os_defcon.cpp | 4 | ||||
| -rw-r--r-- | modules/commands/os_list.cpp | 2 | ||||
| -rw-r--r-- | modules/commands/os_session.cpp | 14 | ||||
| -rw-r--r-- | modules/extra/m_sql_authentication.cpp | 2 | ||||
| -rw-r--r-- | modules/extra/m_sql_oper.cpp | 2 | ||||
| -rw-r--r-- | modules/extra/stats/irc2sql/irc2sql.cpp | 2 | ||||
| -rw-r--r-- | modules/m_dnsbl.cpp | 19 | ||||
| -rw-r--r-- | modules/m_proxyscan.cpp | 6 | ||||
| -rw-r--r-- | modules/m_xmlrpc_main.cpp | 3 | ||||
| -rw-r--r-- | modules/pseudoclients/operserv.cpp | 9 |
10 files changed, 28 insertions, 35 deletions
diff --git a/modules/commands/os_defcon.cpp b/modules/commands/os_defcon.cpp index afd5dc7d6..c5074fd44 100644 --- a/modules/commands/os_defcon.cpp +++ b/modules/commands/os_defcon.cpp @@ -502,7 +502,7 @@ class OSDefcon : public Module if (DConfig.sessionlimit <= 0 || !session_service) return; - Session *session = session_service->FindSession(u->ip); + Session *session = session_service->FindSession(u->ip.addr()); Exception *exception = session_service->FindException(u); if (DConfig.Check(DEFCON_REDUCE_SESSION) && !exception) @@ -511,7 +511,7 @@ class OSDefcon : public Module { if (!DConfig.sle_reason.empty()) { - Anope::string message = DConfig.sle_reason.replace_all_cs("%IP%", u->ip); + Anope::string message = DConfig.sle_reason.replace_all_cs("%IP%", u->ip.addr()); u->SendMessage(OperServ, message); } if (!DConfig.sle_detailsloc.empty()) diff --git a/modules/commands/os_list.cpp b/modules/commands/os_list.cpp index 7bafd8b4d..b0c5fb339 100644 --- a/modules/commands/os_list.cpp +++ b/modules/commands/os_list.cpp @@ -180,7 +180,7 @@ class CommandOSUserList : public Command if (!pattern.empty()) { - Anope::string mask = u2->nick + "!" + u2->GetIdent() + "@" + u2->GetDisplayedHost(), mask2 = u2->nick + "!" + u2->GetIdent() + "@" + u2->host, mask3 = u2->nick + "!" + u2->GetIdent() + "@" + (!u2->ip.empty() ? u2->ip : u2->host); + Anope::string mask = u2->nick + "!" + u2->GetIdent() + "@" + u2->GetDisplayedHost(), mask2 = u2->nick + "!" + u2->GetIdent() + "@" + u2->host, mask3 = u2->nick + "!" + u2->GetIdent() + "@" + u2->ip.addr(); if (!Anope::Match(mask, pattern) && !Anope::Match(mask2, pattern) && !Anope::Match(mask3, pattern)) continue; if (!modes.empty()) diff --git a/modules/commands/os_session.cpp b/modules/commands/os_session.cpp index edf9458f8..40412494e 100644 --- a/modules/commands/os_session.cpp +++ b/modules/commands/os_session.cpp @@ -64,10 +64,10 @@ class MySessionService : public SessionService for (std::vector<Exception *>::const_iterator it = this->Exceptions->begin(), it_end = this->Exceptions->end(); it != it_end; ++it) { Exception *e = *it; - if (Anope::Match(u->host, e->mask) || Anope::Match(u->ip, e->mask)) + if (Anope::Match(u->host, e->mask) || Anope::Match(u->ip.addr(), e->mask)) return e; - if (cidr(e->mask).match(sockaddrs(u->ip))) + if (cidr(e->mask).match(u->ip)) return e; } return NULL; @@ -109,9 +109,9 @@ class MySessionService : public SessionService return NULL; } - SessionMap::iterator FindSessionIterator(const Anope::string &ip) + SessionMap::iterator FindSessionIterator(const sockaddrs &ip) { - cidr c(ip, ip.find(':') != Anope::string::npos ? ipv6_cidr : ipv4_cidr); + cidr c(ip, ip.ipv6() ? ipv6_cidr : ipv4_cidr); if (!c.valid()) return this->Sessions.end(); return this->Sessions.find(c); @@ -668,7 +668,7 @@ class OSSession : public Module if (u->Quitting() || !session_limit || exempt || !u->server || u->server->IsULined()) return; - cidr u_ip(u->ip, u->ip.find(':') != Anope::string::npos ? ipv6_cidr : ipv4_cidr); + cidr u_ip(u->ip, u->ip.ipv6() ? ipv6_cidr : ipv4_cidr); if (!u_ip.valid()) return; @@ -705,7 +705,7 @@ class OSSession : public Module { if (!sle_reason.empty()) { - Anope::string message = sle_reason.replace_all_cs("%IP%", u->ip); + Anope::string message = sle_reason.replace_all_cs("%IP%", u->ip.addr()); u->SendMessage(OperServ, message); } if (!sle_detailsloc.empty()) @@ -729,7 +729,7 @@ class OSSession : public Module } else { - session = new Session(u->ip, u->ip.find(':') != Anope::string::npos ? ipv6_cidr : ipv4_cidr); + session = new Session(u->ip, u->ip.ipv6() ? ipv6_cidr : ipv4_cidr); } } diff --git a/modules/extra/m_sql_authentication.cpp b/modules/extra/m_sql_authentication.cpp index 0710a6e20..c718f3c2b 100644 --- a/modules/extra/m_sql_authentication.cpp +++ b/modules/extra/m_sql_authentication.cpp @@ -122,7 +122,7 @@ class ModuleSQLAuthentication : public Module if (u) { q.SetValue("n", u->nick); - q.SetValue("i", u->ip); + q.SetValue("i", u->ip.addr()); } else { diff --git a/modules/extra/m_sql_oper.cpp b/modules/extra/m_sql_oper.cpp index 68a6d9084..3203021bc 100644 --- a/modules/extra/m_sql_oper.cpp +++ b/modules/extra/m_sql_oper.cpp @@ -135,7 +135,7 @@ class ModuleSQLOper : public Module SQL::Query q(this->query); q.SetValue("a", u->Account()->display); - q.SetValue("i", u->ip); + q.SetValue("i", u->ip.addr()); this->SQL->Run(new SQLOperResult(this, u), q); diff --git a/modules/extra/stats/irc2sql/irc2sql.cpp b/modules/extra/stats/irc2sql/irc2sql.cpp index d20e1a420..fd0ca5890 100644 --- a/modules/extra/stats/irc2sql/irc2sql.cpp +++ b/modules/extra/stats/irc2sql/irc2sql.cpp @@ -95,7 +95,7 @@ void IRC2SQL::OnUserConnect(User *u, bool &exempt) query.SetValue("vhost", u->vhost); query.SetValue("chost", u->chost); query.SetValue("realname", u->realname); - query.SetValue("ip", u->ip); + query.SetValue("ip", u->ip.addr()); query.SetValue("ident", u->GetIdent()); query.SetValue("vident", u->GetVIdent()); query.SetValue("secure", u->HasMode("SSL") || u->HasExt("ssl") ? "Y" : "N"); diff --git a/modules/m_dnsbl.cpp b/modules/m_dnsbl.cpp index b19a66ea4..1c10b09d5 100644 --- a/modules/m_dnsbl.cpp +++ b/modules/m_dnsbl.cpp @@ -54,18 +54,18 @@ class DNSBLResolver : public Request record_reason = this->blacklist.replies[result]; } - Anope::string reason = this->blacklist.reason; + Anope::string reason = this->blacklist.reason, addr = user->ip.addr(); reason = reason.replace_all_cs("%n", user->nick); reason = reason.replace_all_cs("%u", user->GetIdent()); reason = reason.replace_all_cs("%g", user->realname); reason = reason.replace_all_cs("%h", user->host); - reason = reason.replace_all_cs("%i", user->ip); + reason = reason.replace_all_cs("%i", addr); reason = reason.replace_all_cs("%r", record_reason); reason = reason.replace_all_cs("%N", Config->GetBlock("networkinfo")->Get<const Anope::string>("networkname")); BotInfo *OperServ = Config->GetClient("OperServ"); - Log(creator, "dnsbl", OperServ) << user->GetMask() << " (" << user->ip << ") appears in " << this->blacklist.name; - XLine *x = new XLine("*@" + user->ip, OperServ ? OperServ->nick : "m_dnsbl", Anope::CurTime + this->blacklist.bantime, reason, XLineManager::GenerateUID()); + Log(creator, "dnsbl", OperServ) << user->GetMask() << " (" << addr << ") appears in " << this->blacklist.name; + XLine *x = new XLine("*@" + addr, OperServ ? OperServ->nick : "m_dnsbl", Anope::CurTime + this->blacklist.bantime, reason, XLineManager::GenerateUID()); if (this->add_to_akill && akills) { akills->AddXLine(x); @@ -130,22 +130,21 @@ class ModuleDNSBL : public Module return; /* At this time we only support IPv4 */ - sockaddrs user_ip; - user_ip.pton(AF_INET, user->ip); - if (!user_ip.valid()) + if (!user->ip.valid() || user->ip.sa.sa_family != AF_INET) /* User doesn't have a valid IPv4 IP (ipv6/spoof/etc) */ return; - const unsigned long &ip = user_ip.sa4.sin_addr.s_addr; + const unsigned long &ip = user->ip.sa4.sin_addr.s_addr; unsigned long reverse_ip = (ip << 24) | ((ip & 0xFF00) << 8) | ((ip & 0xFF0000) >> 8) | (ip >> 24); - user_ip.sa4.sin_addr.s_addr = reverse_ip; + sockaddrs reverse = user->ip; + reverse.sa4.sin_addr.s_addr = reverse_ip; for (unsigned i = 0; i < this->blacklists.size(); ++i) { const Blacklist &b = this->blacklists[i]; - Anope::string dnsbl_host = user_ip.addr() + "." + b.name; + Anope::string dnsbl_host = reverse.addr() + "." + b.name; DNSBLResolver *res = NULL; try { diff --git a/modules/m_proxyscan.cpp b/modules/m_proxyscan.cpp index 0fe4ade27..6df764166 100644 --- a/modules/m_proxyscan.cpp +++ b/modules/m_proxyscan.cpp @@ -334,9 +334,7 @@ class ModuleProxyScan : public Module return; /* At this time we only support IPv4 */ - sockaddrs user_ip; - user_ip.pton(AF_INET, user->ip); - if (!user_ip.valid()) + if (!user->ip.valid() || user->ip.sa.sa_family != AF_INET) /* User doesn't have a valid IPv4 IP (ipv6/spoof/etc) */ return; @@ -364,7 +362,7 @@ class ModuleProxyScan : public Module con = new SOCKS5ProxyConnect(p, p.ports[k]); else continue; - con->Connect(user->ip, p.ports[k]); + con->Connect(user->ip.addr(), p.ports[k]); } catch (const SocketException &ex) { diff --git a/modules/m_xmlrpc_main.cpp b/modules/m_xmlrpc_main.cpp index 17dd8b96f..a66503f87 100644 --- a/modules/m_xmlrpc_main.cpp +++ b/modules/m_xmlrpc_main.cpp @@ -212,8 +212,7 @@ class MyXMLRPCEvent : public XMLRPCEvent request.reply("vhost", iface->Sanitize(u->vhost)); if (!u->chost.empty()) request.reply("chost", iface->Sanitize(u->chost)); - if (!u->ip.empty()) - request.reply("ip", u->ip); + request.reply("ip", u->ip.addr()); request.reply("timestamp", stringify(u->timestamp)); request.reply("signon", stringify(u->signon)); if (u->Account()) diff --git a/modules/pseudoclients/operserv.cpp b/modules/pseudoclients/operserv.cpp index 1a07bb009..67eaecd45 100644 --- a/modules/pseudoclients/operserv.cpp +++ b/modules/pseudoclients/operserv.cpp @@ -53,13 +53,10 @@ class SGLineManager : public XLineManager if (!x->GetReal().empty() && !Anope::Match(u->realname, x->GetReal())) return false; - if (x->GetHost().find('/') != Anope::string::npos) - { - if (cidr(x->GetHost()).match(sockaddrs(u->ip))) - return true; - } + if (x->c && x->c->match(u->ip)) + return true; - if (x->GetHost().empty() || Anope::Match(u->host, x->GetHost()) || Anope::Match(u->ip, x->GetHost())) + if (x->GetHost().empty() || Anope::Match(u->host, x->GetHost()) || Anope::Match(u->ip.addr(), x->GetHost())) return true; return false; |
