From 923a38b4edd04db455f7e60114391c2170caa879 Mon Sep 17 00:00:00 2001 From: Jeremy Fincher Date: Thu, 25 Sep 2003 07:52:03 +0000 Subject: [PATCH] Fix for RFE #811853, and fix for bug where @voice would actually try to give halfops (good thing no one ever found that :)) --- src/ChannelCommands.py | 30 ++++++++++++++------ test/test_ChannelCommands.py | 53 ++++++++++++++++++++++++++++++++++++ 2 files changed, 74 insertions(+), 9 deletions(-) create mode 100644 test/test_ChannelCommands.py diff --git a/src/ChannelCommands.py b/src/ChannelCommands.py index 64ca9d81d..7a095e83e 100755 --- a/src/ChannelCommands.py +++ b/src/ChannelCommands.py @@ -55,7 +55,10 @@ class ChannelCommands(callbacks.Privmsg): channel = privmsgs.getChannel(msg, args) capability = ircdb.makeChannelCapability(channel, 'op') if ircdb.checkCapability(msg.prefix, capability): - irc.queueMsg(ircmsgs.op(channel, msg.nick)) + if irc.nick in irc.state.channels[channel].ops: + irc.queueMsg(ircmsgs.op(channel, msg.nick)) + else: + irc.error(msg, 'How can I op you? I\'m not opped!') else: irc.error(msg, conf.replyNoCapability % capability) @@ -69,7 +72,10 @@ class ChannelCommands(callbacks.Privmsg): channel = privmsgs.getChannel(msg, args) capability = ircdb.makeChannelCapability(channel, 'halfop') if ircdb.checkCapability(msg.prefix, capability): - irc.queueMsg(ircmsgs.halfop(channel, msg.nick)) + if irc.nick in irc.state.channels[channel].ops: + irc.queueMsg(ircmsgs.halfop(channel, msg.nick)) + else: + irc.error(msg, 'How can I halfop you? I\'m not opped!') else: irc.error(msg, conf.replyNoCapability % capability) @@ -83,7 +89,10 @@ class ChannelCommands(callbacks.Privmsg): channel = privmsgs.getChannel(msg, args) capability = ircdb.makeChannelCapability(channel, 'voice') if ircdb.checkCapability(msg.prefix, capability): - irc.queueMsg(ircmsgs.halfop(channel, msg.nick)) + if irc.nick in irc.state.channels[channel].ops: + irc.queueMsg(ircmsgs.voice(channel, msg.nick)) + else: + irc.error(msg, 'How can I voice you? I\'m not opped!') else: irc.error(msg, conf.replyNoCapability % capability) @@ -119,12 +128,15 @@ class ChannelCommands(callbacks.Privmsg): banmask = ircutils.banmask(bannedHostmask) if ircdb.checkCapability(msg.prefix, capability)\ and not ircdb.checkCapability(bannedHostmask, capability): - irc.queueMsg(ircmsgs.ban(channel, banmask)) - irc.queueMsg(ircmsgs.kick(channel, bannedNick, msg.nick)) - if length > 0: - def f(): - irc.queueMsg(ircmsgs.unban(channel, banmask)) - schedule.addEvent(f, time.time() + length) + if irc.nick in irc.state.channels[channel].ops: + irc.queueMsg(ircmsgs.ban(channel, banmask)) + irc.queueMsg(ircmsgs.kick(channel, bannedNick, msg.nick)) + if length > 0: + def f(): + irc.queueMsg(ircmsgs.unban(channel, banmask)) + schedule.addEvent(f, time.time() + length) + else: + irc.error(msg, 'How can I do that? I\'m not opped.') else: irc.error(msg, conf.replyNoCapability % capability) diff --git a/test/test_ChannelCommands.py b/test/test_ChannelCommands.py new file mode 100644 index 000000000..69ea6b3d3 --- /dev/null +++ b/test/test_ChannelCommands.py @@ -0,0 +1,53 @@ +#!/usr/bin/env python + +### +# Copyright (c) 2002, Jeremiah Fincher +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, +# this list of conditions, and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions, and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# * Neither the name of the author of this software nor the name of +# contributors to this software may be used to endorse or promote products +# derived from this software without specific prior written consent. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +### + +from test import * + +import conf +import ircdb + +class ChannelCommandsTestCase(ChannelPluginTestCase, PluginDocumentation): + plugins = ('ChannelCommands',) + def testOpWithoutOps(self): + self.assertError('op') + + def testHalfOpWithoutOps(self): + self.assertError('halfop') + + def testVoiceWithoutOps(self): + self.assertError('voice') + + def testKbanWithoutOps(self): + self.assertError('kban foobar') + + +# vim:set shiftwidth=4 tabstop=8 expandtab textwidth=78: +