X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fmodules%2Fm_ident.cpp;h=6790907e904a2d54044aebcdc552d29046a7cf22;hb=117742632909d9bfd71fc4feb3304263558101b7;hp=197a6e5e2486eea0876f8984ca041f7d9c260c4b;hpb=7d7250484c352c13830e63ae41ee8faae40a9bd5;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/modules/m_ident.cpp b/src/modules/m_ident.cpp index 197a6e5e2..6790907e9 100644 --- a/src/modules/m_ident.cpp +++ b/src/modules/m_ident.cpp @@ -2,7 +2,7 @@ * | Inspire Internet Relay Chat Daemon | * +------------------------------------+ * - * InspIRCd: (C) 2002-2008 InspIRCd Development Team + * InspIRCd: (C) 2002-2009 InspIRCd Development Team * See: http://www.inspircd.org/wiki/index.php/Credits * * This program is free but copyrighted software; see @@ -12,9 +12,6 @@ */ #include "inspircd.h" -#include "users.h" -#include "channels.h" -#include "modules.h" /* $ModDesc: Provides support for RFC1413 ident lookups */ @@ -40,7 +37,7 @@ * Using this framework we have a much more stable module. * * A few things to note: - * + * * O The only place that may *delete* an active or inactive * ident socket is OnUserDisconnect in the module class. * Because this is out of scope of the socket class there is @@ -49,7 +46,7 @@ * * O Closure of the ident socket with the Close() method will * not cause removal of the socket from memory or detatchment - * from its 'parent' User class. It will only flag it as an + * from its 'parent' User class. It will only flag it as an * inactive socket in the socket engine. * * O Timeouts are handled in OnCheckReaady at the same time as @@ -77,12 +74,10 @@ class IdentRequestSocket : public EventHandler { private: - - User *user; /* User we are attached to */ - InspIRCd* ServerInstance; /* Server instance */ - bool done; /* True if lookup is finished */ - std::string result; /* Holds the ident string if done */ - + User *user; /* User we are attached to */ + InspIRCd* ServerInstance; /* Server instance */ + bool done; /* True if lookup is finished */ + std::string result; /* Holds the ident string if done */ public: IdentRequestSocket(InspIRCd *Server, User* u, const std::string &bindip) : user(u), ServerInstance(Server), result(u->ident) @@ -103,10 +98,12 @@ class IdentRequestSocket : public EventHandler if (GetFd() == -1) throw ModuleException("Could not create socket"); + done = false; + /* We allocate two of these because sizeof(sockaddr_in6) > sizeof(sockaddr_in) */ sockaddr* s = new sockaddr[2]; sockaddr* addr = new sockaddr[2]; - + #ifdef IPV6 /* Horrid icky nasty ugly berkely socket crap. */ if (v6) @@ -208,7 +205,7 @@ class IdentRequestSocket : public EventHandler #else int req_size = snprintf(req, sizeof(req), "%d,%d\r\n", ntohs(raddr.sin6_port), ntohs(laddr.sin6_port)); #endif - + /* Send failed if we didnt write the whole ident request -- * might as well give up if this happens! */ @@ -337,32 +334,51 @@ class ModuleIdent : public Module { private: int RequestTimeout; + ConfigReader *Conf; public: - ModuleIdent(InspIRCd *Me) - : Module(Me) + ModuleIdent(InspIRCd *Me) : Module(Me) { + Conf = new ConfigReader(ServerInstance); OnRehash(NULL, ""); Implementation eventlist[] = { I_OnRehash, I_OnUserRegister, I_OnCheckReady, I_OnCleanup, I_OnUserDisconnect }; ServerInstance->Modules->Attach(eventlist, this, 5); } - + + ~ModuleIdent() + { + delete Conf; + } + virtual Version GetVersion() { - return Version(1, 2, 1, 0, VF_VENDOR, API_VERSION); + return Version("$Id$", VF_VENDOR, API_VERSION); } - - + virtual void OnRehash(User *user, const std::string ¶m) { - ConfigReader MyConf(ServerInstance); - - RequestTimeout = MyConf.ReadInteger("ident", "timeout", 0, true); + delete Conf; + Conf = new ConfigReader(ServerInstance); + + RequestTimeout = Conf->ReadInteger("ident", "timeout", 0, true); if (!RequestTimeout) RequestTimeout = 5; } - + virtual int OnUserRegister(User *user) { + for (int j = 0; j < Conf->Enumerate("connect"); j++) + { + std::string hostn = Conf->ReadValue("connect","allow",j); + /* XXX: Fixme: does not respect port, limit, etc */ + if ((InspIRCd::MatchCIDR(user->GetIPString(),hostn, ascii_case_insensitive_map)) || (InspIRCd::Match(user->host,hostn, ascii_case_insensitive_map))) + { + bool useident = Conf->ReadFlag("connect", "useident", j); + + if (!useident) + return 0; + } + } + /* User::ident is currently the username field from USER; with m_ident loaded, that * should be preceded by a ~. The field is actually IdentMax+2 characters wide. */ if (user->ident.length() > ServerInstance->Config->Limits.IdentMax + 1)