From a0d2a9da2a5571a481c93044494a04ff70fd5b68 Mon Sep 17 00:00:00 2001 From: Jeremy Fincher Date: Fri, 2 Jan 2004 20:50:43 +0000 Subject: [PATCH] Fixed bug #863808; added isIPV6. --- src/ircutils.py | 31 +++++++++++++++++++------------ test/test_ircutils.py | 6 ++++++ 2 files changed, 25 insertions(+), 12 deletions(-) diff --git a/src/ircutils.py b/src/ircutils.py index e79aa02d8..0ae0c2f99 100644 --- a/src/ircutils.py +++ b/src/ircutils.py @@ -45,6 +45,7 @@ import copy import sets import time import random +import socket import string import fnmatch import operator @@ -162,7 +163,7 @@ def hostmaskPatternEqual(pattern, hostmask): _ipchars = string.digits + '.' def isIP(s): - """Not quite perfect, but close enough until I can find the regexp I want. + """Returns whether or not a given string is an IPV4 address. >>> isIP('255.255.255.255') 1 @@ -170,16 +171,16 @@ def isIP(s): >>> isIP('abc.abc.abc.abc') 0 """ - if s.translate(string.ascii, _ipchars) == '': - quads = s.split('.') - if len(quads) <= 4: - for quad in quads: - if int(quad) >= 256: - return False - return True - else: - return False - else: + try: + return bool(socket.inet_aton(s)) + except socket.error: + return False + +def isIPV6(s): + """Returns whether or not a given string is an IPV6 address.""" + try: + return bool(socket.inet_pton(socket.AF_INET6, s)) + except socket.error: return False def banmask(hostmask): @@ -194,7 +195,13 @@ def banmask(hostmask): assert isUserHostmask(hostmask) host = hostFromHostmask(hostmask) if isIP(host): - return '*!*@%s.*' % host[:host.rfind('.')] + L = host.split('.') + L[-1] = '*' + return '*!*@' + '.'.join(L) + elif isIPV6(host): + L = host.split(':') + L[-1] = '*' + return '*!*@' + ':'.join(L) else: if '.' in host: return '*!*@*%s' % host[host.find('.'):] diff --git a/test/test_ircutils.py b/test/test_ircutils.py index ac6f8cb2d..653e3b86d 100644 --- a/test/test_ircutils.py +++ b/test/test_ircutils.py @@ -130,6 +130,11 @@ class FunctionsTestCase(unittest.TestCase): self.failUnless(ircutils.isIP('100.100.100.100')) self.failUnless(ircutils.isIP('255.255.255.255')) + def testIsIPV6(self): + f = ircutils.isIPV6 + self.failUnless(f('2001::')) + self.failUnless(f('2001:888:0:1::666')) + def testIsNick(self): self.failUnless(ircutils.isNick('jemfinch')) self.failUnless(ircutils.isNick('jemfinch0')) @@ -152,6 +157,7 @@ class FunctionsTestCase(unittest.TestCase): msg.prefix), '%r didn\'t match %r' % (msg.prefix, banmask)) self.assertEqual(ircutils.banmask('foobar!user@host'), '*!*@host') + self.assertEqual(ircutils.banmask('foo!bar@2001::'), '*!*@2001::*') def testSeparateModes(self): self.assertEqual(ircutils.separateModes(['+ooo', 'x', 'y', 'z']),