o
    j3                     @   sH   d dl T d dlZd dlmZ G dd dZddejdedefd	d
ZdS )    )*N)Callablec                   @   s   e Zd ZdejfddZdd Zd4ddZd4d	d
Zdd Z	dd Z
d5ddZdd Zd6ddZdd Zdd Zdd Zd7ddZd d! Zd"d# Zd$d% Zd&d' Zd(d) Zd*d+ Zd,d- Zd.d/ Zd8d0d1Zd2d3 ZdS )9SPNEGORelayauth_relay_queuec                 C   sj   || _ i | _d | _d | _d | _d | _d| _d | _d| _d | _	d | _
d | _d | _d| _d | _d | _g | _d S Nr   F)r   authentication_contextsselected_authentication_context&selected_authentication_context_serverselected_mechtypeselected_mechtype_serveriteration_ctrstart_client_evtiteration_ctr_servermic_data_SPNEGORelay__server_side_crash_SPNEGORelay__client_side_crash!_SPNEGORelay__server_latest_token"_SPNEGORelay__relay_queue_notified_SPNEGORelay__authtypeconnection_infooriginal_mechtypes)selfr    r   /root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/asyauth/protocols/spnego/relay/native.py__init__   s"   
zSPNEGORelay.__init__c                    s   t d|  d S )Nz[SPNEGORelay] %s)print)r   messager   r   r   print_debug!   s   zSPNEGORelay.print_debugNc                 C   s.   | j D ]}| j | | | j | j| _qd S N)r   setupr   )r   log_qkr   r   r   r   $   s   
zSPNEGORelay.setupc                    s2   | j du r|| _| j| I d H  d| _ d S d S )NFT)r   r   r   put)r   authtyper   r   r   notify_relay)   s   

zSPNEGORelay.notify_relayc                 C   s
   || _ d S r   )r   )r   r   r   r   r   set_connection_info/      
zSPNEGORelay.set_connection_infoc                 C   s0   | j d u r	tdt| j ddu r| j  S dS )Nz&Call this after selecting auth method!is_guestTF)r   	Exceptionhasattrr'   r   r   r   r   r'   2   s
   

zSPNEGORelay.is_guestinitc                    s   | j j|||dI d H S )N)	direction)r   sign)r   data
message_nor,   r   r   r   r-   :   s   zSPNEGORelay.signc                    s   | j ||I d H S r   )r   encrypt)r   r.   r/   r   r   r   r0   =   s   zSPNEGORelay.encryptc                    s   | j j||||dI d H S )N)r,   	auth_data)r   decrypt)r   r.   r/   r,   r1   r   r   r   r2   @   s   zSPNEGORelay.decryptc                 C   s   d| j v r
| j d S d S N2NTLMSSP - Microsoft NTLM Security Support Providerr   r*   r   r   r   get_ntlmC   s   

zSPNEGORelay.get_ntlmc                 C   s   || j |< dS )a\  
		Add an authentication context to the given authentication context name.
		Valid names are:
			'NTLMSSP - Microsoft NTLM Security Support Provider'
			'MS KRB5 - Microsoft Kerberos 5'
			'KRB5 - Kerberos 5'
			'KRB5 - Kerberos 5 - User to User'
			'NEGOEX - SPNEGO Extended Negotiation Security Mechanism'
			
		Context MUST be already set up!
		Nr5   )r   namectxr   r   r   add_auth_contextH   s   zSPNEGORelay.add_auth_contextc                 C   s*   | j D ]}||v r|| j | f  S qdS )N)NNr5   )r   
mech_typesauth_type_namer   r   r    select_common_athentication_typeV   s
   
z,SPNEGORelay.select_common_athentication_typeFr   c           
         s   | j |I d H \}}}|d urd d |fS |d u rdS i }	|dkr3|dkr-td|	d< ntd|	d< |d urAt|dkrA||	d< |	|d fS )NNFNTzaccept-incompletenegStateaccept-completedr   responseToken)r	   authenticate_relay_serverNegStatelen)
r   
token_datainclude_negstateflags
seq_numberis_rpcresultto_continueerrresponser   r   r   process_ctx_authenticate_server]   s   

z+SPNEGORelay.process_ctx_authenticate_serverc                    s*   i }t d|d< tdt|i d fS )Nr?   r>   negTokenResp)rB   NegotiationTokenNegTokenRespdump)r   rL   r   r   r   "authenticate_relay_server_finishedn   s   z.SPNEGORelay.authenticate_relay_server_finishedc                    sX   | j j|g|R i |I d H \}}}|d urd d |fS |s!dS i }||d< ||d fS )Nr=   r@   )r   authenticate)r   rD   argskwargsrI   rJ   rK   rL   r   r   r   process_ctx_authenticatet   s   &

z$SPNEGORelay.process_ctx_authenticatec                 C   s   | S r   r   r*   r   r   r   get_copy~   s   zSPNEGORelay.get_copyc                 C   s   t | j S )z\
		Returns a list of authentication context names available to the SPNEGO authentication.
		)listr   keysr*   r   r   r   list_original_conexts   s   z!SPNEGORelay.list_original_conextsc                 C   s
   | j | S )z
		Returns a copy of the original (not used) authentication context sp[ecified by name.
		You may use this ctx to perform future authentication, as it has the user credentials
		r5   )r   ctx_namer   r   r   get_original_context   s   
z SPNEGORelay.get_original_contextc                 C   s   t | jdr| j S d S )Nget_extra_info)r)   r   r]   r*   r   r   r   r]      s   
zSPNEGORelay.get_extra_infoc                 C   s
   | j  S r   )r   get_session_keyr*   r   r   r   r^      r&   zSPNEGORelay.get_session_keyc                 C   sH   ddi}dd | j D t|d}tdt|i}ttd|d S )	NhintNamez$not_defined_in_RFC4178@please_ignorec                 S   s   g | ]}t |qS r   )MechType).0mtr   r   r   
<listcomp>   s    z2SPNEGORelay.get_mechtypes_list.<locals>.<listcomp>)	mechTypesnegHintsnegTokenInit1.3.6.1.5.5.2typevalue)r   NegHintsrO   NegTokenInit2GSSAPIGSSTyperQ   )r   neghinttokinitnegtokenr   r   r   get_mechtypes_list   s   zSPNEGORelay.get_mechtypes_listc              
      s  || _ z1| jd urd dtdfW S d }| jd u rt|j}|d }|d | _t|d dkrR|d d | _	|d d dkrQ| 
 I d H  | j|d d  | _n4|d D ]}|dkrn|| _	| j| | _| 
 I d H   nqV| jd u r| d| I d H  td	|d  | jd ur4|d u r|d d
krt|j}|d }n)z
t|}|j}W n ty }	 z| d| I d H  td|	  |	d }	~	ww d|v r|d }
n|d }
d|v r|d | _| j|
|||ddI d H \}}}|d urd d |fW S |d u rW dS | jdkrt| j	|d< tdt|i}| jdkr%tdt|i}|  jd7  _| |d fW S W d S  tyQ }	 z|	| _d d|	fW  Y d }	~	S d }	~	ww )NFzClient auth crashed!rj   rd      r   r4   z([DEBUG][MULTIPLE_MECHTYPES] negtoken: %sz$Failed to find NTLM in mechtypes: %s`   z[DEBUG][NEGTOKEN_LOAD_ERROR] %s	mechTokenr@   mechListMICT)rF   rG   rH   rE   r=   supportedMechrN   )r   r   r(   r	   rm   loadnativer   rC   r   r$   r   r   rO   r   r   rM   r   r`   rP   rQ   r   )r   tokenrF   rG   rH   rq   gssmechtypeneg_token_raweauthdatarL   rJ   rK   r   r   r   rA      s   








 
$z%SPNEGORelay.authenticate_relay_serverc              
      s  zK| j durddtdfW S | jdu r|du rt| jdkr,| dI dH  tdt| jdkr@| d| jd  I dH  | jd | _| j| jvr^| d	| j I dH  td
| j | j| j | _i }t| j|d< | jj	dg|R i |I dH \}}}|durdd|fW S ||d< t
dt|i}ttd|d ddfW S t
|}	|	j}
t|	tstd| j|
jd  | _|
d | _| j|
d g|R i |I dH \}}}|durdd|fW S t| |dfW S t
|}	|	j}
|
d dkrW dS |
d du rtd W dS | j|
d g|R i |I dH \}}}|dur+dd|fW S |s1W dS t
dt|i }| jdu rH| jddfW S ||dfW S  tyh } z|| _dd|fW  Y d}~S d}~ww )z
		This function is called (multiple times) during negotiation phase of a protocol to determine hich auth mechanism to be used
		Token is a byte array that is an ASN1 NegotiationToken structure.
		NFzServer auth crashed!r   z*[CLIENT][AUTHENTICATE] No mechtypes found!zNo mechtypes foundrs   zH[CLIENT][AUTHENTICATE] Multiple mechtypes found! Selecting first one: %sz'[DEBUG][SELECTED_MECHTYPE_NOT_FOUND] %szSelected mechtype not found: %srd   ru   rf   rg   rh   TzServer send init???rw   r@   r>   r?   r=   z3!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!111111111111)NTNrN   )r   r(   r
   rC   r   r   r   r   	MechTypesrS   rO   rl   rm   rn   rQ   rx   ry   
isinstancerP   rd   rV   r   r   r   r   )r   rz   rT   rU   rL   rI   rJ   rK   rq   r}   	neg_tokenresr~   r   r   r   rS      sn   

	&


(
(
zSPNEGORelay.authenticater   )r+   )r+   N)FNr   Fr   )__name__
__module____qualname__asyncioQueuer   r   r   r$   r%   r'   r-   r0   r2   r6   r9   r<   rM   rR   rV   rW   rZ   r\   r]   r^   rr   rA   rS   r   r   r   r   r      s0    






Er   r   ntlm_handler_factoryreturnc                 C   s$   | }t | }|d| ||_|S r3   )r   r9   
spnego_obj)r   r   ntlm_ctxgssapir   r   r   spnegorelay_ntlm_factoryD  s
   r   r   ).asyauth.protocols.spnego.messages.asn1_structsr   typingr   r   r   r   r   r   r   r   <module>   s     9