U
    nËjT  ã                   @  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-pzfrzqh9/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r€t ˆ ¡ddddœ‡ ‡‡fd	d
„ƒ}|S t	ˆ ƒr´t ˆ ¡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_wrapper2   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|› �}t
|dd�S tˆd�‚ˆ | |ŽI d H S ©Nr   Únextú?i/  )Úurlr   )r   ©r!   r"   r#   r
   r$   r   r   Ústrr,   Zurl_forr   r   ©r   r    r   Zorig_request_qparamZnext_url©r   r&   r   r'   r   r   r   Úasync_wrapper@   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|› �}t
|dd�S tˆd�‚ˆ | |ŽS r)   r-   r/   r0   r   r   Úsync_wrapperQ   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    ;rA   c                   @  s   e Zd ZdS )ÚAuthenticationErrorN)Ú__name__Ú
__module__Ú__qualname__r   r   r   r   rB   c   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   Úauthenticateh   s    z"AuthenticationBackend.authenticateN)rC   rD   rE   rK   r   r   r   r   rF   g   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__m   s    zAuthCredentials.__init__)N)rC   rD   rE   rM   r   r   r   r   rL   l   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_authenticatedr   s    zBaseUser.is_authenticatedr.   c                 C  s
   t ƒ ‚d S rG   rH   rP   r   r   r   Údisplay_namev   s    zBaseUser.display_namec                 C  s
   t ƒ ‚d S rG   rH   rP   r   r   r   Úidentityz   s    zBaseUser.identityN)rC   rD   rE   ÚpropertyrQ   rR   rS   r   r   r   r   rN   q   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   
	  ýE