X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fdnsqueue.cpp;h=fb0e0bd75999900c96170afed78f019b5253c63f;hb=c4458ecc70025aeac7ca87115ed0a698e7bbcdad;hp=3b6bd2103d5a016d4cb5d9e11aa53da6da079bde;hpb=4ffd644a14fa40b758f8937b06844861009bfec1;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/dnsqueue.cpp b/src/dnsqueue.cpp index 3b6bd2103..fb0e0bd75 100644 --- a/src/dnsqueue.cpp +++ b/src/dnsqueue.cpp @@ -2,7 +2,7 @@ * | Inspire Internet Relay Chat Daemon | * +------------------------------------+ * - * Inspire is copyright (C) 2002-2004 ChatSpike-Dev. + * InspIRCd is copyright (C) 2002-2006 ChatSpike-Dev. * E-mail: * * @@ -14,66 +14,53 @@ * --------------------------------------------------- */ -using namespace std; - #include "inspircd_config.h" #include "inspircd.h" -#include "inspircd_io.h" +#include "configreader.h" #include #include #include #include -#include -#include #include -#ifdef GCC3 -#include -#else -#include -#endif -#include -#include -#include -#include #include "users.h" #include "globals.h" #include "inspstring.h" #include "dnsqueue.h" -#include -#include -#include -#include -#include -#include #include "dns.h" #include "helperfuncs.h" #include "hashcomp.h" #include "socketengine.h" +#include "socket.h" -extern SocketEngine* SE; extern ServerConfig* Config; +extern InspIRCd* ServerInstance; class Lookup; -Lookup* dnslist[65535]; +Lookup* dnslist[MAX_DESCRIPTORS]; +Lookup* user_fd_to_dns[MAX_DESCRIPTORS]; +extern userrec* fd_ref_table[MAX_DESCRIPTORS]; //enum LookupState { reverse, forward }; class Lookup { private: - DNS resolver1; - DNS resolver2; char u[NICKMAX]; std::string hostname; public: + DNS resolver1; + DNS resolver2; + Lookup() { *u = 0; + hostname = ""; } void Reset() { *u = 0; + hostname = ""; } ~Lookup() @@ -87,16 +74,17 @@ public: if (usr) { resolver1.SetNS(std::string(Config->DNSServer)); - if (!resolver1.ReverseLookup(std::string(usr->host))) + if (!resolver1.ReverseLookup(std::string(usr->host), true)) { return false; } - strlcpy(u,nick.c_str(),NICKMAX); + strlcpy(u,nick.c_str(),NICKMAX-1); /* ASSOCIATE WITH DNS LOOKUP LIST */ if (resolver1.GetFD() != -1) { dnslist[resolver1.GetFD()] = this; + user_fd_to_dns[usr->fd] = this; return true; } } @@ -125,10 +113,18 @@ public: } if ((hostname != "") && (usr->registered != 7)) { - if (std::string(usr->ip) == ip) + if ((std::string(inet_ntoa(usr->ip4)) == ip) && (hostname.length() < 65)) { - strlcpy(usr->host,hostname.c_str(),MAXBUF); - strlcpy(usr->dhost,hostname.c_str(),MAXBUF); + if ((hostname.find_last_of(".in-addr.arpa") == hostname.length() - 1) && (hostname.find_last_of(".in-addr.arpa") != std::string::npos)) + { + WriteServ(usr->fd,"NOTICE Auth :*** Your ISP are muppets -- reverse resolution resolves back to same reverse .arpa domain (!)"); + } + else + { + strlcpy(usr->host,hostname.c_str(),64); + strlcpy(usr->dhost,hostname.c_str(),64); + WriteServ(usr->fd,"NOTICE Auth :*** Found your hostname"); + } } usr->dns_done = true; return true; @@ -157,7 +153,10 @@ public: if ((usr) && (usr->dns_done)) { if (resolver1.GetFD() != -1) + { dnslist[resolver1.GetFD()] = NULL; + user_fd_to_dns[usr->fd] = NULL; + } return true; } if (resolver1.GetFD() != -1) @@ -166,17 +165,23 @@ public: hostname = resolver1.GetResult(); if (usr) { + user_fd_to_dns[usr->fd] = NULL; if ((usr->registered > 3) || (hostname == "")) { + WriteServ(usr->fd,"NOTICE Auth :*** Could not resolve your hostname -- Using your IP address instead"); usr->dns_done = true; return true; } - } - if (hostname != "") - { - resolver2.ForwardLookup(hostname); - if (resolver2.GetFD() != -1) - dnslist[resolver2.GetFD()] = this; + if (hostname != "") + { + resolver2.ForwardLookup(hostname, true); + if (resolver2.GetFD() != -1) + { + dnslist[resolver2.GetFD()] = this; + if (usr) + user_fd_to_dns[usr->fd] = this; + } + } } } } @@ -195,12 +200,23 @@ public: } }; -bool lookup_dns(std::string nick) +bool lookup_dns(const std::string &nick) { /* First attempt to find the nickname */ userrec* u = Find(nick); if (u) { + /* Check the cache */ + /*address_cache::iterator address = addrcache.find(u->ip4); + if (address != addrcache.end()) + { + WriteServ(u->fd,"NOTICE Auth :*** Found your hostname (cached)"); + log(DEBUG,"Found cached host"); + strlcpy(u->host,address->second->c_str(),MAXBUF); + strlcpy(u->dhost,address->second->c_str(),MAXBUF); + u->dns_done = true; + return true; + }*/ /* If the user exists, create a new * lookup object, and associate it * with the user. The lookup object @@ -222,10 +238,47 @@ bool lookup_dns(std::string nick) return false; } +void ZapThisDns(int fd) +{ +#ifdef THREADED_DNS +/* if (fd_ref_table[fd]) + { + if (fd_ref_table[fd]->registered >= 3) + { + log(DEBUG,"Joining thread for user %d",fd); + if (pthread_join(fd_ref_table[fd]->dnsthread, NULL)) + { + log(DEBUG,"Can't pthread_join(): %s", strerror(errno)); + } + } + }*/ +#else + if ((fd < 0) || (fd > MAX_DESCRIPTORS)) + return; + + Lookup *x = user_fd_to_dns[fd]; + + if (x) + { + if (x->resolver1.GetFD() > 0) + { + log(DEBUG,"Whacked resolver1"); + dns_close(x->resolver1.GetFD()); + } + + if (x->resolver2.GetFD() > 0) + { + log(DEBUG,"Whacked resolver2"); + dns_close(x->resolver2.GetFD()); + } + } +#endif +} + void dns_poll(int fdcheck) { /* Check the given file descriptor is in valid range */ - if ((fdcheck < 0) || (fdcheck > 65535)) + if ((fdcheck < 0) || (fdcheck > MAX_DESCRIPTORS)) return; /* Try and find the file descriptor in our list of @@ -244,7 +297,7 @@ void dns_poll(int fdcheck) * from the socket engine, as dns.cpp tracks it * for us if we are in single-threaded country. */ - delete x; + DELETE(x); } } else @@ -252,7 +305,7 @@ void dns_poll(int fdcheck) /* its fd is dodgy, the dns code probably * bashed it due to error. Free the class. */ - delete x; + DELETE(x); } /* If we got down here, the dns lookup was valid, BUT, * its still in progress. Be patient, and wait for @@ -264,6 +317,6 @@ void dns_poll(int fdcheck) * just to be safe so we dont get any more events * about it. */ - SE->DelFd(fdcheck); + if (ServerInstance && ServerInstance->SE) + ServerInstance->SE->DelFd(fdcheck); } -