ó
Ñ7ec           @   s‚   d  d l  Z  d  d l m Z d  d l m Z d  d l m Z e e d ƒ d „ Z	 d „  Z
 d „  Z d	 „  Z d
 „  Z d „  Z d S(   iÿÿÿÿN(   t   ValidationError(   t   range(   t   ugettext_lazys!   This is not a valid IPv6 address.c         C   s¶  d } d } d } d } t  |  ƒ s9 t | d d ƒ‚ n  t |  ƒ }  t |  ƒ }  | rp t |  ƒ } | rp | Sn  |  j d ƒ } x´ t t | ƒ ƒ D]  }	 d | |	 k rÂ | |	 j d ƒ | |	 <n  | |	 sÙ d | |	 <n  | |	 d k r&| d 7} | d k r|	 } n  | | k r2| } | } q2q’ d } d } q’ W| d k r| | }
 |
 t | ƒ k rn| d	 g 7} n  d	 g | | |
 +| d k rd	 g | } qn  d j	 | ƒ } | j
 ƒ  S(
   sU  
    Cleans an IPv6 address string.

    Validity is checked by calling is_valid_ipv6_address() - if an
    invalid address is passed, ValidationError is raised.

    Replaces the longest continuous zero-sequence with "::" and
    removes leading zeroes and makes sure all hextets are lowercase.

    Args:
        ip_str: A valid IPv6 address.
        unpack_ipv4: if an IPv4-mapped address is found,
        return the plain IPv4 address (default=False).
        error_message: An error message used in the ValidationError.

    Returns:
        A compressed IPv6 address, or the same value
    iÿÿÿÿi    t   codet   invalidt   :t   .t   0i   t    (   t   is_valid_ipv6_addressR    t   _explode_shorthand_ip_stringt   _sanitize_ipv4_mappingt   _unpack_ipv4t   splitR   t   lent   lstript   joint   lower(   t   ip_strt   unpack_ipv4t   error_messaget   best_doublecolon_startt   best_doublecolon_lent   doublecolon_startt   doublecolon_lent   ipv4_unpackedt   hextetst   indext   best_doublecolon_endt   result(    (    s;   /usr/local/lib/python2.7/dist-packages/django/utils/ipv6.pyt   clean_ipv6_address   sJ    

	
c         C   sÊ   |  j  ƒ  j d ƒ s |  S|  j d ƒ } d | d k r< |  Sd t | d d d !d	 ƒ t | d d d
 !d	 ƒ t | d d d !d	 ƒ t | d d d
 !d	 ƒ f } d j | d d !ƒ } | d | 7} | S(   s?  
    Sanitize IPv4 mapping in an expanded IPv6 address.

    This converts ::ffff:0a0a:0a0a to ::ffff:10.10.10.10.
    If there is nothing to sanitize, returns an unchanged
    string.

    Args:
        ip_str: A string, the expanded IPv6 address.

    Returns:
        The sanitized output string, if applicable.
    s   0000:0000:0000:0000:0000:ffff:R   R   iÿÿÿÿs   %d.%d.%d.%di   i    i   i   i   i   (   R   t
   startswithR   t   intR   (   R   R   t   ipv4_addressR   (    (    s;   /usr/local/lib/python2.7/dist-packages/django/utils/ipv6.pyR   ]   s    c         C   s-   |  j  ƒ  j d ƒ s d S|  j d d ƒ d S(   sg  
    Unpack an IPv4 address that was mapped in a compressed IPv6 address.

    This converts 0000:0000:0000:0000:0000:ffff:10.10.10.10 to 10.10.10.10.
    If there is nothing to sanitize, returns None.

    Args:
        ip_str: A string, the expanded IPv6 address.

    Returns:
        The unpacked IPv4 address, or None if there was nothing to unpack.
    s   0000:0000:0000:0000:0000:ffff:R   i   N(   R   R   t   Nonet   rsplit(   R   (    (    s;   /usr/local/lib/python2.7/dist-packages/django/utils/ipv6.pyR   ‚   s    c         C   sÌ  d d l  m } t j d ƒ } | j |  ƒ s2 t Sd |  k rB t S|  j d ƒ d k r[ t Sd |  k rk t S|  j d ƒ rŠ |  j d ƒ s© |  j d ƒ r­ |  j d ƒ r­ t S|  j d ƒ d k rÆ t Sd |  k r|  j d ƒ d k r|  j d	 ƒ d
 k rt Sn  t	 |  ƒ }  x¶ |  j
 d ƒ D]¥ } | j d	 ƒ d
 k r}|  j
 d ƒ d | k sWt Sy | | ƒ WqÄt k
 ryt SXqy2 t | d ƒ d k  sªt | d ƒ d k r®t SWqt k
 rÃt SXqWt S(   s¬   
    Ensure we have a valid IPv6 address.

    Args:
        ip_str: A string, the IPv6 address.

    Returns:
        A boolean, True if this is a valid IPv6 address.
    iÿÿÿÿ(   t   validate_ipv4_addresss   ^[0-9a-fA-F:.]+$R   s   ::i   s   :::i   R   i   i   i    iÿÿ  (   t   django.core.validatorsR$   t   ret   compilet   matcht   Falset   countR   t   endswithR
   R   R    R    t
   ValueErrort   True(   R   R$   t
   symbols_ret   hextet(    (    s;   /usr/local/lib/python2.7/dist-packages/django/utils/ipv6.pyR	   •   sB    
!*	c         C   s6  t  |  ƒ s |  S|  j d ƒ } d |  j d ƒ d k rA d } n d } t | ƒ d k rÞ t | d j d ƒ ƒ t | d j d ƒ ƒ } | d j d ƒ } x% t | | ƒ D] } | j d	 ƒ q­ W| | d j d ƒ 7} n |  j d ƒ } g  } x3 | D]+ } | j d
 d t | ƒ | j ƒ  ƒ qú Wd j | ƒ S(   sœ   
    Expand a shortened IPv6 address.

    Args:
        ip_str: A string, the IPv6 address.

    Returns:
        A string, the expanded IPv6 address.
    s   ::R   R   iÿÿÿÿi   i   i   i    t   0000R   i   (   t   _is_shorthand_ipR   R   R   t   appendR   R   (   R   R/   t   fill_tot   sept   new_ipt   __t   ret_ip(    (    s;   /usr/local/lib/python2.7/dist-packages/django/utils/ipv6.pyR
   Ù   s"    
	0)c         C   s@   |  j  d ƒ d k r t St d „  |  j d ƒ Dƒ ƒ r< t St S(   s¥   Determine if the address is shortened.

    Args:
        ip_str: A string, the IPv6 address.

    Returns:
        A boolean, True if the address is shortened.
    s   ::i   c         s   s!   |  ] } t  | ƒ d  k  Vq d S(   i   N(   R   (   t   .0t   x(    (    s;   /usr/local/lib/python2.7/dist-packages/django/utils/ipv6.pys	   <genexpr>  s    R   (   R*   R-   t   anyR   R)   (   R   (    (    s;   /usr/local/lib/python2.7/dist-packages/django/utils/ipv6.pyR1     s
    	(   R&   t   django.core.exceptionsR    t   django.utils.six.movesR   t   django.utils.translationR   t   _R)   R   R   R   R	   R
   R1   (    (    (    s;   /usr/local/lib/python2.7/dist-packages/django/utils/ipv6.pyt   <module>   s   Q	%		D	+