
    k7i                    x   S 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Jr  SS	KJr  SS
KJr  SSKJrJrJrJrJrJrJrJr  \" \5      r   S#         S$S jjr\ " S S5      5       r\ " S S5      5       r     S%           S&S jjr!\S:X  a   SSK"r"SSKr\" 5       r#\$" S5        \$" S5        \$" S\# S35        \$" S\# S35        \$" S\# S35        \$" S5        \$" 5         \!" \#SS9r%\"RL                  " S\# S35        \RN                  " \%RP                  RR                  S\#S S!S"9  gg)'z
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_messagec                    U(       a  SOSnSnU(       a  U(       a  [        SU 3SSS9nOU(       d  [        U SSSS9nS[        5        S	[        XAS
9 S	U S3n[        [        -   [
        -   n[        UUUS9$ )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
            
is_successz
            <div class="close-instruction">
                You can safely close this tab now.
            </div>
        </div>
    )contenttitleadditional_styles)r   r   r   r   r   r   r   )messager   r   
server_urlstatus_titledetail_infor   r   s           W/home/james-whalen/.local/lib/python3.13/site-packages/fastmcp/client/oauth_callback.pycreate_callback_htmlr#   "   s     (2#7N 
 Kj%ZL)DD
 %dTT

]O "<GH IM 		G .?BTT+     c                  l    \ rS rSr% SrS\S'   SrS\S'   SrS\S'   SrS\S'   \	SS j5       r
SS	 jrS
rg)CallbackResponseO   N
str | Nonecodestateerrorerror_descriptionc           
         U " S0 UR                  5        VVs0 s H  u  p#X R                  ;   d  M  X#_M     snnD6$ s  snnf )N )items__annotations__)clsdatakvs       r"   	from_dictCallbackResponse.from_dictV   s9    Qtzz|P|tqq<O<O7Odad|PQQPs   ==c                v    U R                   R                  5        VVs0 s H  u  pUc  M
  X_M     snn$ s  snnf )N)__dict__r/   )selfr3   r4   s      r"   to_dictCallbackResponse.to_dictZ   s1    !%!4!4!6H!6!!6HHHs   	55r.   )r2   dict[str, str]returnr&   )r=   r<   )__name__
__module____qualname____firstlineno__r)   r0   r*   r+   r,   classmethodr5   r:   __static_attributes__r.   r$   r"   r&   r&   O   sE    D*E:E:$(z(R RIr$   r&   c                  D    \ rS rSr% SrSrS\S'   SrS\S'   SrS\S'   S	r	g)
OAuthCallbackResult^   zSContainer for OAuth callback results, used with anyio.Event for async coordination.Nr(   r)   r*   zException | Noner+   r.   )
r>   r?   r@   rA   __doc__r)   r0   r*   r+   rC   r.   r$   r"   rE   rE   ^   s$    ]D*E:"E"r$   rE   	/callbackc                p   ^^^ SUUU4S jjn[        [        X5      /S9n[        [        USU SSSS95      $ )	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)
c                  >#    [        U R                  5      n[        R                  U5      nUR                  (       ae  UR
                  =(       d    SnUR                  S:X  a  SnOSU 3nTb#  Tb   [        U5      Tl        TR                  5         [        [        USS9SS9$ UR                  (       d:  S	nTb#  Tb   [        U5      Tl        TR                  5         [        [        USS9SS9$ UR                  c:  S
nTb#  Tb   [        U5      Tl        TR                  5         [        [        USS9SS9$ Tb5  Tb2  UR                  Tl
        UR                  Tl        TR                  5         [        [        SSTS95      $ 7f)z:Handle OAuth callback requests with proper HTML responses.zUnknown erroraccess_deniedz.Access was denied by the authorization server.zAuthorization failed: Fr   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&   r5   r+   r,   RuntimeErrorsetr   r#   r)   r*   )requestrN   callback_response
error_descuser_messageresult_containerresult_readyr   s        r"   callback_handler6create_oauth_callback_server.<locals>.callback_handler|   s    G001,66|D""*<<OJ !&&/9O!7
|D  +0H)5l)C &  ".$ $    !%%PL  +0H)5l)C &  ".$ $    ""*O 
  +0H)5l)C &  ".$ $    'L,D$5$:$:!%6%<%<"* L
 	
s   E?F)routes	127.0.0.1offwarningzwebsockets-sansio)apphostportlifespan	log_levelws)rQ   r   )r   r   r	   r   )r_   callback_pathr   rU   rV   rW   r]   s     ```  r"   create_oauth_callback_serverrd   g   sK    *F
 F
P E-BC
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)r_   r   zhttp://localhost:rZ   r\   F)r^   r_   ra   
access_log)TzFastMCP OAuthN)
r   strr   boolr   rg   r   r(   r=   rg   )rH   NNN)r_   intrc   rg   r   r(   rU   zOAuthCallbackResult | NonerV   zanyio.Event | Noner=   r	   )*rG   
__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   r>   loggerr#   r&   rE   rd   
webbrowserr_   printserveropenrunconfigr]   r.   r$   r"   <module>r{      s   # !  , & # " 6 0	 	 	 
H	
  !	*** * 	*
 	*Z I I I # # # %!37'+h
hh h 1	h
 %h hV z3 D	
+,	
	(.N
OP	
&tf,ij 
(i
89	
%&	G *GF
 OO'v-MNO KK5 r$   