o
    Œ¨Êhb  ã                   @   sŒ   d Z ddlZddlZddlmZ ddlmZ G dd„ dƒZG dd„ deƒZG d	d
„ d
eƒZ	dd„ Z
e
ƒ ZG dd„ deƒZG dd„ deƒZdS )z(SASL mechanisms for AMQP authentication.é    N)ÚBytesIO)Ú_write_tablec                   @   s$   e Zd ZdZedd„ ƒZdd„ ZdS )ÚSASLz�The base class for all amqp SASL authentication mechanisms.

    You should sub-class this if you're implementing your own authentication.
    c                 C   ó   t ‚)z2Return a bytes containing the SASL mechanism name.©ÚNotImplementedError©Úself© r
   ú;/var/www/html/env/lib/python3.10/site-packages/amqp/sasl.pyÚ	mechanism   s   zSASL.mechanismc                 C   r   )z@Return the first response to a SASL challenge as a bytes object.r   ©r	   Ú
connectionr
   r
   r   Ústart   s   z
SASL.startN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Úpropertyr   r   r
   r
   r
   r   r   
   s
    
r   c                   @   ó(   e Zd ZdZdZdd„ ZdZdd„ ZdS )	ÚPLAINzbPLAIN SASL authentication mechanism.

    See https://tools.ietf.org/html/rfc4616 for details
    s   PLAINc                 C   ó   ||| _ | _d S ©N©ÚusernameÚpassword©r	   r   r   r
   r
   r   Ú__init__"   ó   zPLAIN.__init__r   c                 C   s^   | j d u s
| jd u rtS tƒ }| d¡ | | j  d¡¡ | d¡ | | j d¡¡ | ¡ S )Nó    zutf-8)r   r   ÚNotImplementedr   ÚwriteÚencodeÚgetvalue©r	   r   Úlogin_responser
   r
   r   r   *   s   

zPLAIN.startN©r   r   r   r   r   r   Ú	__slots__r   r
   r
   r
   r   r      ó    r   c                   @   r   )	ÚAMQPLAINzhAMQPLAIN SASL authentication mechanism.

    This is a non-standard mechanism used by AMQP servers.
    s   AMQPLAINc                 C   r   r   r   r   r
   r
   r   r   =   r   zAMQPLAIN.__init__r   c                 C   sF   | j d u s
| jd u rtS tƒ }t| j | jdœ|jg ƒ | ¡ dd … S )N)s   LOGINs   PASSWORDé   )r   r   r    r   r   r!   r#   r$   r
   r
   r   r   E   s   ÿzAMQPLAIN.startNr&   r
   r
   r
   r   r)   5   r(   r)   c                     sT   z
dd l ‰ dd l‰ W n ty   G dd„ dtƒ} |  Y S w G ‡ fdd„dtƒ}|S )Nr   c                   @   s*   e Zd ZdZdZ		d	dd„Zdd„ ZdS )
z)_get_gssapi_mechanism.<locals>.FakeGSSAPIz7A no-op SASL mechanism for when gssapi isn't available.Nó   amqpFc                 S   s   |st dƒ‚d S )Nz?You need to install the `gssapi` module for GSSAPI SASL supportr   ©r	   Úclient_nameÚserviceÚrdnsÚ	fail_softr
   r
   r   r   Y   s
   ÿÿz2_get_gssapi_mechanism.<locals>.FakeGSSAPI.__init__c                 S   s   t S r   )r    r   r
   r
   r   r   `   ó   z/_get_gssapi_mechanism.<locals>.FakeGSSAPI.start©Nr+   FF©r   r   r   r   r   r   r   r
   r
   r
   r   Ú
FakeGSSAPIT   s    
ÿr4   c                       s:   e Zd ZdZdZ		ddd„ZdZd	d
„ Z‡ fdd„ZdS )z%_get_gssapi_mechanism.<locals>.GSSAPIzsGSSAPI SASL authentication mechanism.

            See https://tools.ietf.org/html/rfc4752 for details
            s   GSSAPINr+   Fc                 S   s4   |rt |tƒs| d¡}|| _|| _|| _|| _d S )NÚascii)Ú
isinstanceÚbytesr"   r-   r0   r.   r/   r,   r
   r
   r   r   l   s   

z._get_gssapi_mechanism.<locals>.GSSAPI.__init__)r-   r0   r.   r/   c                 S   s^   |j j}| jr|jtjtjfv r| ¡ }t |d ¡\}}}n|j j	}t
|tƒs-| d¡}|S )Nr   r5   )Ú	transportÚsockr/   ÚfamilyÚsocketÚAF_INETÚAF_INET6ÚgetpeernameÚgethostbyaddrÚhostr6   r7   r"   )r	   r   r9   ÚpeerÚhostnameÚ_r
   r
   r   Úget_hostname|   s   ÿ

z2_get_gssapi_mechanism.<locals>.GSSAPI.get_hostnamec                    s†   z0| j rˆ jˆ  | j ¡d�}nd }|  |¡}ˆ  d | j|g¡ˆ jj¡}ˆ j||d�}| 	d ¡W S  ˆ j
jjyB   | jrAt Y S ‚ w )N)Únameó   @)rE   Úcreds)r-   ÚCredentialsÚNamerD   Újoinr.   ÚNameTypeÚhostbased_serviceÚSecurityContextÚstepÚrawÚmiscÚGSSErrorr0   r    )r	   r   rG   rB   rE   Úcontext©Úgssapir
   r   r   ˆ   s"   
ÿ
ÿüz+_get_gssapi_mechanism.<locals>.GSSAPI.startr2   )	r   r   r   r   r   r   r'   rD   r   r
   rS   r
   r   ÚGSSAPId   s    
ÿ	rU   )rT   Úgssapi.raw.miscÚImportErrorr   )r4   rU   r
   rS   r   Ú_get_gssapi_mechanismO   s   ñ5rX   c                   @   s   e Zd ZdZdZdd„ ZdS )ÚEXTERNALzËEXTERNAL SASL mechanism.

    Enables external authentication, i.e. not handled through this protocol.
    Only passes 'EXTERNAL' as authentication mechanism, but no further
    authentication data.
    s   EXTERNALc                 C   s   dS )Nó    r
   r   r
   r
   r   r   ©   r1   zEXTERNAL.startN)r   r   r   r   r   r   r
   r
   r
   r   rY   Ÿ   s    rY   c                   @   s$   e Zd ZdZdZdd„ Zdd„ ZdS )ÚRAWz±A generic custom SASL mechanism.

    This mechanism takes a mechanism name and response to send to the server,
    so can be used for simple custom authentication schemes.
    Nc                 C   s:   t |tƒsJ ‚t |tƒsJ ‚||| _| _t dt¡ d S )NznPassing login_method and login_response to Connection is deprecated. Please implement a SASL subclass instead.)r6   r7   r   ÚresponseÚwarningsÚwarnÚDeprecationWarning)r	   r   r\   r
   r
   r   r   ¶   s   þzRAW.__init__c                 C   s   | j S r   )r\   r   r
   r
   r   r   ¾   s   z	RAW.startr3   r
   r
   r
   r   r[   ­   s
    r[   )r   r;   r]   Úior   Úamqp.serializationr   r   r   r)   rX   rU   rY   r[   r
   r
   r
   r   Ú<module>   s    M