From 97b48b5e01bb22074ef578bfd35cde3958fc3f53 Mon Sep 17 00:00:00 2001 From: w00t Date: Sun, 3 May 2009 12:15:19 +0000 Subject: 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 --- src/modules/m_banredirect.cpp | 93 ++++++++++++++++++++++++------------------- 1 file changed, 52 insertions(+), 41 deletions(-) (limited to 'src') 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]); } } } -- cgit v1.2.3