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
This commit is contained in:
aquanight 2008-02-02 22:14:24 +00:00
parent 942d25e282
commit d555db40f4
4 changed files with 43 additions and 17 deletions

View File

@ -22,7 +22,7 @@ LAUNCHDPATH = $(DESTDIR)/System/Library/LaunchDaemons
LIBPATH = $(DESTDIR)@LIBRARY_DIR@
MODULES = @MODULES@
INSTMODE = 0755
MAKEARGS = 'PROGS=${PROGS}' 'FLAGS=${FLAGS}' 'CC=${CC}' 'LDLIBS=${LDLIBS}' 'MODULES=${MODULES}' 'MODPATH=${MODPATH}' 'LIBPATH=${LIBPATH}' 'INSTMODE=${INSTMODE}'
MAKEARGS = 'PROGS=${PROGS}' 'FLAGS=${FLAGS}' 'NICEFLAGS=${NICEFLAGS}' 'CC=${CC}' 'LDLIBS=${LDLIBS}' 'MODULES=${MODULES}' 'MODPATH=${MODPATH}' 'LIBPATH=${LIBPATH}' 'INSTMODE=${INSTMODE}'
all: @MAKEORDER@ finishmessage

View File

@ -1824,6 +1824,14 @@ class CoreExport ModuleManager : public classbase
*/
modulelist* FindInterface(const std::string &InterfaceName);
/** Determine if a module has published the named interface.
* This could be used in, for example, OnLoadModule to pick up other modules that can be used.
* @param mod The module to check.
* @param InterfaceName the interface you want to check for
* @return True if the module provides the interface, false otherwise.
*/
bool ModuleHasInterface(Module* mod, const std::string& InterfaceName);
/** Given a pointer to a Module, return its filename
* @param m The module pointer to identify
* @return The module name or an empty string

View File

@ -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);

View File

@ -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);
}
/* 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 &parameter)
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)