o
    ˜¨ÊhD[  ã                   @   s^  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  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(„ Z.d)d*„ Z/dS ),é    N)ÚPath)Úsettings)ÚHttp404ÚHttpResponseÚHttpResponseNotFound)ÚContextÚEngineÚTemplateDoesNotExist)Úpprint)Úresolve)Útimezone)ÚMultiValueDict)Ú	force_str)Úimport_string)Ú_lazy_re_compile)Úget_docs_versionTÚ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   úD/var/www/html/env/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__4   ó   
zCallableSettingWrapper.__init__c                 C   s
   t | jƒS r!   )Úreprr"   ©r#   r   r   r   Ú__repr__7   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_filterK   s   r<   c                 C   s   t ƒ }t| d|ƒS )NÚexception_reporter_filter)r<   Úgetattr)r2   Údefault_filterr   r   r   Úget_exception_reporter_filterQ   s   r@   c                 C   s   t tjƒ}t| d|ƒS )NÚexception_reporter_class)r   r   ÚDEFAULT_EXCEPTION_REPORTERr>   )r2   Ú default_exception_reporter_classr   r   r   r.   V   s   ÿÿr.   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)r2   rE   r   r   r   Ú
get_caller_   s   ÿrH   c                   @   sb   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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)Úflagsc                    s®   zˆ j  |¡}W n ty   d}Y nw |rˆ j}n3t|tƒr+‡ fdd„| ¡ D ƒ}n"t|tƒr:‡ fdd„|D ƒ}nt|tƒrKt‡ fdd„|D ƒƒ}n|}t	|ƒrUt
|ƒ}|S )z¦
        Cleanse an individual setting key/value of sensitive content. If the
        value is a dictionary, recursively cleanse the keys in that dictionary.
        Fc                    ó   i | ]\}}|ˆ   ||¡“qS r   ©Úcleanse_setting©Ú.0ÚkÚvr(   r   r   Ú
<dictcomp>�   ó    z?SafeExceptionReporterFilter.cleanse_setting.<locals>.<dictcomp>c                    ó   g | ]}ˆ   d |¡‘qS ©rD   rL   ©rO   rQ   r(   r   r   Ú
<listcomp>ƒ   ó    z?SafeExceptionReporterFilter.cleanse_setting.<locals>.<listcomp>c                    rT   rU   rL   rV   r(   r   r   rW   …   rX   )Úhidden_settingsÚsearchÚ	TypeErrorÚcleansed_substituteÚ
isinstanceÚdictÚitemsÚlistÚtupleÚcallabler    )r#   ÚkeyÚvalueÚis_sensitiveÚcleansedr   r(   r   rM   t   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   ÚisupperrM   r>   )r#   Úsettings_dictrP   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                    rK   r   rL   rN   r(   r   r   rR   Ÿ   rS   zESafeExceptionReporterFilter.get_safe_request_meta.<locals>.<dictcomp>)Úhasattrrk   r_   ©r#   r2   r   r(   r   Úget_safe_request_meta™   s   
z1SafeExceptionReporterFilter.get_safe_request_metac                 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   ÚDEBUGrm   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>   rp   Úcopyr\   )r#   r2   Úmultivaluedictrq   Ú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 (*********).
        Nrq   Ú__ALL__)r>   rp   ÚPOSTrr   r\   )r#   r2   rq   rf   rP   rt   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Úformatru   )r#   r2   rd   Úis_multivalue_dictÚer   r   r   Úcleanse_special_typesÓ   s   €ÿz1SafeExceptionReporterFilter.cleanse_special_typesc           	      C   s  |j }d}|dur'|jjdkr d|jv r |jd }t|ddƒ}n|j }|dus	i }|  |¡r]|r]|dkr@|jD ]}| j||< q7n/|j ¡ D ]\}}||v rQ| j}n|  ||¡}|||< qEn|j ¡ D ]\}}|  ||¡||< qb|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 (*********).
        NÚsensitive_variables_wrapperÚsensitive_variablesrv   Ú	func_argsÚfunc_kwargs)	Úf_backÚf_codeÚco_nameÚf_localsr>   rp   r\   r_   r}   )	r#   r2   Útb_frameÚcurrent_framer   Úwrapperrf   r   rd   r   r   r   Úget_traceback_frame_variablesá   s:   

ö
ÿ
û	


z9SafeExceptionReporterFilter.get_traceback_frame_variablesN)r   r   r   r*   r\   r   ÚreÚIrY   rM   rj   rn   rp   ru   rx   r}   r‰   r   r   r   r   rI   i   s    ÿ	rI   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_path  ó   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)r2   r@   Úfilterr3   r4   r5   Úis_emailr>   Útemplate_infoÚtemplate_does_not_existÚ
postmortem)r#   r2   r3   r4   r5   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ÚhostrF   )rz   r2   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 ]8\}}d|v rQg }|d D ]!\}}t	|ƒ}t
|ƒdkrEd|dd… t
|ƒf }| ||f¡ q+||d< |||< qd}| j r”t| j tƒr”t| 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 r¢d}nzt| jjƒ}W n tyµ   d}Y nw i d| j“d|“d|“d| 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�r5| jj& ¡ |d#< | jj' ¡ |d$< | jj( ¡ |d%< |  )¡ |d&< t*| jƒ|d'< | j �r?| j j+|d(< | j�rJt| jƒ|d)< |�rS|d* |d+< |S ),z5Return a dictionary containing traceback information.TÚvarsi   u   %sâ€¦ <trimmed %d bytes string>r   rD   ÚstartNÚendé   é   ÚasciiÚreplace)Úerrors)Úget_versionz%[unable to retrieve the current user]r”   Úunicode_hintÚframesr2   Úrequest_metaÚ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_COOKIES_itemsÚrequest_insecure_uriÚraising_view_nameÚexception_typeÚexception_valueéÿÿÿÿÚ	lastframe),r3   Ú
issubclassr	   r–   r4   Úchainr—   Úget_traceback_framesÚ	enumerater
   ÚlenÚappendÚUnicodeErrorr>   Úargsr   ÚmaxÚminÚdjangor¥   r2   ÚstrÚuserry   r”   r“   rn   r`   rx   r_   rj   ÚsysÚ
executableÚversion_infor   ÚnowrF   r•   ÚGETÚFILESÚCOOKIESrœ   rH   r   )r#   r§   ÚiÚframeÚ
frame_varsrP   rQ   r¦   rž   rŸ   Úunicode_strr¥   r©   Úcr   r   r   Úget_traceback_data:  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   r0   ˆ  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   r1   �  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)rl   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Å   )rO   ÚslinerÕ   r   r   rW   ¾  rX   z:ExceptionReporter._get_lines_from_file.<locals>.<listcomp>)rë   r]   ÚbytesrŠ   rZ   Ú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#   r4   Ú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.)r4   r¿   r  ÚwarningsÚwarnr   Úpopr5   Ú__traceback__ÚextendÚget_exception_traceback_framesrð   )r#   Ú
exceptionsr4   r§   r5   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¡ridnd|||d | j | j|j¡t|ƒ||||
d dœV  |j}|d usd S d S )Nrû   TrÆ   )Ú	exc_causeÚexc_cause_explicitr5   ÚtypeÚ__traceback_hide__r    Ú
__loader__r   rD   é   z<source code not available>zdjango.rÄ   )r	  r
  r5   r  ræ   Úfunctionrñ   r�   Úidr÷   rø   rù   Úpre_context_lineno)r  r>   r†   r…   ÚgetÚtb_nextrƒ   Úco_filenamer„   Ú	tb_linenoÚ	f_globalsrú   Ú
startswithr“   r‰   r2   r  )r#   r4   r5   r	  r
  ræ   r  rñ   rç   rè   r  r÷   rø   rù   r   r   r   r  ò  sj   €
ü


ûûÿñÓz0ExceptionReporter.get_exception_traceback_frames)F)NN)r   r   r   r*   Úpropertyr�   r‘   r%   rœ   rÓ   r0   r1   rë   rú   r  r¼   r  r   r   r   r   rŒ     s"    


N
ÿ$!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 s¢w   Y  tƒ }t|tj|||t|ƒ| | ¡ t| ƒdœ	ƒ}	t| |	¡ƒS )zBCreate a technical 404 error response. `exception` is the Http404.r   rF   r    NÚtriedTFú/Úapp_namerD   Ú	namespaceÚadminÚurlconfztechnical_404.htmlrÔ   rÕ   )	r  Úroot_urlconfÚrequest_pathÚurlpatternsÚresolvedÚreasonr2   r   rµ   )rÁ   rð   r[   ÚKeyErrorÚ	path_inforE   r  rF   r¾   r>   Údefault_urlconfr   ÚROOT_URLCONFr]   ÚtypesÚ
ModuleTyper   r   rØ   rÙ   rÚ   rÛ   r<   r   rÅ   rj   rH   r   rÜ   )
r2   Ú	exceptionÚ	error_urlr  r"  r  rÞ   rß   Úreporter_filterrÒ   r   r   r   Útechnical_404_response,  sX   ÿþ
ÿþüÿ÷ÿr-  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Ü   )r2   rÞ   rß   rÒ   r   r   r   r&  [  s   ÿÿÿr&  )r+   )0Ú	functoolsrŠ   rÇ   r(  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Ù   r   ÚUserWarningr   r    r:   Ú	lru_cacher<   r@   r.   rH   rI   rŒ   r-  r&  r   r   r   r   Ú<module>   sJ    þ


	
 0  /