diff --git a/src/ircdb.py b/src/ircdb.py index 4e4b9aba0..9b7ac7104 100644 --- a/src/ircdb.py +++ b/src/ircdb.py @@ -564,17 +564,18 @@ def checkCapability(hostmask, capability, users=users, channels=channels): #debug.printf('isChannelCapability true, user found too.') (channel, capability) = fromChannelCapability(capability) try: - c = channels.getChannel(channel) - #debug.printf('channel found') - if capability in c.capabilities: - #debug.printf('capability in c.capabilities') - return c.checkCapability(capability) - else: - #debug.printf('capability not in c.capabilities') - return _x(capability, c.defaultAllow) + chanop = makeChannelCapability(channel, 'op') + if u.checkCapability(chanop): + return _x(capability, True) except KeyError: - #debug.printf('no such channel %s' % channel) pass + c = channels.getChannel(channel) + if capability in c.capabilities: + #debug.printf('capability in c.capabilities') + return c.checkCapability(capability) + else: + #debug.printf('capability not in c.capabilities') + return _x(capability, c.defaultAllow) if capability in conf.defaultCapabilities: #debug.printf('capability in conf.defaultCapabilities') return True diff --git a/test/test_ircdb.py b/test/test_ircdb.py index c31e36f1f..efaa08fef 100644 --- a/test/test_ircdb.py +++ b/test/test_ircdb.py @@ -35,6 +35,7 @@ import os import unittest import conf +import debug import ircdb import ircutils @@ -296,6 +297,7 @@ class CheckCapabilityTestCase(unittest.TestCase): anticap = ircdb.makeAntiCapability(cap) chancap = ircdb.makeChannelCapability(channel, cap) antichancap = ircdb.makeAntiCapability(chancap) + chanop = ircdb.makeChannelCapability(channel, 'op') channelnothing = ircdb.IrcChannel() channelcap = ircdb.IrcChannel() channelcap.addCapability(cap) @@ -393,6 +395,18 @@ class CheckCapabilityTestCase(unittest.TestCase): self.failUnless(self.checkCapability(self.justchanfoo, self.chancap)) self.failIf(self.checkCapability(self.justchanfoo, self.antichancap)) + def testChanOpCountsAsEverything(self): + self.channels.setChannel(self.channel, self.channelanticap) + id = self.users.getUserId('nothing') + u = self.users.getUser(id) + u.addCapability(self.chanop) + self.users.setUser(id, u) + self.failUnless(self.checkCapability(self.nothing, self.chancap)) + self.channels.setChannel(self.channel, self.channelnothing) + self.failUnless(self.checkCapability(self.nothing, self.chancap)) + self.channelnothing.defaultAllow = not self.channelnothing.defaultAllow + self.failUnless(self.checkCapability(self.nothing, self.chancap)) + def testAntiChanFoo(self): self.channels.setChannel(self.channel, self.channelnothing) self.failIf(self.checkCapability(self.antichanfoo, self.chancap))