
    9-e                     r   d dl Z d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlm	Z	 d dlm
Z
 d d	lmZ d d
lmZ d dlmZ d dlmZ d dlmZ d dlZd dlmZ d dlmZ  e j        e          Z G d de          Zeeeeef         f         Z G d de          Z G d de          ZdededefdZddZ dS )    N)
HTTPStatus)BaseHTTPRequestHandler)
HTTPServer)socket)Any)Dict)List)Set)Tuple)Union)parse_qs)urlparse)	BaseModel)AuthenticationErrorc                   J    e Zd ZU dZdZeed<   dZeed<   g Ze	e         ed<   dS )Resultz;This class is needed to capture the auth code redirect data 	auth_codestatescopesN)
__name__
__module____qualname____doc__r   str__annotations__r   r   r	        <lib/python3.11/site-packages/anaconda_cloud_auth/handlers.pyr   r      sI         EEIsE3OOOFDIr   r   c                        e Zd ZU dZ e            Zed          ed<   dede	ee
f         f fdZd fdZded	ed
eddf fdZdededdfdZ xZS )AuthCodeRedirectServerzGA simple http server to handle the incoming auth code redirect from Ory_open_servers	oidc_pathserver_addressc                     t                                          |t                     d | _        t	          | j        d                   | _        || _        d S )Nr   )super__init__AuthCodeRedirectRequestHandlerresultr   r$   	host_namer#   )selfr#   r$   	__class__s      r   r'   zAuthCodeRedirectServer.__init__'   sG    )GHHH+/T0344"r   returnc                 x    | j                             |            t                                                      S N)r"   addr&   	__enter__)r+   r,   s    r   r1   z AuthCodeRedirectServer.__enter__-   s0    t$$$ww  """r   exc_typeexc_valexc_tbNc                     	 | j                             |            n# t          $ r Y nw xY wt                                          |||          S r/   )r"   removeKeyErrorr&   __exit__)r+   r2   r3   r4   r,   s       r   r8   zAuthCodeRedirectServer.__exit__1   s`    	%%d++++ 	 	 	D	 ww'6:::s    
++requestclient_addressc                 B    t          | j        | j        |||            dS )z8Finish one request by instantiating RequestHandlerClass.serverN)r(   r#   r*   )r+   r9   r:   s      r   finish_requestz%AuthCodeRedirectServer.finish_request9   s6    &NN	
 	
 	
 	
 	
 	
r   )r-   r!   )r   r   r   r   setr"   r
   r   r   r   intr'   r1   r   r8   TRequestr>   __classcell__r,   s   @r   r!   r!   "   s         QQ36355M3/0888## #uS#X # # # # # ## # # # # #; ;s ;C ;D ; ; ; ; ; ;
h 
 
 
 
 
 
 
 
 
 
r   r!   c                        e Zd ZU dZeed<   dedededef fdZdeded	d
fdZ	de
eee         f         d	d
fdZddZddZ xZS )r(   z?Request handler to get the auth code from the redirect from Oryr=   r#   r*   argskwargsc                 V    || _         || _         t                      j        |i | d S r/   )r#   r*   r&   r'   )r+   r#   r*   rE   rF   r,   s        r   r'   z'AuthCodeRedirectRequestHandler.__init__I   s5     #"$)&)))))r   formatr-   Nc                     dS )z-Override base method to suppress log message.Nr   )r+   rH   rE   s      r   log_messagez*AuthCodeRedirectRequestHandler.log_messageV   s      r   query_paramsc                 B   d|v rOd|v rKd}t          |d         d         |d         d         |                    dg                     | j        _        nd}|                     t
          j                   |                     d|           |                                  d S )	Ncoder   z*https://anaconda.cloud/local-login-successr   scope)r   r   r   z(https://anaconda.cloud/local-login-errorLocation)	r   getr=   r)   send_responser   TEMPORARY_REDIRECTsend_headerend_headers)r+   rK   locations      r   _handle_authz+AuthCodeRedirectRequestHandler._handle_authY   s    \!!g&=&=CH!'&v.q1"7+A.#''44" " "DK BH:8999X...r   c                     |                      t          j                   |                     dd           |                                  d S )NzContent-typez	text/html)rQ   r   	NOT_FOUNDrS   rT   )r+   s    r   
_not_foundz)AuthCodeRedirectRequestHandler._not_foundh   sG    :/000555r   c                     t          d| j         | j                   }t          |j                  }|j        | j        k    r|                                  d S |                     |           d S )Nhttp://)r   r*   pathr   queryr#   rY   rV   )r+   
parsed_urlrK   s      r   do_GETz%AuthCodeRedirectRequestHandler.do_GETm   sr    CC	CCDD

 011 ?dn,,OOl+++++r   r-   N)r   r   r   r   r!   r   r   r   r'   rJ   r   r	   rV   rY   r_   rB   rC   s   @r   r(   r(   D   s         II""""** * 	*
 * * * * * *<# <c <d < < < <c49n)= $       
, , , , , , , ,r   r(   redirect_urir   r-   c                    t          |           }|j                            d          \  }}t          |pd          }|j        }t
                              d|             t          |||f          5 }|                                 d d d            n# 1 swxY w Y   |j	        }|t          d          |j        t          d          |j        |k    rt          d          |j        S )N:80zListening on: z!Could not complete authenticationzNo authorization codezState does not match)r   netlocsplitr@   r\   loggerdebugr!   handle_requestr)   r   r   r   )	ra   r   r^   r*   portserver_portr#   
web_serverr)   s	            r   capture_auth_coderm   x   s0   ,''J '--c22OItdld##KI
LL0,00111		I{+C	D	D $
!!###$ $ $ $ $ $ $ $ $ $ $ $ $ $ $ F~!"EFFF!"9:::|u!"8999s   4BBBc                      t          t          j                  D ]'} t          j        d| j         d| j         d           (dS )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.

    r[   rc   z/cancelN)listr!   r"   requestsrP   r*   rk   r<   s    r   shutdown_all_serversrq      s\     -;<< O O 	Mv/MM&2DMMMNNNNO Or   r`   )!logginghttpr   http.serverr   r   r   typingr   r   r	   r
   r   r   urllib.parser   r   rp   pydantic.mainr   anaconda_cloud_auth.exceptionsr   	getLoggerr   rg   r   bytesrA   r!   r(   r   rm   rq   r   r   r   <module>r{      s          . . . . . . " " " " " "                                           ! ! ! ! ! ! ! ! ! ! ! !  # # # # # # > > > > > >		8	$	$    Y    uf}--.
 
 
 
 
Z 
 
 
D1, 1, 1, 1, 1,%; 1, 1, 1,hC      4
O 
O 
O 
O 
O 
Or   