B
    ind~                 @   s&  d dl Z d dl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
mZ d dlmZmZ d dlmZ ejdejd	Ze
eje ed
ddZdejeeje f eeje ejegef 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 )    N)	urlencode)is_async_callable)HTTPException)HTTPConnectionRequest)RedirectResponseResponse)	WebSocket_CallableType)bound)connscopesreturnc             C   s"   x|D ]}|| j jkrdS qW dS )NFT)authr   )r   r   scope r   </tmp/pip-unpacked-wheel-_bom8ime/starlette/authentication.pyhas_required_scope   s    
r     )r   status_coderedirectr   c                s8   t | tr| gnt| tjtjd fdd}|S )N)funcr   c                s   t  }xFt|j D ]$\}|jdks6|jdkr|j}P qW td  d|dkrt t	j
t	j
d d fdd}|S t rt t	j
t	j
td fdd	}|S t t	j
t	j
td fd
d}|S d S )Nrequest	websocketz2No "request" or "websocket" argument on function "")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_wrapper*   s    
z6requires.<locals>.decorator.<locals>.websocket_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 | |I d H S )Nr   nextz{redirect_path}?{orig_request})redirect_pathorig_requesti/  )urlr   )r   )r   r   r   r   r    r   r   strr(   formaturl_forr   r   )r   r   r   orig_request_qparam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j	|
|d}t|ddS td | |S )Nr   r%   z{redirect_path}?{orig_request})r&   r'   i/  )r(   r   )r   )r   r   r   r   r    r   r   r)   r(   r*   r+   r   r   )r   r   r   r,   r-   )r   r"   r   r#   r   r   r   sync_wrapperR   s     

z1requires.<locals>.decorator.<locals>.sync_wrapper)inspect	signature	enumerate
parametersvaluesname	Exception	functoolswrapstypingAnyr   r   )r   sigZ	parametertype_r$   r.   r/   )r   r#   r   )r   r"   r   	decorator   s(    
$zrequires.<locals>.decorator)r   r)   listr9   Callable)r   r   r   r=   r   )r   r#   r   r   requires   s    Gr@   c               @   s   e Zd ZdS )AuthenticationErrorN)__name__
__module____qualname__r   r   r   r   rA   g   s   rA   c               @   s(   e Zd Zeejejd  dddZdS )AuthenticationBackend)AuthCredentialsBaseUser)r   r   c                s
   t  d S )N)NotImplementedError)selfr   r   r   r   authenticatel   s    z"AuthenticationBackend.authenticateN)rB   rC   rD   r   r9   OptionalTuplerJ   r   r   r   r   rE   k   s   rE   c               @   s(   e Zd Zdejeje  dddZdS )rF   N)r   c             C   s   |d krg nt || _d S )N)r>   r   )rI   r   r   r   r   __init__s   s    zAuthCredentials.__init__)N)rB   rC   rD   r9   rK   Sequencer)   rM   r   r   r   r   rF   r   s   rF   c               @   sB   e Zd ZeedddZeedddZeedddZdS )	rG   )r   c             C   s
   t  d S )N)rH   )rI   r   r   r   is_authenticatedx   s    zBaseUser.is_authenticatedc             C   s
   t  d S )N)rH   )rI   r   r   r   display_name|   s    zBaseUser.display_namec             C   s
   t  d S )N)rH   )rI   r   r   r   identity   s    zBaseUser.identityN)	rB   rC   rD   propertyboolrO   r)   rP   rQ   r   r   r   r   rG   w   s   rG   c               @   s@   e Zd ZeddddZeedddZeeddd	ZdS )

SimpleUserN)usernamer   c             C   s
   || _ d S )N)rU   )rI   rU   r   r   r   rM      s    zSimpleUser.__init__)r   c             C   s   dS )NTr   )rI   r   r   r   rO      s    zSimpleUser.is_authenticatedc             C   s   | j S )N)rU   )rI   r   r   r   rP      s    zSimpleUser.display_name)	rB   rC   rD   r)   rM   rR   rS   rO   rP   r   r   r   r   rT      s
   rT   c               @   s0   e Zd ZeedddZeedddZdS )UnauthenticatedUser)r   c             C   s   dS )NFr   )rI   r   r   r   rO      s    z$UnauthenticatedUser.is_authenticatedc             C   s   dS )N r   )rI   r   r   r   rP      s    z UnauthenticatedUser.display_nameN)rB   rC   rD   rR   rS   rO   r)   rP   r   r   r   r   rV      s   rV   )r   N)#r7   r0   r9   urllib.parser   Zstarlette._utilsr   Zstarlette.exceptionsr   Zstarlette.requestsr   r   Zstarlette.responsesr   r   Zstarlette.websocketsr	   TypeVarr?   r
   rN   r)   rS   r   UnionintrK   r@   r6   rA   rE   rF   rG   rT   rV   r   r   r   r   <module>   s&   	 M