-UserResolver::UserResolver(InspIRCd* Instance, userrec* user, std::string to_resolve, QueryType qt) :
- Resolver(Instance, to_resolve, qt), bound_user(user)
-{
- this->fwd = (qt == DNS_QUERY_A || qt == DNS_QUERY_AAAA);
- this->bound_fd = user->GetFd();
-}
-
-void UserResolver::OnLookupComplete(const std::string &result)
-{
- if ((!this->fwd) && (ServerInstance->SE->GetRef(this->bound_fd) == this->bound_user))
- {
- ServerInstance->Log(DEBUG,"Commencing forward lookup");
- this->bound_user->stored_host = result;
- try
- {
- /* Check we didnt time out */
- if (this->bound_user->registered != REG_ALL)
- {
-#ifdef IPV6
- const char *ip = this->bound_user->GetIPString();
- bound_user->res_forward = new UserResolver(this->ServerInstance, this->bound_user, result, (strstr(ip,"0::ffff:") == ip ? DNS_QUERY_A : DNS_QUERY_AAAA));
-#else
- bound_user->res_forward = new UserResolver(this->ServerInstance, this->bound_user, result, DNS_QUERY_A);
-#endif
- this->ServerInstance->AddResolver(bound_user->res_forward);
- }
- }
- catch (ModuleException& e)
- {
- ServerInstance->Log(DEBUG,"Error in resolver: %s",e.GetReason());
- }
- }
- 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)
- {
- std::string hostname = this->bound_user->stored_host;
- if (hostname.length() < 65)
- {
- /* Check we didnt time out */
- if (this->bound_user->registered != REG_ALL)
- {
- /* Hostnames starting with : are not a good thing (tm) */
- if (*(hostname.c_str()) == ':')
- hostname = "0" + hostname;
-
- this->bound_user->WriteServ("NOTICE Auth :*** Found your hostname (%s)", hostname.c_str());
- this->bound_user->dns_done = true;
- strlcpy(this->bound_user->dhost, hostname.c_str(),64);
- strlcpy(this->bound_user->host, hostname.c_str(),64);
- }
- }
- else
- {
- this->bound_user->WriteServ("NOTICE Auth :*** Your hostname is longer than the maximum of 64 characters, using your IP address (%s) instead.", this->bound_user->GetIPString());
- }
- }