
    ՟f=                         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
e      Z G d de      Z G d de      Z G d de      Z G d de      Zy)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                   ^    e Zd ZddZd Zd Zd Zd Zd Zd Z	d	 Z
d
 ZddZd Zd Zd Zy)HTTPAuthNc                     || _         |xs d| _        || _        d | _        d | _        d | _        d }d }| j                  |       | j                  |       y )NzAuthentication Requiredc                      y N )usernames    I/var/www/cvtools/html/venv/lib/python3.12/site-packages/flask_httpauth.pydefault_get_passwordz/HTTPAuth.__init__.<locals>.default_get_password   s        c                 
    d| fS )NzUnauthorized Accessr   )statuss    r   default_auth_errorz-HTTPAuth.__init__.<locals>.default_auth_error   s    (&00r   )schemerealmheaderget_password_callbackget_user_roles_callbackauth_error_callbackget_passworderror_handler)selfr   r   r   r   r   s         r   __init__zHTTPAuth.__init__   s_    77
%)"'+$#' 		1 	./-.r   c                     | j                   | j                   dk(  rC	 t        j                  j                  dd      j	                  d d      \  }}|| j                  k(  S | j                   |v S # t
        $ r Y yw xY w)Nr       F)r   r	   headersgetsplit
ValueErrorr   )r%   r*   r   _s       r   is_compatible_authzHTTPAuth.is_compatible_auth%   sz    ;;$++"@#OO//DJJ!	
 T[[((;;'))  s   3A- -	A98A9c                     || _         |S r   )r    r%   fs     r   r#   zHTTPAuth.get_password1       %&"r   c                     || _         |S r   )r!   r1   s     r   get_user_roleszHTTPAuth.get_user_roles5       '($r   c                 @     t               fd       }| _        |S )Nc                      j                        | i |}t        |t        t        f       }t	        |      }|r|j
                  dk(  rd|_        d|j                  j                         vrj                         |j                  d<   |S )N     zWWW-Authenticate)	ensure_sync
isinstancetupler   r
   status_coder*   keysauthenticate_header)argskwargsrescheck_status_coder2   r%   s       r   	decoratedz)HTTPAuth.error_handler.<locals>.decorated:   s    %$""1%t6v6C$.sUH4E$F F$C S__%;"%!)9)9);;262J2J2L./Jr   )r   r"   )r%   r2   rE   s   `` r   r$   zHTTPAuth.error_handler9   s)    	q		 
		 $- r   c                 N    dj                  | j                  | j                        S )Nz{0} realm="{1}")formatr   r   r%   s    r   r@   zHTTPAuth.authenticate_headerH   s     ''TZZ@@r   c                 >   d }| j                   | j                   dk(  r^t        j                  }|dt        j                  v r	 t        j                  d   j	                  d d      \  }}t        |      }||_        nS| j                   t        j                  v r7t        | j                        }t        j                  | j                      |_        |7|j                  j                         | j                  j                         k7  rd }|S # t        t        f$ r Y Lw xY w)Nr   r)   )r   r	   authorizationr*   r,   r   tokenr-   KeyErrorr   typelower)r%   auth	auth_typerK   s       r   get_authzHTTPAuth.get_authK   s    ;;$++"@((D|#w6'.'G'M'Ma(!$Iu(3D!&DJ [[GOO+ !-D 5DJ
 		 1T[[5F5F5H HD #H- s   8D
 
DDc                 |    d }|r7|j                   r+ | j                  | j                        |j                         }|S r   )r   r;   r    )r%   rO   passwords      r   get_auth_passwordzHTTPAuth.get_auth_passwordj   s;    DMMCt''(B(BCH r   c                    |yt        |t        t        f      r|}n|g}|du r|}| j                  t	        d       | j                  | j                        |      }|i }n%t        |t        t        f      s|h}nt        |      }|D ]4  }t        |t        t        f      rt        |      }||z  |k(  s- y||v s4 y y )NTz&get_user_roles callback is not defined)r<   listr=   r!   r-   r;   set)r%   roleuserrO   roles
user_roless         r   	authorizezHTTPAuth.authorizes   s    <dT5M*EFE4<D''/EFFCT%%d&B&BCDI
JJu6$JZJ 	D$u.4y*$,#	r   c                 P     |t        d       fd}|r ||      S |S )N2role and optional are the only supported argumentsc                 6     t                fd       }|S )Nc                     	j                         }t        j                  dk7  rv	j                  |      }d }	j	                  ||      }|dv rd}n	j                  ||      sd}s|r	 	j                  |      S |dur|n|r|j                  nd t        _
         	j                        | i |S # t        $ r 	j                         cY S w xY w)NOPTIONS)FNr:   i  T)rQ   r	   methodrT   authenticater\   r"   	TypeErrorr   r   flask_httpauth_userr;   )
rA   rB   rO   rS   r   rY   r2   optionalrX   r%   s
         r   rE   zKHTTPAuth.login_required.<locals>.login_required_internal.<locals>.decorated   s    }} >>Y.#55d;H!F,,T8<D},!$!^^D$=!$#>#'#;#;F#CC 594DD.2T]] )*t''*D;F;;  ) >#'#;#;#==>s   +B2 2CCr   r2   rE   rf   rX   r%   s   ` r   login_required_internalz8HTTPAuth.login_required.<locals>.login_required_internal   s!    1X< <4 r   r-   r%   r2   rX   rf   rh   s   ` `` r   login_requiredzHTTPAuth.login_required   s@    =!X%9DF F	< *1--&&r   c                 @    | j                         }|sy|j                  S Nr(   )rQ   r   )r%   rO   s     r   r   zHTTPAuth.username   s    }}}}r   c                 D    t        t        d      rt        j                  S y Nre   hasattrr   re   rH   s    r   current_userzHTTPAuth.current_user       1+,((( -r   c                 P    	 t        j                  |      S # t        $ r |cY S w xY wr   )r   r;   AttributeErrorr1   s     r   r;   zHTTPAuth.ensure_sync   s,    	**1-- 	H	s    %%NNN)__name__
__module____qualname__r&   r/   r#   r5   r$   r@   rQ   rT   r\   rk   r   rr   r;   r   r   r   r   r      sE    /"
*A>4&'P)r   r   c                   8     e Zd Zd fd	Zd Zd Zd Zd Z xZS )HTTPBasicAuthc                 R    t         t        |   |xs d|       d | _        d | _        y )NBasic)superr{   r&   hash_password_callbackverify_password_callback)r%   r   r   	__class__s      r   r&   zHTTPBasicAuth.__init__   s)    mT+F,=guE&*#(,%r   c                     || _         |S r   )r   r1   s     r   hash_passwordzHTTPBasicAuth.hash_password       &'#r   c                     || _         |S r   )r   r1   s     r   verify_passwordzHTTPBasicAuth.verify_password       ()%r   c                    | j                   xs d}|t        j                  vry t        j                  |   j                  d      }	 |j	                  dd      \  }}t        |      j	                  dd      \  }}	 |j                  d      }|j                  d      }t        |||d      S # t        t        f$ r Y y w xY w# t        $ r% |j                  d      }|j                  d      }Y Qw xY w)Nr   utf-8    r)      :latin1)r   rS   )r   r	   r*   encoder,   r   r-   rd   decodeUnicodeDecodeErrorr   )	r%   r   valuer   credentialsencoded_usernameencoded_passwordr   rS   s	            r   rQ   zHTTPBasicAuth.get_auth   s     /('..w7	"'++dA"6FK1:2"U4^ /.	9'..w7H'..w7H x@B 	B I& 		
 " 	9'..x8H'..x8H	9s$   3B, ;"C ,B>=B>+C/.C/c                    |r|j                   }|j                  }nd}d}| j                  r" | j                  | j                        ||      S |sy | j                  r"	  | j                  | j                        |      }|$|"t        j                  ||      r|j                   S d S # t
        $ r%  | j                  | j                        ||      }Y Uw xY wrm   )r   rS   r   r;   r   rd   hmaccompare_digest)r%   rO   stored_passwordr   client_passwords        r   rc   zHTTPBasicAuth.authenticate   s    }}H"mmOH O((B4##D$A$AB/+ +&&L#1$"2"2//#11@#B
 !0 ;'A }} 	LGK	L  L#1$"2"2//#119?#LLs   !B' '+CC)NN)	rw   rx   ry   r&   r   r   rQ   rc   __classcell__r   s   @r   r{   r{      s    -B0Lr   r{   c                   Z     e Zd Z	 	 d fd	Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Z xZS )HTTPDigestAuthc                     t         t           |xs d|       | _        t	        |t
              r3|j                  d      D cg c]  }|j                          c} _        n| _        |j                         dk(  rd _
        n*|j                         dk(  rd _
        nt        d| d      t                _        	  j                  j                          d  _        d  _        d  _        d  _         fd	fd
}d }fd}	d }
 j)                  |        j+                  |	        j-                  |        j/                  |
       y c c}w # t        $ r t                _        Y w xY w)NDigest,r   MD5zmd5-sessMD5-Sessz
Algorithm z is not supportedc                      t        t         j                  j                               j                  d            j	                         S )Nr   )r   strrandomr   	hexdigestrH   s   r   _generate_randomz1HTTPDigestAuth.__init__.<locals>._generate_random  s4    s4;;--/077@AKKMMr   c                  2             t         d<   t         d   S )N
auth_noncer   r   s   r   default_generate_noncez7HTTPDigestAuth.__init__.<locals>.default_generate_nonce"  s    $4$6GL!<((r   c                 b    t        j                  d      }| |yt        j                  | |      S )Nr   Fr   r+   r   r   )noncesession_nonces     r   default_verify_noncez5HTTPDigestAuth.__init__.<locals>.default_verify_nonce&  s0    #KK5M} 5&&um<<r   c                  2             t         d<   t         d   S )Nauth_opaquer   r   s   r   default_generate_opaquez8HTTPDigestAuth.__init__.<locals>.default_generate_opaque,  s    %5%7GM"=))r   c                 b    t        j                  d      }| |yt        j                  | |      S )Nr   Fr   )opaquesession_opaques     r   default_verify_opaquez6HTTPDigestAuth.__init__.<locals>.default_verify_opaque0  s0    $[[7N~!7&&v~>>r   )r~   r   r&   
use_ha1_pwr<   r   r,   stripqoprN   	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   vr   r   r   r   r   r   s   `          @r   r&   zHTTPDigestAuth.__init__  sJ   nd,V-?xG$c3+.99S>:a	:DHDH??%"DN__*,'DNz)4EFGG"n	#KK  (,$%)"(,%&*#	N	)	=	*	? 	2345./01] ; # 	# (DK	#s   EE E21E2c                     || _         |S r   r   r1   s     r   r   zHTTPDigestAuth.generate_nonce;  r6   r   c                     || _         |S r   )r   r1   s     r   r   zHTTPDigestAuth.verify_nonce?  r3   r   c                     || _         |S r   r   r1   s     r   r   zHTTPDigestAuth.generate_opaqueC  r   r   c                     || _         |S r   )r   r1   s     r   r   zHTTPDigestAuth.verify_opaqueG  r   r   c                 "    | j                         S r   r   rH   s    r   	get_noncezHTTPDigestAuth.get_nonceK  s    ++--r   c                 "    | j                         S r   r   rH   s    r   
get_opaquezHTTPDigestAuth.get_opaqueN  s    ,,..r   c                     |dz   | j                   z   dz   |z   }|j                  d      }t        |      j                         S )N:r   )r   r   r   r   )r%   r   rS   a1s       r   generate_ha1zHTTPDigestAuth.generate_ha1Q  s?    ^djj(3.9YYw2w  ""r   c           
      D   | j                         }| j                         }| j                  rMdj                  | j                  | j
                  ||| j                  dj                  | j                              S dj                  | 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   rG   r   r   r   join)r%   r   r   s      r   r@   z"HTTPDigestAuth.authenticate_headerV  s     "88!"(&TZZ(:#<<
 >DDTZZ r   c                 |   |r>|j                   r2|j                  r&|j                  r|j                  r|j                  r|sy| j                  |j                        r| j                  |j                        sy|j                  r|j                  | j                  vry| j                  r|}nJ|j                   dz   |j                  z   dz   |z   }t        |j                  d            j                         }| j                  dk(  rHt        |dz   |j                  z   dz   |j                  z   j                  d            j                         }t        j                   dz   |j                  z   }t        |j                  d            j                         }|j                  dk(  r9|dz   |j                  z   dz   |j"                  z   dz   |j                  z   dz   |z   }n|dz   |j                  z   dz   |z   }t        |j                  d            j                         }t%        j&                  ||j                        S )NFr   r   r   rO   z:auth:)r   r   urir   responser   r   r   r   r   r   r   r   r   cnoncer	   rb   ncr   r   )	r%   rO   stored_password_or_ha1ha1r   a2ha2a3r   s	            r   rc   zHTTPDigestAuth.authenticatec  s   4==

$((zz-))$**5//<880??(C$tzz1C7&'Bbii()335C>>Z'sSy4::-3dkkAII #)+ ^^c!DHH,"))G$%//188vsTZZ'#-7#=&'),-B sTZZ'#-3Bryy)*446""8T]];;r   )NNFrO   r   )rw   rx   ry   r&   r   r   r   r   r   r   r   r@   rc   r   r   s   @r   r   r     s<    FL 32j./#
<r   r   c                   ,     e Zd Zd fd	Zd Zd Z xZS )HTTPTokenAuthc                 >    t         t        |   |||       d | _        y r   )r~   r   r&   verify_token_callback)r%   r   r   r   r   s       r   r&   zHTTPTokenAuth.__init__  s    mT+FE6B%)"r   c                     || _         |S r   )r   r1   s     r   verify_tokenzHTTPTokenAuth.verify_token  r3   r   c                 x    t        |dd      }| j                  r! | j                  | j                        |      S y )NrK   r(   )getattrr   r;   )r%   rO   r   rK   s       r   rc   zHTTPTokenAuth.authenticate  s<    gr*%%?4##D$>$>?FF &r   )BearerNN)rw   rx   ry   r&   r   rc   r   r   s   @r   r   r     s    *
Gr   r   c                        e Zd Zd ZddZd Zy)	MultiAuthc                      || _         || _        y r   )	main_authadditional_auth)r%   r   rA   s      r   r&   zMultiAuth.__init__  s    "#r   Nc                 P     |t        d       fd}|r ||      S |S )Nr^   c                 6     t                fd       }|S )Nc                     j                   }j                   j                  t        j                        s4j                  D ]%  }|j                  t        j                        s#|} n   |j                              | i |S )N)rX   rf   )r   r/   r	   r*   r   rk   )rA   rB   selected_authrO   r2   rf   rX   r%   s       r   rE   zLMultiAuth.login_required.<locals>.login_required_internal.<locals>.decorated  s     $~~88I $ 4 4 "227??C,0M!"5 2}33 4 22356:F>DF Fr   r   rg   s   ` r   rh   z9MultiAuth.login_required.<locals>.login_required_internal  s#    1XF F r   ri   rj   s   ` `` r   rk   zMultiAuth.login_required  s@    =!X%9DF F	 *1--&&r   c                 D    t        t        d      rt        j                  S y ro   rp   rH   s    r   rr   zMultiAuth.current_user  rs   r   rv   )rw   rx   ry   r&   rk   rr   r   r   r   r   r     s    $'.)r   r   )__doc__r   base64r   	functoolsr   hashlibr   r   r   r   flaskr	   r
   r   r   r   r   werkzeug.datastructuresr   objectr   r{   r   r   r   r   r   r   <module>r      sk        ' K K 1pv pf<LH <L~y<X y<xGH G ) )r   