VirtualMailManager/network.py
changeset 760 b678a1c43027
parent 748 659c4476c57c
child 761 e4e656f19771
--- a/VirtualMailManager/network.py	Mon Mar 24 19:22:04 2014 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,100 +0,0 @@
-# -*- coding: UTF-8 -*-
-# Copyright (c) 2011 - 2014, Pascal Volk
-# See COPYING for distribution information.
-"""
-    VirtualMailManager.network
-    ~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-    Network/IP address related class and function
-"""
-
-import socket
-
-
-class NetInfo(object):
-    """Simple class for CIDR network addresses an IP addresses."""
-    __slots__ = ('_addr', '_prefix', '_bits_max', '_family', '_nw_addr')
-
-    def __init__(self, nw_address):
-        """Creates a new `NetInfo` instance.
-
-        Argument:
-
-        `nw_address` : basestring
-          string representation of an IPv4/IPv6 address or network address.
-          E.g. 192.0.2.13, 192.0.2.0/24, 2001:db8::/32 or ::1
-          When the address has no netmask the prefix length will be set to
-          32 for IPv4 addresses and 128 for IPv6 addresses.
-        """
-        self._addr = None
-        self._prefix = 0
-        self._bits_max = 0
-        self._family = 0
-        self._nw_addr = nw_address
-        self._parse_net_range()
-
-    def __hash__(self):
-        return hash((self._addr, self._family, self._prefix))
-
-    def __repr__(self):
-        return "NetInfo('%s')" % self._nw_addr
-
-    def _parse_net_range(self):
-        """Parse the network range of `self._nw_addr and assign values
-        to the class attributes.
-        `"""
-        sep = '/'
-        if self._nw_addr.count(sep):
-            ip_address, sep, self._prefix = self._nw_addr.partition(sep)
-            self._family, self._addr = get_ip_addr_info(ip_address)
-        else:
-            self._family, self._addr = get_ip_addr_info(self._nw_addr)
-        self._bits_max = (128, 32)[self._family is socket.AF_INET]
-        if self._prefix is 0:
-            self._prefix = self._bits_max
-        else:
-            try:
-                self._prefix = int(self._prefix)
-            except ValueError:
-                raise ValueError('Invalid prefix length: %r' % self._prefix)
-        if self._prefix > self._bits_max or self._prefix < 0:
-            raise ValueError('Invalid prefix length: %r' % self._prefix)
-
-    @property
-    def family(self):
-        """Address family: `socket.AF_INET` or `socket.AF_INET6`"""
-        return self._family
-
-    def address_in_net(self, ip_address):
-        """Checks if the `ip_address` belongs to the same subnet."""
-        family, address = get_ip_addr_info(ip_address)
-        if family != self._family:
-            return False
-        return address >> self._bits_max - self._prefix == \
-               self._addr >> self._bits_max - self._prefix
-
-
-def get_ip_addr_info(ip_address):
-    """Checks if the string `ip_address` is a valid IPv4 or IPv6 address.
-
-    When the `ip_address` could be validated successfully a tuple
-    `(address_family, address_as_long)` will be returned. The
-    `address_family`will be either `socket.AF_INET` or `socket.AF_INET6`.
-    """
-    if not isinstance(ip_address, basestring) or not ip_address:
-        raise TypeError('ip_address must be a non empty string.')
-    if not ip_address.count(':'):
-        family = socket.AF_INET
-        try:
-            address = socket.inet_aton(ip_address)
-        except socket.error:
-            raise ValueError('Not a valid IPv4 address: %r' % ip_address)
-    elif not socket.has_ipv6:
-        raise ValueError('Unsupported IP address (IPv6): %r' % ip_address)
-    else:
-        family = socket.AF_INET6
-        try:
-            address = socket.inet_pton(family, ip_address)
-        except socket.error:
-            raise ValueError('Not a valid IPv6 address: %r' % ip_address)
-    return (family, long(address.encode('hex'), 16))