diff --git a/TODO b/TODO index e93bc47d..0d21f4ea 100644 --- a/TODO +++ b/TODO @@ -51,11 +51,11 @@ [x] Compilation date and time in server welcome message is in OS locale - looks ugly 'cause often it's not match user's codepage [ ] Improvments [ ] ircd shouldn't need bison/byacc/yacc or flex for compilation - [/] internally split out +o/+v "ranks" into a series of permissions. this could allow for configure-defined - special access levels, halfops, etc. (would need to match globally, somehow. extra SVINFO param?) - this is mostly done, but is a work in progress. - [x] somehow hide channel operators like ircnet can do? - this is done now that chanroles is available - [x] create chmode.h and put there all declarations of chm_* - this will make some modules clean --- other stuff + [?] internally split out +o/+v "ranks" into a series of permissions. this could allow for configure-defined + special access levels, halfops, etc. (would need to match globally, somehow. extra SVINFO param?) + might be backported from shadowircd in future (chanroles planned) + [?] somehow hide channel operators like ircnet can do? + couldn't be done via extension currently - compilation-time option acceptable? + [x] create chmode.h and put there all declarations of chm_* - this will make some modules clean [?] Move oper override server WALLOPS to global server notices? diff --git a/include/channel.h b/include/channel.h index 3c79793e..8e83cb2c 100644 --- a/include/channel.h +++ b/include/channel.h @@ -87,7 +87,6 @@ struct membership struct Channel *chptr; struct Client *client_p; unsigned int flags; - unsigned int roles; unsigned long bants; }; @@ -188,29 +187,11 @@ typedef int (*ExtbanFunc)(const char *data, struct Client *client_p, #define MODE_ADD 1 #define MODE_DEL -1 -/* Channel roles */ -#define CHANROLE_NONE 0x000 -#define CHANROLE_UNSET 0x001 /* Special value */ -#define CHANROLE_KICK 0x002 /* Can kick */ -#define CHANROLE_STATUS 0x004 /* Can change status modes */ -#define CHANROLE_GRANT 0x008 /* Can grant (unused atm) */ -#define CHANROLE_MODE 0x010 /* Can change modes */ -#define CHANROLE_TOPIC 0x020 /* Can change topic */ -#define CHANROLE_INHERIT 0x040 /* Role is inherited (backwards compat) */ - -#define CHANROLE_INITIAL (CHANROLE_KICK | CHANROLE_STATUS | CHANROLE_GRANT | CHANROLE_MODE | CHANROLE_TOPIC) - #define SecretChannel(x) ((x) && ((x)->mode.mode & MODE_SECRET)) #define HiddenChannel(x) ((x) && ((x)->mode.mode & MODE_PRIVATE)) #define PubChannel(x) ((!x) || ((x)->mode.mode &\ (MODE_PRIVATE | MODE_SECRET)) == 0) -#define HasChanRole(m, r) (((m)->roles & r) != 0) -#define SetChanRole(m, r) ((m)->roles |= r) -#define RemoveChanRole(m, r) ((m)->roles &= ~r) - -#define IsChanRoleSet(m, r) - /* channel visible */ #define ShowChannel(v,c) (PubChannel(c) || IsMember((v),(c))) @@ -298,7 +279,7 @@ extern int match_extban(const char *banstr, struct Client *client_p, struct Chan extern int valid_extban(const char *banstr, struct Client *client_p, struct Channel *chptr, long mode_type); const char * get_extban_string(void); -extern int get_channel_access(struct Client *source_p, struct membership *msptr, int role); +extern int get_channel_access(struct Client *source_p, struct membership *msptr); extern void send_channel_join(struct Channel *chptr, struct Client *client_p); diff --git a/modules/Makefile.in b/modules/Makefile.in index 8c3d4798..e9936e97 100644 --- a/modules/Makefile.in +++ b/modules/Makefile.in @@ -65,7 +65,6 @@ TSRCS = \ m_dline.c \ m_encap.c \ m_etrace.c \ - m_grant.c \ m_help.c \ m_info.c \ m_invite.c \ diff --git a/modules/core/m_kick.c b/modules/core/m_kick.c index e66f52e7..eb72d1c9 100644 --- a/modules/core/m_kick.c +++ b/modules/core/m_kick.c @@ -97,7 +97,7 @@ m_kick(struct Client *client_p, struct Client *source_p, int parc, const char *p return 0; } - if(get_channel_access(source_p, msptr, CHANROLE_KICK) < CHFL_CHANOP) + if(get_channel_access(source_p, msptr) < CHFL_CHANOP) { if(MyConnect(source_p)) { diff --git a/modules/m_grant.c b/modules/m_grant.c deleted file mode 100644 index a24e74ce..00000000 --- a/modules/m_grant.c +++ /dev/null @@ -1,112 +0,0 @@ -/* - * charybdis: an advanced ircd - * m_grant: handle services grant commands - */ - -#include "stdinc.h" -#include "client.h" -#include "ircd.h" -#include "numeric.h" -#include "s_serv.h" -#include "send.h" -#include "msg.h" -#include "parse.h" -#include "modules.h" -#include "s_conf.h" -#include "hash.h" - -struct flag_list -{ - char *name; - int flag; -}; - -static struct flag_list flaglist[] = { - {"kick", CHANROLE_KICK}, - {"grant", CHANROLE_GRANT}, - {"mode", CHANROLE_MODE}, - {"topic", CHANROLE_TOPIC}, - {"status", CHANROLE_STATUS}, - {NULL, 0}, -}; - -static int me_grant(struct Client *, struct Client *, int, const char **); - -struct Message grant_msgtab = { - "GRANT", 0, 0, 0, MFLG_SLOW, - {mg_unreg, mg_ignore, mg_ignore, mg_ignore, {me_grant, 4}, mg_ignore} -}; - -mapi_clist_av1 grant_clist[] = { &grant_msgtab, NULL }; -DECLARE_MODULE_AV1(grant, NULL, NULL, grant_clist, NULL, NULL, "Charybdis development team"); - -static void -apply_flags(struct membership *msptr, const char *flagspec, unsigned int flagmask) -{ - char *s, *t, *p; - - /* unset all chanroles as we're setting new ones */ - msptr->roles = 0; - - t = LOCAL_COPY(flagspec); - for (s = rb_strtok_r(t, " ", &p); s; s = rb_strtok_r(NULL, " ", &p)) - { - const char *priv = s + 1; /* The actual priv */ - struct flag_list *fl; - unsigned int flag = 0; - - /* Go through the flags list... */ - for(fl = flaglist; fl->name != NULL; fl++) - { - if (strcasecmp(fl->name, priv) == 0) - { - /* flagmask exists to ensure users can't give privileges they - * don't possess themselves */ - if (!flagmask || (flagmask & fl->flag)) - flag = fl->flag; - break; - } - } - - /* Ack no flag! */ - if (!flag) - continue; - - if (s[0] == '-') - RemoveChanRole(msptr, flag); - else if (s[0] == '+') - SetChanRole(msptr, flag); - } -} - -/* - * me_grant - * - * parv[1] = channel - * parv[2] = target UID - * parv[3] = flag spec -*/ -static int -me_grant(struct Client *client_p, struct Client *source_p, int parc, const char *parv[]) -{ - struct Channel *chptr; - struct Client *target_p; - struct membership *msptr; - - if (!(chptr = find_channel(parv[1]))) - return 0; - - if (!(target_p = find_person(parv[2]))) - return 0; - - /* Makes no sense to do this for non-local users */ - if(!MyClient(target_p)) - return 0; - - if (!(msptr = find_channel_membership(chptr, target_p))) - return 0; - - apply_flags(msptr, parv[3], 0); - - return 0; -} diff --git a/modules/m_topic.c b/modules/m_topic.c index b175612e..15cc4756 100644 --- a/modules/m_topic.c +++ b/modules/m_topic.c @@ -118,7 +118,7 @@ m_topic(struct Client *client_p, struct Client *source_p, int parc, const char * } if(((chptr->mode.mode & MODE_TOPICLIMIT) == 0 || - get_channel_access(source_p, msptr, CHANROLE_TOPIC) >= CHFL_CHANOP) && + get_channel_access(source_p, msptr) >= CHFL_CHANOP) && (!MyClient(source_p) || can_send(chptr, source_p, msptr))) { diff --git a/src/channel.c b/src/channel.c index 6455fd54..5a134235 100644 --- a/src/channel.c +++ b/src/channel.c @@ -236,12 +236,6 @@ add_user_to_channel(struct Channel *chptr, struct Client *client_p, int flags) msptr->client_p = client_p; msptr->flags = flags; - /* Default to no chanroles until services says we're something else */ - if (flags == CHFL_CHANOP) - msptr->roles = CHANROLE_INITIAL; - else - msptr->roles = CHANROLE_UNSET; - rb_dlinkAdd(msptr, &msptr->usernode, &client_p->user->channel); rb_dlinkAdd(msptr, &msptr->channode, &chptr->members); diff --git a/src/chmode.c b/src/chmode.c index aae52b88..a268fdc5 100644 --- a/src/chmode.c +++ b/src/chmode.c @@ -187,7 +187,7 @@ cflag_orphan(char c_) } int -get_channel_access(struct Client *source_p, struct membership *msptr, int role) +get_channel_access(struct Client *source_p, struct membership *msptr) { hook_data_channel_approval moduledata; @@ -201,12 +201,7 @@ get_channel_access(struct Client *source_p, struct membership *msptr, int role) moduledata.chptr = msptr->chptr; moduledata.msptr = msptr; moduledata.target = NULL; - - /* Check if they have the proper role */ - if(HasChanRole(msptr, role)) - moduledata.approved = CHFL_CHANOP; - else - moduledata.approved = CHFL_PEON; + moduledata.approved = is_chanop(msptr) ? CHFL_CHANOP : CHFL_PEON; call_hook(h_get_channel_access, &moduledata); @@ -903,11 +898,6 @@ chm_op(struct Client *source_p, struct Channel *chptr, mode_changes[mode_count++].client = targ_p; mstptr->flags |= CHFL_CHANOP; - if (mstptr->roles & CHANROLE_UNSET) - { - mstptr->roles &= ~CHANROLE_UNSET; - mstptr->roles = CHANROLE_INITIAL | CHANROLE_INHERIT; - } } else { @@ -928,8 +918,6 @@ chm_op(struct Client *source_p, struct Channel *chptr, mode_changes[mode_count++].client = targ_p; mstptr->flags &= ~CHFL_CHANOP; - if (mstptr->roles & CHANROLE_INHERIT) - mstptr->roles = CHANROLE_UNSET; } } @@ -1212,7 +1200,7 @@ chm_forward(struct Client *source_p, struct Channel *chptr, if(MyClient(source_p) && !(targptr->mode.mode & MODE_FREETARGET)) { if((msptr = find_channel_membership(targptr, source_p)) == NULL || - get_channel_access(source_p, msptr, CHANROLE_MODE) != CHFL_CHANOP) + get_channel_access(source_p, msptr) != CHFL_CHANOP) { sendto_one(source_p, form_str(ERR_CHANOPRIVSNEEDED), me.name, source_p->name, targptr->chname); @@ -1630,7 +1618,7 @@ set_channel_mode(struct Client *client_p, struct Client *source_p, mode_limit = 0; mode_limit_simple = 0; - alevel = get_channel_access(source_p, msptr, CHANROLE_MODE); + alevel = get_channel_access(source_p, msptr); /* Hide connecting server on netburst -- jilles */ if (ConfigServerHide.flatten_links && IsServer(source_p) && !has_id(source_p) && !HasSentEob(source_p)) diff --git a/src/messages.tab b/src/messages.tab index 3bcf93a8..63e85207 100644 --- a/src/messages.tab +++ b/src/messages.tab @@ -507,7 +507,7 @@ static const char * replies[] = { /* 479 ERR_BADCHANNAME */ "%s :Illegal channel name", /* 480 ERR_THROTTLE */ ":%s 480 %s %s :Cannot join channel (+j) - throttle exceeded, try again later", /* 481 ERR_NOPRIVILEGES, */ ":Permission Denied - You're not an IRC operator", -/* 482 ERR_CHANOPRIVSNEEDED, */ ":%s 482 %s %s :You're not a channel operator or have no privilege", +/* 482 ERR_CHANOPRIVSNEEDED, */ ":%s 482 %s %s :You're not a channel operator", /* 483 ERR_CANTKILLSERVER, */ ":You can't kill a server!", /* 484 ERR_ISCHANSERVICE */ ":%s 484 %s %s %s :Cannot kick or deop a network service", /* 485 ERR_BANNEDNICK, */ NULL, diff --git a/src/supported.c b/src/supported.c index f227ddd7..ff59396d 100644 --- a/src/supported.c +++ b/src/supported.c @@ -322,6 +322,5 @@ init_isupport(void) add_isupport("TARGMAX", isupport_targmax, NULL); add_isupport("EXTBAN", isupport_extban, NULL); add_isupport("WHOX", isupport_string, ""); - add_isupport("CHANROLES", isupport_string, ""); add_isupport("CLIENTVER", isupport_string, "3.0"); }