]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/coremods/core_hostname_lookup.cpp
Only assign NewServices once the duplicate check is done.
[user/henk/code/inspircd.git] / src / coremods / core_hostname_lookup.cpp
index 125fe07f080814e3255d349da1ed71364120f7f9..89c361555f4b8fc17cba0c0bc5c4327c7c1c7b5e 100644 (file)
@@ -1,7 +1,10 @@
 /*
  * InspIRCd -- Internet Relay Chat Daemon
  *
- *   Copyright (C) 2013-2016 Adam <Adam@anope.org>
+ *   Copyright (C) 2020 Matt Schatz <genius3000@g3k.solutions>
+ *   Copyright (C) 2013-2015 Attila Molnar <attilamolnar@hush.com>
+ *   Copyright (C) 2013, 2017-2019 Sadie Powell <sadie@witchery.services>
+ *   Copyright (C) 2013, 2016 Adam <Adam@anope.org>
  *
  * 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,16 +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
                        {
-                               bound_user->WriteNotice("*** Your hostname does not match up with your IP address. Sorry, using your IP address (" + bound_user->GetIPString() + ") instead.");
+                               HandleError(bound_user, "Your hostname does not match up with your IP address");
                        }
                }
        }
@@ -142,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));
        }
 };