o
    g=                     @   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   c/var/www/primordialfields.com/dashboard_backend/venv/lib/python3.10/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      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r)ztjddd d\}}W n
 ty#   Y dS w || jkS | j |v 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 r   )r   r    fr   r   r   r   1      zHTTPAuth.get_passwordc                 C   r*   r   )r   r+   r   r   r   get_user_roles5   r-   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rescheck_status_coder,   r    r   r   	decorated:   s   z)HTTPAuth.error_handler.<locals>.decorated)r   r   )r    r,   r<   r   r;   r   r   9   s   
zHTTPAuth.error_handlerc                 C   s   d | j| jS )Nz{0} realm="{1}")formatr   r   r    r   r   r   r6   H   s   zHTTPAuth.authenticate_headerc              	   C   s   d }| j d u s| j dkr9tj}|d u r8dtjv r8ztjd d d\}}t|}||_W n ttfy7   Y nw n| j tjv rKt| j	}tj| j  |_|d ur[|j
 | j	 kr[d }|S )Nr   r#   )r   r   authorizationr$   r&   r   tokenr'   KeyErrorr   typelower)r    auth	auth_typer@   r   r   r   get_authK   s*   



zHTTPAuth.get_authc                 C   s$   d }|r|j r| | j|j }|S r   )r   r1   r   )r    rD   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 r|}| jd u r"td| | j|}|d u r1i }nt |ttfs<|h}nt|}|D ]}t |ttfrYt|}||@ |krX dS qB||v r` dS qBd S )NTz&get_user_roles callback is not defined)r2   listr3   r   r'   r1   set)r    roleuserrD   roles
user_rolesr   r   r   	authorizes   s2   
zHTTPAuth.authorizec                    @   |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                       t   fdd}|S )Nc                     s     }tjdkrL|}d }||}|dv rd}n	||s&d}s>|r>z|W S  ty=     Y S w |durD|n|rI|jnd t	_
 | i |S )NOPTIONS)FNr0   i  T)rF   r   methodrH   authenticaterO   r   	TypeErrorr   r   flask_httpauth_userr1   )r7   r8   rD   rG   r   rL   r,   optionalrK   r    r   r   r<      s&   

zKHTTPAuth.login_required.<locals>.login_required_internal.<locals>.decoratedr   r,   r<   rY   rK   r    r,   r   login_required_internal   s   z8HTTPAuth.login_required.<locals>.login_required_internalr'   r    r,   rK   rY   r]   r   r[   r   login_required   s   zHTTPAuth.login_requiredc                 C   s   |   }|sdS |jS Nr"   )rF   r   )r    rD   r   r   r   r      s   zHTTPAuth.usernamec                 C      t tdrtjS d S NrW   hasattrr   rW   r>   r   r   r   current_user      
zHTTPAuth.current_userc                 C   s$   zt |W S  ty   | Y S w r   )r   r1   AttributeErrorr+   r   r   r   r1      s
   zHTTPAuth.ensure_syncNNN)__name__
__module____qualname__r!   r)   r   r.   r   r6   rF   rH   rO   r`   r   rf   r1   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 )NBasic)superrm   r!   hash_password_callbackverify_password_callback)r    r   r   	__class__r   r   r!      s   
zHTTPBasicAuth.__init__c                 C   r*   r   )rp   r+   r   r   r   hash_password   r-   zHTTPBasicAuth.hash_passwordc                 C   r*   r   )rq   r+   r   r   r   verify_password   r-   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y4   Y d S w z|d}|d}W n t	yT   |d}|d}Y nw t
|||dS )Nr   utf-8    r#      :latin1)r   rG   )r   r   r$   encoder&   r   r'   rV   decodeUnicodeDecodeErrorr   )	r    r   valuer   credentialsencoded_usernameencoded_passwordr   rG   r   r   r   rF      s0   





zHTTPBasicAuth.get_authc                 C   s   |r	|j }|j}nd}d}| jr| | j||S |sd S | jr=z
| | j|}W n ty<   | | j||}Y nw |d urN|d urNt||rN|j S d S ra   )r   rG   rq   r1   rp   rV   hmaccompare_digest)r    rD   stored_passwordr   client_passwordr   r   r   rU      s@   

zHTTPBasicAuth.authenticate)NN)	rj   rk   rl   r!   rt   ru   rF   rU   __classcell__r   r   rr   r   rm      s    rm   c                       sj   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 )HTTPDigestAuthNFrD   MD5c           
         s&  t t|pd| |_t|trdd |dD _n|_| dkr,d_	n| dkr6d_	nt
d	| d
t _zj  W n tyV   t _Y nw 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>  s    z+HTTPDigestAuth.__init__.<locals>.<listcomp>,r   r   zmd5-sessMD5-Sessz
Algorithm z is not supportedc                      s   t t j d S )Nrv   )r   strrandomrz   	hexdigestr   r>   r   r   _generate_random  s   z1HTTPDigestAuth.__init__.<locals>._generate_randomc                           t d< t d S )N
auth_noncer
   r   r   r   r   default_generate_nonce"     
z7HTTPDigestAuth.__init__.<locals>.default_generate_noncec                 S   *   t d}| d u s|d u rdS t| |S )Nr   Fr
   r%   r   r   )noncesession_noncer   r   r   default_verify_nonce&     
z5HTTPDigestAuth.__init__.<locals>.default_verify_noncec                      r   )Nauth_opaquer   r   r   r   r   default_generate_opaque,  r   z8HTTPDigestAuth.__init__.<locals>.default_generate_opaquec                 S   r   )Nr   Fr   )opaquesession_opaquer   r   r   default_verify_opaque0  r   z6HTTPDigestAuth.__init__.<locals>.default_verify_opaque)ro   r   r!   
use_ha1_pwr2   r   r&   qoprC   	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   rr   )r   r    r   r!     s:   



zHTTPDigestAuth.__init__c                 C   r*   r   r   r+   r   r   r   r   ;  r-   zHTTPDigestAuth.generate_noncec                 C   r*   r   )r   r+   r   r   r   r   ?  r-   zHTTPDigestAuth.verify_noncec                 C   r*   r   r   r+   r   r   r   r   C  r-   zHTTPDigestAuth.generate_opaquec                 C   r*   r   )r   r+   r   r   r   r   G  r-   zHTTPDigestAuth.verify_opaquec                 C      |   S r   r   r>   r   r   r   	get_nonceK  r   zHTTPDigestAuth.get_noncec                 C   r   r   r   r>   r   r   r   
get_opaqueN  r   zHTTPDigestAuth.get_opaquec                 C   s,   |d | j  d | }|d}t| S )N:rv   )r   rz   r   r   )r    r   rG   a1r   r   r   generate_ha1Q  s   
zHTTPDigestAuth.generate_ha1c              
   C   sL   |   }|  }| jrd| j| j||| jd| jS d| j| j||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   r=   r   r   r   join)r    r   r   r   r   r   r6   V  s   

z"HTTPDigestAuth.authenticate_headerc           	      C   sP  |r|j r|jr|jr|jr|jr|sdS | |jr!| |js#dS |jr.|j| jvr.dS | j	r4|}n|j d |j d | }t
|d }| jdkrat
|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   rv   r   rD   z:auth:)r   r   urir   responser   r   r   r   r   r   rz   r   r   cnoncer   rT   ncr   r   )	r    rD   stored_password_or_ha1ha1r   a2ha2a3r   r   r   r   rU   c  sN   


zHTTPDigestAuth.authenticate)NNFrD   r   )rj   rk   rl   r!   r   r   r   r   r   r   r   r6   rU   r   r   r   rr   r   r     s    5r   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   )ro   r   r!   verify_token_callback)r    r   r   r   rr   r   r   r!     s   
zHTTPTokenAuth.__init__c                 C   r*   r   )r   r+   r   r   r   verify_token  r-   zHTTPTokenAuth.verify_tokenc                 C   s&   t |dd}| jr| | j|S d S )Nr@   r"   )getattrr   r1   )r    rD   r   r@   r   r   r   rU     s   zHTTPTokenAuth.authenticate)r   NN)rj   rk   rl   r!   r   rU   r   r   r   rr   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   r7   r   r   r   r!     s   
zMultiAuth.__init__Nc                    rP   )NrQ   c                    rR   )Nc                     sP   j }j tjsjD ]}|tjr|} nq|jd | i |S )N)rK   rY   )r   r)   r   r$   r   r`   )r7   r8   selected_authrD   rX   r   r   r<     s    
zLMultiAuth.login_required.<locals>.login_required_internal.<locals>.decoratedr   rZ   r[   r\   r   r]     s   	z9MultiAuth.login_required.<locals>.login_required_internalr^   r_   r   r[   r   r`     s   zMultiAuth.login_requiredc                 C   rb   rc   rd   r>   r   r   r   rf     rg   zMultiAuth.current_userri   )rj   rk   rl   r!   r`   rf   r   r   r   r   r     s    
r   )__doc__r   base64r   	functoolsr   hashlibr   r   r   r   flaskr   r	   r
   r   r   r   werkzeug.datastructuresr   objectr   rm   r   r   r   r   r   r   r   <module>   s    	  4?|