diff --git a/doc/sample-ngircd.conf.tmpl b/doc/sample-ngircd.conf.tmpl index 99960e95..ae1b2139 100644 --- a/doc/sample-ngircd.conf.tmpl +++ b/doc/sample-ngircd.conf.tmpl @@ -165,7 +165,12 @@ ;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. diff --git a/man/ngircd.conf.5.tmpl b/man/ngircd.conf.5.tmpl index c9d7bf83..cf926f9a 100644 --- a/man/ngircd.conf.5.tmpl +++ b/man/ngircd.conf.5.tmpl @@ -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 diff --git a/src/ngircd/conf.c b/src/ngircd/conf.c index 79376b80..b10f4905 100644 --- a/src/ngircd/conf.c +++ b/src/ngircd/conf.c @@ -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; diff --git a/src/ngircd/conf.h b/src/ngircd/conf.h index 93d6785f..948749de 100644 --- a/src/ngircd/conf.h +++ b/src/ngircd/conf.h @@ -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) diff --git a/src/ngircd/login.c b/src/ngircd/login.c index bbde6359..4011b8bc 100644 --- a/src/ngircd/login.c +++ b/src/ngircd/login.c @@ -19,6 +19,7 @@ #include "imp.h" #include #include +#include #include #include #include @@ -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; }