§
    ‹ŸjÑ?  ã                   ó˜   — d 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ZddlmZ ddlmZ ddlmZ dZd	Z G d
„ d¦  «        ZddgZdS )z*Base implementation of 0MQ authentication.é    N)ÚAnyÚ	AwaitableÚDictÚListÚOptionalÚSetÚTupleÚUnion)Ú_check_version)Úz85é   )Úload_certificatesÚ*s   1.0c                   ó’  — e Zd ZU dZded<   eed<   eed<   eeef         ed<   ded<   e	e         ed	<   e	e         ed
<   eeeeef         f         ed<   eeee
ef         f         ed<   eed<   	 	 	 d1ded         dedefd„Zd2d„Zd2d„Zdeddfd„Zdeddfd„Z	 d3dedeeeef                  ddfd„Z	 d4dedeeej        f         ddfd„Z	 d3dededdfd„Zde
defd „Z	 d3dedee         ddfd!„Zd"ee
         fd#„Zded$ed%edeee
f         fd&„Zded'e
deee
f         fd(„Zded)e
deee
f         fd*„Z	 d5d,e
d-e
d.e
d/eddf
d0„ZdS )6ÚAuthenticatoraü  Implementation of ZAP authentication for zmq connections.

    This authenticator class does not register with an event loop. As a result,
    you will need to manually call `handle_zap_message`::

        auth = zmq.Authenticator()
        auth.allow("127.0.0.1")
        auth.start()
        while True:
            await auth.handle_zap_msg(auth.zap_socket.recv_multipart())

    Alternatively, you can register `auth.zap_socket` with a poller.

    Since many users will want to run ZAP in a way that does not block the
    main thread, other authentication classes (such as :mod:`zmq.auth.thread`)
    are provided.

    Note:

    - libzmq provides four levels of security: default NULL (which the Authenticator does
      not see), and authenticated NULL, PLAIN, CURVE, and GSSAPI, which the Authenticator can see.
    - until you add policies, all incoming NULL connections are allowed.
      (classic ZeroMQ behavior), and all PLAIN and CURVE connections are denied.
    - GSSAPI requires no configuration.
    zzmq.ContextÚcontextÚencodingÚ	allow_anyÚcredentials_providersz
zmq.SocketÚ
zap_socketÚ_allowedÚ_deniedÚ	passwordsÚcertsÚlogNúutf-8c                 óF  — t          dd¦  «         |pt          j                             ¦   «         | _        || _        d| _        i | _        d | _        t          ¦   «         | _
        t          ¦   «         | _        i | _        i | _        |pt          j        d¦  «        | _        d S )N)é   r   ÚsecurityFzzmq.auth)r   ÚzmqÚContextÚinstancer   r   r   r   r   Úsetr   r   r   r   ÚloggingÚ	getLoggerr   )Úselfr   r   r   s       úZ/var/www/finuniver-perm.ru/html/student/venv/lib/python3.11/site-packages/zmq/auth/base.pyÚ__init__zAuthenticator.__init__:   sŽ   € õ 	�v˜zÑ*Ô*Ð*ØÐ8¥#¤+×"6Ò"6Ñ"8Ô"8ˆŒØ ˆŒØˆŒØ%'ˆÔ"ØˆŒÝ™œˆŒÝ‘u”uˆŒð ˆŒð ˆŒ
ØÐ7�'Ô+¨JÑ7Ô7ˆŒˆˆó    Úreturnc                 óð   — | j                              t          j        t          j        ¬¦  «        | _        d| j        _        | j                             d¦  «         | j         	                    d¦  «         dS )zCreate and bind the ZAP socket)Úsocket_classr   zinproc://zeromq.zap.01ÚStartingN)
r   Úsocketr    ÚREPÚSocketr   ÚlingerÚbindr   Údebug©r&   s    r'   ÚstartzAuthenticator.startP   s]   € àœ,×-Ò-­c¬gÅCÄJÐ-ÑOÔOˆŒØ!"ˆŒÔØŒ×ÒÐ5Ñ6Ô6Ð6ØŒ�Š�zÑ"Ô"Ð"Ð"Ð"r)   c                 óT   — | j         r| j                              ¦   «          d| _         dS )zClose the ZAP socketN)r   Úcloser4   s    r'   ÚstopzAuthenticator.stopW   s+   € àŒ?ð 	$ØŒO×!Ò!Ñ#Ô#Ð#ØˆŒˆˆr)   Ú	addressesc                 óÂ   — | j         rt          d¦  «        ‚| j                             dd                     |¦  «        ¦  «         | j                             |¦  «         dS )a6  Allow IP address(es).

        Connections from addresses not explicitly allowed will be rejected.

        - For NULL, all clients from this address will be accepted.
        - For real auth setups, they will be allowed to continue with authentication.

        allow is mutually exclusive with deny.
        z Only use allow or deny, not bothzAllowing %sú,N)r   Ú
ValueErrorr   r3   Újoinr   Úupdate©r&   r9   s     r'   ÚallowzAuthenticator.allow]   s\   € ð Œ<ð 	AÝÐ?Ñ@Ô@Ð@ØŒ�Š�} c§h¢h¨yÑ&9Ô&9Ñ:Ô:Ð:ØŒ×Ò˜YÑ'Ô'Ð'Ð'Ð'r)   c                 óÂ   — | j         rt          d¦  «        ‚| j                             dd                     |¦  «        ¦  «         | j                             |¦  «         dS )z§Deny IP address(es).

        Addresses not explicitly denied will be allowed to continue with authentication.

        deny is mutually exclusive with allow.
        z"Only use a allow or deny, not bothz
Denying %sr;   N)r   r<   r   r3   r=   r   r>   r?   s     r'   ÚdenyzAuthenticator.denyl   s\   € ð Œ=ð 	CÝÐAÑBÔBÐBØŒ�Š�| S§X¢X¨iÑ%8Ô%8Ñ9Ô9Ð9ØŒ×Ò˜IÑ&Ô&Ð&Ð&Ð&r)   r   Údomainc                 óT   — |r
|| j         |<   | j                             d|¦  «         dS )zõConfigure PLAIN authentication for a given domain.

        PLAIN authentication uses a plain-text password file.
        To cover all domains, use "*".
        You can modify the password file at any time; it is reloaded automatically.
        zConfigure plain: %sN©r   r   r3   )r&   rC   r   s      r'   Úconfigure_plainzAuthenticator.configure_plainx   s5   € ð ð 	/Ø%.ˆDŒN˜6Ñ"ØŒ�ŠÐ,¨fÑ5Ô5Ð5Ð5Ð5r)   ú.Úlocationc                 ó  — | j                              d||¦  «         |t          k    r	d| _        dS d| _        	 t	          |¦  «        | j        |<   dS # t          $ r'}| j                              d||¦  «         Y d}~dS d}~ww xY w)a	  Configure CURVE authentication for a given domain.

        CURVE authentication uses a directory that holds all public client certificates,
        i.e. their public keys.

        To cover all domains, use "*".

        You can add and remove certificates in that directory at any time. configure_curve must be called
        every time certificates are added or removed, in order to update the Authenticator's state

        To allow all client keys without checking, specify CURVE_ALLOW_ANY for the location.
        zConfigure curve: %s[%s]TFz&Failed to load CURVE certs from %s: %sN)r   r3   ÚCURVE_ALLOW_ANYr   r   r   Ú	ExceptionÚerror)r&   rC   rH   Úes       r'   Úconfigure_curvezAuthenticator.configure_curve…   s©   € ð" 	Œ�ŠÐ0°&¸(ÑCÔCÐCØ•Ò&Ð&Ø!ˆDŒNˆNˆNà"ˆDŒNðVÝ%6°xÑ%@Ô%@�”
˜6Ñ"Ð"Ð"øÝð Vð Vð VØ”—’ÐGÈÐSTÑUÔUÐUÐUÐUÐUÐUÐUÐUøøøøðVøøøs   ¹A Á
BÁA>Á>BÚcredentials_providerc                 óf   — d| _         |�|| j        |<   dS | j                             d|¦  «         dS )aÁ  Configure CURVE authentication for a given domain.

        CURVE authentication using a callback function validating
        the client public key according to a custom mechanism, e.g. checking the
        key against records in a db. credentials_provider is an object of a class which
        implements a callback method accepting two parameters (domain and key), e.g.::

            class CredentialsProvider(object):

                def __init__(self):
                    ...e.g. db connection

                def callback(self, domain, key):
                    valid = ...lookup key and/or domain in db
                    if valid:
                        logging.info('Authorizing: {0}, {1}'.format(domain, key))
                        return True
                    else:
                        logging.warning('NOT Authorizing: {0}, {1}'.format(domain, key))
                        return False

        To cover all domains, use "*".
        FNz0None credentials_provider provided for domain:%s)r   r   r   rL   )r&   rC   rO   s      r'   Úconfigure_curve_callbackz&Authenticator.configure_curve_callback    sA   € ð6 ˆŒàÐ+Ø1EˆDÔ& vÑ.Ð.Ð.àŒH�NŠNÐMÈvÑVÔVÐVÐVÐVr)   Úclient_public_keyc                 óP   — t          j        |¦  «                             d¦  «        S )að  Return the User-Id corresponding to a CURVE client's public key

        Default implementation uses the z85-encoding of the public key.

        Override to define a custom mapping of public key : user-id

        This is only called on successful authentication.

        Parameters
        ----------
        client_public_key: bytes
            The client public key used for the given message

        Returns
        -------
        user_id: unicode
            The user ID as text
        Úascii)r   ÚencodeÚdecode)r&   rR   s     r'   Úcurve_user_idzAuthenticator.curve_user_idÂ   s#   € õ& ŒzÐ+Ñ,Ô,×3Ò3°GÑ<Ô<Ð<r)   c                 ó   — dS )z~Configure GSSAPI authentication

        Currently this is a no-op because there is nothing to configure with GSSAPI.
        N© )r&   rC   rH   s      r'   Úconfigure_gssapizAuthenticator.configure_gssapi×   s   € € € r)   Úmsgc           	   ƒ   ór  ‡ K  — t          |¦  «        dk     rh‰ j                             d|¦  «         t          |¦  «        dk     r‰ j                             d¦  «         n‰                      |d         dd¦  «         dS |dd…         \  }}}}}}|dd…         }|                     ‰ j        d	¦  «        }|                     ‰ j        d	¦  «        }|t          k    r4‰ j                             d
|¦  «         ‰                      |dd¦  «         dS ‰ j                             d||||||¦  «         d}	d}
d}‰ j        rG|‰ j        v rd}	‰ j                             d|¦  «         nmd}
d}‰ j                             d|¦  «         nM‰ j	        rF|‰ j	        v r d}
d}‰ j                             d|¦  «         nd}	‰ j                             d|¦  «         d}|
�s¯|dk    r |	s‰ j                             d¦  «         d}	�n‰|dk    rtt          |¦  «        dk    r4‰ j                             d|¦  «         ‰                      |dd¦  «         dS ˆ fd„|D ¦   «         \  }}‰  
                    |||¦  «        \  }	}�n|dk    r†t          |¦  «        dk    r4‰ j                             d|¦  «         ‰                      |dd¦  «         dS |d         }‰                      ||¦  «        ƒ d{V —†\  }	}|	r‰                      |¦  «        }nƒ|d k    r}t          |¦  «        dk    r4‰ j                             d!|¦  «         ‰                      |dd¦  «         dS |d         }|                     d"¦  «        }‰                      ||¦  «        \  }	}|	r‰                      |d#d$|¦  «         dS ‰                      |d|¦  «         dS )%zPerform ZAP authenticationé   z*Invalid ZAP message, not enough frames: %ré   zNot enough information to replyr   s   400s   Not enough framesNÚreplacezInvalid ZAP version: %rs   Invalid versionzQversion: %r, request_id: %r, domain: %r, address: %r, identity: %r, mechanism: %rFs	   NO ACCESSTzPASSED (allowed) address=%ss   Address not allowedzDENIED (not allowed) address=%ss   Address deniedzDENIED (denied) address=%szPASSED (not denied) address=%sÚ	anonymouss   NULLzALLOWED (NULL)s   PLAINzInvalid PLAIN credentials: %rs   Invalid credentialsc              3   óN   •K  — | ]}|                      ‰j        d ¦  «        V — Œ dS )r_   N)rV   r   )Ú.0Úcr&   s     €r'   ú	<genexpr>z3Authenticator.handle_zap_message.<locals>.<genexpr>$  sD   øè è € ð &ð &Ø;<�A—H’H˜Tœ]¨IÑ6Ô6ð&ð &ð &ð &ð &ð &r)   s   CURVEzInvalid CURVE credentials: %rr   s   GSSAPIzInvalid GSSAPI credentials: %rÚutf8ó   200ó   OK)Úlenr   rL   Ú_send_zap_replyrV   r   ÚVERSIONr3   r   r   Ú_authenticate_plainÚ_authenticate_curverW   Ú_authenticate_gssapi)r&   r[   ÚversionÚ
request_idrC   ÚaddressÚidentityÚ	mechanismÚcredentialsÚallowedÚdeniedÚreasonÚusernameÚpasswordÚkeyÚ	principals   `               r'   Úhandle_zap_messagez Authenticator.handle_zap_messageß   sF  øè è € åˆs‰8Œ8�aŠ<ˆ<ØŒH�NŠNÐGÈÑMÔMÐMÝ�3‰xŒx˜!Š|ˆ|Ø”—’Ð@ÑAÔAÐAÐAà×$Ò$ S¨¤V¨VÐ5IÑJÔJÐJØˆFàDGÈÈÈÄGÑAˆ�˜V W¨h¸	Ø˜!˜"˜"”gˆà—’˜tœ}¨iÑ8Ô8ˆØ—.’. ¤°	Ñ:Ô:ˆà•gÒÐØŒH�NŠNÐ4°cÑ:Ô:Ð:Ø× Ò  ¨VÐ5GÑHÔHÐHØˆFàŒ�Šð8àØØØØØñ		
ô 		
ð 		
ð ˆØˆØˆàŒ=ð 	JØ˜$œ-Ð'Ð'Ø�Ø”—’Ð<¸gÑFÔFÐFÐFà�Ø/�Ø”—’Ð@À'ÑJÔJÐJÐJàŒ\ð 	JØ˜$œ,Ð&Ð&Ø�Ø*�Ø”—’Ð;¸WÑEÔEÐEÐEà�Ø”—’Ð?ÀÑIÔIÐIð ˆØñ $	OØ˜GÒ#Ð#¨GÐ#à”—’Ð/Ñ0Ô0Ð0Ø�‘à˜hÒ&Ð&å�{Ñ#Ô# qÒ(Ð(Ø”H—N’NÐ#BÀKÑPÔPÐPØ×(Ò(¨°VÐ=SÑTÔTÐTØ�Fð&ð &ð &ð &Ø@Kð&ñ &ô &Ñ"�˜(ð #'×":Ò":¸6À8ÈXÑ"VÔ"V‘�˜™à˜hÒ&Ð&å�{Ñ#Ô# qÒ(Ð(Ø”H—N’NÐ#BÀKÑPÔPÐPØ×(Ò(¨°VÐ=SÑTÔTÐTØ�FØ! !”n�Ø(,×(@Ò(@ÀÈÑ(MÔ(MÐ"MÐ"MÐ"MÐ"MÐ"MÐ"M‘�˜Øð 7Ø#×1Ò1°#Ñ6Ô6�Høà˜iÒ'Ð'Ý�{Ñ#Ô# qÒ(Ð(Ø”H—N’NÐ#CÀ[ÑQÔQÐQØ×(Ò(¨°VÐ=SÑTÔTÐTØ�Fà'¨œN�	Ø$×+Ò+¨FÑ3Ô3�Ø"&×";Ò";¸FÀIÑ"NÔ"N‘�˜àð 	=Ø× Ò  ¨V°U¸HÑEÔEÐEÐEÐEà× Ò  ¨V°VÑ<Ô<Ð<Ð<Ð<r)   rw   rx   c                 óN  — d}d}| j         rz|sd}|| j         v r/|| j         |         v r|| j         |         |         k    rd}nd}nd}nd}|r| j                             d|||¦  «         n9| j                             d	|¦  «         nd
}| j                             d|¦  «         ||fS )zPLAIN ZAP authenticationFr)   r   Ts   Invalid passwords   Invalid usernames   Invalid domainz1ALLOWED (PLAIN) domain=%s username=%s password=%sz	DENIED %ss   No passwords definedzDENIED (PLAIN) %srE   )r&   rC   rw   rx   rt   rv   s         r'   rk   z!Authenticator._authenticate_plainC  sé   € ð ˆØˆØŒ>ð 	8àð Ø�à˜œÐ'Ð'Ø˜tœ~¨fÔ5Ð5Ð5Ø 4¤>°&Ô#9¸(Ô#CÒCÐCØ"&˜˜à!4˜˜à0�F�Fà*�àð 4Ø”—’ØGØØØñ	ô ð ð ð ”—’˜{¨FÑ3Ô3Ð3Ð3ð -ˆFØŒH�NŠNÐ.°Ñ7Ô7Ð7à˜ˆÐr)   Ú
client_keyc              ƒ   ót  K  — d}d}| j         r d}d}| j                             d¦  «         �n| j        i k    r�|sd}|| j        v rt	          j        |¦  «        }| j        |                              ||¦  «        }t          |t          ¦  «        r|ƒ d{V —†}|rd}d}nd}|rd	nd
}| j                             d|||¦  «         nqd}nn|sd}|| j	        v r_t	          j        |¦  «        }| j	        |          
                    |¦  «        rd}d}nd}|rd	nd
}| j                             d|||¦  «         nd}||fS )zCURVE ZAP authenticationFr)   Trg   z ALLOWED (CURVE allow any client)r   Ns   Unknown keyÚALLOWEDÚDENIEDz0%s (CURVE auth_callback) domain=%s client_key=%ss   Unknown domainz"%s (CURVE) domain=%s client_key=%s)r   r   r3   r   r   rU   ÚcallbackÚ
isinstancer   r   Úget)r&   rC   r}   rt   rv   Úz85_client_keyÚrÚstatuss           r'   rl   z!Authenticator._authenticate_curvei  s°  è è € ð ˆØˆØŒ>ð 4	+ØˆGØˆFØŒH�NŠNÐ=Ñ>Ô>Ð>Ñ>ØÔ'¨2Ò-Ð-àð Ø�à˜Ô3Ð3Ð3Ý!$¤¨JÑ!7Ô!7�àÔ.¨vÔ6×?Ò?ÀÈÑWÔW�Ý˜a¥Ñ+Ô+ð  Ø˜˜˜˜˜˜�AØð ,Ø"�GØ"�F�Fà+�Fà&-Ð;˜˜°8�Ø”—’ØFØØØ"ñ	ô ð ð ð +��ð ð Ø�à˜œÐ#Ð#å!$¤¨JÑ!7Ô!7�Ø”:˜fÔ%×)Ò)¨.Ñ9Ô9ð ,Ø"�GØ"�F�Fà+�Fà&-Ð;˜˜°8�Ø”—’Ø8ØØØ"ñ	ô ð ð ð +�à˜ˆÐr)   rz   c                 ó>   — | j                              d||¦  «         dS )zPNothing to do for GSSAPI, which has already been handled by an external service.z'ALLOWED (GSSAPI) domain=%s principal=%s)Trg   )r   r3   )r&   rC   rz   s      r'   rm   z"Authenticator._authenticate_gssapi§  s    € àŒ�ŠÐ@À&È)ÑTÔTÐTØˆ{r)   r`   ro   Ústatus_codeÚstatus_textÚuser_idc                 ó  — |dk    r|nd}t          |t          ¦  «        r|                     | j        d¦  «        }d}| j                             d||¦  «         t          |||||g}| j                             |¦  «         dS )z.Send a ZAP reply to finish the authentication.rf   r)   r_   zZAP reply code=%s text=%sN)	r‚   ÚstrrU   r   r   r3   rj   r   Úsend_multipart)r&   ro   rˆ   r‰   rŠ   ÚmetadataÚreplys          r'   ri   zAuthenticator._send_zap_reply¬  sŠ   € ð )¨FÒ2Ð2�'�'¸ˆÝ�g�sÑ#Ô#ð 	?Ø—n’n T¤]°IÑ>Ô>ˆGØˆØŒ�ŠÐ2°KÀÑMÔMÐMÝ˜* k°;ÀÈÐRˆØŒ×&Ò& uÑ-Ô-Ð-Ð-Ð-r)   )Nr   N)r*   N)r   N)r   rG   )r`   ) Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú__annotations__rŒ   Úboolr   r   r   Úbytesr   r(   r5   r8   r@   rB   rF   r
   ÚosÚPathLikerN   rQ   rW   rZ   r   r{   r	   rk   rl   rm   ri   rY   r)   r'   r   r      s¿  € € € € € € ðð ð4 ÐÐÑØ€M€M�MØ€O€O�OØ  S œ>Ð)Ð)Ñ)ØÐÐÑØ�#ŒhÐÐÑØ�ŒXÐÐÑØ�C˜˜c 3˜hœÐ'Ô(Ð(Ð(Ñ(Ø��T˜% ˜*Ô%Ð%Ô&Ð&Ð&Ñ&Ø	€H€H�Hð ,0ØØð	8ð 8à˜-Ô(ð8ð ð8ð ð	8ð 8ð 8ð 8ð,#ð #ð #ð #ðð ð ð ð( ð (¨ð (ð (ð (ð (ð
'˜sð 
' tð 
'ð 
'ð 
'ð 
'ð HLð6ð 6Øð6Ø,4°T¸#¸s¸(´^Ô,Dð6à	ð6ð 6ð 6ð 6ð FIðVð VØðVØ+0°°b´kÐ1AÔ+BðVà	ðVð Vð Vð Vð8 >Bð Wð  WØð WØ7:ð Wà	ð Wð  Wð  Wð  WðD=¨uð =¸ð =ð =ð =ð =ð, <@ðð ØðØ+3°C¬=ðà	ðð ð ð ðb=¨D°¬Kð b=ð b=ð b=ð b=ðH$Øð$Ø%(ð$Ø47ð$à	ˆt�Uˆ{Ô	ð$ð $ð $ð $ðL<Øð<Ø',ð<à	ˆt�Uˆ{Ô	ð<ð <ð <ð <ð|¨3ð ¸5ð ÀUÈ4ÐQVÈ;ÔEWð ð ð ð ð #ð.ð .àð.ð ð.ð ð	.ð
 ð.ð 
ð.ð .ð .ð .ð .ð .r)   r   rJ   )r“   r$   r—   Útypingr   r   r   r   r   r   r	   r
   r    Ú	zmq.errorr   Ú	zmq.utilsr   r   r   rJ   rj   r   Ú__all__rY   r)   r'   ú<module>r�      sæ   ðØ 0Ð 0ð
 €€€Ø 	€	€	€	Ø JÐ JÐ JÐ JÐ JÐ JÐ JÐ JÐ JÐ JÐ JÐ JÐ JÐ JÐ JÐ JÐ JÐ JÐ JÐ Jà 
€
€
€
Ø $Ð $Ð $Ð $Ð $Ð $Ø Ð Ð Ð Ð Ð à $Ð $Ð $Ð $Ð $Ð $à€Ø
€ðf.ð f.ð f.ð f.ð f.ñ f.ô f.ð f.ðR Ð-Ð
.€€€r)   