Implement new configuration option "DefaultUserModes" bug160-DefaultUserModes
authorAlexander Barton <alex@barton.de>
Mon, 26 Aug 2013 19:17:10 +0000 (21:17 +0200)
committerAlexander Barton <alex@barton.de>
Mon, 26 Aug 2013 19:17:10 +0000 (21:17 +0200)
The new configuration option "DefaultUserModes" lists user modes that
become automatically set on new local clients right after login.

Please note that only modes can be set that the client could set on
itself, you can't set "a" (away) or "o" (IRC Op), for example! User
modes "i" (invisible) or "x" (cloaked) etc. are "interesting", though.

Default: set no modes (like without this patch).

Closes bug #160.

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

index 99960e95f0d16a40b827ed67fd08fe60b39741bf..ae1b213950b8484ed4ab0ac92e9c9c03d86cea47 100644 (file)
        ;ConnectIPv6 = yes
        ;ConnectIPv4 = yes
 
-       # Do any DNS lookups when a client connects to the server.
+       # Default user mode(s) to set on new local clients. Please note that
+       # only modes can be set that the client could set on itself, you can't
+       # set "a" (away) or "o" (IRC Op), for example! Default: none.
+       ;DefaultUserModes = i
+
+       # Do DNS lookups when a client connects to the server.
        ;DNS = yes
 
        # Do IDENT lookups if ngIRCd has been compiled with support for it.
index c9d7bf8318c00eb2505432d11b0e6722852e5a43..cf926f9a3b80845f1b45715664a66f1709fddb94 100644 (file)
@@ -258,6 +258,12 @@ Set this to no if you do not want ngIRCd to connect to other IRC servers using
 the IPv6 protocol.
 Default: yes.
 .TP
+\fBDefaultUserModes\fR (string)
+Default user mode(s) to set on new local clients. Please note that only modes
+can be set that the client could set on itself, you can't set "a" (away) or
+"o" (IRC Op), for example!
+Default: none.
+.TP
 \fBDNS\fR (boolean)
 If set to false, ngIRCd will not make any DNS lookups when clients connect.
 If you configure the daemon to connect to other servers, ngIRCd may still
index 79376b80ba8b7c33335a6f0ddc1c61aecfae29c2..b10f4905c9ec7befb08b5b5717cc6397cc48bea9 100644 (file)
@@ -402,6 +402,7 @@ Conf_Test( void )
        printf("  ConnectIPv4 = %s\n", yesno_to_str(Conf_ConnectIPv6));
        printf("  ConnectIPv6 = %s\n", yesno_to_str(Conf_ConnectIPv4));
 #endif
+       printf("  DefaultUserModes = %s\n", Conf_DefaultUserModes);
        printf("  DNS = %s\n", yesno_to_str(Conf_DNS));
 #ifdef IDENT
        printf("  Ident = %s\n", yesno_to_str(Conf_Ident));
@@ -776,6 +777,7 @@ Set_Defaults(bool InitServers)
 #else
        Conf_ConnectIPv6 = false;
 #endif
+       strcpy(Conf_DefaultUserModes, "");
        Conf_DNS = true;
 #ifdef IDENTAUTH
        Conf_Ident = true;
@@ -1706,6 +1708,30 @@ Handle_OPTIONS(const char *File, int Line, char *Var, char *Arg)
                Conf_ConnectIPv4 = Check_ArgIsTrue(Arg);
                return;
        }
+       if (strcasecmp(Var, "DefaultUserModes") == 0) {
+               p = Arg;
+               Conf_DefaultUserModes[0] = '\0';
+               while (*p) {
+                       if (strchr(Conf_DefaultUserModes, *p)) {
+                               /* Mode is already included; ignore it */
+                               p++;
+                               continue;
+                       }
+
+                       if (strchr(USERMODES, *p)) {
+                               len = strlen(Conf_DefaultUserModes) + 1;
+                               assert(len < sizeof(Conf_DefaultUserModes));
+                               Conf_DefaultUserModes[len - 1] = *p;
+                               Conf_DefaultUserModes[len] = '\0';
+                       } else {
+                               Config_Error(LOG_WARNING,
+                                            "%s, line %d: Unknown user mode \"%c\" in \"DefaultUserModes\"!",
+                                            File, Line, *p);
+                       }
+                       p++;
+               }
+               return;
+       }
        if (strcasecmp(Var, "DNS") == 0) {
                Conf_DNS = Check_ArgIsTrue(Arg);
                return;
index 93d6785f2adb9499eb3d000e7fa45689c62d950a..948749de617bc433b6302edac2633eb1fc6e2bbe 100644 (file)
@@ -202,6 +202,9 @@ GLOBAL bool Conf_PAMIsOptional;
 /** Disable all CTCP commands except for /me ? */
 GLOBAL bool Conf_ScrubCTCP;
 
+/** Default user modes for new local clients */
+GLOBAL char Conf_DefaultUserModes[CLIENT_MODE_LEN];
+
 /*
  * try to connect to remote systems using the ipv6 protocol,
  * if they have an ipv6 address? (default yes)
index bbde6359d70434748779ba96a8868134a8e1aa19..4011b8bcadd3216672b2ddfeb67a254eb3dff463 100644 (file)
@@ -19,6 +19,7 @@
 #include "imp.h"
 #include <assert.h>
 #include <stdlib.h>
+#include <stdio.h>
 #include <string.h>
 #include <strings.h>
 #include <unistd.h>
@@ -37,6 +38,7 @@
 #include "ngircd.h"
 #include "pam.h"
 #include "irc-info.h"
+#include "irc-mode.h"
 #include "irc-write.h"
 
 #include "exp.h"
@@ -151,6 +153,9 @@ Login_User(CLIENT * Client)
 GLOBAL bool
 Login_User_PostAuth(CLIENT *Client)
 {
+       REQUEST Req;
+       char modes[CLIENT_MODE_LEN + 1];
+
        assert(Client != NULL);
 
        if (Class_HandleServerBans(Client) != CONNECTED)
@@ -185,8 +190,17 @@ Login_User_PostAuth(CLIENT *Client)
        if (!IRC_Show_MOTD(Client))
                return DISCONNECTED;
 
-       /* Suspend the client for a second ... */
-       IRC_SetPenalty(Client, 1);
+       /* Set default user modes */
+       if (Conf_DefaultUserModes[0]) {
+               snprintf(modes, sizeof(modes), "+%s", Conf_DefaultUserModes);
+               Req.prefix = Client_ThisServer();
+               Req.command = "MODE";
+               Req.argc = 2;
+               Req.argv[0] = Client_ID(Client);
+               Req.argv[1] = modes;
+               IRC_MODE(Client, &Req);
+       } else
+               IRC_SetPenalty(Client, 1);
 
        return CONNECTED;
 }