summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authordanieldg <danieldg@e03df62e-2008-0410-955e-edbf42e46eb7>2010-03-02 06:08:37 +0000
committerdanieldg <danieldg@e03df62e-2008-0410-955e-edbf42e46eb7>2010-03-02 06:08:37 +0000
commita840ad3c174addc97e0ebecc3188006b42d34f35 (patch)
tree07b699a26201aa0238f65ba05bda8f80d9f11de1 /src
parent9b2cb52a12bf17d23417e689a1c07765d3bdaed5 (diff)
Fix m_ident deleting sockets that are still in use
git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@12586 e03df62e-2008-0410-955e-edbf42e46eb7
Diffstat (limited to 'src')
-rw-r--r--src/listensocket.cpp2
-rw-r--r--src/modules/m_ident.cpp58
-rw-r--r--src/usermanager.cpp4
3 files changed, 22 insertions, 42 deletions
diff --git a/src/listensocket.cpp b/src/listensocket.cpp
index d511d536e..0c6fd3b5c 100644
--- a/src/listensocket.cpp
+++ b/src/listensocket.cpp
@@ -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++;
diff --git a/src/modules/m_ident.cpp b/src/modules/m_ident.cpp
index 2d810dde2..314bd9b27 100644
--- a/src/modules/m_ident.cpp
+++ b/src/modules/m_ident.cpp
@@ -73,14 +73,13 @@
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;
}
diff --git a/src/usermanager.cpp b/src/usermanager.cpp
index 15066fd28..b8acf9da7 100644
--- a/src/usermanager.cpp
+++ b/src/usermanager.cpp
@@ -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