ed3ca2ff16
Move opername and privset storage to struct User, so it can exist for remote opers. On /oper and when bursting opers, send: :foo OPER opername privset which sets foo's opername and privset. The contents of the privset on remote servers come from the remote server's config, so the potential for confusion exists if these do not match. If an oper's privset does not exist on a server that sees it, it will complain, but create a placeholder privset. If the privset is created by a rehash, this will be reflected properly. /privs is udpated to take an optional argument, the server to query, and is now local by default: /privs [[nick_or_server] nick]
53 lines
1.1 KiB
C
53 lines
1.1 KiB
C
/*
|
|
* Oper extban type: matches opers
|
|
* -- jilles
|
|
*/
|
|
|
|
#include "stdinc.h"
|
|
#include "modules.h"
|
|
#include "client.h"
|
|
#include "privilege.h"
|
|
#include "s_newconf.h"
|
|
#include "ircd.h"
|
|
|
|
static const char extb_desc[] = "Oper ($o) extban type";
|
|
|
|
static int _modinit(void);
|
|
static void _moddeinit(void);
|
|
static int eb_oper(const char *data, struct Client *client_p, struct Channel *chptr, long mode_type);
|
|
|
|
DECLARE_MODULE_AV2(extb_oper, _modinit, _moddeinit, NULL, NULL, NULL, NULL, NULL, extb_desc);
|
|
|
|
static int
|
|
_modinit(void)
|
|
{
|
|
extban_table['o'] = eb_oper;
|
|
|
|
return 0;
|
|
}
|
|
|
|
static void
|
|
_moddeinit(void)
|
|
{
|
|
extban_table['o'] = NULL;
|
|
}
|
|
|
|
static int eb_oper(const char *data, struct Client *client_p,
|
|
struct Channel *chptr, long mode_type)
|
|
{
|
|
|
|
(void)chptr;
|
|
(void)mode_type;
|
|
|
|
if (data != NULL)
|
|
{
|
|
struct PrivilegeSet *set = privilegeset_get(data);
|
|
if (set != NULL && client_p->user->privset == set)
|
|
return EXTBAN_MATCH;
|
|
|
|
/* $o:admin or whatever */
|
|
return HasPrivilege(client_p, data) ? EXTBAN_MATCH : EXTBAN_NOMATCH;
|
|
}
|
|
|
|
return IsOper(client_p) ? EXTBAN_MATCH : EXTBAN_NOMATCH;
|
|
}
|