bgA+TdZddlmZ ddlmZdZn #e$rdZYnwxYwddlZddlZddl m Z m Z m Z ddl mZmZdd lmZdd lmZdd lmZdd lmZdd lmZddlmZddlmZddlm Z m!Z!ddl"m#Z#ej$Z%e%&dZ'ddZ(Gdde)ZdS)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_userTFN)request current_appg)got_request_exceptionrequest_finished)ClientDisconnected) setup_logging)Client)Sentry) SentryHandler)urlparse) to_unicode) get_headers get_environ)convert_optionslogging_configuredc|dit|j|t|jdgt|jgz|jdgd|idS)NSENTRY_INCLUDE_PATHSRAVEN_IGNORE_EXCEPTIONSapp)dsn include_pathsignore_exceptionsextra)defaults)rconfigsetget import_name) client_clsrrs d/builddir/build/BUILD/cloudlinux-venv-1.0.7/venv/lib/python3.11/site-packages/raven/contrib/flask.py make_clientr%'s :    J '=rBBCC3?+,,-&)Z^^4Mr%R%R3       c eZdZdZddedddejddf dZedZ e j dZ dZ d Z d Z d Zd Zd ZddZdZdZ ddZdZdZdZdZdZdS)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 |r$t|tstd||_||_||_||_||_||_||_ | |_ |r| |dSdS)Nz&client should be an instance of Client) isinstancer TypeErrorrlogginglogging_exclusionsr#clientlevel wrap_wsgiregister_signalinit_app) selfrr-r#rr+r,r.r/r0s r$__init__zSentry.__init__es  F*VV44 FDEE E "4$  ".   MM#       r&c^ tjS#t$rYnwxYwt|ddS)N_last_event_id)rsentry_event_id Exceptiongetattr)r2s r$ last_event_idzSentry.last_event_idwsC $ $    D t-t444s  cP||_ |t_dS#t$rYdSwxYwN)r5rr6r7)r2values r$r9zSentry.last_event_ids?#  %A       DD s  %%c|jsdS|d}|(t|drt|||jf}n|d}||dS)N exception __traceback__exc_info)r@)r-r!hasattrtyper?captureException)r2argskwargsr>r@s r$handle_exceptionzSentry.handle_exceptions{  FJJ{++  WY%H%H YI4KLHHzz*--H x00000r&ci} |jd}n#t$r |j}YnwxYw|r||d<ts|St t ds|S t j}n#t$r|cYSwxYwt|r |}|s|St j |d<dt j vrBt j dD]/}t t |rtt |||<0|S)zu Requires Flask-Login (https://pypi.python.org/pypi/Flask-Login/) to be installed and setup. r ip_address login_manageridSENTRY_USER_ATTRS) access_route IndexError remote_addrhas_flask_loginrArris_authenticatedAttributeErrorcallableget_idrr8)r2r user_inforHrPattrs r$ get_user_infozSentry.get_user_infosO   - -a0JJ - - - ,JJJ -  1&0Il #  {O44   +<           $ % % 2//11   &-// $ +"4 4 4#*+>? B B<..B&-lD&A&AIdOs && A A-,A-c||jr|j}n|j}|||S)zR Determine how to retrieve actual data by using request.mimetype. ) is_json_typemimetype get_json_data get_form_dataget_http_info_with_retriever)r2r retrievers r$ get_http_infozSentry.get_http_infosE   W- . . +*II*I00)DDDr&c|dkS)Nzapplication/jsonr)r2 content_types r$rXzSentry.is_json_types111r&c|jSr;)formr2rs r$r[zSentry.get_form_data |r&c|jSr;)datarcs r$rZzSentry.get_json_datardr&c R||j}tj|j} ||}n#t$ri}YnwxYw|jd|j|j|j|j |tt|j tt|j dS)zT Exact method for getting http_info but with form data work around. Nz://)url query_stringmethodrfheadersenv)r[rurlsplitrhr schemenetlocpathqueryrjdictrenvironr)r2rr]urlpartsrfs r$r\z#Sentry.get_http_info_with_retrievers  *I$W[11 9W%%DD!   DDD #+///8??HMMR$NnK8899 GO4455    s 0 ??cdd|_tjr.|jjtjj |j|tnC#t$r6}|jj t|Yd}~nd}~wwxYw |j |tdS#t$r7}|jj t|Yd}~dSd}~wwxYwr;)r9rurl_ruler- transactionpushrule http_contextr^r7loggerr>r user_contextrV)r2rDrEes r$before_requestzSentry.before_requests-!   @ K # ( ()9)> ? ? ? 8 K $ $T%7%7%@%@ A A A A 8 8 8 K  ( (A 7 7 7 7 7 7 7 7 8 8 K $ $T%7%7%@%@ A A A A A 8 8 8 K  ( (A 7 7 7 7 7 7 7 7 7 8s02A66 B6,B11B6:2C.. D/8,D**D/c|jr|j|jd<|jjt jr.|jjt jj |S)Nz X-Sentry-ID) r9rkr-contextclearrrvrwpopry)r2senderresponserDrEs r$ after_requestzSentry.after_requestsd   A.2.@H ] + !!###   ? K # ' '(8(= > > >r&cB|||_|||_|||_n|j|r|jrd|_nd|_|||_|||_|||_|js t|j ||j|_|jr|i}|j |j|d<t|j|j} t| fi||j j dur|j | tj|fdti||jrt#|j|j|_||jt)j|j||jrt/j|j|t3|dsi|_||jd<dS) NFTexclude)r.sentry_handler)r extensionssentry)rr.r/debugr0r+r,r-r%r#rr r{ propagate addHandlerrsendSentryMiddlewarewsgi_appr~r connectrrrFrAr) r2rrr+r.r,r/r0rEhandlers r$r1zSentry.init_apps ?DH  DJ  &DNN ^ # &sy &!&!%  D  "DL  )&8D #{ F%dosDHEEDK < >F&2$($;y!#DKtzBBBG ' , ,V , , ,z#u,, %%g...  # > >%2 >6< > > > > G+CL$+FFCL 4./// !3C@@@@   M ! )$*? L L L LsL)) CN#'x   r&c|js Jd|jj|i|}|r |j||_nd|_|S)Nz5captureException called before application configured)r-rC get_identr9r2rDrEresults r$rCzSentry.captureException<sa{SSSSS{--t>v>>  &!%!6!6v!>!>D  !%D  r&c|js Jd|jj|i|}|r |j||_nd|_|S)Nz3captureMessage called before application configured)r-captureMessagerr9rs r$rzSentry.captureMessageEsa{QQQQQ{++T!>D  !%D  r&cH|js Jd|jj|i|S)Nz1user_context called before application configured)r-r|r2rDrEs r$r|zSentry.user_contextN2{OOOOO{'t{'8888r&cH|js Jd|jj|i|S)Nz1tags_context called before application configured)r- tags_contextrs r$rzSentry.tags_contextRrr&cH|js Jd|jj|i|S)Nz2extra_context called before application configured)r- extra_contextrs r$rzSentry.extra_contextVs2{PPPPP{(t{($9&999r&r;)NNNNNN)__name__ __module__ __qualname____doc__r r+NOTSETr3propertyr9setterrFrVr^rXr[rZr\r~rr1rCrr|rrrr&r$r r ;s%%R T4w~$55X5 1 1 1***XEEE222    . 8 8 8;?48!%7(7(7(7(r999999:::::r&r r;)*r __future__r flask_loginrrO ImportErrorr+blinkerflaskrrr flask.signalsrr werkzeug.exceptionsr raven.confr raven.baser raven.middlewarer rraven.handlers.loggingrraven.utils.compatrraven.utils.encodingrraven.utils.wsgirrraven.utils.confr Namespace raven_signalssignalrr%objectrr&r$rs'&&&&&((((((OOOOO ))))))))))AAAAAAAA222222$$$$$$777777000000''''''++++++55555555,,,,,,"!## "))*>??(]:]:]:]:]:V]:]:]:]:]:s