X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fmodules%2Fm_ident.cpp;h=314bd9b2700efa1a8f1ea10d97515a0bef3d7664;hb=3cf993500544c2157992650da2487bfa89be405d;hp=95a0529c9b5db69c54a2637dc12fb18f1e565bcf;hpb=67a4a9b62355ea57a2f4521ca5fc53bd4eac3a1f;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/modules/m_ident.cpp b/src/modules/m_ident.cpp index 95a0529c9..314bd9b27 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-2009 InspIRCd Development Team + * InspIRCd: (C) 2002-2010 InspIRCd Development Team * See: http://wiki.inspircd.org/Credits * * This program is free but copyrighted software; see @@ -73,17 +73,15 @@ class IdentRequestSocket : public EventHandler { - private: - User *user; /* User we are attached to */ - bool done; /* True if lookup is finished */ - std::string result; /* Holds the ident string if done */ public: + LocalUser *user; /* User we are attached to */ + std::string result; /* Holds the ident string if done */ time_t age; + bool done; /* True if lookup is finished */ - IdentRequestSocket(User* u) : user(u), result(u->ident) + IdentRequestSocket(LocalUser* u) : user(u) { age = ServerInstance->Time(); - socklen_t size = 0; SetFd(socket(user->server_sa.sa.sa_family, SOCK_STREAM, 0)); @@ -110,7 +108,7 @@ class IdentRequestSocket : public EventHandler } /* Attempt to bind (ident requests must come from the ip the query is referring to */ - if (ServerInstance->SE->Bind(GetFd(), &bindaddr.sa, size) < 0) + if (ServerInstance->SE->Bind(GetFd(), bindaddr) < 0) { this->Close(); throw ModuleException("failed to bind()"); @@ -119,7 +117,7 @@ class IdentRequestSocket : public EventHandler ServerInstance->SE->NonBlocking(GetFd()); /* Attempt connection (nonblocking) */ - if (ServerInstance->SE->Connect(this, &connaddr.sa, size) == -1 && errno != EINPROGRESS) + if (ServerInstance->SE->Connect(this, &connaddr.sa, connaddr.sa_size()) == -1 && errno != EINPROGRESS) { this->Close(); throw ModuleException("connect() failed"); @@ -190,7 +188,6 @@ class IdentRequestSocket : public EventHandler ServerInstance->Logs->Log("m_ident",DEBUG,"Close ident socket %d", GetFd()); ServerInstance->SE->DelFd(this); ServerInstance->SE->Close(GetFd()); - ServerInstance->SE->Shutdown(GetFd(), SHUT_WR); this->SetFd(-1); } } @@ -200,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 @@ -281,8 +270,11 @@ class ModuleIdent : public Module ModuleIdent() : ext("ident_socket", this) { OnRehash(NULL); - Implementation eventlist[] = { I_OnRehash, I_OnUserRegister, I_OnCheckReady, I_OnUserDisconnect }; - ServerInstance->Modules->Attach(eventlist, this, 4); + Implementation eventlist[] = { + I_OnRehash, I_OnUserInit, I_OnCheckReady, + I_OnUserDisconnect, I_OnSetConnectClass + }; + ServerInstance->Modules->Attach(eventlist, this, 5); } ~ModuleIdent() @@ -303,38 +295,30 @@ class ModuleIdent : public Module RequestTimeout = 5; } - virtual ModResult OnUserRegister(User *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..."); try { - IdentRequestSocket *isock = new IdentRequestSocket(user); + IdentRequestSocket *isock = new IdentRequestSocket(IS_LOCAL(user)); ext.set(user, isock); } catch (ModuleException &e) { 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 * creating a Timer object and especially better than creating a * Timer per ident lookup! */ - virtual ModResult OnCheckReady(User *user) + virtual ModResult OnCheckReady(LocalUser *user) { /* Does user have an ident socket attached at all? */ IdentRequestSocket *isock = ext.get(user); @@ -355,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; } @@ -372,16 +350,26 @@ 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()); + { + user->ident = isock->result; + user->WriteServ("NOTICE Auth :*** Found your ident, '%s'", user->ident.c_str()); + } - /* Copy the ident string to the user */ - user->ChangeIdent(isock->GetResult()); + isock->Close(); + ext.unset(user); + return MOD_RES_PASSTHRU; + } - /* The user isnt actually disconnecting, we call this to clean up the user */ - OnUserDisconnect(user); + ModResult OnSetConnectClass(LocalUser* user, ConnectClass* myclass) + { + if (myclass->config->getBool("requireident") && user->ident[0] == '~') + return MOD_RES_DENY; return MOD_RES_PASSTHRU; } @@ -389,10 +377,10 @@ class ModuleIdent : public Module { /* Module unloading, tidy up users */ if (target_type == TYPE_USER) - OnUserDisconnect((User*)item); + OnUserDisconnect((LocalUser*)item); } - virtual void OnUserDisconnect(User *user) + virtual void OnUserDisconnect(LocalUser *user) { /* User disconnect (generic socket detatch event) */ IdentRequestSocket *isock = ext.get(user);