
    	]j='                        d Z ddlZddlZddlmZ ddlmZ ddl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 ddlmZ ddlmZ ddlmZ  ej>                  e       Z!d Z" G d de      Z# G d de      Z$ G d de      Z% G d de      Z& G d de      Z' G d de      Z( G d d      Z) G d d e      Z* G d! d"e      Z+ G d# d$e      Z,y)%zThis file and its contents are licensed under the Apache License 2.0. Please see the included NOTICE for copyright information and LICENSE for a copy of the license.
    N)	timedelta)uuid4)
ContextLog)CSPMiddleware)settings)logout)MiddlewareNotUsed)BaseHandler)HttpResponsePermanentRedirect)CommonMiddleware)MiddlewareMixin)escape_leading_slashes)SAFE_METHODSc                 D     t         j                  r fd}d|_        |S  S )z#Enable csrf for specified view funcc                      | g|i |S N )requestargskwargsfuncs      F/root/env/lib/python3.12/site-packages/label_studio/core/middleware.pywrapperz$enforce_csrf_checks.<locals>.wrapper   s    1$1&11    F)r   USE_ENFORCE_CSRF_CHECKS_dont_enforce_csrf_checks)r   r   s   ` r   enforce_csrf_checksr      s'     ''	2 -2)r   c                       e Zd Zd Zy)DisableCSRFc                     t        |d      rt        |d|j                         y |j                  j	                  d      rt        |dd       y t        |dd       y )Nr   r   FT)hasattrsetattrr   GETget)selfr   callbackr   r   s        r   process_viewzDisableCSRF.process_view(   sK    889G8(:\:\][[__23G8%@G8$?r   N__name__
__module____qualname__r'   r   r   r   r   r   &   s    @r   r   c                       e Zd Zy)HttpSmartRedirectResponseN)r)   r*   r+   r   r   r   r-   r-   1   s    r   r-   c                   <     e Zd ZdZeZ fdZd Z fdZd Z	 xZ
S )*CommonMiddlewareAppendSlashWithoutRedirecta  This class converts HttpSmartRedirectResponse to the common response
    of Django view, without redirect. This is necessary to match status_codes
    for urls like /url?q=1 and /url/?q=1. If you don't use it, you will have 302
    code always on pages without slash.
    c                 d   t               | _        t        j                  }| j                  dz   | j
                  j                  z   }t        j                  D cg c]
  }||k7  s	| c}t        _        | j                  j                          |t        _        t        t        | *  |i | y c c}w )N.)r
   handlerr   
MIDDLEWAREr*   	__class__r)   load_middlewaresuperr/   __init__)r%   r   r   oldnameir4   s         r   r7   z3CommonMiddlewareAppendSlashWithoutRedirect.__init__>   s    "} !!$t~~'>'>>*2*=*=KQdqK$$&!8$H$YRXY Ls   
B-$B-c                 @    |j                  d      }t        |      }|S )zsReturn the full path of the request with a trailing slash appended
        without Exception in Debug mode
        T)force_append_slash)get_full_pathr   )r%   r   new_paths      r   get_full_path_with_slashzCCommonMiddlewareAppendSlashWithoutRedirect.get_full_path_with_slashL   s&     ((D(A)(3r   c                    t         t        |   ||      }t        j                  |_        t        |t              r|j                  j                  d      sLt        j                  r&|j                  t        t        j                        d  n|j                  }|dz   |_        |j                  |_        | j                  j                  |      }|S )N/)r6   r/   process_responser   EDITOR_KEYMAPeditor_keymap
isinstancer-   pathendswithFORCE_SCRIPT_NAMElen	path_infor2   get_response)r%   r   responserF   r4   s       r   rB   z;CommonMiddlewareAppendSlashWithoutRedirect.process_responseU   s    CT[\cemn ( 6 6h 9:<<((-JRJdJdw||C(B(B$C$EFjqjvjv#cz 'G||009Hr   c                 <    |j                   j                  d      syy)zX
        Override the original method to keep global APPEND_SLASH setting false
        rA   TF)rJ   rG   r%   r   s     r   should_redirect_with_slashzECommonMiddlewareAppendSlashWithoutRedirect.should_redirect_with_slashe   s       ))#.r   )r)   r*   r+   __doc__r-   response_redirect_classr7   r?   rB   rO   __classcell__r4   s   @r   r/   r/   5   s%     8Z r   r/   c                       e Zd Zd Zy)SetSessionUIDMiddlewarec                 b    d|j                   vr!t        t                     |j                   d<   y y )Nuid)sessionstrr   rN   s     r   process_requestz'SetSessionUIDMiddleware.process_requesto   s'    '%(\GOOE" (r   N)r)   r*   r+   rZ   r   r   r   rU   rU   n   s    2r   rU   c                       e Zd Zd Zd Zd Zy)ContextLogMiddlewarec                 0    || _         t               | _        y r   )rK   r   logr%   rK   s     r   r7   zContextLogMiddleware.__init__u   s    (<r   c                 P   d }	 t        j                  |j                        }d|vr%t	        |d| j
                  j                                | j                  |      }| j
                  j                  |||       |S #  	 |j                  j                  d      }n#  Y nxY wY xY w)Nzutf-8	server_id)r   rL   body)	jsonloadsrb   decoder"   r^   _get_server_idrK   send)r%   r   rb   rL   s       r   __call__zContextLogMiddleware.__call__y   s    	::gll+D g%G[$((*A*A*CD$$W-gtD	||**73s#   A= =B% BB%B B%c                 X    d|vr&t        |d| j                  j                                y y )Nra   )r"   r^   rf   rN   s     r   rZ   z$ContextLogMiddleware.process_request   s(    g%G[$((*A*A*CD &r   N)r)   r*   r+   r7   rh   rZ   r   r   r   r\   r\   t   s     $Er   r\   c                       e Zd ZdZd Zd Zy)DatabaseIsLockedRetryMiddlewarez\Workaround for sqlite performance issues
    we wait and retry request if database is lockedc                 h    t         j                  t         j                  k7  r
t               || _        y r   )r   	DJANGO_DBDJANGO_DB_SQLITEr	   rK   r_   s     r   r7   z(DatabaseIsLockedRetryMiddleware.__init__   s'    !:!::#%%(r   c                 N   | j                  |      }d}d}d}|j                  dk(  r~t        |d      rrd|j                  v rd|dk  r_t	        j
                  |       | j                  |      }|dz  }||z  }|j                  dk(  r t        |d      rd|j                  v r|dk  r_|S )Nr      g      ?i  contents   database-is-locked-error   )rK   status_coder!   rq   timesleep)r%   r   rL   retries_number
sleep_timebackoffs         r   rh   z(DatabaseIsLockedRetryMiddleware.__call__   s    $$W-
  C'),+x/?/??#JJz"((1HaN'!J   C'),+x/?/??# r   Nr)   r*   r+   rP   r7   rh   r   r   r   rk   rk      s    7)
r   rk   c                       e Zd ZdZd Zd Zy)XApiKeySupportMiddlewarezMiddleware that adds support for the X-Api-Key header, by having its value supersede
    anything that's set in the Authorization header.c                     || _         y r   )rK   r_   s     r   r7   z!XApiKeySupportMiddleware.__init__   s
    (r   c                     d|j                   v r,d|j                   d    |j                   d<   |j                   d= | j                  |      S )NHTTP_X_API_KEYzToken HTTP_AUTHORIZATION)METArK   rN   s     r   rh   z!XApiKeySupportMiddleware.__call__   sM    w||+39',,GW:X9Y1ZGLL-.-.  ))r   Nry   r   r   r   r{   r{      s    8)*r   r{   c                       e Zd Zd Zy)UpdateLastActivityMiddlewarec                     t        |d      rE|j                  t        vr2|j                  j                  r|j                  j                          y y y y )Nuser)r!   methodr   r   is_authenticatedupdate_last_activity)r%   r   	view_func	view_argsview_kwargss        r   r'   z)UpdateLastActivityMiddleware.process_view   sB    7F#l(J||,,113 - )K#r   Nr(   r   r   r   r   r      s    4r   r   c                       e Zd ZdZg ZddZy)"InactivitySessionTimeoutMiddleWarezVLog the user out if they have been logged in for too long
    or inactive for too longNc                     t        |d      rl|j                  j                         sRt        |d      rF|j                  j                  r0t        |d      r|j
                  st        |d      r|j                  ry t        j                         }d|j                  v r|j                  d   nd}|j                  j                  }|rt        |j                  j                        j                         }t        |j                  j                        j                         }||z
  |kD  rt        j                  d||z
  d	d
t         j"                   d       t%        |       n_t         j&                  }||z
  t         j"                  kD  r9t        j                  d||z
  d	d
t         j"                   d       t%        |       | j(                  D ]p  }t+        |t,              r|t-        |j.                        k(  r y d|v s2t-        |j.                        j1                  d      }t3        |      dk(  se|d   |d   v sp y  |j                  j5                  |j                  j7                  dd      r|       y d       y )NrX   r   is_scimis_jwt
last_loginr   )minutesz#Request is too far from last login z.0fz > z; logoutquery?   rp   keep_me_logged_inT)r!   rX   is_emptyr   r   r   r   rt   active_organizationr   session_timeout_policymax_session_agetotal_secondsmax_time_between_activityloggerinfor   MAX_SESSION_AGEr   MAX_TIME_BETWEEN_ACTIVITYNOT_USER_ACTIVITY_PATHSrE   rY   rJ   splitrI   
set_expiryr$   )	r%   r   current_timer   
active_orgorg_max_session_ager   rF   partss	            r   rZ   z2InactivitySessionTimeoutMiddleWare.process_request   s   +'')7F+<<00 Wi(W__*w~~yy{6Bgoo6UW__\2[\
\\55
"+J4U4U4e4e"f"t"t"v(1"99SS)mo & z)-@@9,:STW9XX[\d\t\t[uu}~ w )1(J(J%z)X-E-EE9,:STW9XX[\d\t\t[uu}~ w 00 	D$$W5F5F1G)GDG--.44S9u:?tG}a'@	 	""@S@STgim@n#<vtuvr   )returnN)r)   r*   r+   rP   r   rZ   r   r   r   r   r      s      !/wr   r   c                   "     e Zd ZdZ fdZ xZS )HumanSignalCspMiddlewarez
    Extend CSPMiddleware to support switching report-only CSP to regular CSP.

    For use with core.decorators.override_report_only_csp.
    c                     t         |   ||      }t        |dd      r'|j                  d      x}r||d<   |d= t	        |d       |S )N_override_report_only_cspFz#Content-Security-Policy-Report-OnlyzContent-Security-Policy)r6   rB   getattrr$   delattr)r%   r   rL   
csp_policyr4   s       r   rB   z)HumanSignalCspMiddleware.process_response  sZ    7+GX>88%@%\\*OPPzP6@23BCH9:r   )r)   r*   r+   rP   rB   rR   rS   s   @r   r   r      s     r   r   )-rP   loggingrt   datetimer   uuidr   ujsonrc   core.utils.contextlogr   csp.middlewarer   django.confr   django.contrib.authr   django.core.exceptionsr	   django.core.handlers.baser
   django.httpr   django.middleware.commonr   django.utils.deprecationr   django.utils.httpr   rest_framework.permissionsr   	getLoggerr)   r   r   r   r-   r/   rU   r\   rk   r{   r   r   r   r   r   r   <module>r      s         , (   & 4 1 5 5 4 4 3			8	$@/ @	 = 	61A 6r2. 2E+ E8&6 6* *4#3 46w)9 6wr} r   