
    Ef                          d Z ddlZddlmZ ddlmZmZ ddlmZm	Z	m
Z
mZmZmZ ddlZddlmZmZ ddlmZ dd	lmZ  G d
 de      Z ede      ZdedefdZe G d d             ZdgZy)z>ZAP Authenticator in a Python Thread.

.. versionadded:: 14.1
    N)chain)EventThread)AnyDictListOptionalTypeVarcast)NOBLOCKPOLLIN)jsonapi   )Authenticatorc                   p     e Zd ZdZ	 	 	 ddddedededee   d	df fd
ZddZ	ddZ
dee   d	efdZ xZS )AuthenticationThreadziA Thread for running a zmq Authenticator

    This is run in the background by ThreadedAuthenticator
    Ncontextzmq.Contextendpointencodinglogauthenticatorreturnc                    t         |           |xs t        j                  j	                         | _        || _        |xs t        j                  d      x| _	        }t               | _        |xs t        |||      | _        |j                  t        j                        | _        d| j                   _        | j                   j%                  |       y )Nzzmq.authr   r   r   )super__init__zmqContextinstancer   r   logging	getLoggerr   r   startedr   r   socketPAIRpipelingerconnect)selfr   r   r   r   r   	__class__s         1/usr/lib/python3/dist-packages/zmq/auth/thread.pyr   zAuthenticationThread.__init__   s     	8#++"6"6"8 = 1 1* ==3w,9 -
]hC>

 NN388,					(#    c                 T   | j                   j                          | j                  j                          | j                   j                  }t        j                         }|j                  | j                  t
        j                         |j                  |t
        j                         	 	 t        |j                               }| j                  |v rP|| j                     t        k(  r:	 	 | j                  j                  t              }| j!                  |      }|rn6rn!||v r||   t        k(  r| j#                          | j                  j%                          | j                   j'                          y# t
        j                  $ r Y Jw xY w# t
        j                  $ r Y w xY w)z*Start the Authentication Agent thread task)flagsN)r   startr#   set
zap_socketr   Pollerregisterr&   r   dictpollZMQErrorrecv_multipartr   Again_handle_pipe_handle_zapclosestop)r)   zappollersocksmsg	terminates         r+   runzAuthenticationThread.run1   sX     "  ++		3::.SZZ(V[[]+ yyE!eDII&6&&@ "ii66W6E !% 1 1# 6I   e|c
f 4  "- 0 			!- <<  99 s$   +E8 * F 8FFF'&F'c                     | j                   j                  t        d      | j                   j                  j                         }|sy| j                   j	                  |       y)z7
        Handle a message from the ZAP socket.
        NzZAP socket closed)r   r1   RuntimeErrorr7   handle_zap_message)r)   r@   s     r+   r:   z AuthenticationThread._handle_zapT   sV     ((0233  ++::<--c2r,   r@   c                 @   d}|d}|S |d   }| j                   j                  d|       |dk(  rG|dd D cg c]  }|j                  | j                         }}	  | j                  j
                  |  |S |d	k(  rG|dd D cg c]  }|j                  | j                         }}	  | j                  j                  |  |S |dk(  rq|d   j                  | j                        }|d   }t        t        t        t        f   t        j                  |            }| j                  j                  ||       |S |dk(  rZ|d   j                  | j                        }|d   j                  | j                        }	| j                  j                  ||	       |S |dk(  rd}|S | j                   j!                  d|       |S c c}w # t        $ r  | j                   j                  d|       Y |S w xY wc c}w # t        $ r  | j                   j                  d
|       Y |S w xY w)z6
        Handle a message from front-end API.
        FNTr   zauth received API command %r   ALLOWr   zFailed to allow %s   DENYzFailed to deny %s   PLAIN      CURVE	   TERMINATEz!Invalid auth command from API: %r)r   debugdecoder   r   allow	Exception	exceptiondenyr   r   strr   loadsconfigure_plainconfigure_curveerror)
r)   r@   rA   commandm	addressesdomainjson_passwords	passwordslocations
             r+   r9   z!AuthenticationThread._handle_pipe_   s;    	;Ia&5w?h:=ab'BQ$--0BIBD(""(()4D = :=ab'BQ$--0BIBC'""''36 /  V]]4==1F VN(,S#Xn =)I ..vyA"   V]]4==1F 1v}}T]]3H..vx@  $I
  HHNN>HI C  D""#7C@ CD C  C""#6	B2 5Cs/   "F>G "G/'G4 %G,+G,4%HH)utf-8NNr   N)__name__
__module____qualname____doc__rS   r   r	   r   r   rB   r:   r   bytesboolr9   __classcell__)r*   s   @r+   r   r      sy      15$$ $ 	$
 $  .$ 
$,!"F	32U 2 2r,   r   T)boundclsr   c                     | j                   j                         D ]Q  \  }}|j                  d      st        |      s#t	        t
        |d      }|j                  rA|j                  |_        S | S )zAinherit docstrings from Authenticator, so we don't duplicate them_N)__dict__items
startswithcallablegetattrr   rd   )rj   namemethodupstream_methods       r+   _inherit_docstringsru      sa    **, 5f??3x'7!-t<~~,44FN5 Jr,   c                      e Zd ZU dZded<   eed<   eed<   ded<   dZeed	<   eed
<   	 	 	 d de	d   dedefdZ
dedefdZdefdZdefdZdefdZ	 d!dede	eeef      fdZd"dedefdZ	 d!dedefdZd#dZd#dZdefdZd#dZy)$ThreadAuthenticatorz-Run ZAP authentication in a background threadr   r   r   r   z
zmq.Socketr&    pipe_endpointthreadNc                     || _         || _        d | _        dt        |        d| _        d | _        |xs t        j                  j                         | _	        y )Nz	inproc://z.inproc)
r   r   r&   idry   rz   r   r   r    r   )r)   r   r   r   s       r+   r   zThreadAuthenticator.__init__   sN      	(D
':8#++"6"6"8r,   keyvaluec                    t        | g| j                  j                               D ]8  }||j                  v s|t	        |di       v s!t
        j                  | ||        y  t        | j                  j                  ||       y )N__annotations__)
r   r*   mrorm   rq   object__setattr__setattrrz   r   )r)   r}   r~   objs       r+   r   zThreadAuthenticator.__setattr__   sq    $!3!3!56 	Ccll"sgc;Lb.Q'Q""4e4	 	))36r,   c                 B    t        | j                  j                  |      S N)rq   rz   r   )r)   r}   s     r+   __getattr__zThreadAuthenticator.__getattr__   s    t{{00#66r,   rZ   c           	          | j                   j                  dg|D cg c]  }|j                  | j                         c}z          y c c}w )NrG   r&   send_multipartencoder   r)   rZ   as      r+   rO   zThreadAuthenticator.allow   s9    		  J9Ea!((4==1EE	
E   "A
c           	          | j                   j                  dg|D cg c]  }|j                  | j                         c}z          y c c}w )NrH   r   r   s      r+   rR   zThreadAuthenticator.deny   s9    		  I)DQ$--0DD	
Dr   r[   r]   c                     | j                   j                  d|j                  | j                        t	        j
                  |xs i       g       y )NrI   )r&   r   r   r   r   dumps)r)   r[   r]   s      r+   rU   z#ThreadAuthenticator.configure_plain   s;     			  v}}T]]3W]]9?PR5ST	
r,   r^   c                     |j                  | j                        }|j                  | j                        }| j                  j                  d||g       y )NrK   )r   r   r&   r   )r)   r[   r^   s      r+   rV   z#ThreadAuthenticator.configure_curve   s?    t}}-??4==1		  (FH!=>r,   credentials_providerc                 R    | j                   j                  j                  ||       y )N)r   )rz   r   configure_curve_callback)r)   r[   r   s      r+   r   z,ThreadAuthenticator.configure_curve_callback   s'     	!!::)= 	; 	
r,   r   c                    | j                   j                  t        j                        | _        d| j                  _        | j                  j                  | j                         t        | j                   | j                  | j                  | j                        | _        | j                  j                          | j                  j                  j                  d      st        d      y)zStart the authentication threadr   r   
   )timeoutz$Authenticator thread failed to startN)r   r$   r   r%   r&   r'   bindry   r   r   r   rz   r/   r#   waitrD   r)   s    r+   r/   zThreadAuthenticator.start   s     LL''1					t))**LL$,,t}}$((
 	{{""'''3EFF 4r,   c                     | j                   rn| j                   j                  d       | j                         r| j                  j	                          d| _        | j                   j                          d| _         yy)zStop the authentication threadrL   N)r&   sendis_aliverz   joinr;   r   s    r+   r<   zThreadAuthenticator.stop   sS    99IINN<(}}  "DKIIOODI r,   c                 d    t        | j                  xr | j                  j                               S )z$Is the ZAP thread currently running?)rf   rz   r   r   s    r+   r   zThreadAuthenticator.is_alive   s#    DKK:DKK$8$8$:;;r,   c                 $    | j                          y r   )r<   r   s    r+   __del__zThreadAuthenticator.__del__   s    		r,   )Nr_   N)*N)r   rx   r`   )ra   rb   rc   rd   r   r   rS   ry   r   r	   r   r   r   rO   rR   r   rU   rV   r   r/   r<   rf   r   r    r,   r+   rw   rw      s   7	HM
M3   ,0	9-(9 9 	97s 73 77s 7
 


s 
 HL

,4T#s(^,D
?c ?3 ? >B

7:
G<$ <r,   rw   )rd   r!   	itertoolsr   	threadingr   r   typingr   r   r   r	   r
   r   r   r   r   	zmq.utilsr   baser   r   typerh   ru   rw   __all__r   r,   r+   <module>r      s~      # ; ; 
   |6 |~ CtQ 1  \ \ \~ !
!r,   