diff options
author | Robin Burchell <viroteck@viroteck.net> | 2012-05-16 13:13:09 -0700 |
---|---|---|
committer | Robin Burchell <viroteck@viroteck.net> | 2012-05-16 13:13:09 -0700 |
commit | 2916ae7c920c069ff180f0224b2dc953bbd32501 (patch) | |
tree | ecd7a1d4ae0063edec08c931eed902d66708b774 | |
parent | c745072bec0708b5d1718a325e7c983836f37a6d (diff) | |
parent | 1b909065b0fc7789a4a33dce56219befa602b8ec (diff) |
Merge pull request #113 from nenolod/feature/mlock
modules/m_mlock: new module implementing server-side MLOCK.
-rw-r--r-- | docs/modules.conf.example | 6 | ||||
-rw-r--r-- | src/modules/m_mlock.cpp | 71 |
2 files changed, 77 insertions, 0 deletions
diff --git a/docs/modules.conf.example b/docs/modules.conf.example index 116aace52..39ea4f9cc 100644 --- a/docs/modules.conf.example +++ b/docs/modules.conf.example @@ -1038,6 +1038,12 @@ #<module name="m_messageflood.so"> #-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-# +# MLOCK module: Adds support for server-side enforcement of services +# side MLOCKs. Basically, this module suppresses any mode change that +# would likely be immediately bounced by services. +#<module name="m_mlock.so"> + +#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-# # MsSQL module: Allows other SQL modules to access MS SQL Server # through a unified API. You must copy the source for this module # from the directory src/modules/extra, plus the file m_sqlv2.h diff --git a/src/modules/m_mlock.cpp b/src/modules/m_mlock.cpp new file mode 100644 index 000000000..17deb17bd --- /dev/null +++ b/src/modules/m_mlock.cpp @@ -0,0 +1,71 @@ +/* + * InspIRCd -- Internet Relay Chat Daemon + * + * Copyright (C) 2012 William Pitcock <nenolod@dereferenced.org> + * + * This file is part of InspIRCd. InspIRCd is free software: you can + * redistribute it and/or modify it under the terms of the GNU General Public + * License as published by the Free Software Foundation, version 2. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include "inspircd.h" + +class ModuleMLock : public Module +{ +private: + StringExtItem mlock; + +public: + ModuleMLock() : mlock("mlock", this) {}; + + void init() + { + ServerInstance->Modules->Attach(I_OnPreMode, this); + } + + Version GetVersion() + { + return Version("Implements the ability to have server-side MLOCK enforcement.", VF_VENDOR); + } + + void Prioritize() + { + ServerInstance->Modules->SetPriority(this, I_OnPreMode, PRIORITY_FIRST); + } + + ModResult OnPreMode(User* source, User* dest, Channel* channel, const std::vector<std::string>& parameters) + { + if (!channel) + return MOD_RES_PASSTHRU; + + if (!IS_LOCAL(source)) + return MOD_RES_PASSTHRU; + + std::string *mlock_str = mlock.get(channel); + if (!mlock_str || mlock_str->empty()) + return MOD_RES_PASSTHRU; + + for (const char *modes = parameters[1].c_str(); *modes; modes++) + { + if (mlock_str->find(*modes)) + { + source->WriteNumeric(742, "%s %c %s :MODE cannot be set due to channel having an active MLOCK restriction policy", + channel->name.c_str(), *modes, mlock_str->c_str()); + return MOD_RES_DENY; + } + } + + return MOD_RES_PASSTHRU; + } + +}; + +MODULE_INIT(ModuleMLock) |