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 N2NTLMSSP - 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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 rW dS | jdkrt| 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