o
    àý°j]  ã                   @   s’   d dl Z d dlZd dlZd dlZz
d dlmZmZ W n ey+   d dlmZmZ Y nw d dl	m
Z
mZ dZdZdZdZdZd	ZG d
d„ dƒZdS )é    N)ÚHTTPConnectionÚHTTPSConnection)ÚntlmÚLOGÚAutoÚBasicÚNTLMÚ	NegotiateÚBearerÚDigestc                   @   sr   e Zd Zefdd„Zdd„ Zdd„ Zdd„ Zd	d
„ Zddd„Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ ZdS )ÚHTTPClientSecurityProviderc                 C   sF   d | _ d | _d | _d| _d| _d| _d | _d | _|| _g | _	d | _
d S )NÚ )Ú%_HTTPClientSecurityProvider__usernameÚ%_HTTPClientSecurityProvider__passwordÚ#_HTTPClientSecurityProvider__domainÚ#_HTTPClientSecurityProvider__lmhashÚ#_HTTPClientSecurityProvider__nthashÚ#_HTTPClientSecurityProvider__aesKeyÚ _HTTPClientSecurityProvider__TGTÚ _HTTPClientSecurityProvider__TGSÚ&_HTTPClientSecurityProvider__auth_typeÚ'_HTTPClientSecurityProvider__auth_typesÚ)_HTTPClientSecurityProvider__ntlmssp_info©ÚselfÚ	auth_type© r   ú€/root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/impacket/http.pyÚ__init__,   s   
z#HTTPClientSecurityProvider.__init__c                 C   s
   || _ d S ©N©r   r   r   r   r   Úset_auth_type;   s   
z(HTTPClientSecurityProvider.set_auth_typec                 C   ó   | j S r   r    ©r   r   r   r   Úget_auth_type>   ó   z(HTTPClientSecurityProvider.get_auth_typec                 C   r"   r   )r   r#   r   r   r   Úget_auth_typesA   r%   z)HTTPClientSecurityProvider.get_auth_typesc                 C   r"   r   )r   r#   r   r   r   Úget_ntlmssp_infoD   r%   z+HTTPClientSecurityProvider.get_ntlmssp_infor   Nc	           	      C   s’   || _ || _|| _|dks|dkr>t|ƒd rd| }t|ƒd r%d| }zt |¡| _t |¡| _W n
   || _|| _Y || _|| _	|| _
d S )Nr   é   z0%s)r   r   r   ÚlenÚbinasciiÚ	unhexlifyr   r   r   r   r   )	r   ÚusernameÚpasswordÚdomainÚlmhashÚnthashÚaesKeyÚTGTÚTGSr   r   r   Úset_credentialsG   s$   
z*HTTPClientSecurityProvider.set_credentialsc                 C   sb   g }d|v r|  t¡ d|v r|  t¡ d|v r|  t¡ d|v r&|  t¡ d|v r/|  t¡ |S )Nr   r   r	   r
   r   )ÚappendÚ	AUTH_NTLMÚ
AUTH_BASICÚAUTH_NEGOTIATEÚAUTH_BEARERÚAUTH_DIGEST)r   ÚheaderÚretr   r   r   Úparse_www_authenticate^   s   




z1HTTPClientSecurityProvider.parse_www_authenticatec                 C   sF   |dkrt |ƒS zt tj¡}t||d�W S  ty"   t|ƒ Y S w )NÚhttp)Úcontext)r   ÚsslÚ
SSLContextÚPROTOCOL_SSLv23r   ÚAttributeError)r   ÚprotocolÚhost_L6Ú
uv_contextr   r   r   Úconnectn   s   ÿz"HTTPClientSecurityProvider.connectc                 C   sF   | j tkr|  ||||¡S | j ttfv r|  ||||¡S td| j  ƒ‚)Nz%s auth type not supported)r   r7   Úget_auth_headers_basicÚ	AUTH_AUTOr6   Úget_auth_headers_autoÚ	Exception)r   Úhttp_objÚmethodÚpathÚheadersr   r   r   Úget_auth_headersx   s
   
z+HTTPClientSecurityProvider.get_auth_headersc                 C   s–   | j dks| jdks| jdks| jd ks| jd krtdƒ‚| jdkr+| jd | j }n| jd | j d | j }dt	 
| d¡¡ d¡ }d|id fS )	Nr   zXBasic authentication in HTTP connection used, so set a plaintext credentials to connect.ú:ú\zBasic %szUTF-8ÚasciiÚAuthorization)r   r   r   r   r   rK   r   r   r   Úbase64Ú	b64encodeÚencodeÚdecode)r   rL   rM   rN   rO   Ú	auth_lineÚauth_line_httpr   r   r   rH   €   s   
z1HTTPClientSecurityProvider.get_auth_headers_basicc              
   C   s  |  ¡ }d|d< dt |¡ d¡ |d< |j|||d� | ¡ }| ¡  |jdkr2td|j|f ƒ‚| 	d	¡d u r?td
| ƒ‚| j
g krM|  | 	d	¡¡| _
t| j
vrTdS zt d| 	d	¡¡ d¡}t |¡}	W n tttfyw   td| ƒ‚w | jsˆt |	¡}
t |
d ¡| _|	d fS )NÚ0zContent-LengthúNTLM %srS   rT   )rO   i‘  zJStatus code returned: %d. Authentication does not seem required for url %szWWW-Authenticatez4No authentication requested by the server for url %s)NNzNTLM ([a-zA-Z0-9+/]+={0,2})é   z1No NTLM challenge returned from server for url %sÚTargetInfoFields)ÚcopyrU   rV   rX   ÚrequestÚgetresponseÚreadÚstatusrK   Ú	getheaderr   r=   r6   ÚreÚsearchÚgroupÚ	b64decodeÚ
IndexErrorÚKeyErrorrC   r   r   ÚNTLMAuthChallengeÚAV_PAIRS)r   rL   rM   rN   rO   ÚnegotiateMessageÚauth_headersÚresÚserverChallengeBase64ÚserverChallengeÚ	challenger   r   r   Úsend_ntlm_type1“   s@   
þÿ

ÿÿÿ
z*HTTPClientSecurityProvider.send_ntlm_type1c           
   	   C   sÞ   | j dks| jd ks| jd krtdƒ‚tj| jd�}|  ||||| ¡ ¡d }|d urMt	| _
t ||| j| j| j| j| j¡\}}dt | ¡ ¡ d¡ }	n| j
tkrbt| jv rbt| _
|  ||||¡S td| j ƒ‚d|	id fS )	Nr   zANTLM authentication in HTTP connection used, cannot use Kerberos.)r.   r   r\   rS   z$No supported auth offered by URL: %srT   )r   r   r   rK   r   ÚgetNTLMSSPType1r   rs   ÚgetDatar6   r   ÚgetNTLMSSPType3r   r   r   r   rU   rV   rX   rI   r7   r   rH   )
r   rL   rM   rN   rO   Úauthrq   Útype3ÚexportedSessionKeyrZ   r   r   r   rJ   º   s    þz0HTTPClientSecurityProvider.get_auth_headers_auto)r   r   r   r   NN)Ú__name__Ú
__module__Ú__qualname__rI   r   r!   r$   r&   r'   r4   r=   rG   rP   rH   rs   rJ   r   r   r   r   r   +   s    

'r   )re   r@   rU   r*   Úhttp.clientr   r   ÚImportErrorÚhttplibÚimpacketr   r   rI   r7   r6   r8   r9   r:   r   r   r   r   r   Ú<module>   s"   ÿ