summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorw00t <w00t@e03df62e-2008-0410-955e-edbf42e46eb7>2009-05-03 12:15:19 +0000
committerw00t <w00t@e03df62e-2008-0410-955e-edbf42e46eb7>2009-05-03 12:15:19 +0000
commit97b48b5e01bb22074ef578bfd35cde3958fc3f53 (patch)
tree8844ffa34206417e2c04b35e2f2536acb251706e
parentc0d37f45572f633b57ec4e9ff3719e71f3e7c909 (diff)
Some general tidyup in here (also some possible desync fixes, check IS_LOCAL..), also check that the target channel exists and sender is opped before allowing +b redirects from a remote sender. Fixes bug #851, reported by SnoFox.
git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@11357 e03df62e-2008-0410-955e-edbf42e46eb7
-rw-r--r--src/modules/m_banredirect.cpp93
1 files changed, 52 insertions, 41 deletions
diff --git a/src/modules/m_banredirect.cpp b/src/modules/m_banredirect.cpp
index 2269f2421..9301bf4d5 100644
--- a/src/modules/m_banredirect.cpp
+++ b/src/modules/m_banredirect.cpp
@@ -116,64 +116,75 @@ class BanRedirect : public ModeWatcher
if(mask[CHAN].length())
{
- if(!IS_LOCAL(source) || ServerInstance->IsChannel(mask[CHAN].c_str(), ServerInstance->Config->Limits.ChanMax))
+ if (IS_LOCAL(source))
{
+ if (!ServerInstance->IsChannel(mask[CHAN].c_str(), ServerInstance->Config->Limits.ChanMax))
+ {
+ source->WriteNumeric(403, "%s %s :Invalid channel name in redirection (%s)", source->nick.c_str(), channel->name.c_str(), mask[CHAN].c_str());
+ return false;
+ }
+
+ Channel *c = ServerInstance->FindChan(mask[CHAN].c_str());
+ if (!c)
+ {
+ source->WriteNumeric(690, "%s :Target channel %s must exist to be set as a redirect.",source->nick.c_str(),parameter.c_str());
+ return false;
+ }
+ else if (c->GetStatus(source) < STATUS_OP)
+ {
+ source->WriteNumeric(690, "%s :You must be opped on %s to set it as a redirect.",source->nick.c_str(),parameter.c_str());
+ return false;
+ }
+
if (assign(channel->name) == mask[CHAN])
{
source->WriteNumeric(690, "%s %s :You cannot set a ban redirection to the channel the ban is on", source->nick.c_str(), channel->name.c_str());
return false;
}
- else
+ }
+
+ if(adding)
+ {
+ /* It's a properly valid redirecting ban, and we're adding it */
+ if(!channel->GetExt("banredirects", redirects))
{
- if(adding)
- {
- /* It's a properly valid redirecting ban, and we're adding it */
- if(!channel->GetExt("banredirects", redirects))
- {
- redirects = new BanRedirectList;
- channel->Extend("banredirects", redirects);
- }
+ redirects = new BanRedirectList;
+ channel->Extend("banredirects", redirects);
+ }
- /* Here 'param' doesn't have the channel on it yet */
- redirects->push_back(BanRedirectEntry(mask[CHAN].c_str(), param.c_str()));
+ /* Here 'param' doesn't have the channel on it yet */
+ redirects->push_back(BanRedirectEntry(mask[CHAN].c_str(), param.c_str()));
- /* Now it does */
- param.append(mask[CHAN]);
- }
- else
+ /* Now it does */
+ param.append(mask[CHAN]);
+ }
+ else
+ {
+ /* Removing a ban, if there's no extensible there are no redirecting bans and we're fine. */
+ if(channel->GetExt("banredirects", redirects))
+ {
+ /* But there were, so we need to remove the matching one if there is one */
+
+ for(BanRedirectList::iterator redir = redirects->begin(); redir != redirects->end(); redir++)
{
- /* Removing a ban, if there's no extensible there are no redirecting bans and we're fine. */
- if(channel->GetExt("banredirects", redirects))
+ /* Ugly as fuck */
+ if((irc::string(redir->targetchan.c_str()) == irc::string(mask[CHAN].c_str())) && (irc::string(redir->banmask.c_str()) == irc::string(param.c_str())))
{
- /* But there were, so we need to remove the matching one if there is one */
+ redirects->erase(redir);
- for(BanRedirectList::iterator redir = redirects->begin(); redir != redirects->end(); redir++)
+ if(redirects->empty())
{
- /* Ugly as fuck */
- if((irc::string(redir->targetchan.c_str()) == irc::string(mask[CHAN].c_str())) && (irc::string(redir->banmask.c_str()) == irc::string(param.c_str())))
- {
- redirects->erase(redir);
-
- if(redirects->empty())
- {
- delete redirects;
- channel->Shrink("banredirects");
- }
-
- break;
- }
+ delete redirects;
+ channel->Shrink("banredirects");
}
- }
- /* Append the channel so the default +b handler can remove the entry too */
- param.append(mask[CHAN]);
+ break;
+ }
}
}
- }
- else
- {
- source->WriteNumeric(403, "%s %s :Invalid channel name in redirection (%s)", source->nick.c_str(), channel->name.c_str(), mask[CHAN].c_str());
- return false;
+
+ /* Append the channel so the default +b handler can remove the entry too */
+ param.append(mask[CHAN]);
}
}
}