X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fuser_resolver.cpp;h=0213a3cbf7743d04658d0ecebb455fffe5ff8709;hb=6cfd6ad816d597a88abcbe6c6dc9d3e507aa539c;hp=b5f03ca097ede4743ea00a083fb8fb3be135501d;hpb=1ee5092d7528488b2e2160a57c5dcd433ac48d4d;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/user_resolver.cpp b/src/user_resolver.cpp index b5f03ca09..0213a3cbf 100644 --- a/src/user_resolver.cpp +++ b/src/user_resolver.cpp @@ -2,8 +2,8 @@ * | Inspire Internet Relay Chat Daemon | * +------------------------------------+ * - * InspIRCd: (C) 2002-2008 InspIRCd Development Team - * See: http://www.inspircd.org/wiki/index.php/Credits + * InspIRCd: (C) 2002-2009 InspIRCd Development Team + * See: http://wiki.inspircd.org/Credits * * This program is free but copyrighted software; see * the file COPYING for details. @@ -14,7 +14,6 @@ /* $Core */ #include "inspircd.h" - UserResolver::UserResolver(InspIRCd* Instance, User* user, std::string to_resolve, QueryType qt, bool &cache) : Resolver(Instance, to_resolve, qt, cache), bound_user(user) { @@ -22,11 +21,9 @@ UserResolver::UserResolver(InspIRCd* Instance, User* user, std::string to_resolv this->bound_fd = user->GetFd(); } -void UserResolver::OnLookupComplete(const std::string &result, unsigned int ttl, bool cached, int resultnum) +void UserResolver::OnLookupComplete(const std::string &result, unsigned int ttl, bool cached) { - /* We are only interested in the first matching result */ - if (resultnum) - return; + UserResolver *res_forward; // for forward-resolution if ((!this->fwd) && (ServerInstance->SE->GetRef(this->bound_fd) == this->bound_user)) { @@ -42,14 +39,16 @@ void UserResolver::OnLookupComplete(const std::string &result, unsigned int ttl, { /* IPV6 forward lookup (with possibility of 4in6) */ const char* ip = this->bound_user->GetIPString(); - bound_user->res_forward = new UserResolver(this->ServerInstance, this->bound_user, result, (!strncmp(ip, "0::ffff:", 8) ? DNS_QUERY_A : DNS_QUERY_AAAA), lcached); + res_forward = new UserResolver(this->ServerInstance, this->bound_user, result, (!strncmp(ip, "0::ffff:", 8) ? DNS_QUERY_A : DNS_QUERY_AAAA), lcached); } else /* IPV4 lookup (mixed protocol mode) */ #endif - /* IPV4 lookup (ipv4 only mode) */ - bound_user->res_forward = new UserResolver(this->ServerInstance, this->bound_user, result, DNS_QUERY_A, lcached); - this->ServerInstance->AddResolver(bound_user->res_forward, lcached); + { + /* IPV4 lookup (ipv4 only mode) */ + res_forward = new UserResolver(this->ServerInstance, this->bound_user, result, DNS_QUERY_A, lcached); + } + this->ServerInstance->AddResolver(res_forward, lcached); } } catch (CoreException& e) @@ -60,9 +59,31 @@ void UserResolver::OnLookupComplete(const std::string &result, unsigned int ttl, else if ((this->fwd) && (ServerInstance->SE->GetRef(this->bound_fd) == this->bound_user)) { /* Both lookups completed */ - std::string result2("0::ffff:"); - result2.append(result); - if (this->bound_user->GetIPString() == result || this->bound_user->GetIPString() == result2) + + sockaddr* user_ip = this->bound_user->ip; + bool rev_match = false; +#ifdef IPV6 + if (user_ip->sa_family == AF_INET6) + { + struct in6_addr res_bin; + if (inet_pton(AF_INET6, result.c_str(), &res_bin)) + { + sockaddr_in6* user_ip6 = reinterpret_cast(user_ip); + rev_match = !memcmp(&user_ip6->sin6_addr, &res_bin, sizeof(res_bin)); + } + } + else +#endif + { + struct in_addr res_bin; + if (inet_pton(AF_INET, result.c_str(), &res_bin)) + { + sockaddr_in* user_ip4 = reinterpret_cast(user_ip); + rev_match = !memcmp(&user_ip4->sin_addr, &res_bin, sizeof(res_bin)); + } + } + + if (rev_match) { std::string hostname = this->bound_user->stored_host; if (hostname.length() < 65) @@ -99,6 +120,9 @@ void UserResolver::OnLookupComplete(const std::string &result, unsigned int ttl, this->bound_user->dns_done = true; } } + + // Save some memory by freeing this up; it's never used again in the user's lifetime. + this->bound_user->stored_host.resize(0); } } @@ -108,8 +132,7 @@ void UserResolver::OnError(ResolverError e, const std::string &errormessage) { this->bound_user->WriteServ("NOTICE Auth :*** Could not resolve your hostname: %s; using your IP address (%s) instead.", errormessage.c_str(), this->bound_user->GetIPString()); this->bound_user->dns_done = true; + this->bound_user->stored_host.resize(0); ServerInstance->stats->statsDnsBad++; } } - -