o
    �õ±jÄ   ã                   @   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d0dd„Zd	d
„ Zdd„ Z	d1dd„Z
dd„ Zd2dd„Zdd„ Zdd„ Zdd„ Zd3d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d4d.d/„ZdS )5ÚSPNEGOserverÚauth_relay_queuec                 C   sR   || _ i | _d | _d | _d | _d | _d| _d | _d| _d | _	d | _
d | _g | _d S )Nr   )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Ú_SPNEGOserver__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/server/native.pyÚ__init__   s   
zSPNEGOserver.__init__c                 Ã   s   �t d| ƒ d S )Nz[SPNEGOServer] %s)Úprint)r   Úmessager   r   r   Úprint_debug   s   €zSPNEGOserver.print_debugNc                 C   s.   | j D ]}| j |  |¡ | j | j| _qd S ©N)r   Úsetupr   )r   Úlog_qÚkr   r   r   r       s   
þzSPNEGOserver.setupc                 C   s
   || _ d S r   )r   )r   r   r   r   r   Úset_connection_info%   ó   
z SPNEGOserver.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   (   s
   

zSPNEGOserver.is_guestÚinitc                 Ã   s   �| j j|||d�I d H S )N)Ú	direction)r   Úsign)r   ÚdataÚ
message_nor$   r   r   r   r%   0   s   €zSPNEGOserver.signc                 Ã   s   �| j  ||¡I d H S r   )r   Úencrypt)r   r&   r'   r   r   r   r(   3   s   €zSPNEGOserver.encryptc                 Ã   s   �| j j||||d�I d H S )N)r$   Ú	auth_data)r   Údecrypt)r   r&   r'   r$   r)   r   r   r   r*   6   s   €zSPNEGOserver.decryptc                 C   s   d| j v r
| j d S d S ©Nú2NTLMSSP - Microsoft NTLM Security Support Provider©r   r"   r   r   r   Úget_ntlm9   s   

zSPNEGOserver.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!
		Nr-   )r   ÚnameÚctxr   r   r   Úadd_auth_context>   s   zSPNEGOserver.add_auth_contextc                 C   s*   | j D ]}||v r|| j | f  S qdS )N)NNr-   )r   Ú
mech_typesÚauth_type_namer   r   r   Ú select_common_athentication_typeL   s
   
ÿz-SPNEGOserver.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_serverÚNegStateÚlen)
r   Ú
token_dataÚinclude_negstateÚflagsÚ
seq_numberÚis_rpcÚresultÚto_continueÚerrÚresponser   r   r   Úprocess_ctx_authenticate_serverS   s   €

z,SPNEGOserver.process_ctx_authenticate_serverc                 Ã   s*   �i }t dƒ|d< tdt|ƒiƒ ¡ d fS )Nr7   r6   ÚnegTokenResp)r:   ÚNegotiationTokenÚNegTokenRespÚdump)r   rD   r   r   r   Úauthenticate_server_finishedd   s   €z)SPNEGOserver.authenticate_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 )Nr5   r8   )r   Úauthenticate)r   r<   ÚargsÚkwargsrA   rB   rC   rD   r   r   r   Úprocess_ctx_authenticatej   s   €&

z%SPNEGOserver.process_ctx_authenticatec                 C   s   | S r   r   r"   r   r   r   Úget_copyt   s   zSPNEGOserver.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_conextsw   s   z"SPNEGOserver.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
		r-   )r   Úctx_namer   r   r   Úget_original_context}   s   
z!SPNEGOserver.get_original_contextc                 C   s   t | jdƒr| j ¡ S d S )NÚget_extra_info)r!   r   rU   r"   r   r   r   rU   „   s   
zSPNEGOserver.get_extra_infoc                 C   s
   | j  ¡ S r   )r   Úget_session_keyr"   r   r   r   rV   ‰   r   zSPNEGOserver.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    z3SPNEGOserver.get_mechtypes_list.<locals>.<listcomp>)Ú	mechTypesÚnegHintsÚnegTokenInitz1.3.6.1.5.5.2)ÚtypeÚvalue)r   ÚNegHintsrG   ÚNegTokenInit2ÚGSSAPIÚGSSTyperI   )r   ÚneghintÚtokinitÚnegtokenr   r   r   Úget_mechtypes_listŒ   s   þzSPNEGOserver.get_mechtypes_listc              
   Ã   s`  �|| _ �zd }| jd u rft |¡j}|d }t|d ƒdkr9|d d | _|d d dkr8| j|d d  | _n-|d D ]}|dkrN|| _| j| | _ nq=| jd u rf|  d| ¡I d H  t	d|d  ƒ‚| jd u�r|d u rª|d dkr�t |¡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rÚd 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	�y/ }	 z|	| _d d|	fW  Y d }	~	S d }	~	ww )Nr`   r\   é   r   r,   z([DEBUG][MULTIPLE_MECHTYPES] negtoken: %sz$Failed to find NTLM in mechtypes: %sé`   z[DEBUG][NEGTOKEN_LOAD_ERROR] %sÚ	mechTokenr8   ÚmechListMICT)r>   r?   r@   r=   r5   ÚsupportedMechrF   F)Ú"_SPNEGOserver__server_latest_tokenr   rc   ÚloadÚnativer;   r
   r   r   r    rG   r   r   rE   r   rX   rH   rI   Ú _SPNEGOserver__server_side_crash)r   Útokenr>   r?   r@   rg   ÚgssÚmechtypeÚneg_token_rawÚeÚauthdatarD   rB   rC   r   r   r   r9   —   sx   €
€ý



€ý

 
ÿÝ$€þz SPNEGOserver.authenticate_serverr   )r#   )r#   N)FNr   F)Nr   F)Ú__name__Ú
__module__Ú__qualname__ÚasyncioÚQueuer   r   r   r   r   r%   r(   r*   r.   r1   r4   rE   rJ   rN   rO   rR   rT   rU   rV   rh   r9   r   r   r   r   r      s,    




r   r   Úntlm_handler_factoryÚreturnc                 C   s$   |ƒ }t | ƒ}| d|¡ ||_|S r+   )r   r1   Ú
spnego_obj)r   r}   Úntlm_ctxÚgssapir   r   r   Úspnegoserver_ntlm_factoryÖ   s
   r‚   r   )Ú.asyauth.protocols.spnego.messages.asn1_structsr{   Útypingr   r   r|   r‚   r   r   r   r   Ú<module>   s    J