o
    ưi~                     @   s^   d Z ddlZddlmZmZmZmZmZ ddlm	Z	 ddl
mZ ddlmZ G dd dZdS )	z
IP address utilities for MCP public/private access control.

Internal callers (private IPs) see all MCP servers.
External callers (public IPs) only see servers with available_on_public_internet=True.
    N)AnyDictListOptionalUnion)Request)verbose_proxy_logger)_get_request_ip_addressc                
   @   s2  e Zd ZdZededededededgZedee	e
  d	e	eejejf  fd
dZedee	e
  d	e	eejejf  fddZedee
 de	eejejf  d	efddZe	ddee
 dee	eejejf   d	efddZe	ddedeee
ef  d	ee
 fddZdS )IPAddressUtilsz1Static utilities for IP-based MCP access control.z
10.0.0.0/8z172.16.0.0/12z192.168.0.0/16z127.0.0.0/8z::1/128zfc00::/7configured_rangesreturnc              	   C   s\   | st jS g }| D ]}z|tj|dd W q	 ty&   td| Y q	w |r+|S t jS )zLParse configured CIDR ranges into network objects, falling back to defaults.Fstrictz4Invalid CIDR in mcp_internal_ip_ranges: %s, skipping)r
   _DEFAULT_INTERNAL_NETWORKSappend	ipaddress
ip_network
ValueErrorr   warningr   networksZcidr r   Z/home/app/Keep/.python/lib/python3.10/site-packages/litellm/proxy/auth/ip_address_utils.pyparse_internal_networks   s   z&IPAddressUtils.parse_internal_networksc              	   C   sP   | sg S g }| D ]}z| tj|dd W q ty%   td| Y qw |S )z
        Parse trusted proxy CIDR ranges for XFF validation.
        Returns empty list if not configured (XFF will not be trusted).
        Fr   z6Invalid CIDR in mcp_trusted_proxy_ranges: %s, skipping)r   r   r   r   r   r   r   r   r   r   parse_trusted_proxy_networks.   s   z+IPAddressUtils.parse_trusted_proxy_networksproxy_iptrusted_networksc                    sH   | r|sdS zt |   t fdd|D W S  ty#   Y dS w )z:Check if the direct connection IP is from a trusted proxy.Fc                 3       | ]} |v V  qd S Nr   .0networkaddrr   r   	<genexpr>L       z2IPAddressUtils.is_trusted_proxy.<locals>.<genexpr>)r   
ip_addressstripanyr   )r   r   r   r"   r   is_trusted_proxyB   s   zIPAddressUtils.is_trusted_proxyN	client_ipinternal_networksc                    sj   | sdS d| v r|  dd  } |ptj}z	t|   W n
 ty)   Y dS w t fdd|D S )z
        Check if a client IP is from an internal/private network.

        Handles X-Forwarded-For comma chains (takes leftmost = original client).
        Fails closed: empty/invalid IPs are treated as external.
        F,r   c                 3   r   r   r   r   r"   r   r   r$   k   r%   z0IPAddressUtils.is_internal_ip.<locals>.<genexpr>)splitr'   r
   r   r   r&   r   r(   )r*   r+   r   r   r"   r   is_internal_ipP   s   
zIPAddressUtils.is_internal_iprequestgeneral_settingsc                 C   s   |du rz
ddl m} |}W n ty   i }Y nw |du r i }|dd}|rPd| jv rP|d}|rP| jr;| jjnd}t|}t	||sPt
d| |S t| |d	S )
a  
        Extract client IP from a FastAPI request for MCP access control.

        Security: Only trusts X-Forwarded-For if:
        1. use_x_forwarded_for is enabled in settings
        2. The direct connection is from a trusted proxy (if mcp_trusted_proxy_ranges configured)

        Args:
            request: FastAPI request object
            general_settings: Optional settings dict. If not provided, imports from proxy_server.
        Nr   )r0   use_x_forwarded_forFzx-forwarded-forZmcp_trusted_proxy_rangesz)XFF header from untrusted IP %s, ignoring)r1   )Zlitellm.proxy.proxy_serverr0   ImportErrorgetheadersclienthostr
   r   r)   r   r   r	   )r/   r0   Zproxy_general_settingsZuse_xffZtrusted_rangesZ	direct_ipr   r   r   r   get_mcp_client_ipm   s.   
z IPAddressUtils.get_mcp_client_ipr   )__name__
__module____qualname____doc__r   r   r   staticmethodr   r   strr   IPv4NetworkIPv6Networkr   r   boolr)   r.   r   r   r   r7   r   r   r   r   r
      sb    	

r
   )r;   r   typingr   r   r   r   r   Zfastapir   Zlitellm._loggingr   Zlitellm.proxy.auth.auth_utilsr	   r
   r   r   r   r   <module>   s    