
    "<i                       d 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	 ddl
mZ ddlmZmZ dd	lmZ dd
lmZ ddlmZmZmZmZmZmZmZmZ  ee          Z	 	 	 d5d6dZe G d d                      Ze G d d                      Z 	 	 	 	 d7d8d$Z!ed%k    r	 ddl"Z"ddlZ e            Z# e$d&            e$d'            e$d(e# d)            e$d*e# d+            e$d,e# d            e$d-            e$              e!e#d./          Z% e"j&        d0e# d)            ej'        e%j(        j)        d1e#d2d34           dS dS )9z
OAuth callback server for handling authorization code flows.

This module provides a reusable callback server that can handle OAuth redirects
and display styled responses to users.
    )annotations)	dataclassN)	Starlette)Request)Route)ConfigServer)find_available_port)
get_logger)HELPER_TEXT_STYLESINFO_BOX_STYLESSTATUS_MESSAGE_STYLEScreate_info_boxcreate_logocreate_pagecreate_secure_html_responsecreate_status_messageTFastMCP OAuthmessagestr
is_successbooltitle
server_url
str | Nonereturnc                   |rdnd}d}|r|rt          d| dd          }n|st          | ddd          }dt                       d	t          ||
           d	| d}t          t          z   t
          z   }t          |||          S )z2Create a styled HTML response for OAuth callbacks.zAuthentication successfulzAuthentication failed zConnected to: T)centered	monospace)is_errorr   r    z-
        <div class="container">
            z
            r   z
            <div class="close-instruction">
                You can safely close this tab now.
            </div>
        </div>
    )contentr   additional_styles)r   r   r   r   r   r   r   )r   r   r   r   status_titledetail_infor#   r$   s           /Users/kimhansen/Desktop/03 Workspace/ceo-agents/chl-effectiveness/mcp-servers/whoop/.venv/lib/python3.11/site-packages/fastmcp/client/oauth_callback.pycreate_callback_htmlr(   "   s     (2N##7N 
 K 
j 
%)Z))DD
 
 
  
%dTT
 
 

	]]	 	 #<JGGG	 	 		 	 	G .?BTT+       c                  h    e Zd ZU dZded<   dZded<   dZded<   dZded<   edd
            Z	ddZ
dS )CallbackResponseNr   codestateerrorerror_descriptiondatadict[str, str]r   c                P       di  fd|                                 D             S )Nc                .    i | ]\  }}|j         v ||S  )__annotations__).0kvclss      r'   
<dictcomp>z.CallbackResponse.from_dict.<locals>.<dictcomp>X   s,    PPPtq!qC<O7O7Oa7O7O7Or)   r4   )items)r9   r0   s   ` r'   	from_dictzCallbackResponse.from_dictV   s6    sQQPPPPtzz||PPPQQQr)   c                H    d | j                                         D             S )Nc                    i | ]
\  }}|||S )Nr4   )r6   r7   r8   s      r'   r:   z,CallbackResponse.to_dict.<locals>.<dictcomp>[   s    HHHA!-1---r)   )__dict__r;   )selfs    r'   to_dictzCallbackResponse.to_dictZ   s$    HH!4!4!6!6HHHHr)   )r0   r1   r   r+   )r   r1   )__name__
__module____qualname__r,   r5   r-   r.   r/   classmethodr<   rA   r4   r)   r'   r+   r+   O   s         DEE$(((((R R R [RI I I I I Ir)   r+   c                  >    e Zd ZU dZdZded<   dZded<   dZded<   dS )OAuthCallbackResultzSContainer for OAuth callback results, used with anyio.Event for async coordination.Nr   r,   r-   zException | Noner.   )rB   rC   rD   __doc__r,   r5   r-   r.   r4   r)   r'   rG   rG   ^   sK         ]]DE"E""""""r)   rG   	/callbackportintcallback_pathresult_containerOAuthCallbackResult | Noneresult_readyanyio.Event | Noner	   c           
         d
fd}t          t          ||          g          }t          t          |d| ddd	                    S )a  
    Create an OAuth callback server.

    Args:
        port: The port to run the server on
        callback_path: The path to listen for OAuth redirects on
        server_url: Optional server URL to display in success messages
        result_container: Optional container to store callback results
        result_ready: Optional event to signal when callback is received

    Returns:
        Configured uvicorn Server instance (not yet running)
    requestr   c                4  K   t          | j                  }t                              |          }|j        rh|j        pd}|j        dk    rd}nd| }*(t          |          _                                         t          t          |d          d	          S |j
        sNd
}*(t          |          _                                         t          t          |d          d	          S |j        Nd}*(t          |          _                                         t          t          |d          d	          S .,|j
        _
        |j        _                                         t          t          dd                    S )z:Handle OAuth callback requests with proper HTML responses.zUnknown erroraccess_deniedz.Access was denied by the authorization server.zAuthorization failed: NFr"   i  )status_codez3No authorization code was received from the server.z=The OAuth server did not return the expected state parameter.r   T)r   r   )dictquery_paramsr+   r<   r.   r/   RuntimeErrorsetr   r(   r,   r-   )rR   rW   callback_response
error_descuser_messagerM   rO   r   s        r'   callback_handlerz6create_oauth_callback_server.<locals>.callback_handler|   s     G011,66|DD" 	*<OJ !&/99OD
DD  +0H)5l)C)C &  """.$ $        !% 	PL  +0H)5l)C)C &  """.$ $        "*O 
  +0H)5l)C)C &  """.$ $        'L,D$5$:!%6%<"* LLL
 
 	
r)   )routes	127.0.0.1offwarningzwebsockets-sansio)apphostrJ   lifespan	log_levelws)rR   r   )r   r   r	   r   )rJ   rL   r   rM   rO   r]   rb   s     ```  r'   create_oauth_callback_serverrg   g   s    *F
 F
 F
 F
 F
 F
 F
 F
P E-1ABBC
D
D
DC"	
 	
 	
	 	 	r)   __main__u   🎭 OAuth Callback Test Serveru   📍 Test URLs:z  Success: http://localhost:z /callback?code=test123&state=xyzz  Error:   http://localhost:z=/callback?error=access_denied&error_description=User%20deniedz  Missing: http://localhost:u   🛑 Press Ctrl+C to stopz'https://fastmcp-test-server.example.com)rJ   r   zhttp://localhost:r_   ra   F)rc   rJ   re   
access_log)Tr   N)
r   r   r   r   r   r   r   r   r   r   )rI   NNN)rJ   rK   rL   r   r   r   rM   rN   rO   rP   r   r	   )*rH   
__future__r   dataclassesr   anyiostarlette.applicationsr   starlette.requestsr   starlette.routingr   uvicornr   r	   fastmcp.utilities.httpr
   fastmcp.utilities.loggingr   fastmcp.utilities.uir   r   r   r   r   r   r   r   rB   loggerr(   r+   rG   rg   
webbrowserrJ   printserveropenrunconfigrb   r4   r)   r'   <module>r{      s6    # " " " " " ! ! ! ! ! !  , , , , , , & & & & & & # # # # # # " " " " " " " " 6 6 6 6 6 6 0 0 0 0 0 0	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 
H		
  !	* * * * *Z I I I I I I I I # # # # # # # # %!37'+h h h h hV z3NNN  D	E
+,,,	E
	E
O
O
O
OPPP	Ejtjjj   
E
8
8
8
8999	E
%&&&	EGGG *)G  F
 JONNNNOOO GK     5 r)   