3
¥YðiýE  ã               @   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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a*e
j+e
j,e(e-f  *e
j+e
j,e(e-f  dœdd„Z.G dd„ dƒZ/de
j,e
j0e(e(f e
j0d( f d œd!d"„Z1G d#d$„ d$ƒZ2dS ))é    N)Úchain)Úbasename)Újoiné   )Ú_log)Úparse_cookie)Úgen_salt)ÚRequest)ÚResponseé   )ÚConsole)ÚFrame)Úget_current_traceback)Úrender_console_html)Ú	Traceback)ÚStartResponse)ÚWSGIApplication)ÚWSGIEnvironmenté<   é   é   )ÚpinÚreturnc             C   s$   t j| › d�jddƒƒjƒ d d… S )Nz added saltzutf-8Úreplaceé   )ÚhashlibÚsha1ÚencodeÚ	hexdigest)r   © r   ú;/tmp/pip-build-8om4l6ph/Werkzeug/werkzeug/debug/__init__.pyÚhash_pin$   s    r!   )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ƒ�}|jƒ jƒ }W d Q R X W n tk
rJ   w
Y nX |r
| |7 } P q
W y4t ddƒ� }| |jƒ jƒ jdƒd 7 } W d Q R X W n tk
r¦   Y nX | r°| S yRdd	lm}m} |d
ddddg|d�jƒ d }t	j
d|ƒ}|d k	�r |jdƒS W n ttfk
�r   Y nX tjdk�ršdd l}yP|j|jdd|j|jB ƒ�,}	|j|	dƒ\}
}||jk�rv|
jdƒS |
S Q R X W n tk
�r˜   Y nX d S )Nó    ú/etc/machine-idú/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)r#   r$   )Ú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Úmatchr9   ZrkZguidZ	guid_typer   r   r    Ú	_generate1   sV    
(

z!get_machine_id.<locals>._generate)Ú_machine_idÚtÚOptionalÚUnionÚstrÚbytes)rD   r   r   r    Úget_machine_id+   s
    CrK   c               @   s*   e Zd ZdZejeejf 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)ÚselfrM   r   r   r    Ú__init__}   s    
z_ConsoleFrame.__init__N)	Ú__name__Ú
__module__Ú__qualname__Ú__doc__rF   ÚDictrI   ÚAnyrQ   r   r   r   r    rL   x   s   rL   r   )Úappr   c                s¼  t jjdƒ}d}d‰|dkr dS |dk	rJ|jddƒjƒ rJd|krF|}n|‰t| dtjt| ƒj	j
ƒ}ytjƒ }W n ttfk
rŠ   d}Y nX tjj|ƒ}||t| dt| ƒjƒt|ddƒg}ttjƒ ƒtƒ g}tjƒ }x8t||ƒD ]*}	|	sêqàt|	tƒ�r |	jd	ƒ}	|j|	ƒ qàW |jd
ƒ d|jƒ dd… › �}
ˆdk�r\|jdƒ t|jƒ dƒd›dd… ‰|dk�r´xLdD ]@‰ tˆƒˆ  dk�rldj ‡ ‡fdd„t!dtˆƒˆ ƒD ƒƒ}P �qlW ˆ}||
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ú-Ú rS   rR   Ú__file__zutf-8s
   cookiesaltZ__wzdé   s   pinsalté   Z09dé	   é   é   é   r   c             3   s&   | ]}ˆ||ˆ  … j ˆ d ƒV  qdS )Ú0N)Úrjust)Ú.0Úx)Ú
group_sizeÚnumr   r    ú	<genexpr>Î   s   z*get_pin_and_cookie_name.<locals>.<genexpr>)NN)r`   ra   rb   )"ÚosÚenvironÚgetr   ÚisdigitÚgetattrrF   ÚcastÚobjectÚ	__class__rS   ÚgetpassÚgetuserr6   ÚKeyErrorr7   ÚmodulesÚtyperR   rI   ÚuuidÚgetnoderK   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               @   sH  e Zd ZU dZee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 ths
                        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.
    Fú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 | _i | _|| _|| _|| _|| _tdƒ| _	d| _
|| _|r–tjjdƒdkrœ|rœtddƒ | jd kr†tddƒ qœt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ˆ   ÚframesÚ
tracebacksr‰   rŠ   r‹   rŒ   r   ÚsecretÚ_failed_pin_authrŽ   rj   rk   rl   r   r   )	rP   rX   rˆ   r‰   rŠ   r‹   rŒ   r�   rŽ   r   r   r    rQ   ö   s(    


zDebuggedApplication.__init__)r   c             C   s&   t | dƒs t| jƒ}|\| _| _| jS )NÚ_pin)Úhasattrr„   rX   r–   Ú_pin_cookie)rP   Ú
pin_cookier   r   r    r     s    

zDebuggedApplication.pin)rA   r   c             C   s
   || _ d S )N)r–   )rP   rA   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˜   )rP   r™   r   r   r    Úpin_cookie_name%  s    

z#DebuggedApplication.pin_cookie_namer   r   )rk   Ústart_responser   c             c   s  d}y,| j ||ƒ}|E dH  t|dƒr.|jƒ  W nÐ tk
�r    t|dƒrT|jƒ  td| jdd�}x|jD ]}|| j|j< qlW || j|j< y|dddgƒ W n" tk
rÀ   |d j	dƒ Y n.X t
| j|ƒƒ}|j| j|| jd�jddƒV  |j|d ƒ Y nX dS )z6Run the application and conserve the traceback frames.NÚcloser   T)ÚskiprŒ   Zignore_system_exceptionsz500 INTERNAL SERVER ERRORúContent-Typeútext/html; charset=utf-8úX-XSS-Protectionrc   zwsgi.errorszpDebugging middleware caught exception in streamed response at a point where response headers were already sent.
)rˆ   Úevalex_trustedr”   zutf-8r   )rž   rŸ   )r    rc   )rX   r—   rœ   Ú	Exceptionr   rŒ   r’   rO   r“   ÚwriteÚboolÚcheck_pin_trustZrender_fullrˆ   r”   r   Úlog)rP   rk   r›   Zapp_iterÚ	tracebackÚframeÚ
is_trustedr   r   r    Údebug_application-  s:    



z%DebuggedApplication.debug_application)ÚrequestÚcommandr¨   r   c             C   s   t |jj|ƒdd�S )zExecute a command in a console.z	text/html)Úmimetype)r
   rN   Úeval)rP   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| jƒ ƒ}|jd| jƒ t|ƒ| j d< t| j|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   rL   r¤   r¥   rk   r
   r   r”   )rP   r«   Únsr©   r   r   r    Údisplay_consolee  s    

z#DebuggedApplication.display_console)r«   r?   r   c             C   sj   t dt|ƒƒ}ytjt|ƒ}W n tk
r6   d}Y nX |dk	r^tj|ƒd pPd}t||d�S tddd�S )	z0Return a static resource from the shared folder.ZsharedNr   zapplication/octet-stream)r­   z	Not Foundi”  )Ústatus)	r   r   ÚpkgutilÚget_dataÚ__package__r/   Ú	mimetypesÚ
guess_typer
   )rP   r«   r?   Údatar­   r   r   r    Úget_resourcet  s    
z DebuggedApplication.get_resource)rk   r   c             C   sr   | j dkrdS t|ƒj| jƒ}| s,d|kr0dS |jddƒ\}}|jƒ sLdS |t| j ƒkr^dS tjƒ 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{   )rP   rk   ÚvalÚtsZpin_hashr   r   r    r¥   €  s    
z#DebuggedApplication.check_pin_trustc             C   s*   t j| jdkrdndƒ |  jd7  _d S )Nr`   g      @g      à?r   )r¾   Úsleepr•   )rP   r   r   r    Ú_fail_pin_auth’  s    z"DebuggedApplication._fail_pin_authc       	      C   sð   d}d}| j |jƒ}tjt| jƒ}d}|dkr<| jƒ  d}nT|rFd}nJ| jdkrVd}n:|jd }|j	ƒ j
ddƒ|j
ddƒkrˆd| _d}n| jƒ  ttj||d	œƒd
d�}|rÜ|j| jttjƒ ƒ› dt|ƒ› �dd|jd� n|rì|j| 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   rF   ro   rI   r   rÃ   r•   Úargsr.   r   r
   ÚjsonÚdumpsÚ
set_cookierš   r{   r¾   r!   Z	is_secureZdelete_cookie)	rP   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
   )rP   r   r   r    Úlog_pin_requestÉ  s
    z#DebuggedApplication.log_pin_requestc       	      C   s  t |ƒ}| j}|jjdƒdkrè|jjdƒ}|jjdƒ}|jjdƒ}| jj|jjdtd�ƒ}|dkrt|rt| j||ƒ}nr|d	kr’|| jkr’| j|ƒ}nT|d
kr®|| jkr®| j	ƒ }n8| j
ræ|dk	ræ|dk	ræ| j|kræ| j|ƒræ| j|||ƒ}n,| j
�r| jdk	�r|j| jk�r| j|ƒ}|||ƒS )zDispatch the requests.Z__debugger__ÚyesÚcmdr@   ÚsZfrm)rv   ÚresourceZpinauthZprintpinN)r	   rª   rÉ   rl   r’   r{   r»   r”   rÏ   rÐ   rˆ   r¥   r¯   rŠ   Úpathr³   )	rP   rk   r›   r«   ÚresponserÒ   Úargr”   r¨   r   r   r    Ú__call__Ò  s0    



zDebuggedApplication.__call__)Fr†   r‡   NFTT)#rR   rS   rT   rU   rI   r–   r˜   r¤   rF   rG   ÚCallablerV   rW   rQ   Úpropertyr   Úsetterrš   ÚIteratorrJ   rª   r	   rH   r   rL   r
   r¯   r³   r»   r¥   rÃ   rÏ   rÐ   ÚIterablerØ   r   r   r   r    r…   Ø   s:   
      .13
r…   i  i€Q i€:	 )NN)3rr   r   rÊ   r¸   rj   rµ   r3   r7   r¾   ÚtypingrF   rw   Ú	itertoolsr   Úos.pathr   r   Z	_internalr   Úhttpr   Úsecurityr   Zwrappers.requestr	   Zwrappers.responser
   rN   r   Ztbtoolsr   r   r   r   ZTYPE_CHECKINGZ_typeshed.wsgir   r   r   r¿   rI   r!   rE   rG   rH   rJ   rK   rL   ÚTupler„   r…   r   r   r   r    Ú<module>   sH    M(T