o
    {,hFd                     @   s~  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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# d dl$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# Z0G d$d% d%Z1G d&d' d'Z2d(d) Z3d*d+ Z4dS )-    N)Path)settings)Http404HttpResponseHttpResponseNotFound)ContextEngineTemplateDoesNotExist)pprint)resolve)timezone)MultiValueDict)	force_str)import_string)_lazy_re_compile)PY311get_docs_version)*coroutine_functions_to_sensitive_variablesT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   H/var/www/html/rh/venv/lib/python3.10/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)selfcallable_settingr   r   r   __init__7      
zCallableSettingWrapper.__init__c                 C   s
   t | jS r#   )reprr$   r%   r   r   r   __repr__:   r(   zCallableSettingWrapper.__repr__N)r   r    r!   __doc__r'   r+   r   r   r   r   r"   /   s    r"     c                 C   sF   t | | |||}| dr| }t||dS | }t||d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_type)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   
r<   c                   C   s   t tj S r#   )r   r   !DEFAULT_EXCEPTION_REPORTER_FILTERr   r   r   r   %get_default_exception_reporter_filterN   s   r>   c                 C   s   t  }t| d|S )Nexception_reporter_filter)r>   getattr)r4   default_filterr   r   r   get_exception_reporter_filterT   s   rB   c                 C   s   t tj}t| d|S )Nexception_reporter_class)r   r   DEFAULT_EXCEPTION_REPORTERr@   )r4    default_exception_reporter_classr   r   r   r0   Y   s   r0   c                 C   sB   | j }|d u rzt| j}W n	 ty   Y nw |d u rdS |jS )N )resolver_matchr   pathr   
_func_path)r4   rG   r   r   r   
get_callerb   s   rJ   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********************z4API|AUTH|TOKEN|KEY|SECRET|PASS|SIGNATURE|HTTP_COOKIE)flagsc                    s   |t jkrd}nz j|}W n ty   d}Y nw |r" j}n3t|tr3 fdd| D }n"t|t	rB fdd|D }nt|t
rSt
 fdd|D }n|}t|r]t|}|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                       i | ]\}}|  ||qS r   cleanse_setting.0kvr*   r   r   
<dictcomp>       z?SafeExceptionReporterFilter.cleanse_setting.<locals>.<dictcomp>c                       g | ]}  d |qS rF   rN   rQ   rS   r*   r   r   
<listcomp>       z?SafeExceptionReporterFilter.cleanse_setting.<locals>.<listcomp>c                    rV   rW   rN   rX   r*   r   r   rY      rZ   )r   SESSION_COOKIE_NAMEhidden_settingssearch	TypeErrorcleansed_substitute
isinstancedictitemslisttuplecallabler"   )r%   keyvalueis_sensitivecleansedr   r*   r   rO   w   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   isupperrO   r@   )r%   settings_dictrR   r   r   r   get_safe_settings   s   z-SafeExceptionReporterFilter.get_safe_settingsc                    &   t |dsi S  fdd|j D S )zU
        Return a dictionary of request.META with sensitive values redacted.
        METAc                    rM   r   rN   rP   r*   r   r   rT      rU   zESafeExceptionReporterFilter.get_safe_request_meta.<locals>.<dictcomp>)hasattrro   rb   r%   r4   r   r*   r   get_safe_request_meta      
z1SafeExceptionReporterFilter.get_safe_request_metac                    rn   )zX
        Return a dictionary of request.COOKIES with sensitive values redacted.
        COOKIESc                    rM   r   rN   rP   r*   r   r   rT      rU   z@SafeExceptionReporterFilter.get_safe_cookies.<locals>.<dictcomp>)rp   rt   rb   rq   r   r*   r   get_safe_cookies   rs   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   DEBUGrq   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@   rw   copyr_   )r%   r4   multivaluedictrx   paramr   r   r   get_cleansed_multivaluedict   s   
z7SafeExceptionReporterFilter.get_cleansed_multivaluedictc                 C   sv   |du ri S t |dg }| |r8|r8|j }|dkr(|D ]}| j||< q|S |D ]}||v r5| j||< q*|S |jS )zk
        Replace the values of POST parameters marked as sensitive with
        stars (*********).
        Nrx   __ALL__)r@   rw   POSTry   r_   )r%   r4   rx   ri   rR   r{   r   r   r   get_post_parameters   s"   

z/SafeExceptionReporterFilter.get_post_parametersc              
   C   sT   zt |t}W n ty } zd||W  Y d }~S d }~ww |r(| ||}|S )Nz{!r} while evaluating {!r})r`   r   	Exceptionformatr|   )r%   r4   rg   is_multivalue_dicter   r   r   cleanse_special_types   s   z1SafeExceptionReporterFilter.cleanse_special_typesc           
      C   sZ  d}|j jtj@ dkr$|j jdkr$t|j j d|j j }t	|d}|du rL|}|durL|j jdkrEd|j
v rE|j
d }t|dd}n|j}|dus.i }| |r|r|dkre|j
D ]}| j||< q\n/|j
 D ]\}}	||v rv| j}	n| ||	}	|	||< qjn|j
 D ]\}}	| ||	||< q|j jdkrd|j
v r| j|d< | j|d< | S )	ze
        Replace the values of variables marked as sensitive with
        stars (*********).
        Nr   sensitive_variables_wrapper:sensitive_variablesr}   	func_argsfunc_kwargs)f_codeco_flagsinspectCO_COROUTINEco_namehashco_filenameco_firstlinenor   getf_localsr@   f_backrw   r_   rb   r   )
r%   r4   tb_framer   rf   current_framewrapperri   r   rg   r   r   r   get_traceback_frame_variables   sL   



	


z9SafeExceptionReporterFilter.get_traceback_frame_variablesN)r   r    r!   r,   r_   r   reIr\   rO   rm   rr   ru   rw   r|   r   r   r   r   r   r   r   rK   l   s    	rK   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      t dS )Nztechnical_500.htmlr   r*   r   r   r   html_template_path9     z$ExceptionReporter.html_template_pathc                 C   r   )Nztechnical_500.txtr   r*   r   r   r   text_template_path=  r   z$ExceptionReporter.text_template_pathFc                 C   sJ   || _ t| j | _|| _|| _|| _|| _t| jdd | _d| _	d | _
d S )Ntemplate_debugF)r4   rB   filterr5   r6   r7   is_emailr@   template_infotemplate_does_not_exist
postmortem)r%   r4   r5   r6   r7   r   r   r   r   r'   A  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hostrH   )r   r4   r   _get_raw_hostget_full_pathr*   r   r   r   _get_raw_insecure_uriM  s
   z'ExceptionReporter._get_raw_insecure_uric                 C   s  | j rt| j trd| _| jjp| jg| _|  }t|D ]8\}}d|v rQg }|d D ]!\}}t	|}t
|dkrEd|dd t
|f }|||f q+||d< |||< qd}| j rt| j trt| jdd}t| jd	d}	|dur|	dur| jjd
 }
t|
t|d dt|	d t
|
 ddd}ddlm} | jdu rd}nzt| jj}W n ty   d}Y nw i d| jd|d|d| jd| j| jd| j| j d|dt| j| j d| j dt j!ddt j"dd  dt#$ d| d t j%d!| j&d"| jd#| j}| jdur7| jj' |d$< | jj( |d%< | ) |d&< t*| j|d'< | j rA| j j+|d(< | jr_t| j|d)< t| jd*d }r_d+d+,| |d,< |rh|d- |d.< |S )/z5Return a dictionary containing traceback information.Tvarsi   u   %s… <trimmed %d bytes string>r   rF   startNend      asciireplace)errors)get_versionz%[unable to retrieve the current user]r   unicode_hintframesr4   request_metarequest_COOKIES_itemsuser_strfiltered_POST_itemsr   sys_executablesys_version_infoz%d.%d.%d   server_timedjango_version_infosys_pathr   r   r   request_GET_itemsrequest_FILES_itemsrequest_insecure_uriraising_view_nameexception_typeexception_value	__notes__
exception_notes	lastframe)-r5   
issubclassr	   r   r6   chainr   get_traceback_frames	enumerater
   lenappendUnicodeErrorr@   argsr   maxmindjangor   r4   struserr   r   r   rr   ru   rb   rc   r   rm   sys
executableversion_infor   nowrH   r   GETFILESr   rJ   r   join)r%   r   iframe
frame_varsrR   rS   r   r   r   unicode_strr   r   c	exc_notesr   r   r   get_traceback_dataX  s   
"

z$ExceptionReporter.get_traceback_datac                 C   sV   | j jdd}t| }W d   n1 sw   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   r2     s
   
z$ExceptionReporter.get_traceback_htmlc                 C   sX   | j jdd}t| }W d   n1 sw   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   r3     s
   
z$ExceptionReporter.get_traceback_textc                 C   s   d }t |dr z||}W n	 ty   Y nw |d ur | }|d u rOz t|d}|  }W d    W |S 1 s=w   Y  W |S  tyN   Y |S w |S )N
get_sourcerb)rp   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r=d |dd D ]}td|}|r3|d d  nq  fdd|D }td|| }	|| }
z||	| }|| }||d |
 }W n tyk   dg dg f Y S w |	|||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   )rQ   sliner   r   r   rY     rZ   z:ExceptionReporter._get_lines_from_file.<locals>.<listcomp>)r   r`   bytesr   r]   decoder   
IndexError)r%   r   linenocontext_linesr   r   r   linematchlower_bound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 }|p|rd S |S )N	__cause____suppress_context____context__)r@   )r%   r6   explicitsuppress_context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 n|sg }|s&|S | }|s/| jn|j}	 |	| 
|| z| }W n
 tyL   Y |S w |j}q3)NzHCycle in the exception chain detected: exception '%s' encountered again.)r6   r   r  warningswarnr   popr7   __traceback__extendget_exception_traceback_framesr  )r%   
exceptionsr6   r   r7   r   r   r   r     s:   

z&ExceptionReporter.get_traceback_framesc                 c   s   |  |}t|dd}|d u r||d ddV  |d ur|jjdr'|j}q|jjj}|jjj}|j	d }|jj
d}|jj
dpEd	}	| ||d
||	\}
}}}|
d u r_|}
g }d}g }d	 }}trtt|jj |jd d \}}}}|r|rd||  }d|tt|d  d  }d| | }dd| t|t|    }d| | }||||	drdnd|||d | j| j|jt|||||
d ||dV  |j}|d usd S d S )Nr  Tr   )	exc_causeexc_cause_explicitr7   type__traceback_hide__r   
__loader__r   rF      z<source code not available>r   ^ r      zdjango.r   )r  r  r7   r  r   functionr  r   idr
  r  r  pre_context_linenocolnotb_area_colno)r  r@   r   r   r   tb_nextr   r   r   	tb_lineno	f_globalsr  r   next	itertoolsisliceco_positionstb_lastir   r   lstrip
startswithr   r   r4   r&  )r%   r6   r7   r  r  r   r%  r  r   r   r'  r
  r  r  r(  r)  _start_column
end_column	underlinespacestb_area_spacesr   r   r   r    s   



z0ExceptionReporter.get_exception_traceback_frames)F)NN)r   r    r!   r,   propertyr   r   r'   r   r   r2   r3   r   r  r  r   r  r   r   r   r   r   6  s"    


P
$!r   c           
      C   s  z	|j d d }W n tttfy   | jdd }Y nw z	|j d d }W n tttfy=   d}| jr9| jjnd}Y n;w d}|rt| jdkrxt|dkrxt|d dkrxt|d d d	d
t|d d dd
  krrdkrxt	| S  nt	| S t| dt
j}t|tjr|j}tdjdd}t| }W d   n1 sw   Y  t }t|t
j|||t|| | t| d	}	t||	S )zBCreate a technical 404 error response. `exception` is the Http404.r   rH   r   NtriedTF/app_namerF   	namespaceadminurlconfztechnical_404.htmlr   r   )	r@  root_urlconfrequest_pathurlpatternsresolvedreasonr4   r   r   )r   r  r^   KeyError	path_inforG   r;  r   r@   default_urlconfr   ROOT_URLCONFr`   types
ModuleTyper   r   r   r   r   r   r>   r   r   rm   rJ   r   r   )
r4   	exception	error_urlr;  rD  r@  r   r   reporter_filterr   r   r   r   technical_404_response`  sX   
rO  c                 C   sZ   t djdd}t| }W d   n1 sw   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   )r4   r   r   r   r   r   r   rH    s   rH  )r-   )5	functoolsr   r.  r   r   rJ  r  pathlibr   django.confr   django.httpr   r   r   django.templater   r   r	   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   django.views.decorators.debugr   r   r   UserWarningr   r"   r<   	lru_cacher>   rB   r0   rJ   rK   r   rO  rH  r   r   r   r   <module>   sP    


	
 K  ,/