/*
* InspIRCd -- Internet Relay Chat Daemon
*
- * Copyright (C) 2013 Adam <Adam@anope.org>
+ * 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
* 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)
return;
}
- const DNS::ResourceRecord& ans_record = r->answers[0];
+ const DNS::ResourceRecord* ans_record = r->FindAnswerOfType(this->question.type);
+ if (ans_record == NULL)
+ {
+ OnError(r);
+ 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)
+ 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);
+ 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
{
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))
+ 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));
}
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));
}
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
{
/** 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)
ph = &ptrHosts;
}
- void OnUserInit(LocalUser *user)
+ void OnSetUserIP(LocalUser* user) CXX11_OVERRIDE
{
+ // 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)
- {
- user->WriteNotice("*** Skipping host resolution (disabled by server administrator)");
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)
+ return;
user->WriteNotice("*** Looking up your hostname...");
}
}
- 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);
}