bool done; /* True if lookup is finished */
std::string result; /* Holds the ident string if done */
public:
+ time_t age;
IdentRequestSocket(InspIRCd *Server, User* u) : user(u), ServerInstance(Server), result(u->ident)
{
+ age = ServerInstance->Time();
socklen_t size = 0;
SetFd(socket(user->server_sa.sa.sa_family, SOCK_STREAM, 0));
class ModuleIdent : public Module
{
- private:
int RequestTimeout;
ConfigReader *Conf;
+ SimpleExtItem<IdentRequestSocket> ext;
public:
- ModuleIdent(InspIRCd *Me) : Module(Me)
+ ModuleIdent(InspIRCd *Me) : Module(Me), ext("ident_socket", this)
{
Conf = new ConfigReader(ServerInstance);
OnRehash(NULL);
RequestTimeout = 5;
}
- virtual int OnUserRegister(User *user)
+ virtual ModResult OnUserRegister(User *user)
{
for (int j = 0; j < Conf->Enumerate("connect"); j++)
{
bool useident = Conf->ReadFlag("connect", "useident", "yes", j);
if (!useident)
- return 0;
+ return MOD_RES_PASSTHRU;
}
}
try
{
IdentRequestSocket *isock = new IdentRequestSocket(ServerInstance, user);
- user->Extend("ident_socket", isock);
+ ext.set(user, isock);
}
catch (ModuleException &e)
{
ServerInstance->Logs->Log("m_ident",DEBUG,"Ident exception: %s", e.GetReason());
}
- return 0;
+ return MOD_RES_PASSTHRU;
}
/* This triggers pretty regularly, we can use it in preference to
* creating a Timer object and especially better than creating a
* Timer per ident lookup!
*/
- virtual bool OnCheckReady(User *user)
+ virtual ModResult OnCheckReady(User *user)
{
/* Does user have an ident socket attached at all? */
- IdentRequestSocket *isock = NULL;
- if (!user->GetExt("ident_socket", isock))
+ IdentRequestSocket *isock = ext.get(user);
+ if (!isock)
{
ServerInstance->Logs->Log("m_ident",DEBUG, "No ident socket :(");
- return true;
+ return MOD_RES_PASSTHRU;
}
ServerInstance->Logs->Log("m_ident",DEBUG, "Has ident_socket");
* we call this to clean up the user
*/
OnUserDisconnect(user);
- return true;
+ return MOD_RES_PASSTHRU;
}
/* Got a result yet? */
if (!isock->HasResult())
{
ServerInstance->Logs->Log("m_ident",DEBUG, "No result yet");
- return false;
+ return MOD_RES_DENY;
}
ServerInstance->Logs->Log("m_ident",DEBUG, "Yay, result!");
/* The user isnt actually disconnecting, we call this to clean up the user */
OnUserDisconnect(user);
- return true;
+ return MOD_RES_PASSTHRU;
}
virtual void OnCleanup(int target_type, void *item)
virtual void OnUserDisconnect(User *user)
{
/* User disconnect (generic socket detatch event) */
- IdentRequestSocket *isock = NULL;
- if (user->GetExt("ident_socket", isock))
+ IdentRequestSocket *isock = ext.get(user);
+ if (isock)
{
isock->Close();
- delete isock;
- user->Shrink("ident_socket");
+ ext.unset(user);
}
}
};