mirror of
https://github.com/unrealircd/unrealircd.git
synced 2026-06-29 20:06:37 +02:00
d6fd665ede
- Normal users can now get a list, versioninfo will be hidden however. - Opers get some additional details like hooks and commandoverride's. - Opers can use /module <servername> to get a remote list of loaded modules. - Added flag [3RD] to show it's a 3rd party module This was requested by by quite some people because serveradmins started to load "spy modules" without clearly mentioning it in the MOTD (which is highly unethical and in some countries even illegal due to privacy law). Also the remote module list was requested by quite a few opers. Sure, this isn't a 100% guarantee but at least if someone goes hiding stuff then it's clear what their intentions are (and thus will be refused support, ..). - Changed emailaddr in help window at windows to unreal-users mailinglist. - Made the cloak mismatch msg during linking a bit more scary. - Added comment to 'Install as a service' option in installer to help n00bs a bit.
204 lines
4.8 KiB
C
204 lines
4.8 KiB
C
/*
|
|
* Test for modulized channelmode system, adds 2 modes:
|
|
* +w (paramless)
|
|
* +y <0-100> (1 parameter)
|
|
*
|
|
* It's incomplete (like error signaling) but for testing purposes only.
|
|
*
|
|
* Again, this is not an "official module", rather a test module.
|
|
*/
|
|
|
|
#include "config.h"
|
|
#include "struct.h"
|
|
#include "common.h"
|
|
#include "sys.h"
|
|
#include "numeric.h"
|
|
#include "msg.h"
|
|
#include "proto.h"
|
|
#include "channel.h"
|
|
#include <time.h>
|
|
#include <sys/stat.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#ifdef _WIN32
|
|
#include <io.h>
|
|
#endif
|
|
#include <fcntl.h>
|
|
#include "h.h"
|
|
#ifdef STRIPBADWORDS
|
|
#include "badwords.h"
|
|
#endif
|
|
#ifdef _WIN32
|
|
#include "version.h"
|
|
#endif
|
|
|
|
|
|
ModuleHeader MOD_HEADER(m_chmodetst)
|
|
= {
|
|
"chmodetst", /* Name of module */
|
|
"channelmode test", /* Version */
|
|
"channelmode +w", /* Short description of module */
|
|
"3.2-b8-1",
|
|
NULL,
|
|
};
|
|
|
|
Cmode_t EXTCMODE_TEST = 0L; /* Just for testing */
|
|
Cmode_t EXTCMODE_TEST2 = 0L; /* Just for testing */
|
|
|
|
int modey_is_ok(aClient *sptr, aChannel *chptr, char *para, int checkt, int what);
|
|
CmodeParam * modey_put_param(CmodeParam *lst, char *para);
|
|
char *modey_get_param(CmodeParam *lst);
|
|
char *modey_conv_param(char *param);
|
|
void modey_free_param(CmodeParam *lst);
|
|
CmodeParam *modey_dup_struct(CmodeParam *src);
|
|
int modey_sjoin_check(aChannel *chptr, CmodeParam *ourx, CmodeParam *theirx);
|
|
CmodeParam *modey_dup_struct(CmodeParam *src);
|
|
|
|
typedef struct {
|
|
EXTCM_PAR_HEADER
|
|
short val;
|
|
} aModewentry;
|
|
|
|
/* The purpose of these ifdefs, are that we can "static" link the ircd if we
|
|
* want to
|
|
*/
|
|
|
|
Cmode *ModeTest = NULL, *ModeTest2 = NULL;
|
|
/* This is called on module init, before Server Ready */
|
|
DLLFUNC int MOD_INIT(m_dummy)(ModuleInfo *modinfo)
|
|
{
|
|
CmodeInfo req;
|
|
ircd_log(LOG_ERROR, "debug: mod_init called from chmodetst module");
|
|
ModuleSetOptions(modinfo->handle, MOD_OPT_PERM);
|
|
sendto_realops("chmodetst loading...");
|
|
/* TODO: load mode here */
|
|
/* +w doesn't do anything, it's just for testing */
|
|
memset(&req, 0, sizeof(req));
|
|
req.paracount = 0;
|
|
req.is_ok = extcmode_default_requirechop;
|
|
req.flag = 'w';
|
|
ModeTest = CmodeAdd(modinfo->handle, req, &EXTCMODE_TEST);
|
|
/* +y doesn't do anything except that you can set/unset it with a
|
|
* numeric parameter (1-100)
|
|
*/
|
|
memset(&req, 0, sizeof(req));
|
|
req.paracount = 1;
|
|
req.is_ok = modey_is_ok;
|
|
req.put_param = modey_put_param;
|
|
req.get_param = modey_get_param;
|
|
req.conv_param = modey_conv_param;
|
|
req.free_param = modey_free_param;
|
|
req.sjoin_check = modey_sjoin_check;
|
|
req.dup_struct = modey_dup_struct;
|
|
req.flag = 'y';
|
|
ModeTest2 = CmodeAdd(modinfo->handle, req, &EXTCMODE_TEST2);
|
|
return MOD_SUCCESS;
|
|
}
|
|
|
|
/* Is first run when server is 100% ready */
|
|
DLLFUNC int MOD_LOAD(m_dummy)(int module_load)
|
|
{
|
|
return MOD_SUCCESS;
|
|
}
|
|
|
|
|
|
/* Called when module is unloaded */
|
|
DLLFUNC int MOD_UNLOAD(m_dummy)(int module_unload)
|
|
{
|
|
/* Aaaaaaaargh... we are assumed to be a permanent module */
|
|
sendto_realops("Mod_Unload was called??? Arghhhhhh..");
|
|
return MOD_FAILED;
|
|
}
|
|
|
|
int modey_is_ok(aClient *sptr, aChannel *chptr, char *para, int checkt, int what)
|
|
{
|
|
short t;
|
|
|
|
if ((checkt == EXCHK_ACCESS) || (checkt == EXCHK_ACCESS_ERR))
|
|
{
|
|
if (!is_chan_op(sptr, chptr))
|
|
{
|
|
if (checkt == EXCHK_ACCESS_ERR)
|
|
sendto_one(sptr, err_str(ERR_CHANOPRIVSNEEDED), me.name, sptr->name, chptr->chname);
|
|
return 0;
|
|
} else {
|
|
return 1;
|
|
}
|
|
} else
|
|
if (checkt == EXCHK_PARAM)
|
|
{
|
|
t = (short)atoi(para);
|
|
if ((t < 0) || (t > 100))
|
|
{
|
|
sendto_one(sptr, ":%s NOTICE %s :chanmode +y requires a parameter in the range 0..100",
|
|
me.name, sptr->name);
|
|
return 0;
|
|
}
|
|
return 1;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
CmodeParam * modey_put_param(CmodeParam *ypara, char *para)
|
|
{
|
|
aModewentry *r = (aModewentry *)ypara;
|
|
|
|
if (!r)
|
|
{
|
|
/* Need to create one */
|
|
r = (aModewentry *)malloc(sizeof(aModewentry));
|
|
memset(r, 0, sizeof(aModewentry));
|
|
r->flag = 'y';
|
|
}
|
|
r->val = (short)atoi(para);
|
|
return (CmodeParam *)r;
|
|
}
|
|
|
|
char *modey_get_param(CmodeParam *ypara)
|
|
{
|
|
aModewentry *r = (aModewentry *)ypara;
|
|
static char tmpret[16];
|
|
|
|
if (!r)
|
|
return NULL;
|
|
sprintf(tmpret, "%hu", r->val);
|
|
return tmpret;
|
|
}
|
|
|
|
/* no this is not useless, imagine the parameter "1blah" :P */
|
|
char *modey_conv_param(char *param)
|
|
{
|
|
short i;
|
|
static char tmpret2[16];
|
|
i = (short)atoi(param);
|
|
sprintf(tmpret2, "%hu", i);
|
|
return tmpret2;
|
|
}
|
|
|
|
void modey_free_param(CmodeParam *ypara)
|
|
{
|
|
aModewentry *r = (aModewentry *)ypara;
|
|
free(r);
|
|
}
|
|
|
|
CmodeParam *modey_dup_struct(CmodeParam *src)
|
|
{
|
|
aModewentry *n = (aModewentry *)malloc(sizeof(aModewentry));
|
|
memcpy(n, src, sizeof(aModewentry));
|
|
return (CmodeParam *)n;
|
|
}
|
|
|
|
int modey_sjoin_check(aChannel *chptr, CmodeParam *ourx, CmodeParam *theirx)
|
|
{
|
|
aModewentry *our = (aModewentry *)ourx;
|
|
aModewentry *their = (aModewentry *)theirx;
|
|
|
|
if (our->val == their->val)
|
|
return EXSJ_SAME;
|
|
if (our->val > their->val)
|
|
return EXSJ_WEWON;
|
|
else
|
|
return EXSJ_THEYWON;
|
|
}
|