B
    ǇbBE                 @   s  U 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mZ d dlmZ d dlmZ d dlmZ d dlmZ ddlmZ dd	lmZ dd
lmZ ddlmZ ddlmZ ddlmZ ddl m!Z! ddl"m#Z# ddl$m%Z% ddl$m&Z& ddl$m'Z' e	j(r>d dl)m*Z* d dl)m+Z+ d dl)m,Z, dZ-e.e.dddZ/da0e	j1e	j2e.e3f  e4d< e	j1e	j2e.e3f  dddZ5G dd  d Z6d!e	j2e	j7e.e.f e	j7d" f d#d$d%Z8G d&d' d'Z9dS )(    N)BytesIO)chain)basename)join)adler32   )_log)NotFound)parse_cookie)gen_salt)	send_file)Request)Response   )Console)DebugFrameSummary)DebugTraceback)render_console_html)StartResponse)WSGIApplication)WSGIEnvironmenti:	 )pinreturnc             C   s$   t |  ddd d d S )Nz added saltzutf-8replace   )hashlibsha1encode	hexdigest)r    r   k/var/www/downstreamdata.science/rtclock/rtclock-venv/lib/python3.7/site-packages/werkzeug/debug/__init__.pyhash_pin&   s    r!   _machine_id)r   c              C   s4   t d k	rt S tjtjttf  ddd} |  a t S )N)r   c           
   S   s  d} xXdD ]P}y&t |d}|  }W d Q R X W n tk
rJ   w
Y nX |r
| |7 } P q
W y4t dd }| |  dd 7 } W d Q R X W n tk
r   Y nX | r| S yPddlm}m} |d	d
dddg|d d }t	
d|}|d k	r|dS W n ttfk
r   Y nX tjdkrdd l}yP||jdd|j|jB ,}	||	d\}
}||jkrt|
dS |
S Q R X W n tk
r   Y nX d S )N    )z/etc/machine-idz/proc/sys/kernel/random/boot_idrbz/proc/self/cgroup   /r   r   )PopenPIPEZioregz-cZIOPlatformExpertDevicez-d2)stdouts   "serial-number" = <([^>]+)r   win32zSOFTWARE\Microsoft\CryptographyZMachineGuidzutf-8)openreadlinestripOSError
rpartition
subprocessr&   r'   communicateresearchgroupImportErrorsysplatformwinregOpenKeyHKEY_LOCAL_MACHINEZKEY_READZKEY_WOW64_64KEYQueryValueExREG_SZr   )linuxfilenamefvaluer&   r'   dumpmatchr8   ZrkZguidZ	guid_typer   r   r    	_generate3   sV    
(
z!get_machine_id.<locals>._generate)r"   tOptionalUnionstrbytes)rC   r   r   r    get_machine_id-   s
    CrI   c               @   s<   e Zd ZdZejeejf dddZeejdddZ	dS )	_ConsoleFramez]Helper class so that we can reuse the frame console code for the
    standalone console.
    )	namespacec             C   s   t || _d| _d S )Nr   )r   consoleid)selfrK   r   r   r    __init__   s    
z_ConsoleFrame.__init__)coder   c             C   s   | j |S )N)rL   eval)rN   rP   r   r   r    rQ      s    z_ConsoleFrame.evalN)
__name__
__module____qualname____doc__rD   DictrG   AnyrO   rQ   r   r   r   r    rJ   z   s   rJ   r   )NN)appr   c          	      s  t jd}d}d|dkr dS |dk	rJ|dd rJd|krF|}n|t| dtt| j	j
}yt }W n ttfk
r   d}Y nX tj|}||t| dt| jt|d	dg}tt t g}t }x6t||D ](}	|	sqt|	tr|	d
}	||	 qW |d d| dd  }
dkrZ|d t| dddd |dkrxLdD ]@ t  dkrjd  fddt!dt D }P qjW }||
fS )aQ  Given an application object this returns a semi-stable 9 digit pin
    code and a random key.  The hope is that this is stable between
    restarts to not make debugging particularly frustrating.  If the pin
    was forcefully disabled this returns `None`.

    Second item in the resulting tuple is the cookie name for remembering.
    ZWERKZEUG_DEBUG_PINNoff)NN- rS   rR   __file__zutf-8s
   cookiesaltZ__wzd   s   pinsalt   Z09d	   )         r   c             3   s&   | ]}||     d V  qdS )0N)rjust).0x)
group_sizenumr   r    	<genexpr>   s   z*get_pin_and_cookie_name.<locals>.<genexpr>)"osenvirongetr   isdigitgetattrrD   castobject	__class__rS   getpassgetuserr5   KeyErrorr6   modulestyperR   rG   uuidgetnoderI   r   r   r   
isinstancer   updater   intlenr   range)rX   r   rvmodnameusernamemodZprobably_public_bitsZprivate_bitshbitZcookie_namer   )rg   rh   r    get_pin_and_cookie_name   sR    








r   c               @   sP  e Zd ZU dZeed< eed< d-d	eeeejej	g ej
eejf f  eeedd
	ddZeeje dddZejeddddZeedddZddeje dddZeeejeef edddZeedddZeeedd d!Zdeje d"d#d$Zddd%d&Zeedd'd(Zedd)d*Zddej e dd+d,Z!dS ).DebuggedApplicationa  Enables debugging support for a given application::

        from werkzeug.debug import DebuggedApplication
        from myapp import app
        app = DebuggedApplication(app, evalex=True)

    The `evalex` keyword argument allows evaluating expressions in a
    traceback's frame context.

    :param app: the WSGI application to run debugged.
    :param evalex: enable exception evaluation feature (interactive
                   debugging).  This requires a non-forking server.
    :param request_key: The key that points to the request object in this
                        environment.  This parameter is ignored in current
                        versions.
    :param console_path: the URL for a general purpose console.
    :param console_init_func: the function that is executed before starting
                              the general purpose console.  The return value
                              is used as initial namespace.
    :param show_hidden_frames: by default hidden traceback frames are skipped.
                               You can show them by setting this parameter
                               to `True`.
    :param pin_security: can be used to disable the pin based security system.
    :param pin_logging: enables the logging of the pin system.
    _pin_pin_cookieFwerkzeug.request/consoleNTr   )	rX   evalexrequest_keyconsole_pathconsole_init_funcshow_hidden_framespin_securitypin_loggingr   c	       	      C   s   |sd }|| _ || _i | _|| _|| _|| _|| _td| _d| _	|| _
|rtjddkr|rtdd | jd krtdd qtdd	| j nd | _d S )
Nr]   r   ZWERKZEUG_RUN_MAINtruewarningz * Debugger is active!z- * Debugger PIN disabled. DEBUGGER UNSECURED!infoz * Debugger PIN: %s)rX   r   framesr   r   r   r   r   secret_failed_pin_authr   rj   rk   rl   r   r   )	rN   rX   r   r   r   r   r   r   r   r   r   r    rO      s&    


zDebuggedApplication.__init__)r   c             C   s&   t | ds t| j}|\| _| _| jS )Nr   )hasattrr   rX   r   r   )rN   
pin_cookier   r   r    r     s    

zDebuggedApplication.pin)r@   r   c             C   s
   || _ d S )N)r   )rN   r@   r   r   r    r   %  s    c             C   s&   t | ds t| j}|\| _| _| jS )zThe name of the pin cookie.r   )r   r   rX   r   r   )rN   r   r   r   r    pin_cookie_name)  s    

z#DebuggedApplication.pin_cookie_namer   r   )rk   start_responser   c       
      c   s  d}y,|  ||}|E dH  t|dr.|  W n tk
r } zt|drV|  t|d| j d}x|jD ]}|| jt|< qpW t	| 
|}|j| j| j|d}t|ddd}	y|	||E dH  W n" tk
r   |d	 d
 Y nX |d	 d|  W dd}~X Y nX dS )z6Run the application and conserve the traceback frames.Ncloser   )skipZhide)r   r   evalex_trustedi  z	text/html)statusmimetypezwsgi.errorszpDebugging middleware caught exception in streamed response at a point where response headers were already sent.
r[   )rX   r   r   	Exceptionr   r   Z
all_framesr   rM   boolcheck_pin_trustZrender_debugger_htmlr   r   r   writer   Zrender_traceback_text)
rN   rk   r   Zapp_iteretbframe
is_trustedhtmlresponser   r   r    debug_application1  s0    


z%DebuggedApplication.debug_application)requestcommandr   r   c             C   s   t ||ddS )zExecute a command in a console.z	text/html)r   )r   rQ   )rN   r   r   r   r   r   r    execute_command[  s    z#DebuggedApplication.execute_command)r   r   c             C   sh   d| j krB| jdkri }nt|  }|d| j t|| j d< t| |j}t	t
| j|dddS )zDisplay a standalone shell.r   NrX   )r   r   z	text/html)r   )r   r   dict
setdefaultrX   rJ   r   r   rk   r   r   r   )rN   r   nsr   r   r   r    display_consoled  s    

z#DebuggedApplication.display_console)r   r>   r   c             C   sn   t dt|}ytt|}W n tk
r4   t S X |dkrDt S tt|d@ }t	t
||j||dS dS )z0Return a static resource from the shared folder.ZsharedNl    )Zdownload_nameetag)r   r   pkgutilget_data__package__r.   r	   rG   r   r   r   rk   )rN   r   r>   pathdatar   r   r   r    get_resources  s    z DebuggedApplication.get_resource)rk   r   c             C   sp   | j dkrdS t|| j}|r*d|kr.dS |dd\}}| sJdS |t| j kr\dS t t t	|k S )a!  Checks if the request passed the pin test.  This returns `True` if the
        request is trusted on a pin/cookie basis and returns `False` if not.
        Additionally if the cookie's stored pin hash is wrong it will return
        `None` so that appropriate action can be taken.
        NT|Fr   )
r   r
   rl   r   splitrm   r!   timePIN_TIMEr{   )rN   rk   valtsZpin_hashr   r   r    r     s    
z#DebuggedApplication.check_pin_trustc             C   s*   t | jdkrdnd |  jd7  _d S )Nr`   g      @g      ?r   )r   sleepr   )rN   r   r   r    _fail_pin_auth  s    z"DebuggedApplication._fail_pin_authc       	      C   s   d}d}|  |j}tt| j}d}|dkr<|   d}nT|rFd}nJ| jdkrVd}n:|jd }|	 
dd|
ddkrd| _d}n|   tt||d	d
d}|r|j| jtt  dt| dd|jd n|r|| j |S )zAuthenticates with the pin.FNT
   r   rZ   r[   r   )auth	exhaustedzapplication/json)r   r   ZStrict)httponlyZsamesitesecure)r   rk   rD   ro   rG   r   r   r   argsr-   r   r   jsondumps
set_cookier   r{   r   r!   Z	is_secureZdelete_cookie)	rN   r   r   r   trustr   
bad_cookieZentered_pinr~   r   r   r    pin_auth  s<    

zDebuggedApplication.pin_authc             C   s0   | j r(| jdk	r(tdd tdd| j tdS )zLog the pin if needed.Nr   z= * To enable the debugger you need to enter the security pin:z * Debugger pin code: %sr[   )r   r   r   r   )rN   r   r   r    log_pin_request  s
    z#DebuggedApplication.log_pin_requestc       	      C   s  t |}| j}|jddkr|jd}|jd}|jd}| j|jjdtd}|dkrt|rt| ||}nr|d	kr|| jkr| |}nT|d
kr|| jkr| 	 }n8| j
r|dk	r|dk	r| j|kr| |r| |||}n,| j
r| jdk	r|j| jkr| |}|||S )zDispatch the requests.Z__debugger__yescmdr?   sfrm)rv   resourceZpinauthZprintpinN)r   r   r   rl   r   r{   r   r   r   r   r   r   r   r   r   r   )	rN   rk   r   r   r   r   argr   r   r   r   r    __call__  s0    



zDebuggedApplication.__call__)Fr   r   NFTT)"rR   rS   rT   rU   rG   __annotations__r   rD   rE   CallablerV   rW   rO   propertyr   setterr   IteratorrH   r   r   rF   r   rJ   r   r   r   r   r   r   r   r   Iterabler   r   r   r   r    r      s>   
      .*3
r   ):rr   r   r   rj   r   r2   r6   r   typingrD   rw   ior   	itertoolsr   os.pathr   r   zlibr   	_internalr   
exceptionsr	   httpr
   securityr   utilsr   Zwrappers.requestr   Zwrappers.responser   rL   r   Ztbtoolsr   r   r   TYPE_CHECKINGZ_typeshed.wsgir   r   r   r   rG   r!   r"   rE   rF   rH   r   rI   rJ   Tupler   r   r   r   r   r    <module>   sL    M(T