
    i                        d dl Z d dlZd dlZd dlZd dlZddlmZ ej        rd dlm	Z	  ej
        d          Z G d de j                  Z ej        d	          d
edej        eef         fd            Z ej        d	          dededefd            Zdedej        eef         fdZdej        eej        eef         f         dej        eef         fdZdS )    N   )
StrOrBytesSOCKS5ATypez'^\[(?P<address>[^\]]+)\]:(?P<port>\d+)$c                   2    e Zd ZdZdZdZed	d            ZdS )
AddressTypeIPV4IPV6DNsocks5atyper   returnc                     ddl m} ||j        k    rt          j        S ||j        k    rt          j        S ||j        k    rt          j        S t          |          )Nr   r   )
socksio.socks5r   IPV4_ADDRESSr   r	   DOMAIN_NAMEr   IPV6_ADDRESSr
   
ValueError)clsr   r   s      T/home/ubuntu/.hermes/hermes-agent/venv/lib/python3.11/site-packages/socksio/utils.pyfrom_socks5_atypezAddressType.from_socks5_atype   sf    ......+222##K333>!K444##%%%    N)r   r   r   r   )__name__
__module____qualname__r	   r
   r   classmethodr    r   r   r   r      sA        DD	B	& 	& 	& [	& 	& 	&r   r   @   )maxsizeaddrr   c                    t          | t                    r|                                 n| } 	 t          j        t          j        t
          j        |           fS # t          $ ra 	 t          j	        t          j        t
          j
        |           fcY S # t          $ r% t          j        |                                 fcY cY S w xY ww xY w)zKDetermines the type of address and encodes it into the format SOCKS expects)
isinstancebytesdecoder   r
   socket	inet_ptonAF_INET6OSErrorr	   AF_INETr   encode)r   s    r   encode_addressr*   "   s     'tU33=4;;===D1!1&/4!H!HHH 1 1 1	1#V%5fnd%K%KKKKK 	1 	1 	1>4;;==000000	11s/   *A 
C#*BC*B?:C>B??Caddress_typeencoded_addrc                 
   | t           j        k    rt          j        t          j        |          S | t           j        k    rt          j        t          j        |          S | t           j        k    sJ |                                S )z&Decodes the address from a SOCKS reply)	r   r
   r$   	inet_ntopr&   r	   r(   r   r#   )r+   r,   s     r   decode_addressr/   /   so     {'''>>>	)	)	)==={~----""$$$r   addressc                 x   t          | t                    r|                                 n| } t          j        t
          |           }|r+|                    d          |                    d          }} n|                     d          \  } }}	 | t          |          fS # t          $ r t          d          dw xY w)zReturns a tuple (address: str, port: int) from an address string with a port
    i.e. '127.0.0.1:8080', '[0:0:0:0:0:0:0:1]:3080' or 'localhost:8080'.

    Note no validation is done on the domain or IP itself.
    r0   port:zInvalid address + port. Please supply a valid domain name, IPV4 or IPV6 address with the port as a suffix, i.e. `127.0.0.1:3080`, `[0:0:0:0:0:0:0:1]:3080` or `localhost:3080`N)
r!   r"   r#   rematchIP_V6_WITH_PORT_REGEXgroup	partitionintr   )r0   r5   str_port_s       r   split_address_port_from_stringr<   ;   s     #-We"<"<Ignn'GH*G44E 6!KK	22EKK4G4G&0055HH%%   ;
 
 		s   B B9c                    t          | t                    rZ| \  } }t          | t                    r|                                 } t          |t          t          f          rt          |          }nt          |           \  } }| |fS )z@Returns an (address, port) from an address string-like or tuple.)r!   tupler"   r#   strr9   r<   )r0   r2   s     r   #get_address_port_tuple_from_addressr@   R   s~     '5!! @gu%% 	'nn&&GdS%L)) 	t99D6w??D=r   )enum	functoolsr4   r$   typing_typesr   TYPE_CHECKINGr   r   compiler6   Enumr   	lru_cacheTupler"   r*   r?   r/   r9   r<   Unionr@   r   r   r   <module>rK      s        				        	 +****** #
#MNN & & & & &$) & & &$ R   	1 	1[%5G(H 	1 	1 	1 ! 	1 R   % %E %c % % % ! %J 6<S;Q    .\*fl:s?&CCD\#s(     r   