X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fcoremods%2Fcore_hostname_lookup.cpp;h=db9063ff630e2d56c81d296c1905fabce665347c;hb=d4685e02b55229e0ca5068b839c87b5a80180f33;hp=8e97d0c234083e0f816d74308ca0961dde74ebe9;hpb=693b8a5a39e15b09d7352667e8a7339e58d9114c;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/coremods/core_hostname_lookup.cpp b/src/coremods/core_hostname_lookup.cpp index 8e97d0c23..db9063ff6 100644 --- a/src/coremods/core_hostname_lookup.cpp +++ b/src/coremods/core_hostname_lookup.cpp @@ -1,7 +1,10 @@ /* * InspIRCd -- Internet Relay Chat Daemon * - * Copyright (C) 2013-2016 Adam + * Copyright (C) 2020 Matt Schatz + * Copyright (C) 2013-2015 Attila Molnar + * Copyright (C) 2013, 2017-2019 Sadie Powell + * 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 @@ -33,6 +36,17 @@ class UserResolver : public DNS::Request /** UUID we are looking up */ const std::string uuid; + /** Handles errors which happen during DNS resolution. */ + static void HandleError(LocalUser* user, const std::string& message) + { + user->WriteNotice("*** " + message + "; using your IP address (" + user->GetIPString() + ") instead."); + + bool display_is_real = user->GetDisplayedHost() == user->GetRealHost(); + user->ChangeRealHost(user->GetIPString(), display_is_real); + + dl->unset(user); + } + public: /** Create a resolver. * @param mgr DNS Manager @@ -63,7 +77,7 @@ class UserResolver : public DNS::Request const DNS::ResourceRecord* ans_record = r->FindAnswerOfType(this->question.type); if (ans_record == NULL) { - OnError(r); + HandleError(bound_user, "Could not resolve your hostname: No " + this->manager->GetTypeStr(this->question.type) + " records found"); return; } @@ -94,8 +108,7 @@ class UserResolver : public DNS::Request delete res_forward; ServerInstance->Logs->Log(MODNAME, LOG_DEBUG, "Error in resolver: " + e.GetReason()); - bound_user->WriteNotice("*** There was an internal error resolving your host, using your IP address (" + bound_user->GetIPString() + ") instead."); - dl->set(bound_user, 0); + HandleError(bound_user, "There was an internal error resolving your host"); } } else if (this->question.type == DNS::QUERY_A || this->question.type == DNS::QUERY_AAAA) @@ -121,18 +134,16 @@ class UserResolver : public DNS::Request } } - dl->set(bound_user, 0); - if (rev_match) { bound_user->WriteNotice("*** Found your hostname (" + this->question.name + (r->cached ? ") -- cached" : ")")); - bound_user->ChangeRealHost(this->question.name, true); + bool display_is_real = bound_user->GetDisplayedHost() == bound_user->GetRealHost(); + bound_user->ChangeRealHost(this->question.name, display_is_real); + dl->unset(bound_user); } else { - bool display_is_real = irc::equals(bound_user->GetDisplayedHost(), bound_user->GetRealHost()); - bound_user->WriteNotice("*** Your hostname does not match up with your IP address. Sorry, using your IP address (" + bound_user->GetIPString() + ") instead."); - bound_user->ChangeRealHost(bound_user->GetIPString(), display_is_real); + HandleError(bound_user, "Your hostname does not match up with your IP address"); } } } @@ -144,10 +155,7 @@ class UserResolver : public DNS::Request { LocalUser* bound_user = IS_LOCAL(ServerInstance->FindUUID(uuid)); if (bound_user) - { - 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); - } + HandleError(bound_user, "Could not resolve your hostname: " + this->manager->GetErrorStr(query->error)); } }; @@ -169,7 +177,7 @@ class ModuleHostnameLookup : public Module { // If core_dns is not loaded or hostname resolution is disabled for the user's // connect class then the logic in this function does not apply. - if (!DNS || !user->MyClass->resolvehostnames) + if (!DNS || user->quitting || !user->MyClass->resolvehostnames) return; // Clients can't have a DNS hostname if they aren't connected via IPv4 or IPv6.