Ë
    RPf�  ã                  óà   — d dl mZ d dlZd dlZd dlZd dlmZmZmZ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mZ dd	lmZmZ d
dgZeeef   Zdd„Z G d„ d
e«      Z	 	 	 	 d	 	 	 	 	 	 	 	 	 dd„Zy)é    )ÚannotationsN)ÚAnyÚ	AwaitableÚCallableÚIterableÚOptionalÚTupleÚUnionÚcasté   )ÚHeaders)ÚInvalidHeader)Úbuild_www_authenticate_basicÚparse_authorization_basicé   )ÚHTTPResponseÚWebSocketServerProtocolÚ BasicAuthWebSocketServerProtocolÚbasic_auth_protocol_factoryc                ó|   — 	 | \  }}t        |t        «      xr t        |t        «      S # t        t        f$ r Y yw xY w©NF)Ú
isinstanceÚstrÚ	TypeErrorÚ
ValueError)ÚvalueÚusernameÚpasswords      úP/var/www/fastapitest/venv/lib/python3.12/site-packages/websockets/legacy/auth.pyÚis_credentialsr       sF   € ðGØ"Ñˆ�(ô ˜(¤CÓ(ÒF¬Z¸Ä#Ó-FÐFøô ”zÐ"ò Ùðús   ‚) ©;º;c                  ó€   ‡ — e Zd ZU dZdZded<   	 dZded<   	 dddœ	 	 	 	 	 	 	 	 	 dˆ fd	„Zdd
„Z	 	 	 	 	 	 dˆ fd„Z	ˆ xZ
S )r   zC
    WebSocket server protocol that enforces HTTP Basic Auth.

    Ú r   ÚrealmNúOptional[str]r   ©r#   Úcheck_credentialsc               óD   •— |�|| _         || _        t        ‰| �  |i |¤Ž y ©N)r#   Ú_check_credentialsÚsuperÚ__init__)Úselfr#   r&   ÚargsÚkwargsÚ	__class__s        €r   r+   z)BasicAuthWebSocketServerProtocol.__init__-   s,   ø€ ð ÐØˆDŒJØ"3ˆÔÜ‰Ñ˜$Ð) &Ó)ó    c              ƒ  ó\   K  — | j                   �| j                  ||«      ƒ d{  –—† S y7 Œ­w)aÈ  
        Check whether credentials are authorized.

        This coroutine may be overridden in a subclass, for example to
        authenticate against a database or an external service.

        Args:
            username: HTTP Basic Auth username.
            password: HTTP Basic Auth password.

        Returns:
            bool: :obj:`True` if the handshake should continue;
            :obj:`False` if it should fail with an HTTP 401 error.

        NF)r)   )r,   r   r   s      r   r&   z2BasicAuthWebSocketServerProtocol.check_credentials9   s3   è ø€ ð  ×"Ñ"Ð.Ø×0Ñ0°¸8ÓD×DÐDàð Eús   ‚",¤*¥,c              ƒ  ó  •K  — 	 |d   }	 t        |«      \  }}| j                  ||«      ƒ d{  –—† s3t        j                  j                  dt	        | j
                  «      fgdfS || _	        t        ‰| �-  ||«      ƒ d{  –—† S # t         $ r6 t        j                  j                  dt	        | j
                  «      fgdfcY S w xY w# t        $ r6 t        j                  j                  dt	        | j
                  «      fgdfcY S w xY w7 ŒÚ7 ŒŠ­w)zS
        Check HTTP Basic Auth and return an HTTP 401 response if needed.

        ÚAuthorizationzWWW-Authenticates   Missing credentials
s   Unsupported credentials
Ns   Invalid credentials
)ÚKeyErrorÚhttpÚ
HTTPStatusÚUNAUTHORIZEDr   r#   r   r   r&   r   r*   Úprocess_request)r,   ÚpathÚrequest_headersÚauthorizationr   r   r/   s         €r   r8   z0BasicAuthWebSocketServerProtocol.process_requestN   s  øè ø€ ð	Ø+¨OÑ<ˆMð	Ü!:¸=Ó!IÑˆH�hð ×+Ñ+¨H°hÓ?×?Ð?ä—‘×,Ñ,Ø$Ô&BÀ4Ç:Á:Ó&NÐOÐPØ(ðð ð !ˆŒä‘WÑ,¨T°?ÓC×CÐCøô3 ò 	ä—‘×,Ñ,Ø$Ô&BÀ4Ç:Á:Ó&NÐOÐPØ(ðò ð	ûô ò 	ä—‘×,Ñ,Ø$Ô&BÀ4Ç:Á:Ó&NÐOÐPØ,ðò ð	úð @øð Dúsa   ƒD…B ‹C ™D®D	¯ADÂ DÂDÂ<CÃDÃCÃDÃ<DÄDÄDÄDÄD)
r-   r   r#   r$   r&   ú/Optional[Callable[[str, str], Awaitable[bool]]]r.   r   ÚreturnÚNone©r   r   r   r   r=   Úbool)r9   r   r:   r   r=   zOptional[HTTPResponse])Ú__name__Ú
__module__Ú__qualname__Ú__doc__r#   Ú__annotations__r   r+   r&   r8   Ú__classcell__)r/   s   @r   r   r      s•   ø… ñð
 €Eˆ3ƒOðð #€HˆmÓ"Ø-ð
  $ØMQñ	
*àð
*ð ð
*ð Kð	
*ð
 ð
*ð 
õ
*óð*$Dàð$Dð !ð$Dð 
 ÷	$Dñ $Dr0   c                ó^  ‡— |du |du k(  rt        d«      ‚|�wt        |«      rt        t        |«      g}nIt	        |t
        «      r+t        |«      }t        d„ |D «       «      st        d|› �«      ‚t        d|› �«      ‚t        |«      Šdˆfd„}|€t        }t        j                  || |¬«      S )a  
    Protocol factory that enforces HTTP Basic Auth.

    :func:`basic_auth_protocol_factory` is designed to integrate with
    :func:`~websockets.server.serve` like this::

        websockets.serve(
            ...,
            create_protocol=websockets.basic_auth_protocol_factory(
                realm="my dev server",
                credentials=("hello", "iloveyou"),
            )
        )

    Args:
        realm: Scope of protection. It should contain only ASCII characters
            because the encoding of non-ASCII characters is undefined.
            Refer to section 2.2 of :rfc:`7235` for details.
        credentials: Hard coded authorized credentials. It can be a
            ``(username, password)`` pair or a list of such pairs.
        check_credentials: Coroutine that verifies credentials.
            It receives ``username`` and ``password`` arguments
            and returns a :class:`bool`. One of ``credentials`` or
            ``check_credentials`` must be provided but not both.
        create_protocol: Factory that creates the protocol. By default, this
            is :class:`BasicAuthWebSocketServerProtocol`. It can be replaced
            by a subclass.
    Raises:
        TypeError: If the ``credentials`` or ``check_credentials`` argument is
            wrong.

    Nz/provide either credentials or check_credentialsc              3  ó2   K  — | ]  }t        |«      –— Œ y ­wr(   )r    )Ú.0Úitems     r   ú	<genexpr>z.basic_auth_protocol_factory.<locals>.<genexpr>£   s   è ø€ ÒI°”~ d×+ÑIùs   ‚zinvalid credentials argument: c              “  ób   •K  — 	 ‰|    }t        j                  ||«      S # t         $ r Y yw xY w­wr   )r4   ÚhmacÚcompare_digest)r   r   Úexpected_passwordÚcredentials_dicts      €r   r&   z6basic_auth_protocol_factory.<locals>.check_credentialsª   s@   øè ø€ ðØ$4°XÑ$>Ð!ô ×&Ñ&Ð'8¸(ÓCÐCøô ò Ùðüs   ƒ/…  Š/ 	,©/«,¬/r%   r?   )r   r    r   ÚCredentialsr   r   ÚlistÚallÚdictr   Ú	functoolsÚpartial)r#   Úcredentialsr&   Úcreate_protocolÚcredentials_listrP   s        @r   r   r   u   sÈ   ø€ ðL 	�tÐÐ!2°dÐ!:Ò;ÜÐIÓJÐJàÐÜ˜+Ô&Ü $¤[°+Ó >Ð?ÑÜ˜¤XÔ.Ü# KÓ0ÐÜÑIÐ8HÔIÔIÜÐ"@ÀÀÐ NÓOÐOäÐ<¸[¸MÐJÓKÐKäÐ 0Ó1Ðõ	Dð ÐÜ:ˆä×ÑØØØ+ôð r0   )r   r   r=   r@   )NNNN)
r#   r$   rW   z3Optional[Union[Credentials, Iterable[Credentials]]]r&   r<   rX   z9Optional[Callable[..., BasicAuthWebSocketServerProtocol]]r=   z/Callable[..., BasicAuthWebSocketServerProtocol])Ú
__future__r   rU   rM   r5   Útypingr   r   r   r   r   r	   r
   r   Údatastructuresr   Ú
exceptionsr   Úheadersr   r   Úserverr   r   Ú__all__r   rQ   r    r   r   © r0   r   ú<module>rb      s¡   ðÝ "ã Û Û ß S× SÓ Så $Ý &ß Mß 9ð .Ð/LÐ
M€à�C˜�H‰o€óGôVDÐ'>ô VDðt  ØGKØIMØQUð	CØðCàDðCð GðCð Oð	Cð
 5ôCr0   