
    c                     $   d dl Z d dlZd dlZd dlZ	 d dlZn# e$ r d dlZY nw xY w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 n# e$ r eZY nw xY w G d d          Z G d d          Z G d d	e          Z G d
 de          ZdS )    Nc                     t          |           t          |          k    rdS 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        0lib/python3.11/site-packages/rope/base/oi/doa.py_compat_compare_digestr      sl     1vvQ u J1II 0 0c&kkCKK//

?    )compare_digestc                   @    e Zd ZdZ	 d
dZd Zd Zd Zd Zd Z	d	 Z
dS )PythonFileRunnerz(A class for running python project filesNc                 h    || _         || _        || _        g | _        || _        || _        || _        d S N)pycorefileanalyze_data	observersargsstdinstdout)selfr   file_r   r   r   r   s          r   __init__zPythonFileRunner.__init__-   s:     	(	
r   c                 h   t          t          j                  }| j        j        }| j        j                                        | j        j                                        z   }t          j	        
                    d |D                       |d<   | j        j                            d          j        }d| _        |                                  d}| j        r| j                                        }t          j        ||| j        j        j        | j        j        g}| j        |dd= | j        |                    | j                   t+          j        t          j        ||t          j                            |          d         | j        | j        | j        t          j        d	k    
          | _        dS )zExecute the processc              3   $   K   | ]}|j         V  d S r   )	real_path).0folders     r   	<genexpr>z'PythonFileRunner.run.<locals>.<genexpr>@   s%      +X+XF,<+X+X+X+X+X+Xr   
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:I'	K2244k!99;;< 	 JOO+X+X<+X+X+XXXLk)556KLLV!!###	= 	63355INK'I
  	QqS	9 	#KK	"""!'~i((+*;;go	
 	
 	
r   c                     | j         d S 	 t                      | _        t          j        | j                  | _	        d| j	        _
        | j	                                         d S )NTr(   )target)r   r/   rA   _SocketReceiverr7   _FIFOReceiver	threadingThread_receive_informationreceiving_threaddaemonstartr   s    r   r8   z%PythonFileRunner._init_data_receiving]   se     	F	,+--DM !* 08Q R R R'+$##%%%%%r   c                     | j                                         D ]}|                     |           | j        D ]} |             d S r   )r7   receive_datar   r   )r   dataobservers      r   rN   z%PythonFileRunner._receive_informationk   s`    M..00 	$ 	$Dd####  	 	HHJJJJ	 	r   c                 |    | j                                          | j        r| j                                         dS dS )zWait for the process to finishN)rB   waitr   rO   r5   rR   s    r   wait_processzPythonFileRunner.wait_processt   sF     	)!&&(((((	) 	)r   c                    | j                                         dS t          j        t                    5  t          | j         d          r| j                                          nmt          j        dk    r t          j	        | j         j
        d           n=ddl}t          | j         j                  }|j        j                            |d           ddd           dS # 1 swxY w Y   dS )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   s1   < 	F )) 		D 		Dt|[11 D&&((((D D(!,,,,T\122&77CCC		D 		D 		D 		D 		D 		D 		D 		D 		D 		D 		D 		D 		D 		D 		D 		D 		D 		Ds   BCC#&C#c                 :    | j                             |           dS )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   *   s        22 OS	 	 	 	#
 #
 #
J& & &  ) ) )D D D( ( ( ( (r   r   c                       e Zd Zd Zd ZdS )_MessageReceiverc                     d S r   rt   rR   s    r   rT   z_MessageReceiver.receive_data       r   c                     d S r   rt   rR   s    r   r9   z_MessageReceiver.get_send_info   rx   r   N)rp   rq   rr   rT   r9   rt   r   r   rv   rv      s2              r   rv   c                        e Zd Zd Zd Zd ZdS )rJ   c                    t          j         t           j        t           j                  | _        d| _        t          j        d          | _        | j        dk     rN	 | j                            d| j        f           n+# t          $ r | xj        dz  c_        Y nw xY w| j        dk     N| j        
                    d           d S )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NN:b>>nt# 	$$"''dn(EFFF $ $ $!#$	 nt# 	$ 	!!!$$$$$s   !A= =BBc                 n    d| j         t          j        | j                                      d          fz  S )Nz%d:%szutf-8)r   base64	b64encoder   decoderR   s    r   r9   z_SocketReceiver.get_send_info   s/    $.&*:48*D*D*K*KG*T*TUUUr   c              #     K   | j                                         \  }}| j                                          |                    d          }	 	 |                                }t          |          dk    rn	 |                    d          }t          j        |d |                   }||dz   d         }t          j        |          }n# t          $ r Y w xY wt          j        | j        |t          j                                                  }	t!          ||	          st#          j        |          V  n# t&          $ r Y nw xY w|                                 |                                 d S )NrbTr      :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   s     '..00
d  """--%% 	&&((s88q= !$4J!'!1#kzk2B!C!CJ":>B#67H'-'7'A'A$$     H
 $(HgnEELLNN%j&99  l#3444444   ? 	B 	

s>   'D: 8AC 
D: 
CD: CA
D: #D: :
EEN)rp   rq   rr   r   r9   rT   rt   r   r   rJ   rJ      sD        % % %V V V& & & & &r   rJ   c                   &    e Zd Zd Zd Zd Zd ZdS )rK   c                 j    |                                  | _        t          j        | j                   d S r   )_get_file_name	file_namer/   mkfiforR   s    r   r   z_FIFOReceiver.__init__   s-    ,,..
	$.!!!!!r   c                    t          j                    dz   }d}t          j                            |t          |                              dd          z             rH|dz  }t          j                            |t          |                              dd          z             H|t          |                              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gnnVc!ffll1c&:&::;; 	FA gnnVc!ffll1c&:&::;; 	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        |          V  n# t          $ r Y nw xY w)|                                 t          j        | j                   d S )Nr   )openr   marshalloadr   r   r/   remove)r   r   s     r   rT   z_FIFOReceiver.receive_data   s      t~t,,	l7++++++   	
 	
	$.!!!!!s   1 
>>N)rp   rq   rr   r   r   r9   rT   rt   r   r   rK   rK      sP        " " "
- - -  " " " " "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            MMMMM  				      



       ",####### , , ,+NNN,a( a( a( a( a( a( a( a(H       7 7 7 7 7& 7 7 7t" " " " "$ " " " " "s    	##A AA