a
    SicÁ  ã                   @   sp   d dl Z ddlmZ dd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ ZdS )é    Né   )Údefaultsc                 C   s&   |   ¡  ¡ } |  d¡r"|  dd¡S | S )z2
    Given ip address string, it cleans it up
    z::ffff:Ú )ÚstripÚlowerÚ
startswithÚreplace)Úip© r
   úH/var/www/html/django/DPS/env/lib/python3.9/site-packages/ipware/utils.pyÚ
cleanup_ip   s    
r   c                 C   sx   zt  t j| ¡ W n` ty^   zt  | ¡ W n tt jfyJ   Y Y dS 0 |  d¡dk Y S  t jyr   Y dS 0 dS )z/
    Check the validity of an IPv4 address
    FÚ.é   T)ÚsocketÚ	inet_ptonÚAF_INETÚAttributeErrorÚ	inet_atonÚerrorÚcount©Úip_strr
   r
   r   Úis_valid_ipv4   s    
r   c                 C   s.   zt  t j| ¡ W n t jy(   Y dS 0 dS )z/
    Check the validity of an IPv6 address
    FT)r   r   ÚAF_INET6r   r   r
   r
   r   Úis_valid_ipv6!   s
    r   c                 C   s   t | ƒpt| ƒS )z-
    Check the validity of an IP address
    )r   r   r   r
   r
   r   Úis_valid_ip,   s    r   c                 C   s   |   tj¡S )zM
    Returns true of ip_str is private & not routable, else return false
    )r   ÚdefsZIPWARE_NON_PUBLIC_IP_PREFIXr   r
   r
   r   Úis_private_ip3   s    r   c                 C   s
   t | ƒ S ©zH
    Returns true of ip_str is public & routable, else return false
    )r   r   r
   r
   r   Úis_public_ip:   s    r   c                 C   s   |   tj¡S r   )r   r   ZIPWARE_LOOPBACK_PREFIXr   r
   r
   r   Úis_loopback_ipA   s    r    c              	   C   s4   | j  || j  | dd¡d¡¡ ¡ }|dkr0dS |S )z^
    Given a key, it returns a cleaned up version of the value from request.META, or None
    Ú_ú-r   N)ÚMETAÚgetr   r   )ÚrequestÚkeyÚvaluer
   r
   r   Úget_request_metaH   s    $r(   c                 C   sf   g }|   d¡D ]}| ¡  ¡ }|r| |¡ qt|ƒ}|dkr^t|d ƒr^t|d ƒr^||fS g dfS )zM
    Given a string, it returns a list of one or more valid IP addresses
    ú,r   éÿÿÿÿ)Úsplitr   r   ÚappendÚlenr   )r   Zip_listr	   Úclean_ipÚip_countr
   r
   r   Úget_ips_from_stringR   s    r0   c                 C   s,   d}d}t | ƒ}t|ƒr$|}t|ƒ}||fS )z?
    Given a string, it returns a tuple of (IP, Routable).
    NF)r   r   r   )r   r	   Zis_routable_ipr.   r
   r
   r   Úget_ip_infoe   s    r1   c                 C   s8   | du r|S t | ƒr t |ƒs | S t| ƒr4t|ƒr4| S |S )zž
    Given two IP addresses, it returns the the best match ip.
    Order of precedence is (Public, Private, Loopback, None)
    Right-most IP is returned
    N)r   r   r    )Zlast_ipZnext_ipr
   r
   r   Úget_best_ipr   s    r2   )r   r   r   r   r   r   r   r   r   r   r    r(   r0   r1   r2   r
   r
   r
   r   Ú<module>   s   

