1 /* +------------------------------------+
2 * | Inspire Internet Relay Chat Daemon |
3 * +------------------------------------+
5 * InspIRCd is copyright (C) 2002-2006 ChatSpike-Dev.
7 * <brain@chatspike.net>
8 * <Craig@chatspike.net>
10 * Written by Craig Edwards, Craig McLure, and others.
11 * This program is free but copyrighted software; see
12 * the file COPYING for details.
14 * ---------------------------------------------------
17 /* $ModDesc: Allows for hashed oper passwords */
18 /* $ModDep: m_md5.h m_sha256.h */
22 #include "inspircd_config.h"
39 class cmd_mkpasswd : public command_t
46 cmd_mkpasswd (InspIRCd* Instance, Module* Sender, Module* MD5Hasher, Module* SHAHasher, int P)
47 : command_t(Instance,"MKPASSWD", 'o', 2), MD5Provider(MD5Hasher), SHAProvider(SHAHasher), Prov(P)
49 this->source = "m_oper_hash.so";
50 syntax = "<hashtype> <any-text>";
53 CmdResult Handle (const char** parameters, int pcnt, userrec *user)
55 if (!strcasecmp(parameters[0], "md5"))
57 if ((Prov & PROV_MD5) > 0)
59 MD5ResetRequest(Sender, MD5Provider).Send();
60 user->WriteServ("NOTICE %s :MD5 hashed password for %s is %s",user->nick, parameters[1], MD5SumRequest(Sender, MD5Provider, parameters[1]).Send() );
64 user->WriteServ("NOTICE %s :MD5 hashing is not available (m_md5.so not loaded)");
67 else if (!strcasecmp(parameters[0], "sha256"))
69 if ((Prov & PROV_SHA) > 0)
71 SHA256ResetRequest(Sender, SHAProvider).Send();
72 user->WriteServ("NOTICE %s :SHA256 hashed password for %s is %s",user->nick, parameters[1], SHA256SumRequest(Sender, SHAProvider, parameters[1]).Send() );
76 user->WriteServ("NOTICE %s :SHA256 hashing is not available (m_sha256.so not loaded)");
81 user->WriteServ("NOTICE %s :Unknown hash type, valid hash types are:%s%s", (Prov & PROV_MD5) > 0 ? " MD5" : "", (Prov & PROV_SHA) > 0 ? " SHA256" : "");
84 /* NOTE: Don't propogate this across the network!
85 * We dont want plaintext passes going all over the place...
86 * To make sure it goes nowhere, return CMD_FAILURE!
92 class ModuleOperHash : public Module
95 cmd_mkpasswd* mycommand;
98 std::string providername;
104 ModuleOperHash(InspIRCd* Me)
110 /* Try to find the md5 service provider, bail if it can't be found */
111 MD5Provider = ServerInstance->FindModule("m_md5.so");
115 SHAProvider = ServerInstance->FindModule("m_sha256.so");
119 mycommand = new cmd_mkpasswd(ServerInstance, this, MD5Provider, SHAProvider, ID);
120 ServerInstance->AddCommand(mycommand);
123 virtual ~ModuleOperHash()
127 void Implements(char* List)
129 List[I_OnRehash] = List[I_OnOperCompare] = 1;
132 virtual void OnRehash(const std::string ¶meter)
137 Conf = new ConfigReader(ServerInstance);
140 virtual int OnOperCompare(const std::string &data, const std::string &input, int tagnumber)
142 std::string hashtype = Conf->ReadValue("oper", "hash", tagnumber);
143 if ((hashtype == "sha256") && (data.length() == SHA256_BLOCK_SIZE) && ((ID & PROV_SHA) > 0))
145 SHA256ResetRequest(this, SHAProvider).Send();
146 if (!strcasecmp(data.c_str(), SHA256SumRequest(this, SHAProvider, input.c_str()).Send()))
150 else if ((hashtype == "md5") && (data.length() == 32) && ((ID & PROV_MD5) > 0))
152 MD5ResetRequest(this, MD5Provider).Send();
153 if (!strcasecmp(data.c_str(), MD5SumRequest(this, MD5Provider, input.c_str()).Send()))
160 virtual Version GetVersion()
162 return Version(1,1,0,1,VF_VENDOR,API_VERSION);
167 class ModuleOperHashFactory : public ModuleFactory
170 ModuleOperHashFactory()
174 ~ModuleOperHashFactory()
178 virtual Module * CreateModule(InspIRCd* Me)
180 return new ModuleOperHash(Me);
186 extern "C" void * init_module( void )
188 return new ModuleOperHashFactory;