mirror of
https://github.com/osmarks/ngircd.git
synced 2025-10-27 12:07:39 +00:00
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:
@@ -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;
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user