X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fmodules%2Fm_dnsbl.cpp;h=c2f666c7ec1202cd24c56069a61dfcdd4d8af8b2;hb=7c197db72eab03321e4f3e847054e13126520504;hp=4391272e1b5670275bdb9039e113072b8957eaf9;hpb=76bf72f8c2c5b1524bf20a523fe1cf0d79d29742;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/modules/m_dnsbl.cpp b/src/modules/m_dnsbl.cpp index 4391272e1..c2f666c7e 100644 --- a/src/modules/m_dnsbl.cpp +++ b/src/modules/m_dnsbl.cpp @@ -34,6 +34,7 @@ class DNSBLConfEntry long duration; int bitmask; DNSBLConfEntry(): duration(86400),bitmask(0) {} + ~DNSBLConfEntry() { } }; @@ -63,29 +64,14 @@ class DNSBLResolver : public Resolver if(result.length()) { unsigned int bitmask=0; - unsigned int octetpos=0; - std::string tmp = result; + in_addr resultip; - while(tmp.length()>0) - { - std::string octet; - /* Fix by brain, npos is -1, so unsigned int will never match */ - std::string::size_type lastdot = tmp.rfind("."); - - if (lastdot == std::string::npos) - { - octet=tmp; - tmp.clear(); - } - else - { - octet=tmp.substr(lastdot+1,tmp.length()-lastdot+1); - tmp.resize(lastdot); - } - - bitmask += (256 ^ octetpos) * atoi(octet.c_str()); - octetpos += 1; - } + /* Convert the result to an in_addr (we can gaurantee we got ipv4) + * Whoever did the loop that was here before, I AM CONFISCATING + * YOUR CRACKPIPE. you know who you are. -- Brain + */ + inet_aton(result.c_str(), &resultip); + bitmask = resultip.s_addr >> 24; /* Last octet (network byte order */ bitmask &= ConfEntry->bitmask; @@ -96,7 +82,7 @@ class DNSBLResolver : public Resolver while (x != std::string::npos) { reason.erase(x, 4); - reason.insert(x, "%ip%"); + reason.insert(x, them->GetIPString()); x = reason.find("%ip%"); } @@ -112,16 +98,19 @@ class DNSBLResolver : public Resolver case DNSBLConfEntry::I_KLINE: { ServerInstance->AddKLine(ConfEntry->duration, ServerInstance->Config->ServerName, reason, std::string("*@") + them->GetIPString()); + FOREACH_MOD(I_OnAddKLine,OnAddKLine(ConfEntry->duration, NULL, reason, std::string("*@") + them->GetIPString())); break; } case DNSBLConfEntry::I_GLINE: { ServerInstance->AddGLine(ConfEntry->duration, ServerInstance->Config->ServerName, reason, std::string("*@") + them->GetIPString()); + FOREACH_MOD(I_OnAddGLine,OnAddGLine(ConfEntry->duration, NULL, reason, std::string("*@") + them->GetIPString())); break; } case DNSBLConfEntry::I_ZLINE: { ServerInstance->AddZLine(ConfEntry->duration, ServerInstance->Config->ServerName, reason, them->GetIPString()); + FOREACH_MOD(I_OnAddZLine,OnAddZLine(ConfEntry->duration, NULL, reason, them->GetIPString())); break; } case DNSBLConfEntry::I_UNKNOWN: @@ -138,7 +127,7 @@ class DNSBLResolver : public Resolver virtual void OnError(ResolverError e, const std::string &errormessage) { } - + virtual ~DNSBLResolver() { } @@ -148,7 +137,7 @@ class ModuleDNSBL : public Module { private: std::vector DNSBLConfEntries; - + /* * Convert a string to EnumBanaction */ @@ -162,7 +151,7 @@ class ModuleDNSBL : public Module return DNSBLConfEntry::I_ZLINE; if(action.compare("GLINE")==0) return DNSBLConfEntry::I_GLINE; - + return DNSBLConfEntry::I_UNKNOWN; } public: @@ -170,12 +159,12 @@ class ModuleDNSBL : public Module { ReadConf(); } - + virtual ~ModuleDNSBL() { ClearEntries(); } - + virtual Version GetVersion() { return Version(2, 0, 0, 1, VF_VENDOR, API_VERSION); @@ -191,15 +180,13 @@ class ModuleDNSBL : public Module void ClearEntries() { std::vector::iterator i; - while ((i = DNSBLConfEntries.begin()) != DNSBLConfEntries.end()) - { - DNSBLConfEntries.erase(i); + for (std::vector::iterator i = DNSBLConfEntries.begin(); i != DNSBLConfEntries.end(); i++) delete *i; - } + DNSBLConfEntries.clear(); } /** Fill our conf vector with data - */ + */ virtual void ReadConf() { ConfigReader *MyConf = new ConfigReader(ServerInstance); @@ -270,12 +257,29 @@ class ModuleDNSBL : public Module unsigned char a, b, c, d; char reversedipbuf[128]; std::string reversedip; + bool success = false; if (!inet_aton(user->GetIPString(), &in)) { - ServerInstance->WriteOpers("Invalid IP address in m_dnsbl! Bailing check"); - return 0; +#ifdef IPV6 + /* We could have an ipv6 address here */ + std::string x = user->GetIPString(); + /* Is it a 4in6 address? (Compensate for this kernel kludge that people love) */ + if (x.find("0::ffff:") == 0) + { + x.erase(x.begin(), x.begin() + 8); + if (inet_aton(x.c_str(), &in)) + success = true; + } +#endif } + else + { + success = true; + } + + if (!success) + return 0; d = (unsigned char) (in.s_addr >> 24) & 0xFF; c = (unsigned char) (in.s_addr >> 16) & 0xFF; @@ -289,7 +293,7 @@ class ModuleDNSBL : public Module for (std::vector::iterator i = DNSBLConfEntries.begin(); i != DNSBLConfEntries.end(); i++) { // Fill hostname with a dnsbl style host (d.c.b.a.domain.tld) - std::string hostname=reversedip+"."+ (*i)->domain; + std::string hostname = reversedip + "." + (*i)->domain; /* now we'd need to fire off lookups for `hostname'. */ bool cached; @@ -311,16 +315,16 @@ class ModuleDNSBLFactory : public ModuleFactory ModuleDNSBLFactory() { } - + ~ModuleDNSBLFactory() { } - + virtual Module *CreateModule(InspIRCd *Me) { return new ModuleDNSBL(Me); } - + };