X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fcoremods%2Fcore_hostname_lookup.cpp;h=ec93732b124c732b7569f36454f6fdde55b3b762;hb=6adca3e0997781eae4adb02f19a2f8c312512ae1;hp=cbd80931c727ab2fd9c00529b2068104660a6e50;hpb=f9fd78c01623514a060c607534fc52cb73140200;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/coremods/core_hostname_lookup.cpp b/src/coremods/core_hostname_lookup.cpp index cbd80931c..ec93732b1 100644 --- a/src/coremods/core_hostname_lookup.cpp +++ b/src/coremods/core_hostname_lookup.cpp @@ -37,21 +37,6 @@ 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 @@ -71,7 +56,7 @@ class UserResolver : public DNS::Request * if a previous result has already come back. * @param r The finished query */ - void OnLookupComplete(const DNS::Query* r) + void OnLookupComplete(const DNS::Query* r) CXX11_OVERRIDE { LocalUser* bound_user = (LocalUser*)ServerInstance->FindUUID(uuid); if (!bound_user) @@ -80,10 +65,10 @@ class UserResolver : public DNS::Request return; } - const DNS::ResourceRecord* ans_record = FindAnswerOfType(r, this->type); + const DNS::ResourceRecord* ans_record = r->FindAnswerOfType(this->question.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); + OnError(r); return; } @@ -95,7 +80,7 @@ class UserResolver : public DNS::Request ph->set(bound_user, ans_record->rdata); UserResolver* res_forward; - if (bound_user->client_sa.sa.sa_family == AF_INET6) + if (bound_user->client_sa.family() == AF_INET6) { /* IPV6 forward lookup */ res_forward = new UserResolver(this->manager, this->creator, bound_user, ans_record->rdata, DNS::QUERY_AAAA); @@ -124,7 +109,7 @@ class UserResolver : public DNS::Request irc::sockets::sockaddrs* user_ip = &bound_user->client_sa; bool rev_match = false; - if (user_ip->sa.sa_family == AF_INET6) + if (user_ip->family() == AF_INET6) { struct in6_addr res_bin; if (inet_pton(AF_INET6, ans_record->rdata.c_str(), &res_bin)) @@ -160,11 +145,7 @@ class UserResolver : public DNS::Request hostname->insert(0, "0"); bound_user->WriteNotice("*** Found your hostname (" + *hostname + (r->cached ? ") -- cached" : ")")); - bound_user->host.assign(*hostname, 0, ServerInstance->Config->Limits.MaxHost); - bound_user->dhost = bound_user->host; - - /* Invalidate cache */ - bound_user->InvalidateCache(); + bound_user->ChangeRealHost(hostname->substr(0, ServerInstance->Config->Limits.MaxHost), true); } else { @@ -183,7 +164,7 @@ class UserResolver : public DNS::Request /** Called on failed lookup * @param query The errored query */ - void OnError(const DNS::Query* query) + void OnError(const DNS::Query* query) CXX11_OVERRIDE { LocalUser* bound_user = (LocalUser*)ServerInstance->FindUUID(uuid); if (bound_user) @@ -210,7 +191,7 @@ class ModuleHostnameLookup : public Module ph = &ptrHosts; } - void OnUserInit(LocalUser *user) + void OnSetUserIP(LocalUser* user) CXX11_OVERRIDE { if (!DNS || !user->MyClass->resolvehostnames) { @@ -218,6 +199,13 @@ class ModuleHostnameLookup : public Module return; } + // Clients can't have a DNS hostname if they aren't connected via IPv4 or IPv6. + if (user->client_sa.family() != AF_INET && user->client_sa.family() != AF_INET6) + { + user->WriteNotice("*** Skipping host resolution (connected via a non-IP socket)"); + return; + } + user->WriteNotice("*** Looking up your hostname..."); UserResolver* res_reverse = new UserResolver(*this->DNS, this, user, user->GetIPString(), DNS::QUERY_PTR); @@ -237,12 +225,12 @@ class ModuleHostnameLookup : public Module } } - ModResult OnCheckReady(LocalUser* user) + ModResult OnCheckReady(LocalUser* user) CXX11_OVERRIDE { return this->dnsLookup.get(user) ? MOD_RES_DENY : MOD_RES_PASSTHRU; } - Version GetVersion() + Version GetVersion() CXX11_OVERRIDE { return Version("Provides support for DNS lookups on connecting clients", VF_CORE|VF_VENDOR); }