Source code for wtforglib.ipaddress_foos

"""Top-level module for wtforglib Library."""

from ipaddress import IPv6Address, IPv6Network, ip_address, ip_network

MAX_PREFIX_LENGTH6 = 128


def _get_ipv6_prefix(ipv6_addr: str, prefix_len: int) -> str:  # noqa: WPS210
    """Retruns prefix of ipv6 address.

    Parameters
    ----------
    ipv6_addr : str
        The ipv6 address
    prefix_len : int
        The length of the prefix

    Returns
    -------
    str
        The ipv6 network prefix

    Raises
    ------
    ValueError
        When the prefix length is not valid
    """
    valid_lengths = (16, 32, 48, 64, 80, 96, 112, 128)
    if prefix_len not in valid_lengths:
        raise ValueError(
            "Invalid prefix length: {0}. Expected one of {1}".format(
                prefix_len,
                ",".join(str(xx) for xx in valid_lengths),
            ),
        )
    prefix = ""
    cur_prefix_len = 0
    prefix_increment = 16
    ipv6_parts = ipv6_addr.split(":")
    for part in ipv6_parts:
        if prefix:
            prefix = "{0}:{1}".format(prefix, part)
        else:
            prefix = part
        cur_prefix_len += prefix_increment
        if int(cur_prefix_len) >= int(prefix_len):
            return prefix
    return prefix  # pragma no cover


[docs] def is_ipv6_address(ipaddr: str) -> bool: """Returns True if ipaddr is a valid IPv6 address. Parameters ---------- ipaddr : str A string representation of a IPv6 address Returns ------- bool True if ipaddr is a valid IPv6 address """ try: osix = ip_address(ipaddr) return isinstance(osix, IPv6Address) except ValueError: return False
[docs] def is_ipv6_network(ipaddr: str) -> bool: """Returns True if ipaddr is a valid IPv6 network. Parameters ---------- ipaddr : str A string representation of a IPv6 network Returns ------- bool True if ipaddr is a valid IPv6 network """ try: osix = ip_network(ipaddr) return isinstance(osix, IPv6Network) except ValueError: return False
[docs] def is_ipv6(ipvalue: str) -> bool: """Returns True if ipvalue is a valid IPv6 address or IPv6 network. Parameters ---------- ipvalue : str A string representation of a IPv6 address or IPv6 network Returns ------- bool True if ipvalue is a valid IPv6 address or IPv6 network """ if not is_ipv6_address(ipvalue): return is_ipv6_network(ipvalue) return True
[docs] def ipv6_to_netprefix( ipaddr: str, prefix_len: int, ipv6net_style: str = "standard" ) -> str: """Returns ipv6 network prefix. Parameters ---------- ipaddr : str The ip address prefix_len : int The network prefix length ipv6net_style : string One of standard, postfix Returns ------- str ipv6 network prefix Example: '1111:2222:3333:4444::/64' or postfix style ipv6 network prefix Example: '[1111:2222:3333:4444::]/64' Raises ------ ValueError When ipaddr is not a valid ipv6 address """ ipobj = ip_address(ipaddr) if isinstance(ipobj, IPv6Address): if prefix_len == MAX_PREFIX_LENGTH6: if ipv6net_style == "postfix": return "[{0}]/{1}".format(str(ipobj), prefix_len) return "{0}/{1}".format(str(ipobj), prefix_len) if ipv6net_style == "postfix": return "[{0}::]/{1}".format( _get_ipv6_prefix(ipaddr, prefix_len), prefix_len, ) return "{0}::/{1}".format(_get_ipv6_prefix(ipaddr, prefix_len), prefix_len) raise ValueError("Invalid ipv6 address: {0}".format(ipaddr))