From dfba08638c3b940fb6e96389c12376a411769be1 Mon Sep 17 00:00:00 2001
From: w00t <w00t@e03df62e-2008-0410-955e-edbf42e46eb7>
Date: Wed, 27 Aug 2008 20:19:26 +0000
Subject: Add <disabled:fakenonexistant> - ircd will pretend that a disabled
 command just doesn't exist (for austnet), document <disabled:usermodes> and
 <disabled:chanmodes> (bad aquanight.)

git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@10327 e03df62e-2008-0410-955e-edbf42e46eb7
---
 conf/inspircd.conf.example | 16 ++++++++++------
 include/configreader.h     |  4 ++++
 src/command_parse.cpp      | 11 ++++++++++-
 src/configreader.cpp       |  1 +
 4 files changed, 25 insertions(+), 7 deletions(-)

diff --git a/conf/inspircd.conf.example b/conf/inspircd.conf.example
index dc92b66a2..74406de0f 100644
--- a/conf/inspircd.conf.example
+++ b/conf/inspircd.conf.example
@@ -757,17 +757,21 @@
 <banlist chan="#morons" limit="128">
 <banlist chan="*" limit="69">
 
-#-#-#-#-#-#-#-#-#-#-#-  DISABLED COMMANDS  -#-#-#-#-#-#-#-#-#-#-#-#-#-#
+#-#-#-#-#-#-#-#-#-#-#-  DISABLED FEATURES  -#-#-#-#-#-#-#-#-#-#-#-#-#-#
 #                                                                     #
-# This tag is optional, and specifies one or more commands which are  #
-# not available to non-operators. For example you may wish to disable #
-# NICK and prevent non-opers from changing their nicknames.           #
+# This tag is optional, and specifies one or more features which are  #
+# not available to non-operators.                                     #
+#                                                                     #
+# For example you may wish to disable NICK and prevent non-opers from #
+# changing their nicknames.                                           #
 # Note that any disabled commands take effect only after the user has #
 # 'registered' (e.g. after the initial USER/NICK/PASS on connection)  #
 # so for example disabling NICK will not cripple your network.        #
 #                                                                     #
-
-#<disabled commands="TOPIC MODE">
+# `fakenonexistant' will make the ircd pretend that nonexistant       #
+# commands simply don't exist to non-opers ("no such command").       #
+#                                                                     #
+#<disabled commands="TOPIC MODE" usermodes="" chanmodes="" fakenonexistant="yes">
 
 
 #-#-#-#-#-#-#-#-#-#-#-#-#-#-#-  RTFM LINE  -#-#-#-#-#-#-#-#-#-#-#-#-#-#
diff --git a/include/configreader.h b/include/configreader.h
index 9ec68b9e8..5e437d153 100644
--- a/include/configreader.h
+++ b/include/configreader.h
@@ -439,6 +439,10 @@ class CoreExport ServerConfig : public Extensible
 	 */
 	char DNSServer[MAXBUF];
 
+	/** Pretend disabled commands don't exist.
+	 */
+	bool DisabledDontExist;
+
 	/** This variable contains a space-seperated list
 	 * of commands which are disabled by the
 	 * administrator of the server for non-opers.
diff --git a/src/command_parse.cpp b/src/command_parse.cpp
index 612337ccf..0f93e6f53 100644
--- a/src/command_parse.cpp
+++ b/src/command_parse.cpp
@@ -326,7 +326,16 @@ bool CommandParser::ProcessCommand(User *user, std::string &cmd)
 	if ((user->registered == REG_ALL) && (!IS_OPER(user)) && (cm->second->IsDisabled()))
 	{
 		/* command is disabled! */
-		user->WriteNumeric(ERR_UNKNOWNCOMMAND, "%s %s :This command has been disabled.",user->nick.c_str(),command.c_str());
+		if (ServerInstance->Config->DisabledDontExist)
+		{
+			user->WriteNumeric(ERR_UNKNOWNCOMMAND, "%s %s :Unknown command",user->nick.c_str(),command.c_str());
+		}
+		else
+		{
+			user->WriteNumeric(ERR_UNKNOWNCOMMAND, "%s %s :This command has been disabled.",
+										user->nick.c_str(), command.c_str());
+		}
+
 		ServerInstance->SNO->WriteToSnoMask('d', "%s denied for %s (%s@%s)",
 				command.c_str(), user->nick.c_str(), user->ident.c_str(), user->host.c_str());
 		return do_more;
diff --git a/src/configreader.cpp b/src/configreader.cpp
index 424f3ad68..9ec8aa367 100644
--- a/src/configreader.cpp
+++ b/src/configreader.cpp
@@ -843,6 +843,7 @@ void ServerConfig::Read(bool bail, User* user)
 		{"disabled",	"commands",	"",			new ValueContainerChar (this->DisabledCommands),	DT_CHARPTR,  NoValidation},
 		{"disabled",	"usermodes",	"",			new ValueContainerChar (disabledumodes),		DT_CHARPTR,  ValidateDisabledUModes},
 		{"disabled",	"chanmodes",	"",			new ValueContainerChar (disabledcmodes),		DT_CHARPTR,  ValidateDisabledCModes},
+		{"disabled",	"fakenonexistant",	"0",			new ValueContainerBool (&this->DisabledDontExist),		DT_BOOLEAN,  NoValidation},
 		{"security",	"userstats",	"",			new ValueContainerChar (this->UserStats),		DT_CHARPTR,  NoValidation},
 		{"security",	"customversion","",			new ValueContainerChar (this->CustomVersion),		DT_CHARPTR,  NoValidation},
 		{"security",	"hidesplits",	"0",			new ValueContainerBool (&this->HideSplits),		DT_BOOLEAN,  NoValidation},
-- 
cgit v1.2.3