X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fmodules%2Fm_password_hash.cpp;h=e5c39229209a9fc04b45dd0c1c462bb9ebc8fa5c;hb=697098bb47651b40ed9c768361d1a3b1ca452856;hp=45f986be8fb59e7de3899d819749e03fdd6fc6b1;hpb=20bea3078d67a090ebcca64bf3cdbd7e6ab6adb6;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/modules/m_password_hash.cpp b/src/modules/m_password_hash.cpp index 45f986be8..e5c392292 100644 --- a/src/modules/m_password_hash.cpp +++ b/src/modules/m_password_hash.cpp @@ -28,9 +28,9 @@ class CommandMkpasswd : public Command std::deque &names; public: CommandMkpasswd (InspIRCd* Instance, Module* S, hashymodules &h, std::deque &n) - : Command(Instance,"MKPASSWD", 'o', 2), Sender(S), hashers(h), names(n) + : Command(Instance,"MKPASSWD", "o", 2), Sender(S), hashers(h), names(n) { - this->source = "m_oper_hash.so"; + this->source = "m_password_hash.so"; syntax = " "; } @@ -43,18 +43,23 @@ class CommandMkpasswd : public Command /* Yup, reset it first (Always ALWAYS do this) */ HashResetRequest(Sender, x->second).Send(); /* Now attempt to generate a hash */ - user->WriteServ("NOTICE %s :%s hashed password for %s is %s",user->nick, algo, stuff, HashSumRequest(Sender, x->second, stuff).Send() ); + user->WriteServ("NOTICE %s :%s hashed password for %s is %s",user->nick.c_str(), algo, stuff, HashSumRequest(Sender, x->second, stuff).Send() ); + } + else if (names.empty()) + { + /* same idea as bug #569 */ + user->WriteServ("NOTICE %s :No hash provider modules are loaded", user->nick.c_str()); } else { /* I dont do flying, bob. */ - user->WriteServ("NOTICE %s :Unknown hash type, valid hash types are: %s", user->nick, irc::stringjoiner(", ", names, 0, names.size() - 1).GetJoined().c_str() ); + user->WriteServ("NOTICE %s :Unknown hash type, valid hash types are: %s", user->nick.c_str(), irc::stringjoiner(", ", names, 0, names.size() - 1).GetJoined().c_str() ); } } - CmdResult Handle (const char** parameters, int pcnt, User *user) + CmdResult Handle (const std::vector& parameters, User *user) { - MakeHash(user, parameters[0], parameters[1]); + MakeHash(user, parameters[0].c_str(), parameters[1].c_str()); /* NOTE: Don't propagate this across the network! * We dont want plaintext passes going all over the place... * To make sure it goes nowhere, return CMD_FAILURE! @@ -65,20 +70,21 @@ class CommandMkpasswd : public Command class ModuleOperHash : public Module { - + CommandMkpasswd* mycommand; - ConfigReader* Conf; hashymodules hashers; /* List of modules which implement HashRequest */ std::deque names; /* Module names which implement HashRequest */ + bool diduseiface; /* If we've called UseInterface yet. */ public: ModuleOperHash(InspIRCd* Me) : Module(Me) { + diduseiface = false; /* Read the config file first */ - Conf = NULL; +// Conf = NULL; OnRehash(NULL,""); /* Find all modules which implement the interface 'HashRequest' */ @@ -98,33 +104,37 @@ class ModuleOperHash : public Module hashers[name.c_str()] = *m; names.push_back(name); } + /* UseInterface doesn't do anything if there are no providers, so we'll have to call it later if a module gets loaded later on. */ + ServerInstance->Modules->UseInterface("HashRequest"); + diduseiface = true; } - else - { - throw ModuleException("I can't find any modules loaded which implement the HashRequest interface! You probably forgot to load a hashing module such as m_md5.so or m_sha256.so."); - } - - ServerInstance->Modules->UseInterface("HashRequest"); mycommand = new CommandMkpasswd(ServerInstance, this, hashers, names); ServerInstance->AddCommand(mycommand); - Implementation eventlist[] = { I_OnRehash, I_OnPassCompare }; + Implementation eventlist[] = { I_OnPassCompare, I_OnLoadModule }; ServerInstance->Modules->Attach(eventlist, this, 2); } - + virtual ~ModuleOperHash() { - ServerInstance->Modules->DoneWithInterface("HashRequest"); + if (diduseiface) ServerInstance->Modules->DoneWithInterface("HashRequest"); } - virtual void OnRehash(User* user, const std::string ¶meter) + virtual void OnLoadModule(Module* mod, const std::string& name) { - /* Re-read configuration file */ - if (Conf) - delete Conf; - - Conf = new ConfigReader(ServerInstance); + if (ServerInstance->Modules->ModuleHasInterface(mod, "HashRequest")) + { + ServerInstance->Logs->Log("m_password-hash",DEBUG, "Post-load registering hasher: %s", name.c_str()); + std::string sname = HashNameRequest(this, mod).Send(); + hashers[sname.c_str()] = mod; + names.push_back(sname); + if (!diduseiface) + { + ServerInstance->Modules->UseInterface("HashRequest"); + diduseiface = true; + } + } } virtual int OnPassCompare(Extensible* ex, const std::string &data, const std::string &input, const std::string &hashtype) @@ -150,7 +160,7 @@ class ModuleOperHash : public Module virtual Version GetVersion() { - return Version(1,1,0,1,VF_VENDOR,API_VERSION); + return Version("$Id$",VF_VENDOR,API_VERSION); } };