
    `gj                        d Z ddlmZ ddlZddlZddlZddlmZ ddlm	Z	 ddl
Z
dZdZdZ G d	 d
e      Z G d de      Z G d de      Z ed       G d d             Ze G d d             Z G d d      ZddZy)z0Microsoft Graph app-only authentication helpers.    )annotationsN)	dataclass)Anyz$https://graph.microsoft.com/.defaultz!https://login.microsoftonline.comx   c                      e Zd ZdZy)MicrosoftGraphAuthErrorz-Base class for Microsoft Graph auth failures.N__name__
__module____qualname____doc__     M/root/.hermes/venv/lib/python3.12/site-packages/tools/microsoft_graph_auth.pyr   r      s    7r   r   c                      e Zd ZdZy)MicrosoftGraphConfigErrorz5Raised when Graph credentials are missing or invalid.Nr	   r   r   r   r   r      s    ?r   r   c                      e Zd ZdZy)MicrosoftGraphTokenErrorz$Raised when token acquisition fails.Nr	   r   r   r   r   r      s    .r   r   T)frozenc                      e Zd ZU dZded<   ded<   ded<   eZded<   eZded<   e	dd       Z
e	 dd
d	 	 	 	 	 dd       Zy	)GraphCredentialsz0Normalized Microsoft Graph app-only credentials.str	tenant_id	client_idclient_secretscopeauthority_urlc                    | j                   j                  d      }| j                  j                         j                  d      }| d| dS )N/z/oauth2/v2.0/token)r   rstripr   strip)selfbasetenants      r   	token_urlzGraphCredentials.token_url)   sI    !!((-%%'--c2q 233r   NT)requiredc               @   ||nt         j                  }|j                  d      xs dj                         }|j                  d      xs dj                         }|j                  d      xs dj                         }|j                  d      xs t        j                         }|j                  d      xs t
        j                         }d|fd|fd|ffD 	
cg c]	  \  }	}
|
s|	 }}	}
|r |sy t        ddj                  |              | |||||	      S c c}
}	w )
NMSGRAPH_TENANT_ID MSGRAPH_CLIENT_IDMSGRAPH_CLIENT_SECRETMSGRAPH_SCOPEMSGRAPH_AUTHORITY_URLz'Missing Microsoft Graph configuration: z, )r   r   r   r   r   )osenvirongetr!   DEFAULT_GRAPH_SCOPEDEFAULT_GRAPH_AUTHORITY_URLr   join)clsr/   r&   envr   r   r   r   r   namevaluemissings               r   from_envzGraphCredentials.from_env/   s8    !,g"**WW017R>>@	WW017R>>@	!89?RFFH)@-@GGIGG+,K0K
%' 	 %i0$i0(-8 
e
  
 
 +9$))G:L9MN  ''
 	
!
s   D)returnr   N)r/   dict[str, str] | Noner&   boolr:   z'GraphCredentials | None')r
   r   r   r   __annotations__r1   r   r2   r   propertyr%   classmethodr9   r   r   r   r   r      sz    :NN$E3$4M344 4
  *.%
 	%
&%
 	%

 
#%
 %
r   r   c                  T    e Zd ZU dZded<   ded<   dZded<   eddd	Zedd
       Z	y)CachedAccessTokenz#Cached app-only Graph access token.r   access_tokenfloat
expires_atBearer
token_typeskew_secondsc               p    | j                   t        j                         t        dt        |            z   k  S Nr   )rE   timemaxint)r"   rI   s     r   
is_expiredzCachedAccessToken.is_expired`   s(    499;QL8I1J#JKKr   c                j    t        dt        | j                  t        j                         z
              S rK   )rM   rN   rE   rL   r"   s    r   expires_in_secondsz$CachedAccessToken.expires_in_secondsc   s#    1c$//DIIK7899r   N)rI   rN   r:   r=   )r:   rN   )
r
   r   r   r   r>   rG   DEFAULT_TOKEN_SKEW_SECONDSrO   r?   rR   r   r   r   rB   rB   X   s8    -J0J L : :r   rB   c                  z    e Zd ZdZdedd	 	 	 	 	 	 	 	 	 ddZe	 d	 	 	 	 	 dd       ZddZddZ	d	d
ddZ
ddZy)MicrosoftGraphTokenProviderz9Acquire and cache Microsoft Graph app-only access tokens.g      4@N)timeoutrI   	transportc                   || _         || _        t        dt        |            | _        || _        d | _        t        j                         | _	        y rK   )
credentialsrV   rM   rN   rI   
_transport_cached_tokenasyncioLock_lock)r"   rY   rV   rI   rW   s        r   __init__z$MicrosoftGraphTokenProvider.__init__k   sC     '3|#45#7;\\^
r   c                >    t         j                  |      } | |fi |S r;   )r   r9   )r4   r/   kwargsrY   s       r   r9   z$MicrosoftGraphTokenProvider.from_envz   s$     '//8;)&))r   c                    d | _         y r;   )r[   rQ   s    r   clear_cachez'MicrosoftGraphTokenProvider.clear_cache   s
    !r   c                f   | j                   }d| j                  j                  | j                  j                  | j                  j                  | j                  j
                  | j                  j                  t        |      |r|j                  nd |r|j                  d      nd | j                  d
S )NTr   rH   )

configuredr   r   r   r   r%   cachedrR   rO   refresh_skew_seconds)r[   rY   r   r   r   r   r%   r=   rR   rO   rI   )r"   rf   s     r   inspect_token_healthz0MicrosoftGraphTokenProvider.inspect_token_health   s    ##))33))33%%++!--;;))336l?E&";";4?E&+++;4$($5$5
 	
r   F)force_refreshc                 K   | j                   }|s*|r(|j                  | j                        s|j                  S | j                  4 d {    | j                   }|s;|r9|j                  | j                        s|j                  cd d d       d {    S | j                          d {   }|| _         |j                  cd d d       d {    S 7 7 C7 ,7 # 1 d {  7  sw Y   y xY ww)NrH   )r[   rO   rI   rC   r^   _fetch_access_token)r"   ri   rf   tokens       r   get_access_tokenz,MicrosoftGraphTokenProvider.get_access_token   s     ##0A0A** 1B 1
 &&&:: 		& 		&''F VF4E4E!.. 5F 5 **		& 		& 		& 2244E!&D%%		& 		& 		& 		& 5		& 		& 		& 		&sx   A	C2CC28CC2CC2C,C-CC2CC2C2CC2C/#C&$C/+C2c           	     V  K   d| j                   j                  | j                   j                  | j                   j                  d}ddi}t	        j
                  t	        j                  | j                        | j                        4 d {   }|j                  | j                   j                  ||       d {   }d d d       d {    j                  dk\  r&t        |      }t        d|j                   d	|       	 |j                         }t!        |j#                  d      xs d      j%                         }t!        |j#                  d      xs d      j%                         xs d}	|j#                  d      }
|st        d      	 t'        |
      }t+        ||	t-        j,                         t/        d|      z         S 7 >7 7 # 1 d {  7  sw Y   xY w# t        $ r}t        d
      |d }~ww xY w# t(        t        f$ r}t        d      |d }~ww xY ww)Nclient_credentials)
grant_typer   r   r   zContent-Typez!application/x-www-form-urlencoded)rV   rW   )dataheadersi  z/Microsoft Graph token request failed with HTTP : z2Microsoft Graph token response was not valid JSON.rC   r)   rG   rF   
expires_inz<Microsoft Graph token response did not include access_token.zBMicrosoft Graph token response did not include a valid expires_in.r   )rC   rG   rE   )rY   r   r   r   httpxAsyncClientTimeoutrV   rZ   postr%   status_code_extract_error_detailr   json
ValueErrorr   r0   r!   rN   	TypeErrorrB   rL   rM   )r"   rq   rr   clientresponsedetailpayloadexcrC   rG   rt   rR   s               r   rk   z/MicrosoftGraphTokenProvider._fetch_access_token   s    .))33!--;;%%++	
 "#FG$$MM$,,/oo
 	 	 #[[  ** )  H		 	 3&*84F*A''(6(4 
	mmoG 7;;~6<"=CCE\2>h?EEGS8
[[.
*N 	!$Z !%!yy{S,>%??
 	
Q			 	 	 	&  	*D	  :& 	*T	s   B
H)G
H),G<G=GH)G9H)G) A:H)H .H)GH)G&GG&!H))	H2G>>HH)H&H!!H&&H))
rY   r   rV   rD   rI   rN   rW   zhttpx.AsyncBaseTransport | Noner:   Noner;   )r/   r<   ra   r   r:   z'MicrosoftGraphTokenProvider')r:   r   )r:   zdict[str, Any])ri   r=   r:   r   )r:   rB   )r
   r   r   r   rS   r_   r@   r9   rc   rh   rm   rk   r   r   r   rU   rU   h   s    C 659$%$ 	$
 $ 3$ 
$  *.*&* * 
'	* *"
 ?D &$5
r   rU   c                   	 | j                         }t	        |t
              rt	        |j                  d      t              r|d   S |j                  d      }t	        |t
              rG|j                  d      }|j                  d      }|r	|r| d| S |rt        |      S |rt        |      S t	        |t              r|S t        |      S # t        $ r# | j                  j                         }|xs dcY S w xY w)Nzunknown errorerror_descriptionerrormessagecoders   )r{   r|   textr!   
isinstancedictr0   r   )r   r   r   r   r   r   s         r   rz   rz      s    '--/
 '4 gkk"56<.//G$eT"ii	*G99V$D4r'++7|#4y eS!Lw<'  '}}""$&&'s   C )C76C7)r   zhttpx.Responser:   r   )r   
__future__r   r\   r.   rL   dataclassesr   typingr   ru   r1   r2   rS   RuntimeErrorr   r   r   r   rB   rU   rz   r   r   r   <module>r      s    6 "  	  !   = A   8l 8@ 7 @/6 / $5
 5
 5
p : : :t
 t
nr   