
    Æe                        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l	Z	d dl
Z
d dlZd dlZd dlZd Z	 d dlmZ  G d d      Z G d d      Z G d d	e      Z G d
 de      Zy# e$ r d dlZY \w xY w# e$ r eZY Cw xY w)    Nc                     t        |       t        |      k7  ryd}t        | |      D ]  \  }}|t        |      t        |      z  z  }! |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
differencea_charb_chars        2/usr/lib/python3/dist-packages/rope/base/oi/doa.py_compat_compare_digestr      sX     1vQ Ja) 0c&kCK//
0?    )compare_digestc                   >    e Zd ZdZ	 d
dZd Zd Zd Zd Zd Z	d	 Z
y)PythonFileRunnerz(A class for running python project filesNc                 f    || _         || _        || _        g | _        || _        || _        || _        y N)pycorefileanalyze_data	observersargsstdinstdout)selfr   file_r   r   r   r   s          r   __init__zPythonFileRunner.__init__-   s6     	(	
r   c                    t        t        j                        }| j                  j                  }| j
                  j                  j                         | j
                  j                  j                         z   }t        j                  j                  d |D              |d<   | j
                  j                  j                  d      j                  }d| _        | j                          d}| j                  r| j                  j                         }t        j                   ||| j
                  j                  j"                  | j                  j                  g}| j$                  |dd= | j&                  |j)                  | j&                         t+        j,                  t        j                   ||t        j.                  j1                  |      d   | j2                  | j4                  | j4                  t        j6                  d	k7  
      | _        y)zExecute the processc              3   4   K   | ]  }|j                     y wr   )	real_path).0folders     r   	<genexpr>z'PythonFileRunner.run.<locals>.<genexpr>@   s     +XF,<,<+Xs   
PYTHONPATHzrope.base.oi.runmodN-      r   nt)
executabler   envcwdr   r   stderr	close_fds)dictosenvironr   r    r   projectget_source_foldersget_python_path_folderspathsepjoinfind_modulereceiver_init_data_receivingget_send_infosysr)   addressr   r   extend
subprocessPopenpathsplitr   r   nameprocess)r   r*   	file_pathpath_foldersrunmod_path	send_infor   s          r   runzPythonFileRunner.run8   s   2::II''	KK224kk!!99;< 	 JJOO+X<+XXLkk))556KLVV!!#	==335INNKK''II
 $QqS	99 KK		"!''~~i(+**;;;;ggo	
r   c                     | j                   y 	 t               | _        t        j                  | j                        | _	        d| j                  _
        | j                  j                          y )NT)target)r   r/   rA   _SocketReceiverr7   _FIFOReceiver	threadingThread_receive_informationreceiving_threaddaemonstartr   s    r   r8   z%PythonFileRunner._init_data_receiving]   s[    $ +-DM !* 0 08Q8Q R'+$##%r   c                     | j                   j                         D ]  }| j                  |        | j                  D ]	  } |         y r   )r7   receive_datar   r   )r   dataobservers      r   rN   z%PythonFileRunner._receive_informationk   sF    MM..0 	$Dd#	$  	HJ	r   c                     | j                   j                          | j                  r| j                  j	                          yy)zWait for the process to finishN)rB   waitr   rO   r5   rR   s    r   wait_processzPythonFileRunner.wait_processt   s2    !!&&( r   c                    | j                   j                         yt        j                  t              5  t        | j                   d      r| j                   j                          nt        j                  dk7  r+t        j                  | j                   j                  d       nIddl}t        | j                   j                        }|j                  j                  j!                  |d       ddd       y# 1 sw Y   yxY w)zStop the processN	terminater(   	   r   )rB   poll
contextlibsuppressOSErrorhasattrr[   r/   rA   killpidctypesint_handlewindllkernel32TerminateProcess)r   re   handles      r   kill_processzPythonFileRunner.kill_processz   s    <<*  ) 		Dt||[1&&(D((!,T\\112&&77C		D 		D 		Ds   B9C77D c                 :    | j                   j                  |       y)z,Notify this observer when execution finishesN)r   append)r   rV   s     r   add_finishing_observerz'PythonFileRunner.add_finishing_observer   s    h'r   )NNNN)__name__
__module____qualname____doc__r   rG   r8   rN   rY   rl   ro    r   r   r   r   *   s1    2 OS	#
J&)D(r   r   c                       e Zd Zd Zd Zy)_MessageReceiverc                      y r   rt   rR   s    r   rT   z_MessageReceiver.receive_data       r   c                      y r   rt   rR   s    r   r9   z_MessageReceiver.get_send_info   rx   r   N)rp   rq   rr   rT   r9   rt   r   r   rv   rv      s    r   rv   c                       e Zd Zd Zd Zd Zy)rJ   c                    t        j                   t         j                  t         j                        | _        d| _        t        j                  d      | _        | j                  dk  r)	 | j                  j                  d| j                  f       	 | j                  j                  d       y # t        $ r | xj                  dz  c_        Y nw xY w| j                  dk  ryQ)Ni      i  	localhostr&   )socketAF_INETSOCK_STREAMserver_socket	data_portr/   urandomkeybindra   listenrR   s    r   r   z_SocketReceiver.__init__   s    #]]6>>6;M;MN::b>nnt#$""''dnn(EF 	!!!$  $!#$	 nnt#s   )'B- -CCc                 |    d| j                   t        j                  | j                        j	                  d      fz  S )Nz%d:%szutf-8)r   base64	b64encoder   decoderR   s    r   r9   z_SocketReceiver.get_send_info   s0    $..&*:*:488*D*K*KG*TUUUr   c              #     K   | j                   j                         \  }}| j                   j                          |j                  d      }	 	 |j	                         }t        |      dk(  rn	 |j                  d      }t        j                  |d |       }||dz   d }t        j                  |      }t        j                  | j                  |t        j                        j                         }	t!        ||	      st#        j$                  |       |j                          |j                          y # t        $ r Y w xY w# t&        $ r Y ;w xY ww)Nrbr      :r&   r]   )r   acceptclosemakefilereadliner   indexr   	b64decode	Exceptionhmacnewr   hashlibsha256digestr   pickleloadsEOFError)
r   connaddrmy_filebuf
digest_end
buf_digestbuf_datadecoded_buf_datar   s
             r   rT   z_SocketReceiver.receive_data   s2    ''..0
d  "--%&&(s8q=!$4J!'!1!1#kz2B!CJ":>B7H'-'7'7'A$ $((HgnnELLN%j&9 ll#344= B 	

 !    sh   A
EE +E-AD6 3A	E <E=E "E6	E?E  EEE 	EEEEN)rp   rq   rr   r   r9   rT   rt   r   r   rJ   rJ      s    %V&r   rJ   c                   $    e Zd Zd Zd Zd Zd Zy)rK   c                 l    | j                         | _        t        j                  | j                         y r   )_get_file_name	file_namer/   mkfiforR   s    r   r   z_FIFOReceiver.__init__   s"    ,,.
		$..!r   c                 h   t        j                         dz   }d}t        j                  j	                  |t        |      j                  dd      z         rA|dz  }t        j                  j	                  |t        |      j                  dd      z         rA|t        |      j                  dd      z   S )Nz/__rope_r   r'   0r&   )tempfile
gettempdirr/   r?   existsstrrjust)r   prefixis      r   r   z_FIFOReceiver._get_file_name   s    $$&3ggnnVc!fll1c&::;FA ggnnVc!fll1c&::;AQ,,,r   c                     | j                   S r   )r   rR   s    r   r9   z_FIFOReceiver.get_send_info   s    ~~r   c              #      K   t        | j                  d      }	 	 t        j                  |       # t        $ r Y nw xY w|j                          t        j                  | j                         y w)Nr   )openr   marshalloadr   r   r/   remove)r   r   s     r   rT   z_FIFOReceiver.receive_data   s_     t~~t,ll7++   
		$..!s    A23 A2	?A2?3A2N)rp   rq   rr   r   r   r9   rT   rt   r   r   rK   rK      s    "
-"r   rK   )r   r_   r   r   cPickler   ImportErrorr   r/   r~   r=   r:   r   rL   r   r   r   rv   rJ   rK   rt   r   r   <module>r      s         	   
  ",#
a( a(H 7& 7t"$ "Q  <  ,+N,s"   A' A6 '	A32A36B ?B 