* | Inspire Internet Relay Chat Daemon |
* +------------------------------------+
*
- * Inspire is copyright (C) 2002-2004 ChatSpike-Dev.
+ * InspIRCd is copyright (C) 2002-2006 ChatSpike-Dev.
* E-mail:
* <brain@chatspike.net>
* <Craig@chatspike.net>
* ---------------------------------------------------
*/
+using namespace std;
+
// Hostname cloaking (+x mode) module for inspircd.
// version 1.0.0.1 by brain (C. J. Edwards) Mar 2004.
//
// the server->server link, and all encoding of hosts is
// done locally on the server by this module.
-#include <stdio.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
#include "users.h"
#include "channels.h"
#include "modules.h"
{
private:
- Server *Srv;
+ Server *Srv;
+ std::string prefix;
+ int key1;
+ int key2;
+ int key3;
+ int key4;
void byteSwap(word32 *buf, unsigned words)
{
byte *p = (byte *)buf;
- do {
+ do
+ {
*buf++ = (word32)((unsigned)p[3] << 8 | p[2]) << 16 |
((unsigned)p[1] << 8 | p[0]);
p += 4;
void xMD5Init(struct xMD5Context *ctx)
{
- ctx->buf[0] = 0x67452301;
- ctx->buf[1] = 0xefcdab89;
- ctx->buf[2] = 0x98badcfe;
- ctx->buf[3] = 0x10325476;
+ ctx->buf[0] = key1;
+ ctx->buf[1] = key2;
+ ctx->buf[2] = key3;
+ ctx->buf[3] = key4;
ctx->bytes[0] = 0;
ctx->bytes[1] = 0;
ctx->bytes[1]++; /* Carry from low to high */
t = 64 - (t & 0x3f); /* Space available in ctx->in (at least 1) */
- if ((unsigned)t > (unsigned)len) {
+ if ((unsigned)t > (unsigned)len)
+ {
memcpy((byte *)ctx->in + 64 - (unsigned)t, buf, len);
return;
}
len -= (unsigned)t;
/* Process data in 64-byte chunks */
- while (len >= 64) {
+ while (len >= 64)
+ {
memcpy(ctx->in, buf, 64);
byteSwap(ctx->in, 16);
xMD5Transform(ctx->buf, ctx->in);
/* Bytes of padding needed to make 56 bytes (-8..55) */
count = 56 - 1 - count;
- if (count < 0) { /* Padding forces an extra block */
+ if (count < 0)
+ { /* Padding forces an extra block */
memset(p, 0, count+8);
byteSwap(ctx->in, 16);
xMD5Transform(ctx->buf, ctx->in);
int i = 0;
unsigned char bytes[16];
char hash[MAXBUF];
- strcpy(hash,"");
+ *hash = 0;
MyMD5((char*)bytes,src,strlen(src));
for (i = 0; i < 16; i++)
{
}
public:
- ModuleCloaking()
+ ModuleCloaking(Server* Me)
+ : Module::Module(Me)
{
- // We must create an instance of the Server class to work with
- Srv = new Server;
+ // We must take a copy of the Server class to work with
+ Srv = Me;
// we must create a new mode. Set the parameters so the
// mode doesn't require oper, and is a client usermode
// with no parameters (actually, you cant have params for a umode!)
- if (!Srv->AddExtendedMode('x',MT_CLIENT,false,0,0))
- {
- // we couldn't claim mode x... possibly anther module has it,
- // this might become likely to happen if there are a lot of 3rd
- // party modules around in the future -- any 3rd party modules
- // SHOULD implement a system of configurable mode letters (e.g.
- // from a config file)
- Srv->Log(DEFAULT,"*** m_cloaking: ERROR, failed to allocate user mode +x!");
- printf("Could not claim usermode +x for this module!");
- return;
- }
+ Srv->AddExtendedMode('x',MT_CLIENT,false,0,0);
+
+ OnRehash("");
}
virtual ~ModuleCloaking()
{
- // not really neccessary, but free it anyway
- delete Srv;
}
virtual Version GetVersion()
// listed in /MODULES
return Version(1,0,0,1,VF_STATIC|VF_VENDOR);
}
+
+ virtual void OnRehash(std::string parameter)
+ {
+ ConfigReader* Conf = new ConfigReader();
+ key1 = key2 = key3 = key4 = 0;
+ key1 = Conf->ReadInteger("cloak","key1",0,false);
+ key2 = Conf->ReadInteger("cloak","key2",0,false);
+ key3 = Conf->ReadInteger("cloak","key3",0,false);
+ key4 = Conf->ReadInteger("cloak","key4",0,false);
+ prefix = Conf->ReadValue("cloak","prefix",0);
+ if (prefix == "")
+ {
+ prefix = Srv->GetNetworkName();
+ }
+ if (!key1 && !key2 && !key3 && !key4)
+ {
+ ModuleException ex("You have not defined cloak keys for m_cloaking!!! THIS IS INSECURE AND SHOULD BE CHECKED!");
+ throw (ex);
+ }
+
+ /*ctx->buf[0] = 0x67452301;
+ ctx->buf[1] = 0xefcdab89;
+ ctx->buf[2] = 0x98badcfe;
+ ctx->buf[3] = 0x10325476;*/
+ }
+
+ void Implements(char* List)
+ {
+ List[I_OnRehash] = List[I_OnExtendedMode] = List[I_OnUserConnect] = 1;
+ }
virtual int OnExtendedMode(userrec* user, void* target, char modechar, int type, bool mode_on, string_list ¶ms)
{
if (!inet_aton(dest->host,&testaddr))
{
// if they have a hostname, make something appropriate
- b = Srv->GetNetworkName() + "-" + std::string(ra) + a;
+ b = prefix + "-" + std::string(ra) + a;
}
else
{
// else, they have an ip
- b = std::string(ra) + "." + Srv->GetNetworkName() + ".cloak";
+ b = std::string(ra) + "." + prefix + ".cloak";
}
Srv->Log(DEBUG,"cloak: allocated "+b);
Srv->ChangeHost(dest,b);
{
}
- virtual Module * CreateModule()
+ virtual Module * CreateModule(Server* Me)
{
- return new ModuleCloaking;
+ return new ModuleCloaking(Me);
}
};