
    xh                         S SK Jr  S SKJrJrJr  S SKJr  S SKJ	r	  S SK
Jr  S SKJr  S SKJr  S SKJr  S S	KJr  S S
KJr  \ " S S5      5       r " S S\5      r " S S\5      r " S S\5      rg)    )	dataclass)AnyLiteralOptional)sync_to_async)settings)SESSION_KEYAnonymousUser)HttpRequest)
HttpBearer)SessionAuth)APITokenc                   >    \ rS rSr% \\S'   \S   \S'   Sr\\S'   Sr	g)Auth   user_id)sessiontoken	auth_typeNdata )
__name__
__module____qualname____firstlineno__int__annotations__r   r   r   __static_attributes__r       %/code/glitchtip/api/authentication.pyr   r      s    L)**D#r    r   c                   $    \ rS rSr% Sr\\S'   Srg)AuthHttpRequest   z>Django HttpRequest that is known to be authenticated by a userauthr   N)r   r   r   r   __doc__r   r   r   r   r    r!   r#   r#      s
    H
Jr    r#   c                   :    \ rS rSrSrS\S\\   S\\   4S jr	Sr
g)	r      z
Check if user is logged in by checking session
This avoids an unnecessary database call.
request.auth will result in the user id
requestkeyreturnc                   #    [         R                  S:X  a   UR                  R                  [        5      nO1[        UR                  R                  5      " [        5      I S h  vN nU(       a  [        [        U5      S5      $ S $  N"7f)Nz&django.contrib.sessions.backends.cacher   )r   SESSION_ENGINEr   getr	   r   r   r   )selfr)   r*   r   s       r!   authenticateSessionAuth.authenticate#   sf      ""&NNoo))+6G *'//*=*=>{KKG07tCL),ATA Ls   A!B#B$#Br   N)r   r   r   r   r&   r   r   strr   r0   r   r   r    r!   r   r      s0    B"B)1#B	$Br    r   c                   `   ^  \ rS rSrSrS\S\\   4U 4S jjrS r	S\S\
S\\   4S jrS	rU =r$ )
	TokenAuth.   z
API Token based authentication always connects to a specific user.
Store the token object under data for checking scopes permissions.
r)   r+   c                    > UR                   (       a1  UR                   R                  S;   a  S Ul        U R                  5       $ [        TU ]  U5      $ )N)setup_wizard_hash)resolver_matchurl_namer%   get_anonsuper__call__)r/   r)   	__class__s     r!   r<   TokenAuth.__call__4   sJ    !!g&<&<&E&E J
 '
  GL==?"w((r    c                    #    [        5       $ 7f)Nr
   )r/   s    r!   r:   TokenAuth.get_anon>   s     s   r*   c                    #     [         R                  R                  USS9I S h  vN n[	        UR
                  SUS9$  N! [         R                   a     g f = f7f)NT)r   user__is_activer   )r   )r   objectsagetDoesNotExistr   r   )r/   r)   r*   r   s       r!   r0   TokenAuth.authenticateA   sZ     	"**//c4/PPE EMM777	 Q$$ 		s5   A!A ?A AA AAAAr   )r   r   r   r   r&   r   r   r   r<   r:   r2   r   r0   r   __classcell__)r=   s   @r!   r4   r4   .   sG    
) ) )8+ 8C 8HTN 8 8r    r4   N)dataclassesr   typingr   r   r   asgiref.syncr   django.confr   django.contrib.authr	   django.contrib.auth.modelsr   django.httpr   ninja.securityr   r   BaseSessionAuthapps.api_tokens.modelsr   r   r#   r4   r   r    r!   <module>rR      se    ! ) ) &   + 4 # % 9 +   k B/ B$8
 8r    