o
    ×ŸŽi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.
    Z	templatesN)r   Ú__file__Úparent)Úname© r   ú\C:\Users\psant\Downloads\Anu Raj Backend\school\venv\Lib\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   ó   
zCallableSettingWrapper.__init__c                 C   s
   t | jƒS r    )Úreprr!   ©r"   r   r   r   Ú__repr__8   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_typeN)Úget_exception_reporter_classZacceptsÚget_traceback_htmlr   Úget_traceback_text)ÚrequestÚexc_typeÚ	exc_valueÚtbÚstatus_codeÚreporterÚhtmlÚtextr   r   r   Útechnical_500_response<   s   
ÿr7   c                   C   s   t tjƒƒ S r    )r   r   Z!DEFAULT_EXCEPTION_REPORTER_FILTERr   r   r   r   Ú%get_default_exception_reporter_filterL   s   r8   c                 C   s   t ƒ }t| d|ƒS )NZexception_reporter_filter)r8   Úgetattr)r/   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   ZDEFAULT_EXCEPTION_REPORTERr9   )r/   Z default_exception_reporter_classr   r   r   r,   W   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   Z
_func_path)r/   r<   r   r   r   Ú
get_caller`   s   ÿr>   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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 ©r;   rB   ©rE   rG   r&   r   r   Ú
<listcomp>‡   ó    z?SafeExceptionReporterFilter.cleanse_setting.<locals>.<listcomp>c                    rJ   rK   rB   rL   r&   r   r   rM   ‰   rN   N)r   ZSESSION_COOKIE_NAMEÚhidden_settingsÚsearchÚ	TypeErrorÚcleansed_substituteÚ
isinstanceÚdictÚitemsÚlistÚtupleÚcallabler   )r"   ÚkeyÚvalueZis_sensitiveÚcleansedr   r&   r   rC   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 (*********).
        N)Údirr   ÚisupperrC   r9   )r"   Zsettings_dictrF   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                    rA   r   rB   rD   r&   r   r   rH   £   rI   zESafeExceptionReporterFilter.get_safe_request_meta.<locals>.<dictcomp>N)Úhasattrr`   rU   ©r"   r/   r   r&   r   Úget_safe_request_meta�   ó   
z1SafeExceptionReporterFilter.get_safe_request_metac                    r_   )zX
        Return a dictionary of request.COOKIES with sensitive values redacted.
        ÚCOOKIESc                    rA   r   rB   rD   r&   r   r   rH   «   rI   z@SafeExceptionReporterFilter.get_safe_cookies.<locals>.<dictcomp>N)ra   re   rU   rb   r   r&   r   Úget_safe_cookies¥   rd   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.
        FN)r   ÚDEBUGrb   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_parametersN)r9   rh   ÚcopyrR   )r"   r/   Zmultivaluedictri   Ú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 (*********).
        Nri   Ú__ALL__)r9   rh   ÚPOSTrj   rR   )r"   r/   ri   r[   rF   rk   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})rS   r   Ú	ExceptionÚformatrl   )r"   r/   rZ   Z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ƒ}q'|j }|dus	i }|  |¡r[|r[|dkr?|jD ]5}| j||< q7|j ¡ D ](\}}||v rP| j}n|  ||¡}|||< qD|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_variablesrm   Ú	func_argsZfunc_kwargs)	Úf_backÚf_codeÚco_nameÚf_localsr9   rh   rR   rU   rs   )	r"   r/   Útb_frameÚcurrent_framert   Úwrapperr[   r   rZ   r   r   r   Úget_traceback_frame_variablesí   s>   
ÿþ
ö


ÿþ

z9SafeExceptionReporterFilter.get_traceback_frame_variablesN)r   r   r   r(   rR   r   ÚreÚIrO   rC   r^   rc   rf   rh   rl   ro   rs   r}   r   r   r   r   r?   j   s    ÿ	r?   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 )NZtemplate_debugF)r/   r:   Úfilterr0   r1   r2   Úis_emailr9   Útemplate_infoÚtemplate_does_not_existÚ
postmortem)r"   r/   r0   r1   r2   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=   N)rq   r/   r‹   Z_get_raw_hostZ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| 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   r;   ÚstartNÚendé   é   ÚasciiÚreplace)Úerrors)Úget_versionz%[unable to retrieve the current user]r‡   Úunicode_hintÚframesr/   Zrequest_metaZrequest_COOKIES_itemsÚuser_strZfiltered_POST_itemsr   Zsys_executableZsys_version_infoz%d.%d.%dé   Zserver_timeZdjango_version_infoÚsys_pathrˆ   r‰   rŠ   Zrequest_GET_itemsZrequest_FILES_itemsZrequest_insecure_uriÚraising_view_nameZexception_typeZexception_valueZ	__notes__Ú
Zexception_noteséÿÿÿÿZ	lastframe)-r0   Ú
issubclassr	   r‰   r1   ÚchainrŠ   Úget_traceback_framesÚ	enumerater
   ÚlenÚappendÚUnicodeErrorr9   Úargsr   ÚmaxÚminÚdjangor–   r/   ÚstrÚuserrp   r‡   r†   rc   rf   rU   rV   ro   r^   ÚsysÚ
executableÚversion_infor   Únowr=   rˆ   ÚGETZFILESr�   r>   r   Újoin)r"   r˜   ÚiÚframeZ
frame_varsrF   rG   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 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   r-   –  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)Z
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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)ra   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¡‰  q4q ‡ 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ª   )rE   Úsliner·   r   r   rM   Ì  rN   z:ExceptionReporter._get_lines_from_file.<locals>.<listcomp>)rÌ   rS   Úbytesr~   rP   Údecoder§   Ú
IndexError)r"   rÇ   ÚlinenoZ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 ƒ}|p|rd S |S )NÚ	__cause__Ú__suppress_context__Ú__context__)r9   )r"   r1   Ú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 |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.T)r1   r¤   rÝ   ÚwarningsÚwarnr   Úpopr2   Ú__traceback__ÚextendÚget_exception_traceback_framesrÑ   )r"   Ú
exceptionsr1   r˜   r2   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r¯tt |jj ¡ |jd d ¡ƒ\}}}}|r¯|r¯d||  }d|tt|d ƒƒ d  }d|› |› �}dd| t|ƒt| ¡ ƒ   }d|› |› �}||||	 d¡r¹dnd|||d | j | j|j¡t|ƒ||||
d ||dœV  |j}|d usd S d S )NrÙ   Tr«   )Ú	exc_causeÚexc_cause_explicitr2   ÚtypeZ__traceback_hide__r‘   Ú
__loader__r   r;   é   z<source code not available>rÍ   ú^ú r�   é   zdjango.r©   )rå   ræ   r2   rç   rÇ   ÚfunctionrÒ   rŽ   ÚidrÕ   rÖ   r×   Úpre_context_linenoÚcolnoÚtb_area_colno)rÝ   r9   rz   ry   ÚgetÚtb_nextrw   Úco_filenamerx   Ú	tb_linenoÚ	f_globalsrØ   r   ÚnextÚ	itertoolsÚisliceZco_positionsÚtb_lastir£   rª   ÚlstripÚ
startswithr†   r}   r/   rî   )r"   r1   r2   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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   r=   r‘   NÚtriedTFú/Zapp_namer;   Ú	namespaceZadminÚurlconfztechnical_404.htmlr¶   r·   )	r  Zroot_urlconfÚrequest_pathZurlpatternsÚresolvedÚreasonr/   r   rœ   )r¦   rÑ   rQ   ÚKeyErrorZ	path_infor<   r   r=   r£   r9   Údefault_urlconfr   ZROOT_URLCONFrS   ÚtypesÚ
ModuleTyper   r   rº   r»   r¼   r½   r8   r   rª   r^   r>   r   r¾   )
r/   Ú	exceptionZ	error_urlr   r  r  rÀ   rÁ   Zreporter_filterr´   r   r   r   Útechnical_404_responseN  s^   ÿþÿ
þýûúøÿ÷ÿ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¾   )r/   rÀ   rÁ   r´   r   r   r   r  }  s   ÿÿÿr  )r)   )2Ú	functoolsrø   r~   r¬   r	  rÞ   Úpathlibr   Zdjango.confr   Zdjango.httpr   r   r   Zdjango.templater   r   r	   Zdjango.template.defaultfiltersr
   Zdjango.urlsr   Zdjango.utilsr   Zdjango.utils.datastructuresr   Zdjango.utils.encodingr   Zdjango.utils.module_loadingr   Zdjango.utils.regex_helperr   Zdjango.utils.versionr   r   r»   r   ÚUserWarningr   r   r7   Ú	lru_cacher8   r:   r,   r>   r?   r€   r  r  r   r   r   r   Ú<module>   sL    þ


	
 ;  ,/