added FEAT_CHMODE_A_NOSET to prevent +a from being set by users
authorpk910 <philipp@zoelle1.de>
Tue, 7 Feb 2012 13:09:04 +0000 (14:09 +0100)
committerpk910 <philipp@zoelle1.de>
Tue, 7 Feb 2012 13:09:04 +0000 (14:09 +0100)
doc/example.conf
include/ircd_features.h
ircd/channel.c
ircd/ircd_features.c
ircd/m_join.c

index 0e4c6c289eab47b4af46c200b6e1b0ab6f90030e..dab243d3774a7dafe3c9157f2088165418d59319 100644 (file)
@@ -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";
index 1b260172eb3af0793b6268785febf303cff32395..c4c65f843bf544081b99ac6ab5873becc576f2c2 100644 (file)
@@ -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,
index dc8783ce5994f86570abc5885dcfbac86c2271b3..41e2cdb6dda2d6bfd51dcd95e250451ee8361137 100644 (file)
@@ -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;
index 8cc5037756c9e14b934dfc30cc7b083305c00af2..6bb973e551d1e43822e3dcff17487c3b8db36f1a 100644 (file)
@@ -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),
   
index 9e2298331ff1a7957c5f42a1529f89393cb220c1..63c93d55d6bc2244f1a666bd685c3a0078be24f3 100644 (file)
@@ -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)) {