diff options
author | aquanight <aquanight@e03df62e-2008-0410-955e-edbf42e46eb7> | 2008-02-02 22:14:24 +0000 |
---|---|---|
committer | aquanight <aquanight@e03df62e-2008-0410-955e-edbf42e46eb7> | 2008-02-02 22:14:24 +0000 |
commit | d555db40f4b39f10ad06c2449b42711c1e74105f (patch) | |
tree | 36928004553bab7826b8053a349f1bde7265ceeb /src | |
parent | 942d25e282e5c0d3442a154d8db8869944ac58eb (diff) |
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
Diffstat (limited to 'src')
-rw-r--r-- | src/modules.cpp | 13 | ||||
-rw-r--r-- | src/modules/m_password_hash.cpp | 37 |
2 files changed, 34 insertions, 16 deletions
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<std::string> 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) |