U
    e                     @  s*  d dl mZ d dlZd dlZd dlZd dlZd dlmZ ejdkrPd dlm	Z	 n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 d d
lmZ e	dZddddddZd&dddddddZG dd deZG dd dZG dd dZG d d! d!ZG d"d# d#eZG d$d% d%eZdS )'    )annotationsN)	urlencode)   
   )	ParamSpec)is_async_callable)HTTPException)HTTPConnectionRequest)RedirectResponse)	WebSocket_Pr	   ztyping.Sequence[str]bool)connscopesreturnc                 C  s    |D ]}|| j jkr dS qdS )NFT)authr   )r   r   Zscope r   </tmp/pip-unpacked-wheel-2mv5qoba/starlette/authentication.pyhas_required_scope   s    r     zstr | typing.Sequence[str]intz
str | NonezStyping.Callable[[typing.Callable[_P, typing.Any]], typing.Callable[_P, typing.Any]])r   status_coderedirectr   c                   s4   t | tr| gnt| ddd fdd}|S )Nztyping.Callable[_P, typing.Any])funcr   c                   s   t  }t|j D ]&\}|jdks4|jdkr|j} qPqtd  d|dkrt dddd fd	d
}|S t	 rt dddd fdd}|S t dddd fdd}|S d S )Nrequest	websocketz2No "request" or "websocket" argument on function ""z_P.argsz	_P.kwargsNone)argskwargsr   c                    s\   | dt| k r|  nd }t|ts.tt|sH| I d H  n | |I d H  d S )Nr   )getlen
isinstancer   AssertionErrorr   close)r   r    r   )r   idxscopes_listr   r   websocket_wrapper6   s     
z6requires.<locals>.decorator.<locals>.websocket_wrapperz
typing.Anyc                    s   | dt| k r|  nd }t|ts.tt|s|d k	rrtdt|ji}dj	|
|d}t|ddS td | |I d H S Nr   nextz{redirect_path}?{orig_request})Zredirect_pathZorig_requesti/  )urlr   )r   r!   r"   r#   r
   r$   r   r   strr+   formatZurl_forr   r   r   r    r   Zorig_request_qparamZnext_urlr   r&   r   r'   r   r   r   async_wrapperF   s     

z2requires.<locals>.decorator.<locals>.async_wrapperc                    s   | dt| k r|  nd }t|ts.tt|s|d k	rrtdt|ji}dj	|
|d}t|ddS td | |S r)   r,   r/   r0   r   r   sync_wrapperZ   s     

z1requires.<locals>.decorator.<locals>.sync_wrapper)
inspect	signature	enumerate
parametersvaluesname	Exception	functoolswrapsr   )r   sigZ	parametertype_r(   r1   r2   r   r'   r   )r   r&   r   	decorator'   s&    

  zrequires.<locals>.decorator)r#   r-   list)r   r   r   r?   r   r>   r   requires   s    ErA   c                   @  s   e Zd ZdS )AuthenticationErrorN)__name__
__module____qualname__r   r   r   r   rB   o   s   rB   c                   @  s   e Zd ZdddddZdS )AuthenticationBackendr	   z'tuple[AuthCredentials, BaseUser] | None)r   r   c                   s
   t  d S NNotImplementedError)selfr   r   r   r   authenticatet   s    z"AuthenticationBackend.authenticateN)rC   rD   rE   rK   r   r   r   r   rF   s   s   rF   c                   @  s   e Zd ZdddddZdS )AuthCredentialsNztyping.Sequence[str] | None)r   c                 C  s   |d krg nt || _d S rG   )r@   r   )rJ   r   r   r   r   __init__{   s    zAuthCredentials.__init__)N)rC   rD   rE   rM   r   r   r   r   rL   z   s   rL   c                   @  sB   e Zd ZeddddZeddddZedddd	Zd
S )BaseUserr   r   c                 C  s
   t  d S rG   rH   rJ   r   r   r   is_authenticated   s    zBaseUser.is_authenticatedr-   c                 C  s
   t  d S rG   rH   rP   r   r   r   display_name   s    zBaseUser.display_namec                 C  s
   t  d S rG   rH   rP   r   r   r   identity   s    zBaseUser.identityN)rC   rD   rE   propertyrQ   rR   rS   r   r   r   r   rN      s   rN   c                   @  s@   e Zd ZdddddZedddd	Zeddd
dZdS )
SimpleUserr-   r   )usernamer   c                 C  s
   || _ d S rG   rV   )rJ   rV   r   r   r   rM      s    zSimpleUser.__init__r   rO   c                 C  s   dS )NTr   rP   r   r   r   rQ      s    zSimpleUser.is_authenticatedc                 C  s   | j S rG   rW   rP   r   r   r   rR      s    zSimpleUser.display_nameN)rC   rD   rE   rM   rT   rQ   rR   r   r   r   r   rU      s
   rU   c                   @  s0   e Zd ZeddddZeddddZdS )	UnauthenticatedUserr   rO   c                 C  s   dS )NFr   rP   r   r   r   rQ      s    z$UnauthenticatedUser.is_authenticatedr-   c                 C  s   dS )N r   rP   r   r   r   rR      s    z UnauthenticatedUser.display_nameN)rC   rD   rE   rT   rQ   rR   r   r   r   r   rX      s   rX   )r   N) 
__future__r   r:   r3   systypingurllib.parser   version_infor   Ztyping_extensionsZstarlette._utilsr   Zstarlette.exceptionsr   Zstarlette.requestsr	   r
   Zstarlette.responsesr   Zstarlette.websocketsr   r   r   rA   r9   rB   rF   rL   rN   rU   rX   r   r   r   r   <module>   s0   
	  Q