o
    j#                     @   sT   d dl mZ d dlZg ZdZdZdZee ZeefddZG dd	 d	e	Z
e
 adS )
    )print_functionN)
HTTP_X_FORWARDED_FORX_FORWARDED_FORHTTP_CLIENT_IPHTTP_X_REAL_IPHTTP_X_FORWARDEDHTTP_X_CLUSTER_CLIENT_IPHTTP_FORWARDED_FORHTTP_FORWARDEDHTTP_VIAREMOTE_ADDR)z0.z10.z169.254.z172.16.z172.17.z172.18.z172.19.z172.20.z172.21.z172.22.z172.23.z172.24.z172.25.z172.26.z172.27.z172.28.z172.29.z172.30.z172.31.z192.0.2.z192.168.z255.255.255.z	2001:db8:zfc00:zfe80:zff00:)z127.z::1c                 C   s   t | ||dadS )a  Changes global parameters for Spyne's residend ip address parser.

    :param trusted_proxies: Tuple of reverse proxies that are under YOUR control.
    :param field_precedence: A tuple of field names that may contain address
        information, in decreasing level of preference.
    :param private_ip_prefixes: You might want to add your list of
        public-but-otherwise-private ip prefixes or addresses here.
    trusted_proxiesfield_precedenceprivate_ip_prefixesN)AddressParseraddress_parserr    r   R/var/www/html/LicenciasMiG/venv/lib/python3.10/site-packages/spyne/util/address.pyset_address_parser_settingsg   s   
r   c                   @   sj   e Zd ZddefddZdd Zddd	Zdd
dZ		dddZe	dd Z
e	dd Ze	dd ZdS )r   Nr   c                 C   sV   |d ur|| _ n
tdd tD | _ t|dkr|| _n
tdd tD | _|| _d S )Nc                 S      g | ]}|  qS r   lower.0ipr   r   r   
<listcomp>       z*AddressParser.__init__.<locals>.<listcomp>r   c                 S   r   r   r   r   r   r   r   r      r   )r   tupleNON_PUBLIC_IP_PREFIXESlenr   TRUSTED_PROXIESr   )selfr   r   r   r   r   r   __init__z   s   
zAddressParser.__init__c                 C   s   | ddS )NREMOTE_PORTr   )get)r"   wsgi_envr   r   r   get_port   s   zAddressParser.get_portFc           
      C   s   d}| j D ]k}||d}|du r||ddd}|du s#|dkr$qdd |dD }|r:t|dkr:t|}|D ]3}|du sK|dksKt|sLq<|| j	sX|    S |sot
}	|du rc|}q<||	ro||	so|}q<q|S )	zC
        Returns client's best-matched ip-address, or None
        N_- c                 S      g | ]}|   qS r   stripr   r   r   r   r   r          z(AddressParser.get_ip.<locals>.<listcomp>,   )r   r%   replacesplitr    reversedr   is_valid_ip
startswithr   LOOPBACK_PREFIX)
r"   r&   real_ip_onlyright_most_proxybest_matched_ipkeyvalueipsip_strloopbackr   r   r   get_ip   s8   

zAddressParser.get_ipc                 C   s   | j |d|dS )zh
        Returns client's best-matched `real` `externally-routable` ip-address,
        or None
        T)r7   r8   )r?   )r"   r&   r8   r   r   r   get_real_ip   s   zAddressParser.get_real_ipc           	      C   s   |du r| j }|du st|dkrt}|du st|dkrdS ddg}|D ]H}||d}|du r;||ddd}|du sC|dkrDq%dd	 |d
D }t|dkrm|rZ|  |D ]}||d v rl|d     S q\q%dS )zT
        Returns client's ip-address from `trusted` proxy server(s) or None
        Nr   r   r   r(   r)   r*   c                 S   r+   r   r,   r   r   r   r   r      r.   z0AddressParser.get_trusted_ip.<locals>.<listcomp>r/   r0   )r   r    r!   r%   r1   r2   reverse)	r"   r&   r8   r   	meta_keysr:   r;   r<   proxyr   r   r   get_trusted_ip   s.   zAddressParser.get_trusted_ipc                 C   s   | du rdS z
t t j|  W dS  ty6   zt |  W n tt jfy,   Y Y dS w | ddk Y S  t jy@   Y dS w )z7
        Check the validity of an IPv4 address
        NF.   T)socket	inet_ptonAF_INETAttributeError	inet_atonerrorcountr=   r   r   r   is_valid_ipv4   s   zAddressParser.is_valid_ipv4c                 C   s8   | du rdS z
t t j|  W dS  t jy   Y dS w )z7
        Check the validity of an IPv6 address
        NFT)rH   rI   AF_INET6rM   rO   r   r   r   is_valid_ipv6   s   zAddressParser.is_valid_ipv6c                 C   s   t | p	t | S )z5
        Check the validity of an IP address
        )r   rP   rR   rO   r   r   r   r4   
  s   
zAddressParser.is_valid_ip)FF)F)FN)__name__
__module____qualname__
PRECEDENCEr#   r'   r?   r@   rE   staticmethodrP   rR   r4   r   r   r   r   r   y   s     


'
#

r   )
__future__r   rH   r!   rV   PRIVATE_IP_PREFIXESr6   r   r   objectr   r   r   r   r   r   <module>   s   *
 
