a
    Tf=                     @   s   d 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mZmZmZmZ ddlmZ G d	d
 d
eZG dd deZG dd deZG dd deZG dd deZdS )z
flask_httpauth
==================

This module provides Basic and Digest HTTP authentication for Flask routes.

:copyright: (C) 2014 by Miguel Grinberg.
:license:   MIT, see LICENSE for more details.
    N)	b64decodewraps)md5)RandomSystemRandom)requestmake_responsesessiongResponsecurrent_app)Authorizationc                   @   sx   e Zd ZdddZdd Zdd Zdd	 Zd
d Zdd Zdd Z	dd Z
dd ZdddZdd Zdd Zdd ZdS )HTTPAuthNc                 C   sP   || _ |pd| _|| _d | _d | _d | _dd }dd }| | | | d S )NzAuthentication Requiredc                 S   s   d S N )usernamer   r   G/var/www/ai-form-bot/venv/lib/python3.9/site-packages/flask_httpauth.pydefault_get_password   s    z/HTTPAuth.__init__.<locals>.default_get_passwordc                 S   s   d| fS )NzUnauthorized Accessr   )statusr   r   r   default_auth_error   s    z-HTTPAuth.__init__.<locals>.default_auth_error)schemerealmheaderget_password_callbackget_user_roles_callbackauth_error_callbackget_passworderror_handler)selfr   r   r   r   r   r   r   r   __init__   s    

zHTTPAuth.__init__c                 C   s`   | j d u s| j dkrRztjddd d\}}W n tyF   Y dS 0 || jkS | j |v S d S )Nr       F)r   r   headersgetsplit
ValueErrorr   )r   r#   r   _r   r   r   is_compatible_auth%   s    
zHTTPAuth.is_compatible_authc                 C   s
   || _ |S r   )r   r   fr   r   r   r   1   s    zHTTPAuth.get_passwordc                 C   s
   || _ |S r   )r   r)   r   r   r   get_user_roles5   s    zHTTPAuth.get_user_rolesc                    s    t   fdd}|_|S )Nc                     s`     | i |}t|ttf }t|}|r@|jdkr@d|_d|j vr\ |jd< |S )N     zWWW-Authenticate)	ensure_sync
isinstancetupler   r	   status_coder#   keysauthenticate_header)argskwargsresZcheck_status_coder*   r   r   r   	decorated:   s    z)HTTPAuth.error_handler.<locals>.decorated)r   r   )r   r*   r8   r   r7   r   r   9   s    
zHTTPAuth.error_handlerc                 C   s   d | j| jS )Nz{0} realm="{1}")formatr   r   r   r   r   r   r3   H   s    zHTTPAuth.authenticate_headerc              	   C   s   d }| j d u s| j dkrrtj}|d u rdtjv rz(tjd d d\}}t|}||_W q ttfyn   Y q0 n$| j tjv rt| j	}tj| j  |_|d ur|j
 | j	 krd }|S )Nr   r"   )r   r   authorizationr#   r%   r   tokenr&   KeyErrorr   typelower)r   authZ	auth_typer<   r   r   r   get_authK   s(    


zHTTPAuth.get_authc                 C   s$   d }|r |j r | | j|j }|S r   )r   r.   r   )r   r@   passwordr   r   r   get_auth_passwordj   s    

zHTTPAuth.get_auth_passwordc                 C   s   |d u rdS t |ttfr |}n|g}|du r2|}| jd u rDtd| | j|}|d u rbi }nt |ttfsx|h}nt|}|D ]<}t |ttfrt|}||@ |kr dS q||v r dS qd S )NTz&get_user_roles callback is not defined)r/   listr0   r   r&   r.   set)r   roleuserr@   ZrolesZ
user_rolesr   r   r   	authorizes   s,    
zHTTPAuth.authorizec                    s@   |d ur d us d ur t d fdd}|r<||S |S )N2role and optional are the only supported argumentsc                    s   t   fdd}|S )Nc                     s     }tjdkr|}d }||}|dv r:d}n||sLd}s||r|z|W S  tyz     Y S 0 |dur|n|r|jnd t	_
 | i |S )NOPTIONS)FNr-   i  T)rA   r   methodrC   authenticaterH   r   	TypeErrorr   r   flask_httpauth_userr.   )r4   r5   r@   rB   r   rG   r*   optionalrF   r   r   r   r8      s$    

zKHTTPAuth.login_required.<locals>.login_required_internal.<locals>.decoratedr   r*   r8   rP   rF   r   r*   r   login_required_internal   s    z8HTTPAuth.login_required.<locals>.login_required_internalr&   r   r*   rF   rP   rT   r   rR   r   login_required   s    zHTTPAuth.login_requiredc                 C   s   |   }|sdS |jS Nr!   )rA   r   )r   r@   r   r   r   r      s    zHTTPAuth.usernamec                 C   s   t tdrtjS d S NrN   hasattrr   rN   r:   r   r   r   current_user   s    
zHTTPAuth.current_userc                 C   s(   zt |W S  ty"   | Y S 0 d S r   )r   r.   AttributeErrorr)   r   r   r   r.      s    zHTTPAuth.ensure_sync)NNN)NNN)__name__
__module____qualname__r    r(   r   r+   r   r3   rA   rC   rH   rW   r   r\   r.   r   r   r   r   r      s   
	
(r   c                       s>   e Zd Zd fdd	Zdd Zdd Zdd	 Zd
d Z  ZS )HTTPBasicAuthNc                    s&   t t| |pd| d | _d | _d S )NZBasic)superra   r    hash_password_callbackverify_password_callback)r   r   r   	__class__r   r   r       s    zHTTPBasicAuth.__init__c                 C   s
   || _ |S r   )rc   r)   r   r   r   hash_password   s    zHTTPBasicAuth.hash_passwordc                 C   s
   || _ |S r   )rd   r)   r   r   r   verify_password   s    zHTTPBasicAuth.verify_passwordc           	   	   C   s   | j pd}|tjvrd S tj| d}z(|dd\}}t|dd\}}W n ttfyh   Y d S 0 z|d}|d}W n& t	y   |d}|d}Y n0 t
|||dS )Nr   utf-8    r"      :latin1)r   rB   )r   r   r#   encoder%   r   r&   rM   decodeUnicodeDecodeErrorr   )	r   r   valuer   credentialsZencoded_usernameZencoded_passwordr   rB   r   r   r   rA      s,    




zHTTPBasicAuth.get_authc                 C   s   |r|j }|j}nd}d}| jr2| | j||S |s:d S | jrzz| | j|}W n$ tyx   | | j||}Y n0 |d ur|d urt||r|j S d S rX   )r   rB   rd   r.   rc   rM   hmaccompare_digest)r   r@   stored_passwordr   Zclient_passwordr   r   r   rL      s>    


zHTTPBasicAuth.authenticate)NN)	r^   r_   r`   r    rg   rh   rA   rL   __classcell__r   r   re   r   ra      s
   ra   c                       sf   e Zd Zd fdd	Zdd Zd	d
 Zdd Zdd Zdd Zdd Z	dd Z
dd Zdd Z  ZS )HTTPDigestAuthNFr@   MD5c           
         s&  t t|pd| |_t|tr>dd |dD _n|_| dkrXd_	n$| dkrld_	nt
d	| d
t _zj  W n ty   t _Y n0 d _d _d _d _fdd  fdd}dd } fdd}dd }	| | | |	 d S )NDigestc                 S   s   g | ]}|  qS r   )strip).0vr   r   r   
<listcomp>      z+HTTPDigestAuth.__init__.<locals>.<listcomp>,r   rw   zmd5-sessMD5-Sessz
Algorithm z is not supportedc                      s   t t j d S )Nri   )r   strrandomrm   	hexdigestr   r:   r   r   _generate_random  s    z1HTTPDigestAuth.__init__.<locals>._generate_randomc                      s     t d< t d S )N
auth_noncer
   r   r   r   r   default_generate_nonce"  s    
z7HTTPDigestAuth.__init__.<locals>.default_generate_noncec                 S   s*   t d}| d u s|d u rdS t| |S )Nr   Fr
   r$   rr   rs   )nonceZsession_noncer   r   r   default_verify_nonce&  s    
z5HTTPDigestAuth.__init__.<locals>.default_verify_noncec                      s     t d< t d S )Nauth_opaquer   r   r   r   r   default_generate_opaque,  s    
z8HTTPDigestAuth.__init__.<locals>.default_generate_opaquec                 S   s*   t d}| d u s|d u rdS t| |S )Nr   Fr   )opaqueZsession_opaquer   r   r   default_verify_opaque0  s    
z6HTTPDigestAuth.__init__.<locals>.default_verify_opaque)rb   rv   r    
use_ha1_pwr/   r   r%   qopr?   	algorithmr&   r   r   NotImplementedErrorr   generate_nonce_callbackverify_nonce_callbackgenerate_opaque_callbackverify_opaque_callbackgenerate_noncegenerate_opaqueverify_nonceverify_opaque)
r   r   r   r   r   r   r   r   r   r   re   )r   r   r   r      s8    



zHTTPDigestAuth.__init__c                 C   s
   || _ |S r   r   r)   r   r   r   r   ;  s    zHTTPDigestAuth.generate_noncec                 C   s
   || _ |S r   )r   r)   r   r   r   r   ?  s    zHTTPDigestAuth.verify_noncec                 C   s
   || _ |S r   r   r)   r   r   r   r   C  s    zHTTPDigestAuth.generate_opaquec                 C   s
   || _ |S r   )r   r)   r   r   r   r   G  s    zHTTPDigestAuth.verify_opaquec                 C   s   |   S r   r   r:   r   r   r   	get_nonceK  s    zHTTPDigestAuth.get_noncec                 C   s   |   S r   r   r:   r   r   r   
get_opaqueN  s    zHTTPDigestAuth.get_opaquec                 C   s,   |d | j  d | }|d}t| S )N:ri   )r   rm   r   r   )r   r   rB   a1r   r   r   generate_ha1Q  s    
zHTTPDigestAuth.generate_ha1c              
   C   sP   |   }|  }| jr8d| j| j||| jd| jS d| j| j||S d S )NzB{0} realm="{1}",nonce="{2}",opaque="{3}",algorithm="{4}",qop="{5}"r~   z({0} realm="{1}",nonce="{2}",opaque="{3}")r   r   r   r9   r   r   r   join)r   r   r   r   r   r   r3   V  s    

z"HTTPDigestAuth.authenticate_headerc           	      C   sR  |r&|j r&|jr&|jr&|jr&|jr&|s*dS | |jrB| |jsFdS |jr\|j| jvr\dS | j	rh|}n*|j d |j d | }t
|d }| jdkrt
|d |j d |j d }tjd |j }t
|d }|jdkr|d |j d |j d |j d | }n|d |j d | }t
|d }t||jS )NFr   ri   r   r@   z:auth:)r   r   urir   responser   r   r   r   r   r   rm   r   r   cnoncer   rK   ncrr   rs   )	r   r@   Zstored_password_or_ha1Zha1r   Za2Zha2a3r   r   r   r   rL   c  sJ    


zHTTPDigestAuth.authenticate)NNFr@   rw   )r^   r_   r`   r    r   r   r   r   r   r   r   r3   rL   ru   r   r   re   r   rv     s     5rv   c                       s.   e Zd Zd	 fdd	Zdd Zdd Z  ZS )
HTTPTokenAuthBearerNc                    s   t t| ||| d | _d S r   )rb   r   r    verify_token_callback)r   r   r   r   re   r   r   r      s    zHTTPTokenAuth.__init__c                 C   s
   || _ |S r   )r   r)   r   r   r   verify_token  s    zHTTPTokenAuth.verify_tokenc                 C   s&   t |dd}| jr"| | j|S d S )Nr<   r!   )getattrr   r.   )r   r@   rt   r<   r   r   r   rL     s    zHTTPTokenAuth.authenticate)r   NN)r^   r_   r`   r    r   rL   ru   r   r   re   r   r     s   r   c                   @   s&   e Zd Zdd ZdddZdd ZdS )		MultiAuthc                 G   s   || _ || _d S r   )	main_authadditional_auth)r   r   r4   r   r   r   r      s    zMultiAuth.__init__Nc                    s@   |d ur d us d ur t d fdd}|r<||S |S )NrI   c                    s   t   fdd}|S )Nc                     sP   j }j tjs4jD ]}|tjr|} q4q|jd | i |S )N)rF   rP   )r   r(   r   r#   r   rW   )r4   r5   Zselected_authr@   rO   r   r   r8     s    
zLMultiAuth.login_required.<locals>.login_required_internal.<locals>.decoratedr   rQ   rR   rS   r   rT     s    	z9MultiAuth.login_required.<locals>.login_required_internalrU   rV   r   rR   r   rW     s    zMultiAuth.login_requiredc                 C   s   t tdrtjS d S rY   rZ   r:   r   r   r   r\     s    
zMultiAuth.current_user)NNN)r^   r_   r`   r    rW   r\   r   r   r   r   r     s   
r   )__doc__rr   base64r   	functoolsr   hashlibr   r   r   r   Zflaskr   r	   r
   r   r   r   Zwerkzeug.datastructuresr   objectr   ra   rv   r   r   r   r   r   r   <module>   s   	  4?|