X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fcoremods%2Fcore_hostname_lookup.cpp;h=cbd80931c727ab2fd9c00529b2068104660a6e50;hb=b200104cf2c61465acecaca111e3ec727fc3b954;hp=11cc5bbba8e0fdfaf8e0be034977af517c08d785;hpb=b705c6426818ba8cedfd00d1a84dab8ff0d0f1a0;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/coremods/core_hostname_lookup.cpp b/src/coremods/core_hostname_lookup.cpp index 11cc5bbba..cbd80931c 100644 --- a/src/coremods/core_hostname_lookup.cpp +++ b/src/coremods/core_hostname_lookup.cpp @@ -1,7 +1,7 @@ /* * InspIRCd -- Internet Relay Chat Daemon * - * Copyright (C) 2013 Adam + * Copyright (C) 2013-2016 Adam * * This file is part of InspIRCd. InspIRCd is free software: you can * redistribute it and/or modify it under the terms of the GNU General Public @@ -37,6 +37,21 @@ class UserResolver : public DNS::Request */ const bool fwd; + const DNS::ResourceRecord* FindAnswerOfType(const DNS::Query* response, DNS::QueryType qtype) + { + for (std::vector::const_iterator it = response->answers.begin(); it != response->answers.end(); ++it) + { + const DNS::ResourceRecord& rr = *it; + + if (rr.type == qtype) + { + return &rr; + } + } + + return NULL; + } + public: /** Create a resolver. * @param mgr DNS Manager @@ -65,25 +80,30 @@ class UserResolver : public DNS::Request return; } - const DNS::ResourceRecord& ans_record = r->answers[0]; + const DNS::ResourceRecord* ans_record = FindAnswerOfType(r, this->type); + if (ans_record == NULL) + { + ServerInstance->Logs->Log(MODNAME, LOG_DEBUG, "DNS result for %s: no record of type %d", uuid.c_str(), this->type); + return; + } - ServerInstance->Logs->Log(MODNAME, LOG_DEBUG, "DNS result for %s: '%s' -> '%s'", uuid.c_str(), ans_record.name.c_str(), ans_record.rdata.c_str()); + ServerInstance->Logs->Log(MODNAME, LOG_DEBUG, "DNS result for %s: '%s' -> '%s'", uuid.c_str(), ans_record->name.c_str(), ans_record->rdata.c_str()); if (!fwd) { // first half of resolution is done. We now need to verify that the host matches. - ph->set(bound_user, ans_record.rdata); + ph->set(bound_user, ans_record->rdata); UserResolver* res_forward; if (bound_user->client_sa.sa.sa_family == AF_INET6) { /* IPV6 forward lookup */ - res_forward = new UserResolver(this->manager, this->creator, bound_user, ans_record.rdata, DNS::QUERY_AAAA); + res_forward = new UserResolver(this->manager, this->creator, bound_user, ans_record->rdata, DNS::QUERY_AAAA); } else { /* IPV4 lookup */ - res_forward = new UserResolver(this->manager, this->creator, bound_user, ans_record.rdata, DNS::QUERY_A); + res_forward = new UserResolver(this->manager, this->creator, bound_user, ans_record->rdata, DNS::QUERY_A); } try { @@ -107,7 +127,7 @@ class UserResolver : public DNS::Request if (user_ip->sa.sa_family == AF_INET6) { struct in6_addr res_bin; - if (inet_pton(AF_INET6, ans_record.rdata.c_str(), &res_bin)) + if (inet_pton(AF_INET6, ans_record->rdata.c_str(), &res_bin)) { rev_match = !memcmp(&user_ip->in6.sin6_addr, &res_bin, sizeof(res_bin)); } @@ -115,7 +135,7 @@ class UserResolver : public DNS::Request else { struct in_addr res_bin; - if (inet_pton(AF_INET, ans_record.rdata.c_str(), &res_bin)) + if (inet_pton(AF_INET, ans_record->rdata.c_str(), &res_bin)) { rev_match = !memcmp(&user_ip->in4.sin_addr, &res_bin, sizeof(res_bin)); } @@ -170,7 +190,6 @@ class UserResolver : public DNS::Request { bound_user->WriteNotice("*** Could not resolve your hostname: " + this->manager->GetErrorStr(query->error) + "; using your IP address (" + bound_user->GetIPString() + ") instead."); dl->set(bound_user, 0); - ServerInstance->stats.DnsBad++; } } }; @@ -215,7 +234,6 @@ class ModuleHostnameLookup : public Module this->dnsLookup.set(user, 0); delete res_reverse; ServerInstance->Logs->Log(MODNAME, LOG_DEBUG, "Error in resolver: " + e.GetReason()); - ServerInstance->stats.DnsBad++; } }