Implement new configuration option "DefaultUserModes"

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.
This commit is contained in:
Alexander Barton 2013-08-26 21:17:10 +02:00
parent 3b65f4e38d
commit 2bacb8210b
5 changed files with 57 additions and 3 deletions

View File

@ -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.

View 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

View 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;

View 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)

View 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;
}