§
    Ètºfñ  ã                   ó(  — d Z ddlZddlZddlmZmZmZmZ ddlm	Z	 ddl
mZmZ ddlmZ ddlmZ ddlmZ d	d
lmZmZ d	dlmZmZmZmZ  G d„ de¦  «        Z G d„ de¦  «        ZdZdZdZdZ  e	ej!        ¦  «         G d„ d¦  «        ¦   «         Z"dS )zD
IProxyParser implementation for version two of the PROXY protocol.
é    N)ÚCallableÚTupleÚTypeÚUnion)Úimplementer)ÚValueConstantÚValues)ÚLiteral)Úaddress)Úcompaté   )Ú_infoÚ_interfaces)ÚInvalidNetworkProtocolÚInvalidProxyHeaderÚMissingAddressDataÚconvertErrorc                   ój   — e Zd ZdZ ed¦  «        Z ed¦  «        Z ed¦  «        Z ed¦  «        ZdS )Ú	NetFamilyz(
    Values for the 'family' field.
    r   é   é    é0   N)	Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   ÚUNSPECÚINETÚINET6ÚUNIX© ó    úb/var/www/surfInsights/venv3-11/lib/python3.11/site-packages/twisted/protocols/haproxy/_v2parser.pyr   r      sV   € € € € € ðð ð ˆ]˜4Ñ Ô €FØˆ=˜ÑÔ€DØˆM˜$ÑÔ€EØˆ=˜ÑÔ€D€D€Dr"   r   c                   óT   — e Zd ZdZ ed¦  «        Z ed¦  «        Z ed¦  «        ZdS )ÚNetProtocolz&
    Values for 'protocol' field.
    r   r   é   N)r   r   r   r   r   r   ÚSTREAMÚDGRAMr!   r"   r#   r%   r%   )   sG   € € € € € ðð ð ˆ]˜1ÑÔ€FØˆ]˜1ÑÔ€FØˆM˜!ÑÔ€E€E€Er"   r%   éð   é   ÚLOCALÚPROXYc                   óð   — e Zd ZdZdZdgZeedœZdddddddœZ	dd„Z
ded	eeej        ef         ed         f         fd„Zeded	efd„¦   «         Zeded	efd„¦   «         Zeded	ej        fd„¦   «         Zd
S )ÚV2Parserzn
    PROXY protocol version two header parser.

    Version two of the PROXY protocol is a binary format.
    s   

 
QUIT
r   )r   r   z!4s4s2Hz	!16s16s2Hz	!108s108s)é   é   é!   é"   é1   é2   ÚreturnNc                 ó   — d| _         d S )Nr"   )Úbuffer)Úselfs    r#   Ú__init__zV2Parser.__init__P   s   € ØˆŒˆˆr"   Údata©NNc                 ót  — | xj         |z  c_         t          | j         ¦  «        dk     rt          ¦   «         ‚t          j        d| j         dd…         ¦  «        d         dz   }t          | j         ¦  «        |k     rdS | j         d|…         | j         |d…         }}d| _         |                      |¦  «        }||fS )aë  
        Consume a chunk of data and attempt to parse it.

        @param data: A bytestring.
        @type data: bytes

        @return: A two-tuple containing, in order, a L{_interfaces.IProxyInfo}
            and any bytes fed to the parser that followed the end of the
            header.  Both of these values are None until a complete header is
            parsed.

        @raises InvalidProxyHeader: If the bytes fed to the parser create an
            invalid PROXY header.
        r   z!Hé   r   r;   Nr"   )r7   Úlenr   ÚstructÚunpackÚparse)r8   r:   ÚsizeÚheaderÚ	remainingÚinfos         r#   ÚfeedzV2Parser.feedS   s·   € ð" 	ˆŒ�tÑˆŒÝˆtŒ{ÑÔ˜bÒ Ð Ý$Ñ&Ô&Ð&åŒ}˜T 4¤;¨r°"¨uÔ#5Ñ6Ô6°qÔ9¸BÑ>ˆÝˆtŒ{ÑÔ˜dÒ"Ð"Ø�<à œK¨¨¨Ô.°´¸D¸E¸EÔ0B�	ˆØˆŒØ�zŠz˜&Ñ!Ô!ˆØ�iÐ Ð r"   Ú
bytestringc                 ód   — d                      d„ t          j        | ¦  «        D ¦   «         ¦  «        S )a7  
        Convert packed 32-bit IPv4 address bytes into a dotted-quad ASCII bytes
        representation of that address.

        @param bytestring: 4 octets representing an IPv4 address.
        @type bytestring: L{bytes}

        @return: a dotted-quad notation IPv4 address.
        @rtype: L{bytes}
        ó   .c              3   ób   K  — | ]*}d t          |¦  «        fz                       d¦  «        V — Œ+dS )z%iÚasciiN)ÚordÚencode)Ú.0Úbs     r#   ú	<genexpr>z(V2Parser._bytesToIPv4.<locals>.<genexpr>}   sN   è è € ð 
ð 
Ø34ˆT•S˜‘V”V�IÑ×%Ò% gÑ.Ô.ð
ð 
ð 
ð 
ð 
ð 
r"   )Újoinr   Ú	iterbytes)rG   s    r#   Ú_bytesToIPv4zV2Parser._bytesToIPv4q   sA   € ð �yŠyð 
ð 
Ý8>Ô8HÈÑ8TÔ8Tð
ñ 
ô 
ñ 
ô 
ð 	
r"   c                 óŒ   ‡— t          j        | ¦  «        Šd                     ˆfd„t          ddd¦  «        D ¦   «         ¦  «        S )a=  
        Convert packed 128-bit IPv6 address bytes into a colon-separated ASCII
        bytes representation of that address.

        @param bytestring: 16 octets representing an IPv6 address.
        @type bytestring: L{bytes}

        @return: a dotted-quad notation IPv6 address.
        @rtype: L{bytes}
        ó   :c              3   óx   •K  — | ]4}t          ‰||d z   …         d¦  «        d›                     d¦  «        V — Œ5dS )é   r   ÚxrK   N)ÚintrM   )rN   rO   Ú	hexStrings     €r#   rP   z(V2Parser._bytesToIPv6.<locals>.<genexpr>Ž   sb   øè è € ð 
ð 
àõ �I˜a ! a¡%˜iÔ(¨"Ñ-Ô-Ð1Ð1×9Ò9¸'ÑBÔBð
ð 
ð 
ð 
ð 
ð 
r"   r   r   rW   )ÚbinasciiÚb2a_hexrQ   Úrange)rG   rZ   s    @r#   Ú_bytesToIPv6zV2Parser._bytesToIPv6�   s[   ø€ õ Ô$ ZÑ0Ô0ˆ	Ø�yŠyð 
ð 
ð 
ð 
å˜1˜b !‘_”_ð
ñ 
ô 
ñ 
ô 
ð 	
r"   Úlinec           
      óì  — |dd…         }d}t          t          t          ¦  «        5  t          |dd…         ¦  «        }t          |dd…         ¦  «        }ddd¦  «         n# 1 swxY w Y   || j        k    rt          ¦   «         ‚|t
          z  |t          z  }}|| j        vs	|| j        vrt          ¦   «         ‚| j        |         t          k    rt          j        |dd¦  «        S |t
          z  |t          z  }	}t          t          t          ¦  «        5  t                               |¦  «        }t                                |	¦  «        }	ddd¦  «         n# 1 swxY w Y   |t          j        u s|	t           j        u rt          j        |dd¦  «        S | j        |         }
|ddt'          j        |
¦  «        z   …         }|t          j        u r¯t          t&          j        t.          ¦  «        5  t'          j        |
|¦  «        \  }}ddd¦  «         n# 1 swxY w Y   t          j        |t3          j        |                     d¦  «        ¦  «        t3          j        |                     d¦  «        ¦  «        ¦  «        S d}|	t           j        u rd}t2          j        }| j        }|t          j        u rt2          j         }| j!        }t          t&          j        t.          ¦  «        5  t'          j        |
|¦  «        }|\  }}}}ddd¦  «         n# 1 swxY w Y   t          j        | || ||¦  «         "                    ¦   «         |¦  «         || ||¦  «         "                    ¦   «         |¦  «        ¦  «        S )	a‘  
        Parse a bytestring as a full PROXY protocol header.

        @param line: A bytestring that represents a valid HAProxy PROXY
            protocol version 2 header.
        @type line: bytes

        @return: A L{_interfaces.IProxyInfo} containing the
            parsed data.

        @raises InvalidProxyHeader: If the bytestring does not represent a
            valid PROXY header.
        Né   é   r=   r   ó    ÚTCPÚUDP)#r   Ú
IndexErrorr   rL   ÚPREFIXÚ_HIGHÚ_LOWÚVERSIONSÚCOMMANDSÚ_LOCALCOMMANDr   Ú	ProxyInfoÚ
ValueErrorr   r   ÚlookupByValuer%   r   ÚADDRESSFORMATSr?   Úcalcsizer    Úerrorr   r@   r   ÚUNIXAddressÚrstripr(   ÚIPv4AddressrS   r   ÚIPv6Addressr^   Údecode)Úclsr_   ÚprefixÚaddrInfoÚversionCommandÚfamilyProtoÚversionÚcommandÚfamilyÚnetprotoÚaddressFormatÚsourceÚdestÚaddrTypeÚaddrClsÚ
addrParserrE   ÚsPortÚdPorts                      r#   rA   zV2Parser.parse“   s?  € ð �c�r�c”ˆØˆÝ�*Õ&8Ñ9Ô9ð 	+ð 	+õ !  b¨ e¤Ñ-Ô-ˆNÝ˜d 2 b 5œkÑ*Ô*ˆKð		+ð 	+ð 	+ñ 	+ô 	+ð 	+ð 	+ð 	+ð 	+ð 	+ð 	+øøøð 	+ð 	+ð 	+ð 	+ð �S”ZÒÐÝ$Ñ&Ô&Ð&à)­EÑ1°>ÅDÑ3H�ˆØ˜#œ,Ð&Ð&¨'¸¼Ð*EÐ*EÝ$Ñ&Ô&Ð&àŒ<˜Ô ¥MÒ1Ð1Ý”? 4¨¨tÑ4Ô4Ð4à&­Ñ.°½dÑ0B�ˆÝ�*Õ&<Ñ=Ô=ð 	;ð 	;Ý×,Ò,¨VÑ4Ô4ˆFÝ"×0Ò0°Ñ:Ô:ˆHð	;ð 	;ð 	;ñ 	;ô 	;ð 	;ð 	;ð 	;ð 	;ð 	;ð 	;øøøð 	;ð 	;ð 	;ð 	;ð •YÔ%Ð%Ð%¨µ[Ô5GÐ)GÐ)GÝ”? 4¨¨tÑ4Ô4Ð4àÔ*¨;Ô7ˆØ˜˜R¥&¤/°-Ñ"@Ô"@Ñ@Ð@ÔAˆØ•Y”^Ð#Ð#Ý�fœlÕ,>Ñ?Ô?ð Fð FÝ%œ}¨]¸HÑEÔE‘�˜ðFð Fð Fñ Fô Fð Fð Fð Fð Fð Fð Føøøð Fð Fð Fð Få”?ØÝÔ# F§M¢M°'Ñ$:Ô$:Ñ;Ô;ÝÔ# D§K¢K°Ñ$8Ô$8Ñ9Ô9ñô ð ð ;@ˆØ•{Ô(Ð(Ð(ØˆHõ Ôð 	ð 03Ô/?ˆ
Ø•Y”_Ð$Ð$ÝÔ)ˆGØÔ)ˆJå�&œ,Õ(:Ñ;Ô;ð 	.ð 	.Ý”= °Ñ9Ô9ˆDØ)-Ñ&ˆF�D˜% ð	.ð 	.ð 	.ñ 	.ô 	.ð 	.ð 	.ð 	.ð 	.ð 	.ð 	.øøøð 	.ð 	.ð 	.ð 	.õ ŒØØˆG�H˜j˜j¨Ñ0Ô0×7Ò7Ñ9Ô9¸5ÑAÔAØˆG�H˜j˜j¨Ñ.Ô.×5Ò5Ñ7Ô7¸Ñ?Ô?ñ
ô 
ð 	
sG   §/A"Á"A&Á)A&Ä5EÅEÅEÇ+HÈHÈHË L	Ì	LÌL)r5   N)r   r   r   r   rg   rj   rl   Ú_PROXYCOMMANDrk   rp   r9   Úbytesr   r   r   rm   rF   ÚstaticmethodrS   r^   ÚclassmethodrA   r!   r"   r#   r.   r.   9   sA  € € € € € ðð ð A€FØˆt€HØ  ]Ð3Ð3€Hð ØàØàØð
ð 
€Nðð ð ð ð!Øð!à	ˆu�U”_ eÐ+Ô,¨e°JÔ.?Ð?Ô	@ð!ð !ð !ð !ð< ð
 ð 
¨5ð 
ð 
ð 
ñ „\ð
ð ð
 ð 
¨5ð 
ð 
ð 
ñ „\ð
ð" ðE
˜ð E
 5¤?ð E
ð E
ð E
ñ „[ðE
ð E
ð E
r"   r.   )#r   r[   r?   Útypingr   r   r   r   Úzope.interfacer   Ú
constantlyr   r	   Útyping_extensionsr
   Útwisted.internetr   Útwisted.pythonr   Ú r   r   Ú_exceptionsr   r   r   r   r   r%   rh   ri   rl   r‰   ÚIProxyParserr.   r!   r"   r#   ú<module>r–      s»  ððð ð €€€Ø €€€Ø /Ð /Ð /Ð /Ð /Ð /Ð /Ð /Ð /Ð /Ð /Ð /à &Ð &Ð &Ð &Ð &Ð &à ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ø %Ð %Ð %Ð %Ð %Ð %à $Ð $Ð $Ð $Ð $Ð $Ø !Ð !Ð !Ð !Ð !Ð !Ø  Ð  Ð  Ð  Ð  Ð  Ð  Ð  ðð ð ð ð ð ð ð ð ð ð ð ðð ð ð ð �ñ ô ð ðð ð ð ð �&ñ ô ð ð 	€Ø€Ø€Ø€ð €ˆ[Ô%Ñ&Ô&ð_
ð _
ð _
ð _
ð _
ñ _
ô _
ñ 'Ô&ð_
ð _
ð _
r"   