about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorAlexander Barton <alex@barton.de>2013-08-26 21:17:10 +0200
committerAlexander Barton <alex@barton.de>2013-08-26 21:17:10 +0200
commit2bacb8210b4f0807eb50587bcc4329c7ea7a50c3 (patch)
tree6ada7c4ec9a5e63a3e0e297d8c66c35f519a86a0 /src
parent3b65f4e38d1ab019513f16b70581ae10574006e8 (diff)
downloadngircd-2bacb8210b4f0807eb50587bcc4329c7ea7a50c3.tar.gz
ngircd-2bacb8210b4f0807eb50587bcc4329c7ea7a50c3.zip
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.
Diffstat (limited to 'src')
-rw-r--r--src/ngircd/conf.c26
-rw-r--r--src/ngircd/conf.h3
-rw-r--r--src/ngircd/login.c18
3 files changed, 45 insertions, 2 deletions
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 <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;
 }