
    i$              	          S SK r S SKJr  S SKJr  S SKJr  S SKJr  S SKJr  S SKJ	r	  S SKJ
r
  S S	KJr  S S
KJr  S SKJr  S SKJr  S SKJr  S SKJr  S SKrS SKJr  S SKJr  S SKJr  S SKJr  \ R4                  " \5      r " S S\5      r\\\\\4   4   r " S S\5      r  " S S\5      r! SS\"S\"S\\   S\"4S jjr#S S jr$g)!    N)
HTTPStatus)BaseHTTPRequestHandler)
HTTPServer)socket)Any)Dict)List)Optional)Set)Tuple)Union)parse_qs)urlparse)	BaseModel)AnacondaAuthConfig)AnacondaAuthSite)AuthenticationErrorc                   J    \ rS rSr% SrSr\\S'   Sr\\S'   / r	\
\   \S'   Srg)	Result   z;This class is needed to capture the auth code redirect data 	auth_codestatescopes N)__name__
__module____qualname____firstlineno____doc__r   str__annotations__r   r   r	   __static_attributes__r       6lib/python3.13/site-packages/anaconda_auth/handlers.pyr   r      s&    EIsE3OFDIr$   r   c                      ^  \ rS rSr% Sr\" 5       r\S    \S'    SS\	S\
\	\4   S\\   4U 4S jjjrSU 4S
 jjrS\S\S\S	S4U 4S jjrS\S\	S	S4S jrSrU =r$ )AuthCodeRedirectServer%   zGA simple http server to handle the incoming auth code redirect from Ory_open_serversN	oidc_pathserver_addressconfigc                    > [         TU ]  U[        5        S U l        [	        U R
                  S   5      U l        Xl        U=(       d
    [        5       U l	        g )Nr   )
super__init__AuthCodeRedirectRequestHandlerresultr!   r+   	host_namer*   r   r,   )selfr*   r+   r,   	__class__s       r%   r/   AuthCodeRedirectServer.__init__*   sH     	)GH+/T0034"4 2 4r$   returnc                 V   > U R                   R                  U 5        [        TU ]  5       $ N)r)   addr.   	__enter__)r3   r4   s    r%   r:    AuthCodeRedirectServer.__enter__6   s%    t$w ""r$   exc_typeexc_valexc_tbc                 |   >  U R                   R                  U 5        [        TU ]  XU5      $ ! [         a     Nf = fr8   )r)   removeKeyErrorr.   __exit__)r3   r<   r=   r>   r4   s       r%   rB   AuthCodeRedirectServer.__exit__:   sD    	%%d+ w6::  		s   . 
;;requestclient_addressc           
          [        UUU U R                  U R                  U R                  R                  U R                  R
                  S9  g)z8Finish one request by instantiating RequestHandlerClass.)serverr*   r2   login_success_urllogin_error_urlN)r0   r*   r2   r,   rH   rI   )r3   rD   rE   s      r%   finish_request%AuthCodeRedirectServer.finish_requestB   s;    &nnnn"kk;; KK77	
r$   )r,   r2   r*   r1   r8   )r6   r'   )r   r   r   r   r    setr)   r   r"   r!   r   intr
   r   r/   r:   r   rB   TRequestrJ   r#   __classcell__r4   s   @r%   r'   r'   %   s    Q365M3/08 .2	
5
5 c3h
5 )*	
5 
5#; ;s ;C ;D ;

h 

 

 

 

r$   r'   c                      ^  \ rS rSr% Sr\\S'   S\S\S\S\S\S	\4U 4S
 jjr	S\S\SS4S jr
S\\\\   4   SS4S jrSS jrSS jrSrU =r$ )r0   O   z?Request handler to get the auth code from the redirect from OryrG   argsr*   r2   rH   rI   kwargsc                V   > Xl         X l        X0l        X@l        [        TU ]  " U0 UD6  g r8   )r*   r2   rH   rI   r.   r/   )r3   r*   r2   rH   rI   rS   rT   r4   s          r%   r/   'AuthCodeRedirectRequestHandler.__init__T   s-     #"!2.$)&)r$   formatr6   Nc                     g)z-Override base method to suppress log message.Nr   )r3   rW   rS   s      r%   log_message*AuthCodeRedirectRequestHandler.log_messagee   s    r$   query_paramsc                 <   SU;   aI  SU;   aC  U R                   n[        US   S   US   S   UR                  S/ 5      S9U R                  l        OU R
                  nU R                  [        R                  5        U R                  SU5        U R                  5         g )Ncoder   r   scope)r   r   r   Location)rH   r   getrG   r1   rI   send_responser   TEMPORARY_REDIRECTsend_headerend_headers)r3   r[   locations      r%   _handle_auth+AuthCodeRedirectRequestHandler._handle_authh   s    \!g&=--H!'&v.q1"7+A.#''4"DKK ++H:889X.r$   c                     U R                  [        R                  5        U R                  SS5        U R	                  5         g )NzContent-typez	text/html)ra   r   	NOT_FOUNDrc   rd   )r3   s    r%   
_not_found)AuthCodeRedirectRequestHandler._not_foundw   s2    ://05r$   c                     [        SU R                   U R                   35      n[        UR                  5      nUR                  U R
                  :w  a  U R                  5         g U R                  U5        g )Nhttp://)r   r2   pathr   queryr*   rj   rf   )r3   
parsed_urlr[   s      r%   do_GET%AuthCodeRedirectRequestHandler.do_GET|   sZ    '7		{CD

 0 01 ??dnn,OOl+r$   )r2   rI   rH   r*   r6   N)r   r   r   r   r    r'   r"   r   r!   r/   rY   r   r	   rf   rj   rq   r#   rO   rP   s   @r%   r0   r0   O   s    I""** * 	*
 * * *"<# <c <d <c49n)= $ 
, ,r$   r0   redirect_urir   r,   r6   c                    U=(       d
    [        5       n[        U 5      nUR                  R                  S5      u  pE[	        U=(       d    S5      nUR
                  n[        R                  SU  35        [        XtU4US9 nUR                  5         S S S 5        WR                  n	U	c  [        S5      eU	R                  c  [        S5      eU	R                  U:w  a  [        S5      eU	R                  $ ! , (       d  f       Ng= f)N:80zListening on: )r,   z!Could not complete authenticationzNo authorization codezState does not match)r   r   netlocsplitrM   rn   loggerdebugr'   handle_requestr1   r   r   r   )
rt   r   r,   rp   r2   portserver_portr*   
web_serverr1   s
             r%   capture_auth_coder      s     +)+F,'J ''--c2OIdld#KI
LL>,01	{+F
	!!#

 F~!"EFF!"9::||u!"899!
 
s    C22
D c                      [        [        R                  5       H4  n [        R                  " SU R
                   SU R                   S35        M6     g)zCancel all open AuthCodeRedirectServer instances, which may be blocking their thread waiting
for an auth code.

This function should be called from a separate thread than the servers.

rm   rv   z/cancelN)listr'   r)   requestsr`   r2   r~   )rG   s    r%   shutdown_all_serversr      sE     -;;< 	wv//0&2D2D1EWMN =r$   r8   rs   )%logginghttpr   http.serverr   r   r   typingr   r   r	   r
   r   r   r   urllib.parser   r   r   pydanticr   anaconda_auth.configr   r   anaconda_auth.exceptionsr   	getLoggerr   rz   r   bytesrN   r'   r0   r!   r   r   r   r$   r%   <module>r      s      . "         ! !   3 1 8			8	$Y  uf}--.'
Z '
T5,%; 5,r IM!+34D+E>
Or$   