<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/css/bootstrap.min.css" rel="stylesheet"
        integrity="sha384-GLhlTQ8iRABdZLl6O3oVMWSktQOp6b7In1Zl3/Jr59b6EGGoI1aFkw7cmDA6j6gD" crossorigin="anonymous">
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.3.0/css/all.min.css"
        integrity="sha512-SzlrxWUlpfuzQ+pcUCosxcglQRNAq/DZjVsC0lE40xsADsfeQoEypE+enwcOiGjk/bSuGGKHEyjSoQ1zVisanQ=="
        crossorigin="anonymous" referrerpolicy="no-referrer" />
</head>
</html>
B
    Yw)                 @   s  d Z ddlmZ yddlmZ W n ek
r8   dZY nX dZddlZddlZddl	m
Z
mZmZ ddl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$ Z%e%&dZ'dddZ(G dd de)ZdS )z
raven.contrib.flask
~~~~~~~~~~~~~~~~~~~

:copyright: (c) 2010-2012 by the Sentry Team, see AUTHORS for more details.
:license: BSD, see LICENSE for more details.
    )absolute_import)current_userFTN)requestcurrent_appg)got_request_exceptionrequest_finished)ClientDisconnected)setup_logging)Client)Sentry)SentryHandler)urlparse)
to_unicode)get_headersget_environ)convert_optionslogging_configuredc          
   C   sF   | f t |j|t|jdg t|jgB |jdg d|iddS )NZSENTRY_INCLUDE_PATHSZRAVEN_IGNORE_EXCEPTIONSapp)dsnZinclude_pathsZignore_exceptionsextra)defaults)r   configsetgetZimport_name)
client_clsr   r    r   D/opt/alt/python37/lib/python3.7/site-packages/raven/contrib/flask.pymake_client'   s    r   c            	   @   s   e Zd ZdZddedddejddf	ddZedd Z	e	j
d	d Z	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dZdd Zd d! Zd"d# Zd$d% Zd&d' ZdS )*r   a  
    Flask application for Sentry.

    Look up configuration from ``os.environ['SENTRY_DSN']``::

    >>> sentry = Sentry(app)

    Pass an arbitrary DSN::

    >>> sentry = Sentry(app, dsn='http://public:secret@example.com/1')

    Pass an explicit client::

    >>> sentry = Sentry(app, client=client)

    Automatically configure logging::

    >>> sentry = Sentry(app, logging=True, level=logging.ERROR)

    Capture an exception::

    >>> try:
    >>>     1 / 0
    >>> except ZeroDivisionError:
    >>>     sentry.captureException()

    Capture a message::

    >>> sentry.captureMessage('hello, world!')

    By default, the Flask integration will do the following:

    - Hook into the `got_request_exception` signal. This can be disabled by
      passing `register_signal=False`.
    - Wrap the WSGI application. This can be disabled by passing
      `wrap_wsgi=False`.
    - Capture information from Flask-Login (if available).
    NFTc
       
      C   sX   |rt |tstd|| _|| _|| _|| _|| _|| _|| _	|	| _
|rT| | d S )Nz&client should be an instance of Client)
isinstancer   	TypeErrorr   logginglogging_exclusionsr   clientlevel	wrap_wsgiregister_signalinit_app)
selfr   r#   r   r   r!   r"   r$   r%   r&   r   r   r   __init__e   s    zSentry.__init__c             C   s(   yt jS  tk
r   Y nX t| dd S )N_last_event_id)r   sentry_event_id	Exceptiongetattr)r(   r   r   r   last_event_idw   s
    zSentry.last_event_idc             C   s*   || _ y
|t_W n tk
r$   Y nX d S )N)r*   r   r+   r,   )r(   valuer   r   r   r.      s
    
c             O   s    | j s
d S | j|dd d S )Nexc_info)r0   )r#   captureExceptionr   )r(   argskwargsr   r   r   handle_exception   s    zSentry.handle_exceptionc             C   s   i }y|j d }W n tk
r,   |j}Y nX |r:||d< tsB|S ttdsP|S y
tj}W n tk
rn   |S X t	|r~| }|s|S t
 |d< dtjkrx*tjd D ]}tt|rtt|||< qW |S )zu
        Requires Flask-Login (https://pypi.python.org/pypi/Flask-Login/)
        to be installed and setup.
        r   
ip_addressZlogin_manageridZSENTRY_USER_ATTRS)Zaccess_route
IndexErrorZremote_addrhas_flask_loginhasattrr   r   is_authenticatedAttributeErrorcallableZget_idr   r-   )r(   r   Z	user_infor5   r:   attrr   r   r   get_user_info   s2    



zSentry.get_user_infoc             C   s&   |  |jr| j}n| j}| ||S )zR
        Determine how to retrieve actual data by using request.mimetype.
        )is_json_typeZmimetypeget_json_dataget_form_dataget_http_info_with_retriever)r(   r   	retrieverr   r   r   get_http_info   s    zSentry.get_http_infoc             C   s   |dkS )Nzapplication/jsonr   )r(   content_typer   r   r   r?      s    zSentry.is_json_typec             C   s   |j S )N)Zform)r(   r   r   r   r   rA      s    zSentry.get_form_datac             C   s   |j S )N)data)r(   r   r   r   r   r@      s    zSentry.get_json_datac             C   sz   |dkr| j }t|j}y||}W n tk
r>   i }Y nX d|j|j|jf |j|j	|t
t|jt
t|jdS )zT
        Exact method for getting http_info but with form data work around.
        Nz	%s://%s%s)urlZquery_stringmethodrF   headersenv)rA   r   urlsplitrG   r	   schemenetlocpathqueryrH   dictr   environr   )r(   r   rC   ZurlpartsrF   r   r   r   rB      s    
z#Sentry.get_http_info_with_retrieverc          
   O   s   d | _ tjr| jjtjj y| j| t W n4 t	k
rh } z| jj
t| W d d }~X Y nX y| j| t W n4 t	k
r } z| jj
t| W d d }~X Y nX d S )N)r.   r   url_ruler#   transactionpushruleZhttp_contextrD   r,   logger	exceptionr   user_contextr>   )r(   r2   r3   er   r   r   before_request   s    $zSentry.before_requestc             O   s:   | j r| j |jd< | jj  tjr6| jjtjj	 |S )NzX-Sentry-ID)
r.   rI   r#   contextclearr   rR   rS   poprU   )r(   senderresponser2   r3   r   r   r   after_request   s    zSentry.after_requestc       
      C   sd  |d k	r|| _ |d k	r|| _|d k	r,|| _n"| jd krN|rH|jrHd| _nd| _|d k	r\|| _|d k	rj|| _|d k	rx|| _| jst| j	|| j | _| jri }| jd k	r| j|d< t
| j| jd}	t|	f| |jjdkr|j|	 tj| fdt
i| | jrt|j| j|_|| j tj| j|d | jrDtj| j|d t|dsVi |_| |jd< d S )	NFTexclude)r$   Zsentry_handler)r^   
extensionsZsentry)r   r$   r%   debugr&   r!   r"   r#   r   r   r   r
   rV   	propagate
addHandlerr   sendSentryMiddlewareZwsgi_apprZ   r   connectr`   r   r4   r9   rb   )
r(   r   r   r!   r$   r"   r%   r&   r3   handlerr   r   r   r'      sJ    



zSentry.init_appc             O   s:   | j std| j j||}|r0| j || _nd | _|S )Nz5captureException called before application configured)r#   AssertionErrorr1   	get_identr.   )r(   r2   r3   resultr   r   r   r1   3  s    zSentry.captureExceptionc             O   s:   | j std| j j||}|r0| j || _nd | _|S )Nz3captureMessage called before application configured)r#   rj   captureMessagerk   r.   )r(   r2   r3   rl   r   r   r   rm   <  s    zSentry.captureMessagec             O   s   | j std| j j||S )Nz1user_context called before application configured)r#   rj   rX   )r(   r2   r3   r   r   r   rX   E  s    zSentry.user_contextc             O   s   | j std| j j||S )Nz1tags_context called before application configured)r#   rj   tags_context)r(   r2   r3   r   r   r   rn   I  s    zSentry.tags_contextc             O   s   | j std| j j||S )Nz2extra_context called before application configured)r#   rj   extra_context)r(   r2   r3   r   r   r   ro   M  s    zSentry.extra_context)N)NNNNNN)__name__
__module____qualname____doc__r   r!   NOTSETr)   propertyr.   setterr4   r>   rD   r?   rA   r@   rB   rZ   r`   r'   r1   rm   rX   rn   ro   r   r   r   r   r   ;   s.   &,

  
7		r   )N)*rs   
__future__r   Zflask_loginr   ImportErrorr8   r!   Zblinkerflaskr   r   r   Zflask.signalsr   r   Zwerkzeug.exceptionsr	   Z
raven.confr
   Z
raven.baser   Zraven.middlewarer   rg   Zraven.handlers.loggingr   Zraven.utils.compatr   Zraven.utils.encodingr   Zraven.utils.wsgir   r   Zraven.utils.confr   	NamespaceZraven_signalssignalr   r   objectr   r   r   r   <module>   s.   


