add ability to disable hostmask lookup, to prevent bot hangs up if issue with socket

This commit is contained in:
Nicolas Coevoet 2015-03-12 21:44:13 +01:00
parent 883bee94a8
commit 705a902598
2 changed files with 52 additions and 50 deletions

View File

@ -60,11 +60,13 @@ conf.registerGlobalValue(ChanTracker, 'unquietCommand',
conf.registerGlobalValue(ChanTracker, 'announceNagInterval', conf.registerGlobalValue(ChanTracker, 'announceNagInterval',
registry.Integer(300,"""interval between two check about announceNagMode, this setting is global.""")) registry.Integer(300,"""interval between two check about announceNagMode, this setting is global."""))
conf.registerGlobalValue(ChanTracker, 'resolveIp',
registry.Boolean(True, """trying to resolve host's ip with socket, could add latency"""))
#now per channel
conf.registerChannelValue(ChanTracker, 'useIpForGateway', conf.registerChannelValue(ChanTracker, 'useIpForGateway',
registry.Boolean(False, """use *!*@*ip bans instead of *!ident@gateway/* when gateways cloak is found and ends with ip.*""")) registry.Boolean(False, """use *!*@*ip bans instead of *!ident@gateway/* when gateways cloak is found and ends with ip.*"""))
#now per channel
conf.registerChannelValue(ChanTracker, 'opCommand', conf.registerChannelValue(ChanTracker, 'opCommand',
registry.String("CS OP $channel $nick", """command used to obtain channel operator mode""")) registry.String("CS OP $channel $nick", """command used to obtain channel operator mode"""))

View File

@ -74,7 +74,7 @@ def applymodes(channel, args=(), prefix='', msg=None):
mcidr = re.compile(r'^(\d{1,3}\.){0,3}\d{1,3}/\d{1,2}$') mcidr = re.compile(r'^(\d{1,3}\.){0,3}\d{1,3}/\d{1,2}$')
m6cidr = re.compile(r'^([0-9a-f]{0,4}:){2,7}[0-9a-f]{0,4}/\d{1,3}$') m6cidr = re.compile(r'^([0-9a-f]{0,4}:){2,7}[0-9a-f]{0,4}/\d{1,3}$')
def matchHostmask (pattern,n): def matchHostmask (pattern,n,resolve):
# return the machted pattern for Nick # return the machted pattern for Nick
if n.prefix == None or not ircutils.isUserHostmask(n.prefix): if n.prefix == None or not ircutils.isUserHostmask(n.prefix):
return None return None
@ -90,7 +90,7 @@ def matchHostmask (pattern,n):
else: else:
if n.ip != None: if n.ip != None:
cache[n.prefix] = n.ip cache[n.prefix] = n.ip
else: elif resolve:
try: try:
r = socket.getaddrinfo(host,None) r = socket.getaddrinfo(host,None)
if r != None: if r != None:
@ -105,7 +105,7 @@ def matchHostmask (pattern,n):
n.setIp(L[0]) n.setIp(L[0])
cache[n.prefix] = n.ip cache[n.prefix] = n.ip
except: except:
cache[n.prefix] = None cache[n.prefix] = n.prefix
try: try:
if n.ip != None and pattern.find('@') != -1 and mcidr.match(pattern.split('@')[1]) and IPAddress(u'%s' % n.ip) in IPNetwork(u'%s' % pattern.split('@')[1]): if n.ip != None and pattern.find('@') != -1 and mcidr.match(pattern.split('@')[1]) and IPAddress(u'%s' % n.ip) in IPNetwork(u'%s' % pattern.split('@')[1]):
if ircutils.hostmaskPatternEqual('%s@*' % pattern.split('@')[0],'%s!%s@%s' % (nick,ident,n.ip)): if ircutils.hostmaskPatternEqual('%s@*' % pattern.split('@')[0],'%s!%s@%s' % (nick,ident,n.ip)):
@ -170,7 +170,7 @@ def matchGecos (pattern,pat,negate,n,extprefix):
return test return test
return None return None
def match (pattern,n,irc): def match (pattern,n,irc,resolve):
if not pattern: if not pattern:
return None return None
if not n.prefix: if not n.prefix:
@ -208,17 +208,17 @@ def match (pattern,n,irc):
else: else:
# bug if ipv6 used .. # bug if ipv6 used ..
k = pattern[(pattern.rfind(':')+1):] k = pattern[(pattern.rfind(':')+1):]
cache[key] = matchHostmask(k,n) cache[key] = matchHostmask(k,n,resolve)
else: else:
p = pattern p = pattern
if p.find(extprefix) != -1: if p.find(extprefix) != -1:
p = p.split(extprefix)[0] p = p.split(extprefix)[0]
cache[key] = matchHostmask(p,n) cache[key] = matchHostmask(p,n,resolve)
return cache[key] return cache[key]
def getBestPattern (n,irc,useIp=False): def getBestPattern (n,irc,useIp=False,resolve=True):
# return best pattern for a given Nick # return best pattern for a given Nick
match(n.prefix,n,irc) match(n.prefix,n,irc,resolve)
results = [] results = []
if not n.prefix or not ircutils.isUserHostmask(n.prefix): if not n.prefix or not ircutils.isUserHostmask(n.prefix):
return [] return []
@ -453,7 +453,7 @@ class Ircd (object):
c.close() c.close()
return results return results
def against (self,irc,channel,n,prefix,db): def against (self,irc,channel,n,prefix,db,ct):
# returns active items which matchs n # returns active items which matchs n
if not channel or not n or not db: if not channel or not n or not db:
return [] return []
@ -468,7 +468,7 @@ class Ircd (object):
if len(items): if len(items):
for item in items: for item in items:
item = items[item] item = items[item]
if match(item.value,n,irc): if match(item.value,n,irc,ct.registryValue('resolveIp')):
r.append([item.uid,item.mode,item.value,item.by,item.when,item.expire]) r.append([item.uid,item.mode,item.value,item.by,item.when,item.expire])
r.sort(reverse=True) r.sort(reverse=True)
if len(r): if len(r):
@ -932,7 +932,7 @@ class Chan (object):
c.close() c.close()
return r return r
def addItem (self,mode,value,by,when,db,checkUser=True): def addItem (self,mode,value,by,when,db,checkUser=True,ct=None):
# eqIb(+*) (-ov) pattern prefix when # eqIb(+*) (-ov) pattern prefix when
# mode : eqIb -ov + ? # mode : eqIb -ov + ?
l = self.getItemsFor(mode) l = self.getItemsFor(mode)
@ -971,7 +971,7 @@ class Chan (object):
L.append(nick) L.append(nick)
for nick in L: for nick in L:
n = self.ircd.getNick(self.ircd.irc,nick) n = self.ircd.getNick(self.ircd.irc,nick)
m = match(value,n,self.ircd.irc) m = match(value,n,self.ircd.irc,ct.registryValue('resolveIp'))
if m: if m:
i.affects.append(n.prefix) i.affects.append(n.prefix)
# insert logs # insert logs
@ -1631,7 +1631,7 @@ class ChanTracker(callbacks.Plugin,plugins.ChannelDBHandler):
else: else:
irc.reply('unknow nick') irc.reply('unknow nick')
return return
results = i.against(irc,channel,n,msg.prefix,self.getDb(irc.network)) results = i.against(irc,channel,n,msg.prefix,self.getDb(irc.network),self)
if len(results): if len(results):
irc.reply(' '.join(results), private=True) irc.reply(' '.join(results), private=True)
else: else:
@ -1649,7 +1649,7 @@ class ChanTracker(callbacks.Plugin,plugins.ChannelDBHandler):
for nick in list(irc.state.channels[channel].users): for nick in list(irc.state.channels[channel].users):
if nick in i.nicks: if nick in i.nicks:
n = self.getNick(irc,nick) n = self.getNick(irc,nick)
m = match(pattern,n,irc) m = match(pattern,n,irc,self.registryValue('resolveIp'))
if m: if m:
results.append('[%s - %s]' % (nick,m)) results.append('[%s - %s]' % (nick,m))
if len(results): if len(results):
@ -1666,7 +1666,7 @@ class ChanTracker(callbacks.Plugin,plugins.ChannelDBHandler):
returns a list of hostmask's pattern, best first, mostly used for debug""" returns a list of hostmask's pattern, best first, mostly used for debug"""
i = self.getIrc(irc) i = self.getIrc(irc)
if prefix in i.nicks: if prefix in i.nicks:
irc.reply(' '.join(getBestPattern(self.getNick(irc,prefix),irc,self.registryValue('useIpForGateway',channel=channel)))) irc.reply(' '.join(getBestPattern(self.getNick(irc,prefix),irc,self.registryValue('useIpForGateway',channel=channel),self.registryValue('resolveIp'))))
else: else:
n = Nick(0) n = Nick(0)
#gecos ( $x ) #gecos ( $x )
@ -1679,7 +1679,7 @@ class ChanTracker(callbacks.Plugin,plugins.ChannelDBHandler):
else: else:
n.setPrefix(prefix) n.setPrefix(prefix)
if ircutils.isUserHostmask(prefix): if ircutils.isUserHostmask(prefix):
irc.reply(' '.join(getBestPattern(n,irc,self.registryValue('useIpForGateway',channel=channel)))) irc.reply(' '.join(getBestPattern(n,irc,self.registryValue('useIpForGateway',channel=channel),self.registryValue('resolveIp'))))
return return
irc.reply('nick not found or wrong hostmask given') irc.reply('nick not found or wrong hostmask given')
getmask = wrap(getmask,['op','text']) getmask = wrap(getmask,['op','text'])
@ -1702,7 +1702,7 @@ class ChanTracker(callbacks.Plugin,plugins.ChannelDBHandler):
i = self.getIrc(irc) i = self.getIrc(irc)
if nick in i.nicks: if nick in i.nicks:
chan = self.getChan(irc,channel) chan = self.getChan(irc,channel)
irc.reply(chan.isWrong(getBestPattern(self.getNick(irc,nick),irc,self.registryValue('useIpForGateway',channel=channel))[0])) irc.reply(chan.isWrong(getBestPattern(self.getNick(irc,nick),irc,self.registryValue('useIpForGateway',channel=channel),self.registryValue('resolveIp'))[0]))
else: else:
irc.reply('nick not found') irc.reply('nick not found')
isbad = wrap(isbad,['op','nick']) isbad = wrap(isbad,['op','nick'])
@ -1763,7 +1763,7 @@ class ChanTracker(callbacks.Plugin,plugins.ChannelDBHandler):
for item in items: for item in items:
if item in chan.nicks or item in irc.state.channels[channel].users: if item in chan.nicks or item in irc.state.channels[channel].users:
n = self.getNick(irc,item) n = self.getNick(irc,item)
patterns = getBestPattern(n,irc,self.registryValue('useIpForGateway',channel=channel)) patterns = getBestPattern(n,irc,self.registryValue('useIpForGateway',channel=channel),self.registryValue('resolveIp'))
# when resync patterns may be empty, until the bot computed WHO # when resync patterns may be empty, until the bot computed WHO
if len(patterns): if len(patterns):
targets.append(patterns[0]) targets.append(patterns[0])
@ -1804,7 +1804,7 @@ class ChanTracker(callbacks.Plugin,plugins.ChannelDBHandler):
self.log.debug('L is %s' % L) self.log.debug('L is %s' % L)
# here we check active items against Nick and add each pattern which matchs him # here we check active items against Nick and add each pattern which matchs him
for pattern in L: for pattern in L:
m = match(L[pattern].value,n,irc) m = match(L[pattern].value,n,irc,self.registryValue('resolveIp'))
if m: if m:
targets.append(L[pattern].value) targets.append(L[pattern].value)
elif ircutils.isUserHostmask(item) or item.find(self.getIrcdExtbansPrefix(irc)) != -1: elif ircutils.isUserHostmask(item) or item.find(self.getIrcdExtbansPrefix(irc)) != -1:
@ -2125,7 +2125,7 @@ class ChanTracker(callbacks.Plugin,plugins.ChannelDBHandler):
if irc.isChannel(channel) and channel in irc.state.channels: if irc.isChannel(channel) and channel in irc.state.channels:
if mode in self.registryValue('modesToAsk',channel=channel) or mode in self.registryValue('modesToAskWhenOpped',channel=channel): if mode in self.registryValue('modesToAsk',channel=channel) or mode in self.registryValue('modesToAskWhenOpped',channel=channel):
chan = self.getChan(irc,channel) chan = self.getChan(irc,channel)
item = chan.addItem(mode,value,prefix,float(date),self.getDb(irc.network),False) item = chan.addItem(mode,value,prefix,float(date),self.getDb(irc.network),False,self)
# added expire date if new modes were added when the bot was offline # added expire date if new modes were added when the bot was offline
expire = self.registryValue('autoExpire',channel=item.channel) expire = self.registryValue('autoExpire',channel=item.channel)
if expire > 0 and item.isNew: if expire > 0 and item.isNew:
@ -2267,21 +2267,21 @@ class ChanTracker(callbacks.Plugin,plugins.ChannelDBHandler):
return return
for channel in channels: for channel in channels:
if ircutils.isChannel(channel) and channel in irc.state.channels: if ircutils.isChannel(channel) and channel in irc.state.channels:
best = getBestPattern(n,irc,self.registryValue('useIpForGateway',channel=channel))[0] best = getBestPattern(n,irc,self.registryValue('useIpForGateway',channel=channel),self.registryValue('resolveIp'))[0]
chan = self.getChan(irc,channel) chan = self.getChan(irc,channel)
chan.nicks[msg.nick] = True chan.nicks[msg.nick] = True
n.addLog(channel,'has joined') n.addLog(channel,'has joined')
c = ircdb.channels.getChannel(channel) c = ircdb.channels.getChannel(channel)
banned = False banned = False
if not self._isVip(irc,channel,n): if not self._isVip(irc,channel,n):
if self.registryValue('checkEvade',channel=channel) and msg.prefix.find('/ip.') != -1: if self.registryValue('checkEvade',channel=channel) and msg.prefix.find('/ip.') != -1 and self.registryValue('resolveIp'):
items = chan.getItemsFor('b') items = chan.getItemsFor('b')
for k in items: for k in items:
item = items[k] item = items[k]
if ircutils.isUserHostmask(item.value): if ircutils.isUserHostmask(item.value):
n = Nick(0) n = Nick(0)
n.setPrefix(item.value) n.setPrefix(item.value)
if match('*!*@%s' % msg.prefix.split('ip.')[1],n,irc): if match('*!*@%s' % msg.prefix.split('ip.')[1],n,irc,self.registryValue('resolveIp')):
self._act (irc,channel,'b',best,self.registryValue('autoExpire',channel=channel),'evade of [#%s +%s %s]' % (item.uid,item.mode,item.value)) self._act (irc,channel,'b',best,self.registryValue('autoExpire',channel=channel),'evade of [#%s +%s %s]' % (item.uid,item.mode,item.value))
f = None f = None
banned = True banned = True
@ -2298,7 +2298,7 @@ class ChanTracker(callbacks.Plugin,plugins.ChannelDBHandler):
n = Nick(0) n = Nick(0)
n.setPrefix(item.value) n.setPrefix(item.value)
pat = '*!*@%s' % msg.prefix.split('ip.')[1] pat = '*!*@%s' % msg.prefix.split('ip.')[1]
if pat != item.value and match(pat,n,irc): if pat != item.value and match(pat,n,irc,self.registryValue('resolveIp')):
f = None f = None
if self.registryValue('announceBotMark',channel=channel): if self.registryValue('announceBotMark',channel=channel):
f = self._logChan f = self._logChan
@ -2306,7 +2306,7 @@ class ChanTracker(callbacks.Plugin,plugins.ChannelDBHandler):
break break
if not banned and c.bans and len(c.bans) and self.registryValue('useChannelBansForPermanentBan',channel=channel): if not banned and c.bans and len(c.bans) and self.registryValue('useChannelBansForPermanentBan',channel=channel):
for ban in list(c.bans): for ban in list(c.bans):
if match (ban,n,irc): if match (ban,n,irc,self.registryValue('resolveIp')):
if i.add(irc,channel,'b',best,self.registryValue('autoExpire',channel=channel),irc.prefix,self.getDb(irc.network)): if i.add(irc,channel,'b',best,self.registryValue('autoExpire',channel=channel),irc.prefix,self.getDb(irc.network)):
banned = True banned = True
self.forceTickle = True self.forceTickle = True
@ -2340,7 +2340,7 @@ class ChanTracker(callbacks.Plugin,plugins.ChannelDBHandler):
del i.channels[channel] del i.channels[channel]
continue continue
if ircutils.isChannel(channel) and channel in irc.state.channels: if ircutils.isChannel(channel) and channel in irc.state.channels:
best = getBestPattern(n,irc,self.registryValue('useIpForGateway',channel=channel))[0] best = getBestPattern(n,irc,self.registryValue('useIpForGateway',channel=channel),self.registryValue('resolveIp'))[0]
if len(reason): if len(reason):
if reason.startswith('requested by') and self.registryValue('announceKick',channel=channel): if reason.startswith('requested by') and self.registryValue('announceKick',channel=channel):
if self.registryValue('useColorForAnnounces',channel=channel): if self.registryValue('useColorForAnnounces',channel=channel):
@ -2354,7 +2354,7 @@ class ChanTracker(callbacks.Plugin,plugins.ChannelDBHandler):
items = chan.getItemsFor(mode) items = chan.getItemsFor(mode)
for k in items: for k in items:
item = items[k] item = items[k]
f = match(item.value,n,irc) f = match(item.value,n,irc,self.registryValue('resolveIp'))
if f: if f:
found = item found = item
break break
@ -2427,7 +2427,7 @@ class ChanTracker(callbacks.Plugin,plugins.ChannelDBHandler):
items = chan.getItemsFor(mode) items = chan.getItemsFor(mode)
for k in items: for k in items:
item = items[k] item = items[k]
f = match(item.value,n,irc) f = match(item.value,n,irc,self.registryValue('resolveIp'))
if f: if f:
found = item found = item
break break
@ -2443,7 +2443,7 @@ class ChanTracker(callbacks.Plugin,plugins.ChannelDBHandler):
def _rmNick (self,irc,n): def _rmNick (self,irc,n):
def nrm(): def nrm():
patterns = getBestPattern(n,irc,self.registryValue('useIpForGateway')) patterns = getBestPattern(n,irc,self.registryValue('useIpForGateway'),self.registryValue('resolveIp'))
i = self.getIrc(irc) i = self.getIrc(irc)
if not len(patterns): if not len(patterns):
return return
@ -2456,7 +2456,7 @@ class ChanTracker(callbacks.Plugin,plugins.ChannelDBHandler):
if nick in i.nicks: if nick in i.nicks:
del i.nicks[nick] del i.nicks[nick]
for channel in irc.state.channels: for channel in irc.state.channels:
best = getBestPattern(n,irc,self.registryValue('useIpForGateway',channel=channel))[0] best = getBestPattern(n,irc,self.registryValue('useIpForGateway',channel=channel),self.registryValue('resolveIp'))[0]
if channel in i.channels: if channel in i.channels:
chan = self.getChan(irc,channel) chan = self.getChan(irc,channel)
if nick in chan.nicks: if nick in chan.nicks:
@ -2504,7 +2504,7 @@ class ChanTracker(callbacks.Plugin,plugins.ChannelDBHandler):
return return
if not isBot: if not isBot:
n = self.getNick(irc,msg.nick) n = self.getNick(irc,msg.nick)
patterns = getBestPattern(n,irc,self.registryValue('useIpForGateway')) patterns = getBestPattern(n,irc,self.registryValue('useIpForGateway'),self.registryValue('resolveIp'))
best = None best = None
if len(patterns): if len(patterns):
best = patterns[0] best = patterns[0]
@ -2530,7 +2530,7 @@ class ChanTracker(callbacks.Plugin,plugins.ChannelDBHandler):
chan = self.getChan(irc,channel) chan = self.getChan(irc,channel)
if msg.nick in chan.nicks: if msg.nick in chan.nicks:
if not self._isVip(irc,channel,n): if not self._isVip(irc,channel,n):
best = getBestPattern(n,irc,self.registryValue('useIpForGateway',channel=channel))[0] best = getBestPattern(n,irc,self.registryValue('useIpForGateway',channel=channel),self.registryValue('resolveIp'))[0]
isCycle = self._isSomething(irc,channel,best,'cycle') isCycle = self._isSomething(irc,channel,best,'cycle')
if isCycle: if isCycle:
isBad = self._isSomething(irc,channel,best,'bad') isBad = self._isSomething(irc,channel,best,'bad')
@ -2570,13 +2570,13 @@ class ChanTracker(callbacks.Plugin,plugins.ChannelDBHandler):
n = self.getNick(irc,newNick) n = self.getNick(irc,newNick)
n.addLog('ALL','%s is now known as %s' % (oldNick,newNick)) n.addLog('ALL','%s is now known as %s' % (oldNick,newNick))
best = None best = None
patterns = getBestPattern(n,irc,self.registryValue('useIpForGateway')) patterns = getBestPattern(n,irc,self.registryValue('useIpForGateway'),self.registryValue('resolveIp'))
if len(patterns): if len(patterns):
best = patterns[0] best = patterns[0]
if not best: if not best:
return return
for channel in irc.state.channels: for channel in irc.state.channels:
best = getBestPattern(n,irc,self.registryValue('useIpForGateway',channel=channel))[0] best = getBestPattern(n,irc,self.registryValue('useIpForGateway',channel=channel),self.registryValue('resolveIp'))[0]
if newNick in irc.state.channels[channel].users: if newNick in irc.state.channels[channel].users:
chan = self.getChan(irc,channel) chan = self.getChan(irc,channel)
if oldNick in chan.nicks: if oldNick in chan.nicks:
@ -2660,7 +2660,7 @@ class ChanTracker(callbacks.Plugin,plugins.ChannelDBHandler):
for item in items: for item in items:
# only check against ~a:,$a: bans # only check against ~a:,$a: bans
if items[item].value.startswith(self.getIrcdExtbansPrefix(irc)) and items[item].value[1] == 'a': if items[item].value.startswith(self.getIrcdExtbansPrefix(irc)) and items[item].value[1] == 'a':
f = match(items[item].value,n,irc) f = match(items[item].value,n,irc,self.registryValue('resolveIp'))
if f: if f:
found = items[item] found = items[item]
if found: if found:
@ -2671,12 +2671,12 @@ class ChanTracker(callbacks.Plugin,plugins.ChannelDBHandler):
duration = -1 duration = -1
if found.expire and found.expire != found.when: if found.expire and found.expire != found.when:
duration = int(found.expire-time.time()) duration = int(found.expire-time.time())
r = self.getIrcdMode(irc,found.mode,getBestPattern(n,irc,self.registryValue('useIpForGateway',channel=channel))[0]) r = self.getIrcdMode(irc,found.mode,getBestPattern(n,irc,self.registryValue('useIpForGateway',channel=channel),self.registryValue('resolveIp'))[0])
self._act (irc,channel,r[0],r[1],duration,'evade of [#%s +%s %s]' % (found.uid,found.mode,found.value)) self._act (irc,channel,r[0],r[1],duration,'evade of [#%s +%s %s]' % (found.uid,found.mode,found.value))
f = None f = None
if self.registryValue('announceBotMark',channel=found.channel): if self.registryValue('announceBotMark',channel=found.channel):
f = self._logChan f = self._logChan
i.mark(irc,found.uid,'evade with %s --> %s' % (msg.prefix,getBestPattern(n,irc,self.registryValue('useIpForGateway',channel=channel))[0]),irc.prefix,self.getDb(irc.network),f,self) i.mark(irc,found.uid,'evade with %s --> %s' % (msg.prefix,getBestPattern(n,irc,self.registryValue('useIpForGateway',channel=channel),self.registryValue('resolveIp'))[0]),irc.prefix,self.getDb(irc.network),f,self)
self.forceTickle = True self.forceTickle = True
self._tickle(irc) self._tickle(irc)
@ -2704,7 +2704,7 @@ class ChanTracker(callbacks.Plugin,plugins.ChannelDBHandler):
if msg.nick == irc.nick: if msg.nick == irc.nick:
return return
n = self.getNick(irc,msg.nick) n = self.getNick(irc,msg.nick)
patterns = getBestPattern(n,irc,self.registryValue('useIpForGateway')) patterns = getBestPattern(n,irc,self.registryValue('useIpForGateway'),self.registryValue('resolveIp'))
best = False best = False
if len(patterns): if len(patterns):
best = patterns[0] best = patterns[0]
@ -2712,7 +2712,7 @@ class ChanTracker(callbacks.Plugin,plugins.ChannelDBHandler):
return return
for channel in targets.split(','): for channel in targets.split(','):
if irc.isChannel(channel) and channel in irc.state.channels: if irc.isChannel(channel) and channel in irc.state.channels:
best = getBestPattern(n,irc,self.registryValue('useIpForGateway',channel=channel))[0] best = getBestPattern(n,irc,self.registryValue('useIpForGateway',channel=channel),self.registryValue('resolveIp'))[0]
chan = self.getChan(irc,channel) chan = self.getChan(irc,channel)
n.addLog(channel,'NOTICE | %s' % text) n.addLog(channel,'NOTICE | %s' % text)
isVip = self._isVip(irc,channel,n) isVip = self._isVip(irc,channel,n)
@ -2789,7 +2789,7 @@ class ChanTracker(callbacks.Plugin,plugins.ChannelDBHandler):
i = self.getIrc(irc) i = self.getIrc(irc)
if ircutils.isUserHostmask(msg.prefix): if ircutils.isUserHostmask(msg.prefix):
n = self.getNick(irc,msg.nick) n = self.getNick(irc,msg.nick)
patterns = getBestPattern(n,irc,self.registryValue('useIpForGateway')) patterns = getBestPattern(n,irc,self.registryValue('useIpForGateway'),self.registryValue('resolveIp'))
if len(patterns): if len(patterns):
best = patterns[0] best = patterns[0]
# if it fails here stacktrace # if it fails here stacktrace
@ -2799,7 +2799,7 @@ class ChanTracker(callbacks.Plugin,plugins.ChannelDBHandler):
return return
for channel in recipients.split(','): for channel in recipients.split(','):
if irc.isChannel(channel) and channel in irc.state.channels: if irc.isChannel(channel) and channel in irc.state.channels:
best = getBestPattern(n,irc,self.registryValue('useIpForGateway',channel=channel))[0] best = getBestPattern(n,irc,self.registryValue('useIpForGateway',channel=channel),self.registryValue('resolveIp'))[0]
chan = self.getChan(irc,channel) chan = self.getChan(irc,channel)
message = text message = text
if isCtcpMsg and not isAction: if isCtcpMsg and not isAction:
@ -2900,7 +2900,7 @@ class ChanTracker(callbacks.Plugin,plugins.ChannelDBHandler):
for mode in modes: for mode in modes:
items = chan.getItemsFor(mode) items = chan.getItemsFor(mode)
for item in items: for item in items:
f = match(items[item].value,n,irc) f = match(items[item].value,n,irc,self.registryValue('resolveIp'))
if f: if f:
found = [items[item],f] found = [items[item],f]
if found: if found:
@ -3026,14 +3026,14 @@ class ChanTracker(callbacks.Plugin,plugins.ChannelDBHandler):
b = '$j:%s' % fromChannel b = '$j:%s' % fromChannel
kicks = [] kicks = []
for channel in irc.state.channels: for channel in irc.state.channels:
if b in irc.state.channels[channel].bans and mode in self.registryValue('kickMode',channel=channel) and not value.startswith('m:'): if b in irc.state.channels[channel].bans and mode in self.registryValue('kickMode',channel=channel) and not target.startswith('m:'):
L = [] L = []
for nick in list(irc.state.channels[channel].users): for nick in list(irc.state.channels[channel].users):
L.append(nick) L.append(nick)
for nick in L: for nick in L:
if not self._isVip(irc,channel,self.getNick(irc,nick)): if not self._isVip(irc,channel,self.getNick(irc,nick)):
n = self.getNick(irc,nick) n = self.getNick(irc,nick)
m = match(target,n,irc) m = match(target,n,irc,self.registryValue('resolveIp'))
if m: if m:
kicks.append([nick,channel]) kicks.append([nick,channel])
if len(kicks): if len(kicks):
@ -3071,7 +3071,7 @@ class ChanTracker(callbacks.Plugin,plugins.ChannelDBHandler):
item = None item = None
if '+' in mode: if '+' in mode:
if m in self.registryValue('modesToAskWhenOpped',channel=channel) or m in self.registryValue('modesToAsk',channel=channel): if m in self.registryValue('modesToAskWhenOpped',channel=channel) or m in self.registryValue('modesToAsk',channel=channel):
item = chan.addItem(m,value,msg.prefix,now,self.getDb(irc.network),self.registryValue('trackAffected',channel=channel)) item = chan.addItem(m,value,msg.prefix,now,self.getDb(irc.network),self.registryValue('trackAffected',channel=channel),self)
if msg.nick != irc.nick and self.registryValue('askOpAboutMode',channel=channel) and ircdb.checkCapability(msg.prefix, '%s,op' % channel): if msg.nick != irc.nick and self.registryValue('askOpAboutMode',channel=channel) and ircdb.checkCapability(msg.prefix, '%s,op' % channel):
data = [item.uid,m,value,channel,msg.prefix,'For [#%s %s %s in %s - %s user(s)] type <duration> <reason>, you have 3 minutes' % (item.uid,'+%s' % m,value,channel,len(item.affects)),False] data = [item.uid,m,value,channel,msg.prefix,'For [#%s %s %s in %s - %s user(s)] type <duration> <reason>, you have 3 minutes' % (item.uid,'+%s' % m,value,channel,len(item.affects)),False]
if self.registryValue('useColorForAnnounces',channel=channel): if self.registryValue('useColorForAnnounces',channel=channel):
@ -3093,7 +3093,7 @@ class ChanTracker(callbacks.Plugin,plugins.ChannelDBHandler):
if len(items): if len(items):
for active in items: for active in items:
active = items[active] active = items[active]
if match(active.value,self.getNick(irc,nick),irc): if match(active.value,self.getNick(irc,nick),irc,self.registryValue('resolveIp')):
tolift.append(active) tolift.append(active)
kicked = False kicked = False
if m in self.registryValue('kickMode',channel=channel) and not value.startswith('m:'): # and not value.startswith(self.getIrcdExtbans(irc)) works for unreal if m in self.registryValue('kickMode',channel=channel) and not value.startswith('m:'): # and not value.startswith(self.getIrcdExtbans(irc)) works for unreal
@ -3287,7 +3287,7 @@ class ChanTracker(callbacks.Plugin,plugins.ChannelDBHandler):
for nick in list(irc.state.channels[channel].users): for nick in list(irc.state.channels[channel].users):
if nick in i.nicks and nick != irc.nick: if nick in i.nicks and nick != irc.nick:
n = self.getNick(irc,nick) n = self.getNick(irc,nick)
m = match(mask,n,irc) m = match(mask,n,irc,self.registryValue('resolveIp'))
if m: if m:
results.append(nick) results.append(nick)
if len(results) and mode in 'kr': if len(results) and mode in 'kr':