[Freeipa-devel] [freeipa PR#58] Ip addr validation (synchronize)

2016-09-07 Thread mbasti-rh
mbasti-rh's pull request #58: "Ip addr validation" was synchronize

See the full pull-request at https://github.com/freeipa/freeipa/pull/58
... or pull the PR as Git branch:
git remote add ghfreeipa https://github.com/freeipa/freeipa
git fetch ghfreeipa pull/58/head:pr58
git checkout pr58
From 7fc0b28b05acca51ffbdfbb04a7e1dc4212ae9a0 Mon Sep 17 00:00:00 2001
From: Martin Basti 
Date: Fri, 2 Sep 2016 13:25:19 +0200
Subject: [PATCH 1/4] Allow network ip addresses

Currently cloud environments uses heavily prefix /32 (/128) what makes
IPA validators to fail. IPA should not care if IP address is network or not.
This commit allows usage of network addresses in:
* host plugin
* dns plugin
* server-installer
* client-installer

https://fedorahosted.org/freeipa/ticket/5814
---
 ipapython/ipautil.py| 9 +
 ipaserver/plugins/dns.py| 5 ++---
 ipatests/test_ipapython/test_ipautil.py | 6 --
 3 files changed, 11 insertions(+), 9 deletions(-)

diff --git a/ipapython/ipautil.py b/ipapython/ipautil.py
index 8de9acf..8a9aa0e 100644
--- a/ipapython/ipautil.py
+++ b/ipapython/ipautil.py
@@ -132,8 +132,8 @@ class CheckedIPAddress(UnsafeIPAddress):
 Reserved or link-local addresses are never accepted.
 """
 def __init__(self, addr, match_local=False, parse_netmask=True,
- allow_network=False, allow_loopback=False,
- allow_broadcast=False, allow_multicast=False):
+ allow_loopback=False, allow_broadcast=False,
+ allow_multicast=False):
 
 super(CheckedIPAddress, self).__init__(addr)
 if isinstance(addr, CheckedIPAddress):
@@ -199,14 +199,15 @@ def __init__(self, addr, match_local=False, parse_netmask=True,
 elif self.version == 6:
 self._net = netaddr.IPNetwork(str(self) + '/64')
 
-if not allow_network and self == self._net.network:
-raise ValueError("cannot use IP network address {}".format(addr))
 if not allow_broadcast and (self.version == 4 and
 self == self._net.broadcast):
 raise ValueError("cannot use broadcast IP address {}".format(addr))
 
 self.prefixlen = self._net.prefixlen
 
+def is_network_addr(self):
+return self == self._net.network
+
 
 def valid_ip(addr):
 return netaddr.valid_ipv4(addr) or netaddr.valid_ipv6(addr)
diff --git a/ipaserver/plugins/dns.py b/ipaserver/plugins/dns.py
index f048351..a5f11a4 100644
--- a/ipaserver/plugins/dns.py
+++ b/ipaserver/plugins/dns.py
@@ -413,8 +413,7 @@ def _validate_bind_aci(ugettext, bind_acis):
 bind_aci = bind_aci[1:]
 
 try:
-ip = CheckedIPAddress(bind_aci, parse_netmask=True,
-  allow_network=True, allow_loopback=True)
+CheckedIPAddress(bind_aci, parse_netmask=True, allow_loopback=True)
 except (netaddr.AddrFormatError, ValueError) as e:
 return unicode(e)
 except UnboundLocalError:
@@ -439,7 +438,7 @@ def _normalize_bind_aci(bind_acis):
 
 try:
 ip = CheckedIPAddress(bind_aci, parse_netmask=True,
-  allow_network=True, allow_loopback=True)
+  allow_loopback=True)
 if '/' in bind_aci:# addr with netmask
 netmask = "/%s" % ip.prefixlen
 else:
diff --git a/ipatests/test_ipapython/test_ipautil.py b/ipatests/test_ipapython/test_ipautil.py
index 8c0b9c4..ea9251b 100644
--- a/ipatests/test_ipapython/test_ipautil.py
+++ b/ipatests/test_ipapython/test_ipautil.py
@@ -44,6 +44,7 @@ def check_ipaddress():
 
 def test_ip_address():
 addrs = [
+('0.0.0.0/0',),
 ('10.11.12.13', (10, 11, 12, 13),   8),
 ('10.11.12.13/14',  (10, 11, 12, 13),   14),
 ('10.11.12.13%zoneid',),
@@ -53,10 +54,11 @@ def test_ip_address():
 ('127.0.0.1',),
 ('241.1.2.3',),
 ('169.254.1.2',),
-('10.11.12.0/24',),
+('10.11.12.0/24',   (10, 11, 12, 0),   24),
 ('224.5.6.7',),
 ('10.11.12.255/24',),
 
+('::/0',),
 ('2001::1', (0x2001, 0, 0, 0, 0, 0, 0, 1), 64),
 ('2001::1/72',  (0x2001, 0, 0, 0, 0, 0, 0, 1), 72),
 ('2001::1%zoneid',  (0x2001, 0, 0, 0, 0, 0, 0, 1), 64),
@@ -66,7 +68,7 @@ def test_ip_address():
 ('::1',),
 ('6789::1',),
 ('fe89::1',),
-('2001::/64',),
+('2001::/64',   (0x2001, 0, 0, 0, 0, 0, 0, 0), 64),
 ('ff01::1',),
 
 ('junk',)

From e4167ec9df06a0508602968ea9d9b69b370a56c5 Mon Sep 17 00:00:00 2001
From: Martin Basti 
Date: Fri, 2 Sep 2016 17:07:03 +0200
Subject: [PATCH 2/4] Allow broadcast ip addresses

Currently environments may use prefix /31 on point-to-point connections what
makes IPA validators to fail. IPA should not care if IP address is broadcast
or not. In some cases (when prefix is not specified) IP

[Freeipa-devel] [freeipa PR#58] Ip addr validation (synchronize)

2016-09-07 Thread mbasti-rh
mbasti-rh's pull request #58: "Ip addr validation" was synchronize

See the full pull-request at https://github.com/freeipa/freeipa/pull/58
... or pull the PR as Git branch:
git remote add ghfreeipa https://github.com/freeipa/freeipa
git fetch ghfreeipa pull/58/head:pr58
git checkout pr58
From 7fc0b28b05acca51ffbdfbb04a7e1dc4212ae9a0 Mon Sep 17 00:00:00 2001
From: Martin Basti 
Date: Fri, 2 Sep 2016 13:25:19 +0200
Subject: [PATCH 1/4] Allow network ip addresses

Currently cloud environments uses heavily prefix /32 (/128) what makes
IPA validators to fail. IPA should not care if IP address is network or not.
This commit allows usage of network addresses in:
* host plugin
* dns plugin
* server-installer
* client-installer

https://fedorahosted.org/freeipa/ticket/5814
---
 ipapython/ipautil.py| 9 +
 ipaserver/plugins/dns.py| 5 ++---
 ipatests/test_ipapython/test_ipautil.py | 6 --
 3 files changed, 11 insertions(+), 9 deletions(-)

diff --git a/ipapython/ipautil.py b/ipapython/ipautil.py
index 8de9acf..8a9aa0e 100644
--- a/ipapython/ipautil.py
+++ b/ipapython/ipautil.py
@@ -132,8 +132,8 @@ class CheckedIPAddress(UnsafeIPAddress):
 Reserved or link-local addresses are never accepted.
 """
 def __init__(self, addr, match_local=False, parse_netmask=True,
- allow_network=False, allow_loopback=False,
- allow_broadcast=False, allow_multicast=False):
+ allow_loopback=False, allow_broadcast=False,
+ allow_multicast=False):
 
 super(CheckedIPAddress, self).__init__(addr)
 if isinstance(addr, CheckedIPAddress):
@@ -199,14 +199,15 @@ def __init__(self, addr, match_local=False, parse_netmask=True,
 elif self.version == 6:
 self._net = netaddr.IPNetwork(str(self) + '/64')
 
-if not allow_network and self == self._net.network:
-raise ValueError("cannot use IP network address {}".format(addr))
 if not allow_broadcast and (self.version == 4 and
 self == self._net.broadcast):
 raise ValueError("cannot use broadcast IP address {}".format(addr))
 
 self.prefixlen = self._net.prefixlen
 
+def is_network_addr(self):
+return self == self._net.network
+
 
 def valid_ip(addr):
 return netaddr.valid_ipv4(addr) or netaddr.valid_ipv6(addr)
diff --git a/ipaserver/plugins/dns.py b/ipaserver/plugins/dns.py
index f048351..a5f11a4 100644
--- a/ipaserver/plugins/dns.py
+++ b/ipaserver/plugins/dns.py
@@ -413,8 +413,7 @@ def _validate_bind_aci(ugettext, bind_acis):
 bind_aci = bind_aci[1:]
 
 try:
-ip = CheckedIPAddress(bind_aci, parse_netmask=True,
-  allow_network=True, allow_loopback=True)
+CheckedIPAddress(bind_aci, parse_netmask=True, allow_loopback=True)
 except (netaddr.AddrFormatError, ValueError) as e:
 return unicode(e)
 except UnboundLocalError:
@@ -439,7 +438,7 @@ def _normalize_bind_aci(bind_acis):
 
 try:
 ip = CheckedIPAddress(bind_aci, parse_netmask=True,
-  allow_network=True, allow_loopback=True)
+  allow_loopback=True)
 if '/' in bind_aci:# addr with netmask
 netmask = "/%s" % ip.prefixlen
 else:
diff --git a/ipatests/test_ipapython/test_ipautil.py b/ipatests/test_ipapython/test_ipautil.py
index 8c0b9c4..ea9251b 100644
--- a/ipatests/test_ipapython/test_ipautil.py
+++ b/ipatests/test_ipapython/test_ipautil.py
@@ -44,6 +44,7 @@ def check_ipaddress():
 
 def test_ip_address():
 addrs = [
+('0.0.0.0/0',),
 ('10.11.12.13', (10, 11, 12, 13),   8),
 ('10.11.12.13/14',  (10, 11, 12, 13),   14),
 ('10.11.12.13%zoneid',),
@@ -53,10 +54,11 @@ def test_ip_address():
 ('127.0.0.1',),
 ('241.1.2.3',),
 ('169.254.1.2',),
-('10.11.12.0/24',),
+('10.11.12.0/24',   (10, 11, 12, 0),   24),
 ('224.5.6.7',),
 ('10.11.12.255/24',),
 
+('::/0',),
 ('2001::1', (0x2001, 0, 0, 0, 0, 0, 0, 1), 64),
 ('2001::1/72',  (0x2001, 0, 0, 0, 0, 0, 0, 1), 72),
 ('2001::1%zoneid',  (0x2001, 0, 0, 0, 0, 0, 0, 1), 64),
@@ -66,7 +68,7 @@ def test_ip_address():
 ('::1',),
 ('6789::1',),
 ('fe89::1',),
-('2001::/64',),
+('2001::/64',   (0x2001, 0, 0, 0, 0, 0, 0, 0), 64),
 ('ff01::1',),
 
 ('junk',)

From e4167ec9df06a0508602968ea9d9b69b370a56c5 Mon Sep 17 00:00:00 2001
From: Martin Basti 
Date: Fri, 2 Sep 2016 17:07:03 +0200
Subject: [PATCH 2/4] Allow broadcast ip addresses

Currently environments may use prefix /31 on point-to-point connections what
makes IPA validators to fail. IPA should not care if IP address is broadcast
or not. In some cases (when prefix is not specified) IP