From d555db40f4b39f10ad06c2449b42711c1e74105f Mon Sep 17 00:00:00 2001 From: aquanight Date: Sat, 2 Feb 2008 22:14:24 +0000 Subject: Make m_password_hash able to pick up hasher modules after it's loaded, meaning m_md5 and m_sha256 no longer have to be loaded before it. git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@8793 e03df62e-2008-0410-955e-edbf42e46eb7 --- src/modules.cpp | 13 +++++++++++++ src/modules/m_password_hash.cpp | 37 +++++++++++++++++++++---------------- 2 files changed, 34 insertions(+), 16 deletions(-) (limited to 'src') diff --git a/src/modules.cpp b/src/modules.cpp index 25a53fefe..6cc1a3450 100644 --- a/src/modules.cpp +++ b/src/modules.cpp @@ -641,6 +641,19 @@ modulelist* ModuleManager::FindInterface(const std::string &InterfaceName) return &(iter->second.second); } +bool ModuleManager::ModuleHasInterface(Module* mod, const std::string& InterfaceName) +{ + interfacelist::iterator iter = Interfaces.find(InterfaceName); + if (iter == Interfaces.end()) + return false; + else + { + modulelist& ml = iter->second.second; + modulelist::iterator mi = std::find(ml.begin(), ml.end(), mod); + return (mi != ml.end()); + } +} + void ModuleManager::UseInterface(const std::string &InterfaceName) { interfacelist::iterator iter = Interfaces.find(InterfaceName); diff --git a/src/modules/m_password_hash.cpp b/src/modules/m_password_hash.cpp index 476202616..baf73e113 100644 --- a/src/modules/m_password_hash.cpp +++ b/src/modules/m_password_hash.cpp @@ -67,18 +67,19 @@ 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 +99,37 @@ class ModuleOperHash : public Module hashers[name.c_str()] = *m; names.push_back(name); } - } - 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."); + /* 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; } - 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->Log(DEBUG, "Post-load registering hasher: %s", name.c_str()); + std::string name = HashNameRequest(this, mod).Send(); + hashers[name.c_str()] = mod; + names.push_back(name); + 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) -- cgit v1.2.3