B
    :Ra\                 @   s   d dl Z d dlZd dlZyd dlZW n ek
r@   d dlZY nX d dlZd dlZd dlZd dl	Z	d dl
Z
d dlZd dlZdd Zyd dlmZ W n ek
r   eZY nX G dd deZG dd deZG d	d
 d
eZG dd deZdS )    Nc             C   sL   t | t |krdS d}x*t| |D ]\}}|t|t|A O }q$W |dkS )zImplementation of hmac.compare_digest for python < 2.7.7.

    This function uses an approach designed to prevent timing analysis by
    avoiding content-based short circuiting behaviour, making it appropriate
    for cryptography.
    Fr   )lenzipord)ab
differenceZa_charZb_char r   /lib/python3.7/site-packages/rope/base/oi/doa.py_compat_compare_digest   s    r
   )compare_digestc               @   sJ   e Zd Z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 )PythonFileRunnerz(A class for running python project filesNc             C   s.   || _ || _|| _g | _|| _|| _|| _d S )N)pycorefileanalyze_data	observersargsstdinstdout)selfr   Zfile_r   r   r   r   r   r   r	   __init__*   s    zPythonFileRunner.__init__c          
   C   s   t tj}| jj}| jj | jj  }tj	
dd |D |d< | jjdj}d| _|   d}| jrv| j }tj||| jjj| jjg}| jdkr|dd= | jdk	r|| j tjtj||tj|d	 | j| j| jtjd
kd| _dS )zExecute the processc             s   s   | ]}|j V  qd S )N)	real_path).0Zfolderr   r   r	   	<genexpr>:   s   z'PythonFileRunner.run.<locals>.<genexpr>Z
PYTHONPATHzrope.base.oi.runmodN-      r   nt)
executabler   envcwdr   r   stderrZ	close_fds)dictosenvironr   r   r   ZprojectZget_source_foldersZget_python_path_folderspathsepjoinfind_modulereceiver_init_data_receivingget_send_infosysr   Zaddressr   r   extend
subprocessPopenpathsplitr   r   nameprocess)r   r   Z	file_pathZpath_foldersZrunmod_pathZ	send_infor   r   r   r	   run4   s,    





zPythonFileRunner.runc             C   sX   | j d krd S dstjdkr&t | _nt | _tj| jd| _	| j	
d | j	  d S )NTr   )target)r   r"   r0   _SocketReceiverr'   _FIFOReceiver	threadingZThread_receive_informationreceiving_threadZ	setDaemonstart)r   r   r   r	   r(   M   s    

z%PythonFileRunner._init_data_receivingc             C   s8   x| j  D ]}| | qW x| jD ]
}|  q&W d S )N)r'   receive_datar   r   )r   dataobserverr   r   r	   r7   \   s    z%PythonFileRunner._receive_informationc             C   s   | j   | jr| j  dS )zWait for the process to finishN)r1   waitr   r8   r%   )r   r   r   r	   wait_processe   s    
zPythonFileRunner.wait_processc             C   s   | j  dk	rdS y\t| j dr,| j   n@tjdkrHt| j jd n$ddl}t	| j j
}|jj|d W n tk
r   Y nX dS )zStop the processN	terminater   	   r   )r1   Zpollhasattrr?   r"   r0   killpidctypesintZ_handleZwindllZkernel32ZTerminateProcessOSError)r   rE   Zhandler   r   r	   kill_processk   s    
zPythonFileRunner.kill_processc             C   s   | j | dS )z,Notify this observer when execution finishesN)r   append)r   r<   r   r   r	   add_finishing_observer{   s    z'PythonFileRunner.add_finishing_observer)NNNN)__name__
__module____qualname____doc__r   r2   r(   r7   r>   rH   rJ   r   r   r   r	   r   '   s    
		r   c               @   s   e Zd Zdd Zdd ZdS )_MessageReceiverc             C   s   d S )Nr   )r   r   r   r	   r:      s    z_MessageReceiver.receive_datac             C   s   d S )Nr   )r   r   r   r	   r)      s    z_MessageReceiver.get_send_infoN)rK   rL   rM   r:   r)   r   r   r   r	   rO      s   rO   c               @   s$   e Zd Zdd Zdd Zdd ZdS )r4   c             C   s   t  t jt j| _d| _td| _xL| jdk rpy| jd| jf P W q& t j	k
rl   |  jd7  _Y q&X q&W | j
d d S )Ni      i  Z	localhostr   )socketZAF_INETZSOCK_STREAMserver_socket	data_portr"   urandomkeyZbinderrorZlisten)r   r   r   r	   r      s    z_SocketReceiver.__init__c             C   s   d| j t| jdf S )Nz%d:%szutf-8)rS   base64Z	b64encoderU   decode)r   r   r   r	   r)      s    z_SocketReceiver.get_send_infoc       
      c   s   | j  \}}| j   |d}xy| }t|dkr<P y:|d}t|d | }||d d }t|}W n   w$Y nX t	
| j|tj }	t||	sw$t|V  W q$ tk
r   P Y q$X q$W |  |  d S )Nrbr      :r   rA   )rR   ZacceptcloseZmakefilereadliner   indexrW   Z	b64decodehmacnewrU   hashlibZsha256digestr   pickleloadsEOFError)
r   ZconnZaddrmy_fileZbufZ
digest_endZ
buf_digestZbuf_dataZdecoded_buf_datara   r   r   r	   r:      s.    

	

z_SocketReceiver.receive_dataN)rK   rL   rM   r   r)   r:   r   r   r   r	   r4      s   r4   c               @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
r5   c             C   s   |   | _t| j d S )N)_get_file_name	file_namer"   mkfifo)r   r   r   r	   r      s    
z_FIFOReceiver.__init__c             C   sN   t  d }d}x(tj|t|dd r8|d7 }qW |t|dd S )Nz/__rope_r   r   0r   )tempfileZ
gettempdirr"   r.   existsstrrjust)r   prefixir   r   r	   rf      s
    z_FIFOReceiver._get_file_namec             C   s   | j S )N)rg   )r   r   r   r	   r)      s    z_FIFOReceiver.get_send_infoc             c   sR   t | jd}x,yt|V  W q tk
r4   P Y qX qW |  t| j d S )NrY   )openrg   marshalloadrd   r[   r"   remove)r   re   r   r   r	   r:      s    z_FIFOReceiver.receive_dataN)rK   rL   rM   r   rf   r)   r:   r   r   r   r	   r5      s   r5   )rW   r`   r^   ZcPicklerb   ImportErrorrq   r"   rQ   r,   r*   rj   r6   r
   r   objectr   rO   r4   r5   r   r   r   r	   <module>   s,   
Y	<