o
    vvXj~  ã                   @   sž   d Z ddlmZmZ ddlZddlZddlmZ ddlm	Z	 G dd„ de
ƒ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.é    )Úabsolute_importÚunicode_literalsN)Ú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   úF/var/www/html/myproject/venv/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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__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   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   9   r    zAMQPLAIN.__init__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   <   s   ÿzAMQPLAIN.startNr(   r   r   r   r   r*   1   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   P   s
   ÿÿz2_get_gssapi_mechanism.<locals>.FakeGSSAPI.__init__c                 S   s   t S r   )r"   r
   r   r   r   r   W   ó   z/_get_gssapi_mechanism.<locals>.FakeGSSAPI.start©Nr,   FFr(   r   r   r   r   Ú
FakeGSSAPIK   s    
ÿr4   c                       s6   e Zd ZdZdZ		dd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.   r1   r/   r0   r-   r   r   r   r   c   s   

z._get_gssapi_mechanism.<locals>.GSSAPI.__init__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Úsockr0   ÚfamilyÚsocketÚAF_INETÚAF_INET6ÚgetpeernameÚgethostbyaddrÚhostr6   r7   r$   )r   r   r9   ÚpeerÚhostnameÚ_r   r   r   Úget_hostnamel   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ÚGSSErrorr1   r"   )r   r   rG   rB   rE   Úcontext©Úgssapir   r   r   x   s"   
ÿ
ÿüz+_get_gssapi_mechanism.<locals>.GSSAPI.startr3   )r   r   r   r   r   r   rD   r   r   rS   r   r   ÚGSSAPI[   s    
ÿ	rU   )rT   Úgssapi.raw.miscÚImportErrorr   )r4   rU   r   rS   r   Ú_get_gssapi_mechanismF   s   ñ.rX   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   ™   r2   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.startr(   r   r   r   r   r[   �   s
    r[   )r   Ú
__future__r   r   r;   r]   Úior   Úamqp.serializationr   Úobjectr   r   r*   rX   rU   rY   r[   r   r   r   r   Ú<module>   s    F