]> git.netwichtig.de Git - user/henk/code/inspircd.git/commitdiff
Fix m_ident deleting sockets that are still in use
authordanieldg <danieldg@e03df62e-2008-0410-955e-edbf42e46eb7>
Tue, 2 Mar 2010 06:08:37 +0000 (06:08 +0000)
committerdanieldg <danieldg@e03df62e-2008-0410-955e-edbf42e46eb7>
Tue, 2 Mar 2010 06:08:37 +0000 (06:08 +0000)
git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@12586 e03df62e-2008-0410-955e-edbf42e46eb7

src/listensocket.cpp
src/modules/m_ident.cpp
src/usermanager.cpp

index d511d536eb62df5a958cf9e25ae7d85eec8bc420..0c6fd3b5c451bd516bee9699da552c3d5f87a8f8 100644 (file)
@@ -67,7 +67,7 @@ void ListenSocket::AcceptInternal()
        socklen_t length = sizeof(client);
        int incomingSockfd = ServerInstance->SE->Accept(this, &client.sa, &length);
 
-       ServerInstance->Logs->Log("SOCKET",DEBUG,"HandleEvent for Listensoket %s nfd=%d", bind_desc.c_str(), incomingSockfd);
+       ServerInstance->Logs->Log("SOCKET",DEBUG,"HandleEvent for Listensocket %s nfd=%d", bind_desc.c_str(), incomingSockfd);
        if (incomingSockfd < 0)
        {
                ServerInstance->stats->statsRefused++;
index 2d810dde27d10fa9c200cb0786d9659d560a875c..314bd9b2700efa1a8f1ea10d97515a0bef3d7664 100644 (file)
 
 class IdentRequestSocket : public EventHandler
 {
- private:
+ public:
        LocalUser *user;                        /* User we are attached to */
-       bool done;                      /* True if lookup is finished */
        std::string result;             /* Holds the ident string if done */
- public:
        time_t age;
+       bool done;                      /* True if lookup is finished */
 
-       IdentRequestSocket(LocalUser* u) : user(u), result(u->ident)
+       IdentRequestSocket(LocalUser* u) : user(u)
        {
                age = ServerInstance->Time();
 
@@ -198,14 +197,6 @@ class IdentRequestSocket : public EventHandler
                return done;
        }
 
-       /* Note: if the lookup succeeded, will contain 'ident', otherwise
-        * will contain '~ident'. Use *GetResult() to determine lookup success.
-        */
-       const char* GetResult()
-       {
-               return result.c_str();
-       }
-
        void ReadResponse()
        {
                /* We don't really need to buffer for incomplete replies here, since IDENT replies are
@@ -280,7 +271,7 @@ class ModuleIdent : public Module
        {
                OnRehash(NULL);
                Implementation eventlist[] = {
-                       I_OnRehash, I_OnUserRegister, I_OnCheckReady,
+                       I_OnRehash, I_OnUserInit, I_OnCheckReady,
                        I_OnUserDisconnect, I_OnSetConnectClass
                };
                ServerInstance->Modules->Attach(eventlist, this, 5);
@@ -304,17 +295,11 @@ class ModuleIdent : public Module
                        RequestTimeout = 5;
        }
 
-       virtual ModResult OnUserRegister(LocalUser *user)
+       void OnUserInit(LocalUser *user)
        {
                ConfigTag* tag = user->MyClass->config;
                if (!tag->getBool("useident", true))
-                       return MOD_RES_PASSTHRU;
-
-               /* 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)
-                       user->ident.assign(user->ident, 0, ServerInstance->Config->Limits.IdentMax);
-               user->ident.insert(0, "~");
+                       return;
 
                user->WriteServ("NOTICE Auth :*** Looking up your ident...");
 
@@ -327,8 +312,6 @@ class ModuleIdent : public Module
                {
                        ServerInstance->Logs->Log("m_ident",DEBUG,"Ident exception: %s", e.GetReason());
                }
-
-               return MOD_RES_PASSTHRU;
        }
 
        /* This triggers pretty regularly, we can use it in preference to
@@ -356,16 +339,10 @@ class ModuleIdent : public Module
                        /* Ident timeout */
                        user->WriteServ("NOTICE Auth :*** Ident request timed out.");
                        ServerInstance->Logs->Log("m_ident",DEBUG, "Timeout");
-                       /* The user isnt actually disconnecting,
-                        * we call this to clean up the user
-                        */
-                       OnUserDisconnect(user);
-                       return MOD_RES_PASSTHRU;
                }
-
-               /* Got a result yet? */
-               if (!isock->HasResult())
+               else if (!isock->HasResult())
                {
+                       // time still good, no result yet... hold the registration
                        ServerInstance->Logs->Log("m_ident",DEBUG, "No result yet");
                        return MOD_RES_DENY;
                }
@@ -373,16 +350,19 @@ class ModuleIdent : public Module
                ServerInstance->Logs->Log("m_ident",DEBUG, "Yay, result!");
 
                /* wooo, got a result (it will be good, or bad) */
-               if (*(isock->GetResult()) != '~')
-                       user->WriteServ("NOTICE Auth :*** Found your ident, '%s'", isock->GetResult());
+               if (isock->result.empty())
+               {
+                       user->ident.insert(0, 1, '~');
+                       user->WriteServ("NOTICE Auth :*** Could not find your ident, using %s instead.", user->ident.c_str());
+               }
                else
-                       user->WriteServ("NOTICE Auth :*** Could not find your ident, using %s instead.", isock->GetResult());
-
-               /* Copy the ident string to the user */
-               user->ChangeIdent(isock->GetResult());
+               {
+                       user->ident = isock->result;
+                       user->WriteServ("NOTICE Auth :*** Found your ident, '%s'", user->ident.c_str());
+               }
 
-               /* The user isnt actually disconnecting, we call this to clean up the user */
-               OnUserDisconnect(user);
+               isock->Close();
+               ext.unset(user);
                return MOD_RES_PASSTHRU;
        }
 
index 15066fd2856d742d2b005458698b6801695789f1..b8acf9da73de665b5b628a4f464c11ab2a9bc1f0 100644 (file)
@@ -79,14 +79,14 @@ void UserManager::AddUser(int socket, ListenSocket* via, irc::sockets::sockaddrs
                return;
        }
 
-       FOREACH_MOD(I_OnUserInit,OnUserInit(New));
-
        /*
         * First class check. We do this again in FullConnect after DNS is done, and NICK/USER is recieved.
         * See my note down there for why this is required. DO NOT REMOVE. :) -- w00t
         */
        New->SetClass();
 
+       FOREACH_MOD(I_OnUserInit,OnUserInit(New));
+
        /*
         * Check connect class settings and initialise settings into User.
         * This will be done again after DNS resolution. -- w00t