Merge pull request #217 from Shawn-Smith/insp20+antiredirect

[2.0] Backported user mode +L from 2.1
This commit is contained in:
Attila Molnar 2012-07-06 11:57:35 -07:00
commit 85b9374a7a
2 changed files with 53 additions and 8 deletions

View File

@ -1340,8 +1340,17 @@
#<randquote file="randquotes.conf">
#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#
# Redirect module: Adds channel redirection (mode +L)
# Redirect module: Adds channel redirection (mode +L) #
# Optional: <redirect:antiredirect> to add usermode +L to stop forced #
# redirection and instead print an error. #
# #
# Note: You can not update this with a simple rehash, it requires #
# reloading the module for it to take effect. #
# This also breaks linking to servers that do not have the option. #
# This defaults to false for the 2.0 version, it will be enabled in #
# all the future versions. #
#<module name="m_redirect.so">
#<redirect antiredirect="true">
#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#
# Regular Expression Provider for Glob or wildcard (?/*) matching.

View File

@ -1,6 +1,7 @@
/*
* InspIRCd -- Internet Relay Chat Daemon
*
* Copyright (C) 2012 Shawn Smith <ShawnSmith0828@gmail.com>
* Copyright (C) 2009 Daniel De Graaf <danieldg@inspircd.org>
* Copyright (C) 2007-2008 Robin Burchell <robin+git@viroteck.net>
* Copyright (C) 2007 Dennis Friis <peavey@inspircd.org>
@ -23,7 +24,7 @@
#include "inspircd.h"
/* $ModDesc: Provides channel mode +L (limit redirection) */
/* $ModDesc: Provides channel mode +L (limit redirection) and usermode +L (no forced redirection) */
/** Handle channel mode +L
*/
@ -86,19 +87,44 @@ class Redirect : public ModeHandler
}
};
/** Handles usermode +L to stop forced redirection and print an error.
*/
class AntiRedirect : public SimpleUserModeHandler
{
public:
AntiRedirect(Module* Creator) : SimpleUserModeHandler(Creator, "antiredirect", 'L') {}
};
class ModuleRedirect : public Module
{
Redirect re;
AntiRedirect re_u;
bool UseUsermode;
public:
ModuleRedirect()
: re(this)
: re(this), re_u(this)
{
/* Setting this here so it isn't changable by rehasing the config later. */
UseUsermode = ServerInstance->Config->ConfValue("redirect")->getBool("antiredirect");
/* Channel mode */
if (!ServerInstance->Modes->AddMode(&re))
throw ModuleException("Could not add new modes!");
/* Check to see if the usermode is enabled in the config */
if (UseUsermode)
{
/* Log noting that this breaks compatability. */
ServerInstance->Logs->Log("m_redirect", DEFAULT, "REDIRECT: Enabled usermode +L. This breaks linking with servers that do not have this enabled. This is disabled by default in the 2.0 branch but will be enabled in the next version.");
/* Try to add the usermode */
if (!ServerInstance->Modes->AddMode(&re_u))
throw ModuleException("Could not add new modes!");
}
Implementation eventlist[] = { I_OnUserPreJoin };
ServerInstance->Modules->Attach(eventlist, this, 1);
}
@ -122,10 +148,20 @@ class ModuleRedirect : public Module
user->WriteNumeric(470, "%s %s * :You may not join this channel. A redirect is set, but you may not be redirected as it is a circular loop.", user->nick.c_str(), cname);
return MOD_RES_DENY;
}
user->WriteNumeric(470, "%s %s %s :You may not join this channel, so you are automatically being transferred to the redirect channel.", user->nick.c_str(), cname, channel.c_str());
Channel::JoinUser(user, channel.c_str(), false, "", false, ServerInstance->Time());
return MOD_RES_DENY;
/* We check the bool value here to make sure we have it enabled, if we don't then
usermode +L might be assigned to something else. */
if (UseUsermode && user->IsModeSet('L'))
{
user->WriteNumeric(470, "%s %s %s :Force redirection stopped.",
user->nick.c_str(), cname, channel.c_str());
return MOD_RES_DENY;
}
else
{
user->WriteNumeric(470, "%s %s %s :You may not join this channel, so you are automatically being transferred to the redirect channel.", user->nick.c_str(), cname, channel.c_str());
Channel::JoinUser(user, channel.c_str(), false, "", false, ServerInstance->Time());
return MOD_RES_DENY;
}
}
}
}
@ -138,7 +174,7 @@ class ModuleRedirect : public Module
virtual Version GetVersion()
{
return Version("Provides channel mode +L (limit redirection)", VF_VENDOR);
return Version("Provides channel mode +L (limit redirection) and user mode +L (no forced redirection)", VF_VENDOR);
}
};