
    	]j@(                        d dl Z d dl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mZ d dlmZmZ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$m%Z% d dl&m'Z'm(Z( d dl)m*Z*m+Z+  e jX                  e-      Z. G d de      Z/ ed edgdddddgd             ed edgdd dd!dgd             G d" d#e                    Z0 G d$ d%e*      Z1 ed edgd&d'ejd                  eid(d)dgd*             ed edgd+d,ejf                  eid(d-dgd*             G d. d/ejh                                      Z5 G d0 d1e+      Z6 G d2 d3e+      Z7y)4    N)datetime)ViewClassPermissionall_permissions)method_decorator)extend_schema)TokenAuthenticationPhaseout)
LSAPITokenTruncatedLSAPIToken)JWTSettingsSerializerLSAPITokenCreateSerializerLSAPITokenListSerializerTokenRefreshResponseSerializerTokenRotateResponseSerializer)genericsstatus)SessionAuthentication)APIException)CreateAPIView)Response)api_settings)JWTAuthentication)TokenBackendError
TokenError)BlacklistedTokenOutstandingToken)TokenRefreshViewTokenViewBasec                   ,    e Zd Zej                  ZdZdZy)TokenExistsErrorzKYou already have a valid token. Please revoke it before creating a new one.token_existsN)__name__
__module____qualname__r   HTTP_409_CONFLICTstatus_codedefault_detaildefault_code     E/root/env/lib/python3.12/site-packages/label_studio/jwt_auth/views.pyr   r      s    **KbN!Lr)   r   getJWTzRetrieve JWT Settingsz<Retrieve JWT settings for the currently active organization.jwt_settingspubliczx-fern-sdk-group-namezx-fern-sdk-method-namezx-fern-audiences)tagssummarydescription
extensions)name	decoratorpostzUpdate JWT Settingsz:Update JWT settings for the currently active organization.updatec                   ^    e Zd ZeZ eej                  ej                        Z	d Z
d Zd Zy)JWTSettingsAPI)GETPOSTc                     | j                   j                  j                  j                  }| j	                  | j                   |       |S N)requestuseractive_organizationjwtcheck_object_permissions)selfrA   s     r*   
get_objectzJWTSettingsAPI.get_objectE   s6    ll3377%%dllC8
r)   c                 j    | j                         }t        | j                  |      j                        S r=   )rD   r   get_serializerdata)rC   r>   argskwargsr-   s        r*   r+   zJWTSettingsAPI.getJ   s*    (++L9>>??r)   c                     | j                         }| j                  |j                  |      }|j                  d       |j	                          t        |j                        S )N)rG   instanceTraise_exception)rD   rF   rG   is_validsaver   )rC   r>   rH   rI   r-   
serializers         r*   r6   zJWTSettingsAPI.postN   sQ    (((gll\(R
D1
((r)   N)r!   r"   r#   r   serializer_classr   r   organizations_vieworganizations_changepermission_requiredrD   r+   r6   r(   r)   r*   r9   r9   $   s7    6 --..11

@)r)   r9   c            
       b     e Zd Z edgddej
                  eidddgd       fd	       Z xZS )
DecoratedTokenRefreshViewr,   zRefresh JWT tokenz.Get a new access token, using a refresh token.tokensrefreshr.   r/   r0   r1   r2   	responsesr3   c                 *    t        |   |g|i |S r=   )superr6   )rC   r>   rH   rI   	__class__s       r*   r6   zDecoratedTokenRefreshView.postW   s     w|G5d5f55r)   )	r!   r"   r#   r   r   HTTP_200_OKr   r6   __classcell__)r]   s   @r*   rV   rV   V   sH    W#D >
 &.&/!)

66r)   rV   zList API tokensz)List all API tokens for the current user.rW   listrY   zCreate API tokenz,Create a new API token for the current user.createc                   @    e Zd Zej                  ZeZd Zd Z	d Z
d Zy)LSAPITokenViewc                 J   t         j                  j                  t        j                               j                  dd      }t        j                  j                  | j                  j                  j                  t        j                               j                  |      S )zReturns all non-expired non-blacklisted tokens for the current user.

        The `list` method handles filtering for refresh tokens (as opposed to access tokens),
        since simple-jwt makes it hard to do this at the DB level.)token__expires_at__gttoken_idT)flat)user_idexpires_at__gt)id__in)r   objectsfilterr   nowvalues_listr   r>   r?   idexclude)rC   current_blacklisted_tokenss     r*   get_querysetzLSAPITokenView.get_queryset   s     &6%=%=%D%D[c[g[g[i%D%j%v%vT &w &
"  ''..t||7H7H7K7K\d\h\h\j.kss- t 
 	
r)   c                     | j                         }dt        fd}t        t        d |D cg c]
  } ||       c}            }|D cg c]  }|d   dk(  s| }	}| j	                  |	d      }
|
j
                  }t        |      S c c}w c c}w )Ntokenc                     	 t        t        | j                              S # t        t        f$ r }t
        j                  d|       Y d }~y d }~ww xY w)Nz#JWT API token validation failed: %s)r
   strrt   r   r   loggerdebug)rt   es     r*   _maybe_get_tokenz-LSAPITokenView.list.<locals>._maybe_get_token   sC    *3u{{+;<< 12 BAFs     AA

A
token_typerX   T)many)rr   r   r`   rl   rF   rG   r   )rC   r>   rH   rI   
all_tokensrz   rt   token_objectstokrefresh_tokensrP   rG   s               r*   r`   zLSAPITokenView.list   s    &&(
	$4 	 VDPZ*[u+;E+B*[\])6Y##l:Ky:X#YY((d(C
~ +\Ys   BBBc                 L    | j                   j                  dk(  rt        S t        S )Nr;   )r>   methodr   r   )rC   s    r*   get_serializer_classz#LSAPITokenView.get_serializer_class   s     <<&(--''r)   c                     | j                         }|j                         r
t               | j                  j	                  | j
                  j                        }||_        y r=   )rr   existsr   token_classfor_userr>   r?   rK   )rC   rP   existing_tokensrt   s       r*   perform_createzLSAPITokenView.perform_create   sM    ++-!!#"$$  ))$,,*;*;<#
r)   N)r!   r"   r#   r   users_token_anyrT   r	   r   rr   r`   r   r   r(   r)   r*   rc   rc   h   s*    B *99K
$&(
$r)   rc   c            
       r    e Zd ZdZ edgddej                  dej                  diddd	gd
      d        Zy)LSTokenBlacklistViewz2jwt_auth.serializers.LSAPITokenBlacklistSerializerr,   zBlacklist a JWT refresh tokenzeAdds a JWT refresh token to the blacklist, preventing it from being used to obtain new access tokens.z"Token was successfully blacklistedzToken is already blacklistedrW   	blacklistr.   r/   rY   c                 <   | j                  |j                        }	 |j                  d       t        t        j                        S # t        $ rH}t        j                  dt        |      d       t        ddit        j                        cY d }~S d }~ww xY w)	NrG   TrL   z:Token error occurred while trying to blacklist a token: %s)exc_infodetail(Token is invalid or already blacklisted.r   )rF   rG   rN   r   rw   errorrv   r   r   HTTP_404_NOT_FOUNDHTTP_204_NO_CONTENT)rC   r>   rH   rI   rP   ry   s         r*   r6   zLSTokenBlacklistView.post   s     ((gll(;
	v 5
 v99::	  	vLLUWZ[\W]hlLmX'QR[a[t[tuu	vs   A
 
	B=BBBN)	r!   r"   r#   _serializer_classr   r   r   r   r6   r(   r)   r*   r   r      sY    LW/{&&(L%%'E

 &.&1!)


;
;r)   r   c            
           e Zd ZeeegZej                  Z	e
j                  ZdZeZ edgddej$                  eej(                  didddgd	
      d        Zd Zy)LSAPITokenRotateViewz/jwt_auth.serializers.LSAPITokenRotateSerializerr,   zRotate JWT refresh tokenz?Creates a new JWT refresh token and blacklists the current one.z*Invalid token or token already blacklistedrW   rotater.   r/   rY   c                    | j                  |j                        }|j                  d       |j                  d   }	 |j	                          | j                  |j                        }t        d|j                         it        j                        S # t
        $ r  t        ddit        j                        cY S w xY w)Nr   TrL   rX   r   r   r   )rF   rG   rN   validated_datar   r   r   r   HTTP_400_BAD_REQUESTcreate_tokenr?   get_full_jwtr^   )rC   r>   rH   rI   rP   current_token	new_tokens          r*   r6   zLSAPITokenRotateView.post   s     ((gll(;
D1"11)<	x##%
 %%gll3	I$:$:$<=fFXFXYY  	xX'QR[a[v[vww	xs   B &B>=B>c                 8    | j                   j                  |      S )zcCreate a new token for the user. Can be overridden by child classes to use different token classes.)r   r   )rC   r?   s     r*   r   z!LSAPITokenRotateView.create_token  s    ((..r)   N)r!   r"   r#   r   r   r   authentication_classesr   DEFAULT_PERMISSION_CLASSESpermission_classesr   r   rT   r   r	   r   r   r   r^   r   r   r6   r   r(   r)   r*   r   r      s     01LNcd%@@)99IKW*U ='')U

 &.&.!)

ZZ/r)   r   )8loggingr   core.permissionsr   r   django.utils.decoratorsr   drf_spectacular.utilsr   jwt_auth.authr   jwt_auth.modelsr	   r
   jwt_auth.serializersr   r   r   r   r   rest_frameworkr   r   rest_framework.authenticationr   rest_framework.exceptionsr   rest_framework.genericsr   rest_framework.responser   rest_framework.settingsr   'rest_framework_simplejwt.authenticationr   #rest_framework_simplejwt.exceptionsr   r   /rest_framework_simplejwt.token_blacklist.modelsr   r   rest_framework_simplejwt.viewsr   r   	getLoggerr!   rw   r   r9   rV   r^   HTTP_201_CREATEDListCreateAPIViewrc   r   r   r(   r)   r*   <module>r      s     A 4 / 5 ;  , ? 2 1 , 0 E M ^ J			8	$"| " 	W'R%3&+!)

		 	W%P%3&.!)

		)] )4)06 0 6$ 	W!? 8
 &.&,!)

  	W"B##%?
 &.&.!)

 5$X// 5$!!@5$p;= ;<(/= (/r)   