New configuration option "OperChanPAutoOp"
authorDNS777 <dns@rbose.org>
Tue, 25 Sep 2012 11:08:39 +0000 (13:08 +0200)
committerAlexander Barton <alex@barton.de>
Tue, 25 Sep 2012 11:08:39 +0000 (13:08 +0200)
If disabled, IRC operators don't become channel operators in persistent
channels when joining. Enabled by default, which has been the behavior
of ngIRCd up to this patch.

Closes bug #135.

(Cosmetic fixes by Alex.)

doc/sample-ngircd.conf.tmpl
man/ngircd.conf.5.tmpl
src/ngircd/conf.c
src/ngircd/conf.h
src/ngircd/irc-channel.c

index 57e6589..018855d 100644 (file)
        # they are not(!) channel-operators?
        ;OperCanUseMode = no
 
+       # Should IRC Operators get AutoOp (+o) in persistent (+P) channels?
+       ;OperChanPAutoOp = yes
+
        # Mask IRC Operator mode requests as if they were coming from the
        # server? (This is a compatibility hack for ircd-irc2 servers)
        ;OperServerMode = no
index aff11a6..c03cf74 100644 (file)
@@ -268,6 +268,10 @@ while connecting. Default: no.
 Should IRC Operators be allowed to use the MODE command even if they are
 not(!) channel-operators? Default: no.
 .TP
+\fBOperChanPAutoOp\fR (boolean)
+Should IRC Operators get AutoOp (+o) in persistent (+P) channels?
+Default: yes.
+.TP
 \fBOperServerMode\fR (boolean)
 If \fBOperCanUseMode\fR is enabled, this may lead the compatibility problems
 with Servers that run the ircd-irc2 Software. This Option "masks" mode
index 0052de8..4ac37ad 100644 (file)
@@ -372,6 +372,7 @@ Conf_Test( void )
        printf("  MorePrivacy = %s\n", yesno_to_str(Conf_MorePrivacy));
        printf("  NoticeAuth = %s\n", yesno_to_str(Conf_NoticeAuth));
        printf("  OperCanUseMode = %s\n", yesno_to_str(Conf_OperCanMode));
+       printf("  OperChanPAutoOp = %s\n", yesno_to_str(Conf_OperChanPAutoOp));
        printf("  OperServerMode = %s\n", yesno_to_str(Conf_OperServerMode));
 #ifdef PAM
        printf("  PAM = %s\n", yesno_to_str(Conf_PAM));
@@ -733,6 +734,7 @@ Set_Defaults(bool InitServers)
        Conf_MorePrivacy = false;
        Conf_NoticeAuth = false;
        Conf_OperCanMode = false;
+       Conf_OperChanPAutoOp = true;
        Conf_OperServerMode = false;
 #ifdef PAM
        Conf_PAM = true;
@@ -1181,6 +1183,7 @@ CheckLegacyGlobalOption(int Line, char *Var, char *Arg)
            || strcasecmp(Var, "ConnectIPv4") == 0
            || strcasecmp(Var, "ConnectIPv6") == 0
            || strcasecmp(Var, "OperCanUseMode") == 0
+           || strcasecmp(Var, "OperChanPAutoOp") == 0
            || strcasecmp(Var, "OperServerMode") == 0
            || strcasecmp(Var, "PredefChannelsOnly") == 0
            || strcasecmp(Var, "SyslogFacility") == 0
@@ -1556,6 +1559,10 @@ Handle_OPTIONS(int Line, char *Var, char *Arg)
                Conf_OperCanMode = Check_ArgIsTrue(Arg);
                return;
        }
+       if (strcasecmp(Var, "OperChanPAutoOp") == 0) {
+               Conf_OperChanPAutoOp = Check_ArgIsTrue(Arg);
+               return;
+       }
        if (strcasecmp(Var, "OperServerMode") == 0) {
                Conf_OperServerMode = Check_ArgIsTrue(Arg);
                return;
index 7a4e38a..90d74d2 100644 (file)
@@ -151,6 +151,9 @@ GLOBAL bool Conf_PredefChannelsOnly;
 /** Flag indicating if IRC operators are allowed to always use MODE (true) */
 GLOBAL bool Conf_OperCanMode;
 
+/** Flag indicating if IRC operators get AutoOp in persistent (+P) channels */
+GLOBAL bool Conf_OperChanPAutoOp;
+
 /**
  * If true, mask channel MODE commands of IRC operators to the server.
  * Background: ircd2 will ignore channel MODE commands if an IRC operator
index 72fbdc2..4a157d6 100644 (file)
@@ -167,8 +167,10 @@ join_set_channelmodes(CHANNEL *chan, CLIENT *target, const char *flags)
                }
        }
 
-       /* If channel persistent and client is ircop: make client chanop */
-       if (strchr(Channel_Modes(chan), 'P') && strchr(Client_Modes(target), 'o'))
+       /* If the channel is persistent (+P) and client is an IRC op:
+        * make client chanop, if not disabled in configuration. */
+       if (strchr(Channel_Modes(chan), 'P') && Conf_OperChanPAutoOp
+           && strchr(Client_Modes(target), 'o'))
                Channel_UserModeAdd(chan, target, 'o');
 } /* join_set_channelmodes */