From f6892ecd79c6113544106e32374075f489bf95a7 Mon Sep 17 00:00:00 2001 From: pk910 Date: Tue, 7 Feb 2012 14:09:04 +0100 Subject: [PATCH] added FEAT_CHMODE_A_NOSET to prevent +a from being set by users --- doc/example.conf | 1 + include/ircd_features.h | 1 + ircd/channel.c | 3 +++ ircd/ircd_features.c | 1 + ircd/m_join.c | 2 +- 5 files changed, 7 insertions(+), 1 deletion(-) diff --git a/doc/example.conf b/doc/example.conf index 0e4c6c2..dab243d 100644 --- a/doc/example.conf +++ b/doc/example.conf @@ -962,6 +962,7 @@ features # "LOC_TARGET" = "somenick"; # "CHMODE_A_ENABLE" = "TRUE"; # "CHMODE_A_TARGET" = "ChanServ"; +# "CHMODE_A_NOSET" = "TRUE"; # Mode is not settable by normal users (only services chan set it) # "CHMODE_F_ENABLE" = "TRUE"; # "UNKNOWN_CMD_ENABLE" = "TRUE"; # "UNKNOWN_CMD_TARGET" = "OpServ"; diff --git a/include/ircd_features.h b/include/ircd_features.h index 1b26017..c4c65f8 100644 --- a/include/ircd_features.h +++ b/include/ircd_features.h @@ -177,6 +177,7 @@ enum Feature { FEAT_UNKNOWN_CMD_TARGET, FEAT_CHMODE_A_ENABLE, FEAT_CHMODE_A_TARGET, + FEAT_CHMODE_A_NOSET, FEAT_CHMODE_F_ENABLE, FEAT_HALFOP, diff --git a/ircd/channel.c b/ircd/channel.c index dc8783c..41e2cdb 100644 --- a/ircd/channel.c +++ b/ircd/channel.c @@ -2513,6 +2513,9 @@ mode_parse_access(struct ParseState *state, ulong64 *flag_p) return; } + if(feature_bool(FEAT_CHMODE_A_NOSET) && !(state->flags & MODE_PARSE_FORCE)) /* mode can'T be set. */ + return; + if (!(state->flags & MODE_PARSE_WIPEOUT) && (!t_access || t_access == state->chptr->mode.access)) return; diff --git a/ircd/ircd_features.c b/ircd/ircd_features.c index 8cc5037..6bb973e 100644 --- a/ircd/ircd_features.c +++ b/ircd/ircd_features.c @@ -442,6 +442,7 @@ static struct FeatureDesc { F_S(UNKNOWN_CMD_TARGET, FEAT_NULL, 0, 0), F_B(CHMODE_A_ENABLE, 0, 0, 0), F_S(CHMODE_A_TARGET, FEAT_NULL, 0, 0), + F_B(CHMODE_A_NOSET, 0, 0, 0), F_B(CHMODE_F_ENABLE, 0, 0, 0), F_B(HALFOP, 0, 0, 0), diff --git a/ircd/m_join.c b/ircd/m_join.c index 9e22983..63c93d5 100644 --- a/ircd/m_join.c +++ b/ircd/m_join.c @@ -265,7 +265,7 @@ int m_join(struct Client *cptr, struct Client *sptr, int parc, char *parv[]) override = 1; } - if(!err && !override && !IsInvited(sptr, chptr) && chptr->mode.access && chptr->mode.access > 0 && chptr->mode.access < 500 && feature_bool(FEAT_CHMODE_A_ENABLE)) { + if(!err && !override && !IsInvited(sptr, chptr) && chptr->mode.access && chptr->mode.access > 0 && chptr->mode.access <= 500 && feature_bool(FEAT_CHMODE_A_ENABLE)) { //We have to check the users channel access... struct Client *acptr; if(feature_str(FEAT_CHMODE_A_TARGET) && (acptr = FindUser(feature_str(FEAT_CHMODE_A_TARGET))) && IsNetServ(acptr) && IsService(cli_user(acptr)->server)) { -- 2.20.1