X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fmodules%2Fm_dnsbl.cpp;h=e0a827f0442494080817fa98b111e37d5d492401;hb=97a1d6429a735eb279496df010d04e3f42aa4e22;hp=752a0d7a5997a14ba39845295f7cf6bf3886612b;hpb=c6a508a3da977041909f18f77d6e8fea942512cf;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/modules/m_dnsbl.cpp b/src/modules/m_dnsbl.cpp index 752a0d7a5..e0a827f04 100644 --- a/src/modules/m_dnsbl.cpp +++ b/src/modules/m_dnsbl.cpp @@ -24,6 +24,7 @@ #include "inspircd.h" #include "xline.h" #include "modules/dns.h" +#include "modules/stats.h" /* Class holding data for a single entry */ class DNSBLConfEntry : public refcountbase @@ -34,15 +35,15 @@ class DNSBLConfEntry : public refcountbase std::string name, ident, host, domain, reason; EnumBanaction banaction; EnumType type; - long duration; - int bitmask; + unsigned long duration; + unsigned int bitmask; unsigned char records[256]; unsigned long stats_hits, stats_misses; DNSBLConfEntry(): type(A_BITMASK),duration(86400),bitmask(0),stats_hits(0), stats_misses(0) {} }; -/** Resolver for CGI:IRC hostnames encoded in ident/GECOS +/** Resolver for CGI:IRC hostnames encoded in ident/real name */ class DNSBLResolver : public DNS::Request { @@ -88,7 +89,7 @@ class DNSBLResolver : public DNS::Request bool match = false; in_addr resultip; - inet_aton(ans_record->rdata.c_str(), &resultip); + inet_pton(AF_INET, ans_record->rdata.c_str(), &resultip); switch (ConfEntry->type) { @@ -220,7 +221,7 @@ class DNSBLResolver : public DNS::Request } }; -class ModuleDNSBL : public Module +class ModuleDNSBL : public Module, public Stats::EventListener { std::vector > DNSBLConfEntries; dynamic_reference DNS; @@ -247,7 +248,8 @@ class ModuleDNSBL : public Module } public: ModuleDNSBL() - : DNS(this, "DNS") + : Stats::EventListener(this) + , DNS(this, "DNS") , nameExt("dnsbl_match", ExtensionItem::EXT_USER, this) , countExt("dnsbl_pending", ExtensionItem::EXT_USER, this) { @@ -276,10 +278,10 @@ class ModuleDNSBL : public Module e->reason = tag->getString("reason"); e->domain = tag->getString("domain"); - if (tag->getString("type") == "bitmask") + if (stdalgo::string::equalsci(tag->getString("type"), "bitmask")) { e->type = DNSBLConfEntry::A_BITMASK; - e->bitmask = tag->getInt("bitmask"); + e->bitmask = tag->getUInt("bitmask", 0, 0, UINT_MAX); } else { @@ -337,6 +339,10 @@ class ModuleDNSBL : public Module if ((user->exempt) || !DNS) return; + // Clients can't be in a DNSBL if they aren't connected via IPv4 or IPv6. + if (user->client_sa.family() != AF_INET && user->client_sa.family() != AF_INET6) + return; + if (user->MyClass) { if (!user->MyClass->config->getBool("usednsbl", true)) @@ -346,7 +352,7 @@ class ModuleDNSBL : public Module ServerInstance->Logs->Log(MODNAME, LOG_DEBUG, "User has no connect class in OnSetUserIP"); std::string reversedip; - if (user->client_sa.sa.sa_family == AF_INET) + if (user->client_sa.family() == AF_INET) { unsigned int a, b, c, d; d = (unsigned int) (user->client_sa.in4.sin_addr.s_addr >> 24) & 0xFF; @@ -356,7 +362,7 @@ class ModuleDNSBL : public Module reversedip = ConvToStr(d) + "." + ConvToStr(c) + "." + ConvToStr(b) + "." + ConvToStr(a); } - else if (user->client_sa.sa.sa_family == AF_INET6) + else if (user->client_sa.family() == AF_INET6) { const unsigned char* ip = user->client_sa.in6.sin6_addr.s6_addr;