a
    Qha                     @   sj  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mZmZ d dlmZmZ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!m"Z" edddidZ#dd Z$G dd de%Z&G dd dZ'd+ddZ(e j)dd Z*dd Z+dd  Z,d!d" Z-G d#d$ d$Z.G d%d& d&Z/d'd( Z0d)d* Z1dS ),    N)Path)settings)Http404HttpResponseHttpResponseNotFound)ContextEngineTemplateDoesNotExist)pprint)resolve)timezone)MultiValueDict)	force_str)import_string)_lazy_re_compile)PY311get_docs_versionTZi18nzdjango.templatetags.i18n)debug	librariesc                 C   s   t tjd |  S )z
    Return a path to a builtin template.

    Avoid calling this function at the module level or in a class-definition
    because __file__ may not exist, e.g. in frozen environments.
    	templates)r   __file__parent)name r   K/var/www/sistema_ama/venv/lib/python3.9/site-packages/django/views/debug.pybuiltin_template_path   s    r   c                   @   s   e Zd ZdS )ExceptionCycleWarningN)__name__
__module____qualname__r   r   r   r   r   )   s   r   c                   @   s    e Zd ZdZdd Zdd ZdS )CallableSettingWrapperz
    Object to wrap callable appearing in settings.
    * Not to call in the debug page (#21345).
    * Not to break the debug page if the callable forbidding to set attributes
      (#23070).
    c                 C   s
   || _ d S N)_wrapped)selfZcallable_settingr   r   r   __init__5   s    zCallableSettingWrapper.__init__c                 C   s
   t | jS r!   )reprr"   r#   r   r   r   __repr__8   s    zCallableSettingWrapper.__repr__N)r   r   r   __doc__r$   r'   r   r   r   r   r    -   s   r      c                 C   sJ   t | | |||}| dr0| }t||dS | }t||ddS dS )z
    Create a technical server error response. The last three arguments are
    the values returned from sys.exc_info() and friends.
    z	text/html)statusztext/plain; charset=utf-8)r*   content_typeN)get_exception_reporter_classacceptsget_traceback_htmlr   get_traceback_text)requestexc_type	exc_valuetbstatus_codereporterhtmltextr   r   r   technical_500_response<   s    
r8   c                   C   s   t tj S r!   )r   r   !DEFAULT_EXCEPTION_REPORTER_FILTERr   r   r   r   %get_default_exception_reporter_filterL   s    r:   c                 C   s   t  }t| d|S )NZexception_reporter_filter)r:   getattr)r0   Zdefault_filterr   r   r   get_exception_reporter_filterR   s    r<   c                 C   s   t tj}t| d|S )NZexception_reporter_class)r   r   DEFAULT_EXCEPTION_REPORTERr;   )r0   Z default_exception_reporter_classr   r   r   r,   W   s    r,   c                 C   sB   | j }|d u r0zt| j}W n ty.   Y n0 |d u r<dS |jS )N )resolver_matchr   pathr   
_func_path)r0   r?   r   r   r   
get_caller`   s    rB   c                   @   sj   e Zd ZdZdZedejdZdd Z	dd Z
d	d
 Zdd Zdd Zdd Zdd Zdd Zdd ZdS )SafeExceptionReporterFilterz
    Use annotations made by the sensitive_post_parameters and
    sensitive_variables decorators to filter out sensitive information.
    z********************z/API|TOKEN|KEY|SECRET|PASS|SIGNATURE|HTTP_COOKIE)flagsc                    s   |t jkrd}n(z j|}W n ty6   d}Y n0 |rD j}nft|trf fdd| D }nDt|t	r fdd|D }n&t|t
rt
 fdd|D }n|}t|rt|}|S )z
        Cleanse an individual setting key/value of sensitive content. If the
        value is a dictionary, recursively cleanse the keys in that dictionary.
        TFc                    s   i | ]\}}|  ||qS r   cleanse_setting.0kvr&   r   r   
<dictcomp>       z?SafeExceptionReporterFilter.cleanse_setting.<locals>.<dictcomp>c                    s   g | ]}  d |qS r>   rE   rH   rJ   r&   r   r   
<listcomp>   rL   z?SafeExceptionReporterFilter.cleanse_setting.<locals>.<listcomp>c                    s   g | ]}  d |qS rM   rE   rN   r&   r   r   rO      rL   )r   SESSION_COOKIE_NAMEhidden_settingssearch	TypeErrorcleansed_substitute
isinstancedictitemslisttuplecallabler    )r#   keyvalueZis_sensitivecleansedr   r&   r   rF   u   s$    




z+SafeExceptionReporterFilter.cleanse_settingc                 C   s4   i }t tD ]"}| r| |tt|||< q|S )z
        Return a dictionary of the settings module with values of sensitive
        settings replaced with stars (*********).
        )dirr   isupperrF   r;   )r#   settings_dictrI   r   r   r   get_safe_settings   s
    z-SafeExceptionReporterFilter.get_safe_settingsc                    s&   t |dsi S  fdd|j D S )zU
        Return a dictionary of request.META with sensitive values redacted.
        METAc                    s   i | ]\}}|  ||qS r   rE   rG   r&   r   r   rK      rL   zESafeExceptionReporterFilter.get_safe_request_meta.<locals>.<dictcomp>)hasattrrb   rW   r#   r0   r   r&   r   get_safe_request_meta   s    
z1SafeExceptionReporterFilter.get_safe_request_metac                    s&   t |dsi S  fdd|j D S )zX
        Return a dictionary of request.COOKIES with sensitive values redacted.
        COOKIESc                    s   i | ]\}}|  ||qS r   rE   rG   r&   r   r   rK      rL   z@SafeExceptionReporterFilter.get_safe_cookies.<locals>.<dictcomp>)rc   rf   rW   rd   r   r&   r   get_safe_cookies   s    
z,SafeExceptionReporterFilter.get_safe_cookiesc                 C   s
   t jdu S )a  
        This filter is to add safety in production environments (i.e. DEBUG
        is False). If DEBUG is True then your site is not safe anyway.
        This hook is provided as a convenience to easily activate or
        deactivate the filter on a per request basis.
        F)r   DEBUGrd   r   r   r   	is_active   s    z%SafeExceptionReporterFilter.is_activec                 C   sB   t |dg }| |r>|r>| }|D ]}||v r&| j||< q&|S )z
        Replace the keys in a MultiValueDict marked as sensitive with stars.
        This mitigates leaking sensitive POST parameters if something like
        request.POST['nonexistent_key'] throws an exception (#21098).
        sensitive_post_parameters)r;   ri   copyrT   )r#   r0   Zmultivaluedictrj   paramr   r   r   get_cleansed_multivaluedict   s    z7SafeExceptionReporterFilter.get_cleansed_multivaluedictc                 C   s|   |du ri S t |dg }| |rr|rr|j }|dkrP|D ]}| j||< q<|S |D ]}||v rT| j||< qT|S n|jS dS )zk
        Replace the values of POST parameters marked as sensitive with
        stars (*********).
        Nrj   __ALL__)r;   ri   POSTrk   rT   )r#   r0   rj   r]   rI   rl   r   r   r   get_post_parameters   s     
z/SafeExceptionReporterFilter.get_post_parametersc              
   C   sT   zt |t}W n0 ty> } zd||W  Y d }~S d }~0 0 |rP| ||}|S )Nz{!r} while evaluating {!r})rU   r   	Exceptionformatrm   )r#   r0   r\   Zis_multivalue_dicter   r   r   cleanse_special_types   s    "z1SafeExceptionReporterFilter.cleanse_special_typesc           	      C   s  |j }d}|durH|jjdkr@d|jv r@|jd }t|dd}qH|j }q
i }| |r|r|dkrz|jD ]}| j||< qhq|j D ],\}}||v r| j}n| ||}|||< qn$|j D ]\}}| ||||< q|jjdkrd|jv r| j|d< | j|d< | S )ze
        Replace the values of variables marked as sensitive with
        stars (*********).
        NZsensitive_variables_wrappersensitive_variablesrn   Z	func_argsZfunc_kwargs)	f_backf_codeco_namef_localsr;   ri   rT   rW   rt   )	r#   r0   tb_framecurrent_frameru   wrapperr]   r   r\   r   r   r   get_traceback_frame_variables   s<    





z9SafeExceptionReporterFilter.get_traceback_frame_variablesN)r   r   r   r(   rT   r   reIrQ   rF   ra   re   rg   ri   rm   rp   rt   r}   r   r   r   r   rC   j   s   	rC   c                   @   s|   e Zd ZdZedd Zedd ZdddZd	d
 Zdd Z	dd Z
dd Zdd ZdddZdd Zdd Zdd ZdS )ExceptionReporterz0Organize and coordinate reporting on exceptions.c                 C   s   t dS )Nztechnical_500.htmlr   r&   r   r   r   html_template_path'  s    z$ExceptionReporter.html_template_pathc                 C   s   t dS )Nztechnical_500.txtr   r&   r   r   r   text_template_path+  s    z$ExceptionReporter.text_template_pathFc                 C   sJ   || _ t| j | _|| _|| _|| _|| _t| jdd | _d| _	d | _
d S )Ntemplate_debugF)r0   r<   filterr1   r2   r3   is_emailr;   template_infotemplate_does_not_exist
postmortem)r#   r0   r1   r2   r3   r   r   r   r   r$   /  s    zExceptionReporter.__init__c                 C   s    dj | jj| j | j dS )z
        Return an absolute URI from variables available in this request. Skip
        allowed hosts protection, so may return insecure URI.
        z{scheme}://{host}{path})schemehostr@   )rr   r0   r   _get_raw_hostget_full_pathr&   r   r   r   _get_raw_insecure_uri;  s
    z'ExceptionReporter._get_raw_insecure_uric                 C   s  | j r*t| j tr*d| _| jjp&| jg| _|  }t|D ]p\}}d|v rg }|d D ]B\}}t	|}t
|dkrd|dd t
|f }|||f qV||d< |||< q:d}| j r0t| j tr0t| jdd}t| jd	d}	|dur0|	dur0| jjd
 }
t|
t|d dt|	d t
|
 ddd}ddlm} | jdu rNd}n*zt| jj}W n tyv   d}Y n0 | j||| j| j| j| j| j |t| j| j | j t j!dt j"dd  t#$ | t j%| j&| j| jd}| jdur8| jj' |d< | jj( |d< | ) |d< t*| j|d< | j rL| j j+|d< | jrt| j|d< t| jdd }rdd,| |d< |r|d |d< |S )z5Return a dictionary containing traceback information.Tvarsi   u   %s… <trimmed %d bytes string>r   r>   startNend      asciireplace)errors)get_versionz%[unable to retrieve the current user]z%d.%d.%d   )r   unicode_hintframesr0   Zrequest_metaZrequest_COOKIES_itemsuser_strZfiltered_POST_itemsr   Zsys_executableZsys_version_infoserver_timeZdjango_version_infoZsys_pathr   r   r   Zrequest_GET_itemsZrequest_FILES_itemsZrequest_insecure_uriraising_view_nameZexception_typeZexception_valueZ	__notes__
Zexception_notesZ	lastframe)-r1   
issubclassr	   r   r2   chainr   get_traceback_frames	enumerater
   lenappendUnicodeErrorr;   argsr   maxmindjangor   r0   struserrq   r   r   re   rg   rW   rX   rp   ra   sys
executableversion_infor   nowr@   r   GETFILESr   rB   r   join)r#   r   iframeZ
frame_varsrI   rJ   r   r   r   Zunicode_strr   r   cZ	exc_notesr   r   r   get_traceback_dataF  s    
"
z$ExceptionReporter.get_traceback_datac                 C   sV   | j jdd}t| }W d   n1 s20    Y  t|  dd}||S )z1Return HTML version of debug 500 HTTP error page.utf-8encodingNF)use_l10n)r   openDEBUG_ENGINEfrom_stringreadr   r   renderr#   fhtr   r   r   r   r.     s    ,z$ExceptionReporter.get_traceback_htmlc                 C   sX   | j jdd}t| }W d   n1 s20    Y  t|  ddd}||S )z7Return plain text version of debug 500 HTTP error page.r   r   NF)
autoescaper   )r   r   r   r   r   r   r   r   r   r   r   r   r/     s    ,z$ExceptionReporter.get_traceback_textc                 C   s   d }t |dr@z||}W n ty.   Y n0 |d ur@| }|d u rz:t|d}|  }W d    n1 sv0    Y  W n ty   Y n0 |S )N
get_sourcerb)rc   r   ImportError
splitlinesr   r   OSError)r#   filenameloadermodule_namesourcefpr   r   r   _get_source  s    
.zExceptionReporter._get_sourceNc                    s   |  |||}|du r"dg dg fS t|d trzd |dd D ]&}td|}|r@|d d  qhq@ fdd|D }td|| }	|| }
z(||	| }|| }||d |
 }W n ty   dg dg f Y S 0 |	|||fS )	z
        Return context_lines before and after lineno from file.
        Return (pre_context_lineno, pre_context, context_line, post_context).
        Nr   r      s   coding[:=]\s*([-\w.]+)r   c                    s   g | ]}t | d qS )r   )r   )rH   sliner   r   r   rO     rL   z:ExceptionReporter._get_lines_from_file.<locals>.<listcomp>)r   rU   bytesr~   rR   decoder   
IndexError)r#   r   linenocontext_linesr   r   r   linematchZlower_boundZupper_boundpre_contextcontext_linepost_contextr   r   r   _get_lines_from_file  s(    z&ExceptionReporter._get_lines_from_filec                 C   s4   t |dd }t |dd }t |dd }|p2|r0d S |S )N	__cause____suppress_context____context__)r;   )r#   r2   ZexplicitZsuppress_contextZimplicitr   r   r   _get_explicit_or_implicit_cause  s    z1ExceptionReporter._get_explicit_or_implicit_causec                 C   s   g }| j }|r>|| | |}||v r
td| t q>q
g }|sJ|S | }|s\| jn|j}|	| 
|| z| }W n ty   Y qY n0 |j}qb|S )NzHCycle in the exception chain detected: exception '%s' encountered again.)r2   r   r   warningswarnr   popr3   __traceback__extendget_exception_traceback_framesr   )r#   
exceptionsr2   r   r3   r   r   r   r     s2    


z&ExceptionReporter.get_traceback_framesc                 c   s  |  |}t|dd}|d u r.||d ddV  |d ur|jjdrN|j}q.|jjj}|jjj}|j	d }|jj
d}|jj
dpd	}	| ||d
||	\}
}}}|
d u r|}
g }d}g }d	 }}trdtt|jj |jd d \}}}}|rd|rdd||  }d|tt|d  d  }d| | }dd| t|t|    }d| | }||||	drzdnd|||d | j| j|jt|||||
d ||dV  |j}q.d S )Nr   Tr   )	exc_causeexc_cause_explicitr3   type__traceback_hide__r   
__loader__r   r>      z<source code not available>r   ^ r      zdjango.r   )r   r   r3   r   r   functionr   r   idr   r   r   pre_context_linenocolnotb_area_colno)r   r;   rz   ry   gettb_nextrw   co_filenamerx   	tb_lineno	f_globalsr   r   next	itertoolsisliceZco_positionstb_lastir   r   lstrip
startswithr   r}   r0   r   )r#   r2   r3   r   r   r   r   r   r   r   r   r   r   r   r   r   _Zstart_columnZ
end_columnZ	underlinespacesZtb_area_spacesr   r   r   r      s    




z0ExceptionReporter.get_exception_traceback_frames)F)NN)r   r   r   r(   propertyr   r   r$   r   r   r.   r/   r   r   r   r   r   r   r   r   r   r   $  s    


P 
$!r   c           
      C   s  z|j d d }W n& tttfy8   | jdd }Y n0 z|j d d }W n. tttfyz   d}| jrr| jjnd}Y np0 d}|r| jdkrt|dkrt|d dkrt	|d d d	d
t	|d d dd
  krdkrn nt
| S t	| dtj}t|tjr|j}tdjdd}t| }W d   n1 sB0    Y  t }t|tj|||t|| | t| d	}	t||	S )zBCreate a technical 404 error response. `exception` is the Http404.r   r@   r   NtriedTF/app_namer>   	namespaceadminurlconfztechnical_404.htmlr   r   )	r	  Zroot_urlconfZrequest_pathurlpatternsresolvedreasonr0   r   r   )r   r   rS   KeyError	path_infor?   r  r@   r   r;   default_urlconfr   ROOT_URLCONFrU   types
ModuleTyper   r   r   r   r   r   r:   r   r   ra   rB   r   r   )
r0   	exceptionZ	error_urlr  r  r	  r   r   Zreporter_filterr   r   r   r   technical_404_responseN  sT    

.r  c                 C   sZ   t djdd}t| }W d   n1 s40    Y  tdt i}t||S )z+Create an empty URLconf 404 error response.zdefault_urlconf.htmlr   r   Nversion)	r   r   r   r   r   r   r   r   r   )r0   r   r   r   r   r   r   r  }  s    ,r  )r)   )2	functoolsr   r~   r   r  r   pathlibr   django.confr   django.httpr   r   r   django.templater   r   r	   Zdjango.template.defaultfiltersr
   django.urlsr   django.utilsr   django.utils.datastructuresr   django.utils.encodingr   django.utils.module_loadingr   django.utils.regex_helperr   django.utils.versionr   r   r   r   UserWarningr   r    r8   	lru_cacher:   r<   r,   rB   rC   r   r  r  r   r   r   r   <module>   sJ   


	
 ;  ,/