From b6225c97d37515567396a326c2d1d92ec75d2ce9 Mon Sep 17 00:00:00 2001 From: David Paleino Date: Sun, 6 May 2012 17:52:39 +0200 Subject: [PATCH] Implemented basic IPv6 support -- needs HEAVY testing --- gtk/netentry.py | 19 ++++++++++--------- tests/testmisc.py | 24 ++++++++++++++++++++++++ wicd/misc.py | 26 +++++++++++++++++++------- 3 files changed, 53 insertions(+), 16 deletions(-) diff --git a/gtk/netentry.py b/gtk/netentry.py index 538c36a..2a7efe9 100644 --- a/gtk/netentry.py +++ b/gtk/netentry.py @@ -152,18 +152,19 @@ class AdvancedSettingsDialog(gtk.Dialog): def set_defaults(self, widget=None, event=None): """ Put some default values into entries to help the user out. """ self.txt_ip.set_text(self.txt_ip.get_text().strip()) - ipAddress = self.txt_ip.get_text() # For easy typing :) + ip = self.txt_ip.get_text() # For easy typing :) netmask = self.txt_netmask gateway = self.txt_gateway - ip_parts = misc.IsValidIP(ipAddress) - if ip_parts: - if stringToNone(gateway.get_text()) is None: # Make sure the gateway box is blank - # Fill it in with a .1 at the end - gateway.set_text('.'.join(ip_parts[0:3]) + '.1') + if misc.IsValidIP(ip): + # Only do these things if it's IPv4 + if misc.IsValidIPv4(ip): + if stringToNone(gateway.get_text()) is None: # Make sure the gateway box is blank + # Fill it in with a .1 at the end + gateway.set_text(ip[:ip.rindex('.')] + '.1') - if stringToNone(netmask.get_text()) is None: # Make sure the netmask is blank - netmask.set_text('255.255.255.0') # Fill in the most common one - elif ipAddress != "": + if stringToNone(netmask.get_text()) is None: # Make sure the netmask is blank + netmask.set_text('255.255.255.0') # Fill in the most common one + elif ip != '': error(None, _('Invalid IP address entered.')) def reset_static_checkboxes(self): diff --git a/tests/testmisc.py b/tests/testmisc.py index 8c2f8cd..189964e 100644 --- a/tests/testmisc.py +++ b/tests/testmisc.py @@ -18,6 +18,18 @@ class TestMisc(unittest.TestCase): def test_valid_ip_3(self): self.assertTrue(misc.IsValidIP('10.0.1.1')) + def test_valid_ip_4(self): + self.assertTrue(misc.IsValidIP('::')) + + def test_valid_ip_5(self): + self.assertTrue(misc.IsValidIP('::1')) + + def test_valid_ip_6(self): + self.assertTrue(misc.IsValidIP('FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF')) + + def test_valid_ip_7(self): + self.assertTrue(misc.IsValidIP('2001:0db8:85a3:0000:0000:8a2e:0370:7334')) + def test_invalid_ip_1(self): self.assertFalse(misc.IsValidIP('-10.0.-1.-1')) @@ -27,6 +39,18 @@ class TestMisc(unittest.TestCase): def test_invalid_ip_3(self): self.assertFalse(misc.IsValidIP('1000.0.0.1')) + def test_invalid_ip_4(self): + self.assertFalse(misc.IsValidIP(':')) + + def test_invalid_ip_5(self): + self.assertFalse(misc.IsValidIP('1:')) + + def test_invalid_ip_6(self): + self.assertFalse(misc.IsValidIP('ZZZZ:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF')) + + def test_invalid_ip_7(self): + self.assertFalse(misc.IsValidIP('2001:0db8:85Z3:0000:0000:8a2e:0370:7334')) + def test_run_valid_regex(self): import re regex = re.compile('.*(ABC.EFG).*') diff --git a/wicd/misc.py b/wicd/misc.py index a8b09fa..0670f9b 100644 --- a/wicd/misc.py +++ b/wicd/misc.py @@ -33,6 +33,7 @@ from subprocess import Popen, STDOUT, PIPE, call from commands import getoutput from itertools import repeat, chain, izip from pipes import quote +import socket from wicd.translations import _ @@ -173,15 +174,26 @@ def IsValidIP(ip): """ Make sure an entered IP is valid. """ if not ip: return False - ipNumbers = ip.split('.') - if len(ipNumbers) < 4: - return False - - for number in ipNumbers: - if not number.isdigit() or int(number) > 255: + if not IsValidIPv4(ip): + if not IsValidIPv6(ip): return False + return True - return ipNumbers +def IsValidIPv4(ip): + ''' Make sure an entered IP is a valid IPv4. ''' + try: + socket.inet_pton(socket.AF_INET, ip) + except (TypeError, socket.error): + return False + return True + +def IsValidIPv6(ip): + ''' Make sure an entered IP is a valid IPv6. ''' + try: + socket.inet_pton(socket.AF_INET6, ip) + except (TypeError, socket.error): + return False + return True def PromptToStartDaemon(): """ Prompt the user to start the daemon """