o
    �õ±jù  ã                   @   sR   d dl Z d dlZd dlmZ d dlmZ d dlZdefdd„ZG dd„ deƒZ	dS )	é    N)ÚList)ÚHTTPServerHandlerÚmsgc                 Ã   s   �t | ƒ d S )N)Úprint)r   © r   ú¢/root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/asysocks/unicomm/protocol/server/http/httprelay.pyÚ	dummy_log   s   €r   c                	       sž   e Zd Zddddddœdedededef‡ fd	d
„Zdd„ Zdd„ Zdd„ Z	defdd„Z
dg fdedee fdd„Zdd„ Zdd„ Zdd„ Zdd„ Z‡  ZS )ÚHTTPRelayHandlerFÚNTLMN)Úis_proxyÚauthtypeÚauthbodyÚsuccessbodyÚlog_callbackr   r   r   r   c          	         s¸   t ƒ j|i |¤Ž d| _|| _|ƒ | _| ¡ | _|dvr"td| ƒ‚|du r3d| _d| _	d| _
d| _nd	| _d
| _	d| _
d| _t|tƒrH| ¡ }t|tƒrQ| ¡ }|| _|| _|| _d S )NÚ )r
   ÚSPNEGOzUnsupported auth type %sTzProxy Authentication RequiredzProxy-AuthenticatezProxy-Authorizationi—  ÚUnauthorizedzWWW-AuthenticateÚAuthorizationé‘  )ÚsuperÚ__init__Ú
webdav_urlÚrelay_handlerÚgssapiÚupperr   Ú	ExceptionÚunauthorized_reasonÚauthorization_keyÚclient_auth_keyÚunauthorized_statusÚ
isinstanceÚstrÚencoder   r   r   )	Úselfr   r   r   r   r   r   ÚargsÚkwargs©Ú	__class__r   r   r      s.   



zHTTPRelayHandler.__init__c                 C   s8   | j  ¡  d¡}|jD ]}|d |kr|d   S qd S )NÚasciir   é   )r   Úlowerr"   Úheaders)r#   Úrequestr   Úheaderr   r   r   Úget_auth_header*   s   
ÿÿz HTTPRelayHandler.get_auth_headerc                 Ç   s<   �dd„ |D ƒ}d  |¡}| jd ur|  |¡I d H  d S d S )Nc                 S   s   g | ]}t |ƒ‘qS r   )r!   )Ú.0Úxr   r   r   Ú
<listcomp>1   s    z*HTTPRelayHandler.debug.<locals>.<listcomp>ú )Újoinr   )r#   r$   r   r   r   r   Údebug0   s   €

ÿzHTTPRelayHandler.debugc              
   Ã   sø   �|   d¡I d H  z[d}|  ¡ }| d¡ | jd ur+| d¡ | dtt| jƒƒf¡ | | j| jf¡ tj	||d�}| j
 |¡I d H  | jd urW| j
 tj| jd�¡I d H  | j
 t ¡ ¡I d H  W d S  ty{ } zt ¡  W Y d }~d S d }~ww )NzInitial responser   )Ú
Connectionz
keep-alive©úContent-Typez	text/htmlúContent-Length©Ústatus_coder+   ©Údata)r4   Úbasic_headersÚappendr   r!   Úlenr   r   Úh11ÚResponseÚ_wrapperÚsendÚDataÚEndOfMessager   Ú	tracebackÚ	print_exc)r#   r:   r+   ÚresÚer   r   r   Úinitial_response6   s&   €



€ÿz!HTTPRelayHandler.initial_responseÚ	auth_datac                 Ã   sl   �|   d| ¡I d H  d}|  ¡ }| | j|f¡ tj||d�}| j |¡I d H  | j t ¡ ¡I d H  d S )Nzsend_auth_progress %sr   r9   )	r4   r=   r>   r   r@   rA   rB   rC   rE   )r#   rK   r:   r+   rH   r   r   r   Úsend_auth_progressH   s   €z#HTTPRelayHandler.send_auth_progressÚextra_headersc                 Ã   sÐ   �|   d| ¡I d H  d}|  ¡ }| |¡ | d¡ | jd ur,| dtt| jƒƒf¡ |d ur8| | j|f¡ tj	||d�}| j
 |¡I d H  | jd ur[| j
 tj| jd�¡I d H  | j
 t ¡ ¡I d H  d S )Nzsend_success %séÈ   r6   r8   r9   r;   )r4   r=   Úextendr>   r   r!   r?   r   r@   rA   rB   rC   rD   rE   )r#   rK   rM   r:   r+   rH   r   r   r   Úsend_successQ   s   €



zHTTPRelayHandler.send_successc                 Ã   s    �g d¢}| j |d�I d H  d S )N))zAccess-Control-Allow-Methodsz8OPTIONS, PROPFIND, GET, PUT, DELETE, MKCOL, LOCK, UNLOCK)zAccess-Control-Allow-OriginÚ*)zAccess-Control-Allow-HeaderszContent-Type, Authorization)rM   )rP   )r#   r,   rM   r   r   r   Úhandle_optionsa   s   €zHTTPRelayHandler.handle_optionsc           
   	   Ã   sÆ   �d}|j  ¡ }| d¡d }d}d}d| j› d|› d|› d	|› d
�	}|  ¡ }| d¡ | dtt|ƒƒf¡ tj	||d�}	| j
 |	¡I d H  | j
 tj| ¡ d�¡I d H  | j
 t ¡ ¡I d H  d S )NéÏ   ú/éÿÿÿÿr   z2016-11-12T22:00:22ZzG<?xml version="1.0"?><D:multistatus xmlns:D="DAV:"><D:response><D:href>z-</D:href><D:propstat><D:prop><D:creationdate>z </D:creationdate><D:displayname>z$</D:displayname><D:getcontentlength>ag  </D:getcontentlength><D:getcontenttype></D:getcontenttype><D:getetag></D:getetag><D:getlastmodified>Mon, 20 Mar 2017 00:00:22 GMT</D:getlastmodified><D:resourcetype><D:collection></D:collection></D:resourcetype><D:supportedlock></D:supportedlock><D:ishidden>0</D:ishidden></D:prop><D:status>HTTP/1.1 200 OK</D:status></D:propstat></D:response></D:multistatus>©r7   ztext/xmlr8   r9   r;   )ÚtargetÚdecodeÚsplitr   r=   r>   r!   r?   r@   rA   rB   rC   rD   r"   rE   )
r#   r,   r:   Úrequest_targetÚrequest_fileÚgetcontentlengthÚcreationdateÚcontentr+   rH   r   r   r   Úhandle_propfindi   s   €
 
z HTTPRelayHandler.handle_propfindc                 Ã   sN   �|   ¡ }| d¡ tjd|d�}| j |¡I d H  | j t ¡ ¡I d H  d S )NrV   rN   r9   )r=   r>   r@   rA   rB   rC   rE   )r#   r,   r+   rH   r   r   r   Úhandle_headz   s   €
zHTTPRelayHandler.handle_headc              
   Ã   sÈ  �| j  ¡ }d }| j |j¡ | j dkr| j ¡ }n| j dkr"| j}z¯|| _|  |¡}|  d| ¡I d H  |d u rs|j	dkrI|  
|¡I d H  W d S |j	dkrY|  |¡I d H  W d S |j	dkri|  |¡I d H  W d S |  ¡ I d H  W d S | |¡du rÌt |t|ƒd d … ¡}| |¡I d H \}}}|d ur˜|‚|du r²|d ur²|  d	|t |¡f ¡I d H  W d S d }	|d urÁd	|t |¡f }	|  |	¡I d H  W d S td
| ƒ‚ tyã }
 zt ¡  |
‚d }
~
ww )Nr
   r   zauth_data %ss   OPTIONSs   PROPFINDs   HEADTr)   s   %s %sz#Authdata doesnt seem to be NTLM! %s)r   r"   r   Úset_connection_infoÚstreamÚget_ntlmrB   r.   r4   ÚmethodrR   r_   r`   rJ   Ú
startswithÚbase64Ú	b64decoder?   Úauthenticate_relay_serverrL   Ú	b64encoderP   r   rF   rG   )r#   Úwrapperr,   r   ÚauthobjrK   rH   Úto_continueÚerrÚres_datarI   r   r   r   Ú_process_requestƒ   sT   €






€þz!HTTPRelayHandler._process_request)Ú__name__Ú
__module__Ú__qualname__Úboolr!   Úbytesr   r.   r4   rJ   rL   r   ÚtuplerP   rR   r_   r`   ro   Ú__classcell__r   r   r&   r   r	      s    ,		r	   )
rf   rF   Útypingr   Ú0asysocks.unicomm.protocol.server.http.httpserverr   r@   r!   r   r	   r   r   r   r   Ú<module>   s   