]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/coremods/core_hostname_lookup.cpp
Initial support for listening on UNIX socket endpoints.
[user/henk/code/inspircd.git] / src / coremods / core_hostname_lookup.cpp
index b9adc9c2e7433df71b9629a18880ba5fa3feb6fa..ec93732b124c732b7569f36454f6fdde55b3b762 100644 (file)
@@ -56,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,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);
@@ -109,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))
@@ -145,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
                                {
@@ -168,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)
@@ -195,7 +191,7 @@ class ModuleHostnameLookup : public Module
                ph = &ptrHosts;
        }
 
-       void OnUserInit(LocalUser *user)
+       void OnSetUserIP(LocalUser* user) CXX11_OVERRIDE
        {
                if (!DNS || !user->MyClass->resolvehostnames)
                {
@@ -203,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);
@@ -222,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);
        }