summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorw00t <w00t@e03df62e-2008-0410-955e-edbf42e46eb7>2007-08-28 00:21:52 +0000
committerw00t <w00t@e03df62e-2008-0410-955e-edbf42e46eb7>2007-08-28 00:21:52 +0000
commitf4173d3a44fa7be263f5797999528fe8f88c77e9 (patch)
treec3f12fa90bb8f10fdd42c330619a11c68cdc8984 /src
parent373de28c980309af655816426d9cccae08102fd7 (diff)
Mode to protect services from /kill and hide channel list in /whois from everyone (opers included) - handy, and perhaps it could be extended to do other misc services related stuff so it doesn't have to be duplicated in m_serv, and _account together
git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@7934 e03df62e-2008-0410-955e-edbf42e46eb7
Diffstat (limited to 'src')
-rw-r--r--src/modules/m_servprotect.cpp98
1 files changed, 98 insertions, 0 deletions
diff --git a/src/modules/m_servprotect.cpp b/src/modules/m_servprotect.cpp
new file mode 100644
index 000000000..d1ea08c73
--- /dev/null
+++ b/src/modules/m_servprotect.cpp
@@ -0,0 +1,98 @@
+/* +------------------------------------+
+ * | Inspire Internet Relay Chat Daemon |
+ * +------------------------------------+
+ *
+ * InspIRCd: (C) 2002-2007 InspIRCd Development Team
+ * See: http://www.inspircd.org/wiki/index.php/Credits
+ *
+ * This program is free but copyrighted software; see
+ * the file COPYING for details.
+ *
+ * ---------------------------------------------------
+ */
+
+#include "inspircd.h"
+#include <stdio.h>
+#include <string>
+#include "users.h"
+#include "channels.h"
+#include "modules.h"
+#include "configreader.h"
+
+/* $ModDesc: Provides support for Austhex style +k / UnrealIRCD +S services mode */
+
+/** Handles user mode +k
+ */
+class ServProtectMode : public ModeHandler
+{
+ public:
+ ServProtectMode(InspIRCd* Instance) : ModeHandler(Instance, 'k', 0, 0, false, MODETYPE_USER, true) { }
+
+ ModeAction OnModeChange(userrec* source, userrec* dest, chanrec* channel, std::string &parameter, bool adding)
+ {
+ return MODEACTION_DENY;
+ }
+
+ bool NeedsOper() { return true; }
+};
+
+class ModuleServProtectMode : public Module
+{
+
+ ServProtectMode* bm;
+ public:
+ ModuleServProtectMode(InspIRCd* Me)
+ : Module(Me)
+ {
+
+ bm = new ServProtectMode(ServerInstance);
+ if (!ServerInstance->AddMode(bm, 'k'))
+ throw ModuleException("Could not add new modes!");
+ }
+
+ void Implements(char* List)
+ {
+ List[I_OnWhois] = List[I_OnKill] = List[I_OnWhoisLine] = 1;
+ }
+
+ virtual ~ModuleServProtectMode()
+ {
+ ServerInstance->Modes->DelMode(bm);
+ DELETE(bm);
+ }
+
+ virtual Version GetVersion()
+ {
+ return Version(1,1,0,0,VF_COMMON,API_VERSION);
+ }
+
+ virtual void OnWhois(userrec* src, userrec* dst)
+ {
+ if (dst->IsModeSet('k'))
+ {
+ ServerInstance->SendWhoisLine(src, dst, 310, std::string(src->nick)+" "+std::string(dst->nick)+" :is an "+ServerInstance->Config->Network+" Service");
+ }
+ }
+
+ virtual int OnKill(userrec* src, userrec* dst, const std::string &reason)
+ {
+ if (src == NULL)
+ return 0;
+
+ if (dst->IsModeSet('k'))
+ {
+ src->WriteServ("485 %s :You are not allowed to kill %s Services!", src->nick, ServerInstance->Config->Network);
+ ServerInstance->WriteOpers("*** "+std::string(src->nick)+" tried to kill service "+dst->nick+" ("+reason+")");
+ return 1;
+ }
+ return 0;
+ }
+
+ virtual int OnWhoisLine(userrec* src, userrec* dst, int &numeric, std::string &text)
+ {
+ return ((src != dst) && (numeric == 319) && dst->IsModeSet('k'));
+ }
+};
+
+
+MODULE_INIT(ModuleServProtectMode)