
    9i,R                         d dl Z d dlZd dlZd dlZd dlZddlmZ ddlmZm	Z	 ddl
mZ  ej                  e      ZdZd Zd Z G d	 d
e      Z G d de      Zy)    N   )canonicalize)decode_partdecode_id_token)Clientbrokerc                      t        |fi | |k(  S N)dict)smallbigs     C/var/www/html/venv/lib/python3.12/site-packages/msal/token_cache.pyis_subdict_ofr      s    u$$    c                 D    | j                  d| j                  d            S )Npreferred_usernameupn)get)id_token_claimss    r   _get_usernamer      s&    E"$ $r   c            
           e Zd ZdZ G d d      Z G d d      Zd Z	 ddZdd	Zdd
Z	e
ddedededefd       ZddddZddddZddZd ZddZddZd Zd Zd Zd Zd Zy)
TokenCachea  This is considered as a base class containing minimal cache behavior.

    Although it maintains tokens using unified schema across all MSAL libraries,
    this class does not serialize/persist them.
    See subclass :class:`SerializableTokenCache` for details on serialization.
    c                        e Zd ZdZdZdZdZdZy)TokenCache.CredentialTypeAccessTokenRefreshTokenAccountIdTokenAppMetadataN)__name__
__module____qualname__ACCESS_TOKENREFRESH_TOKENACCOUNTID_TOKENAPP_METADATA r   r   CredentialTyper      s    $&$r   r)   c                       e Zd ZdZdZy)TokenCache.AuthorityTypeADFSMSSTSN)r    r!   r"   r,   r-   r(   r   r   AuthorityTyper+   &   s    r   r.   c                 \    t        j                          _        i  _         j                  j
                  	 	 d fd	 j                  j                  	 	 d fd	 j                  j                  	 	 d fd	 j                  j                  dd j                  j                  d	di _
        y )
Nc           	          dj                  | xs d|xs dj                  j                  |xs dd|xs dg      j                         S N- )joinr)   r$   lower)home_account_idenvironment	client_idtarget!ignored_payload_from_a_real_tokenselfs        r   <lambda>z%TokenCache.__init__.<locals>.<lambda>1   sR    HH'-2#)r++99!R"  !57 r   c           	          dj                  | xs d|xs dj                  j                  |xs d|xs d|xs dg      j                         S r1   )r4   r)   r#   r5   )r6   r7   r8   realmr9   r:   r;   s         r   r<   z%TokenCache.__init__.<locals>.<lambda><   sX    
 HH'-2#)r++88!R"  !57 r   c                     dj                  | xs d|xs dj                  j                  |xs d|xs ddg      j                         S r1   )r4   r)   r&   r5   )r6   r7   r8   r>   r:   r;   s        r   r<   z%TokenCache.__init__.<locals>.<lambda>K   sR    HH'-2#)r++44!R  !57 r   c                 ^    dj                  | xs d|xs d|xs dg      j                         S r1   )r4   r5   )r6   r7   r>   !ignored_payload_from_a_real_entrys       r   r<   z%TokenCache.__init__.<locals>.<lambda>V   s8    HH'-2#)r  !57 r   c                 6    dj                  | xs d|xs d      S )Nzappmetadata-{}-{}r3   )format)r7   r8   kwargss      r   r<   z%TokenCache.__init__.<locals>.<lambda>^   s     '..{/@b)/rR r   )NNNN)NNNNN)NNNNN)	threadingRLock_lock_cacher)   r$   r#   r&   r%   r'   
key_makersr;   s   `r   __init__zTokenCache.__init__*   s    __&
 --IM#	# ,,IM+/# ((IM"	# ''# ,,Sc3r   Nc                     | j                  | j                  j                   | j                  t        j                  j                     ||||dj                  |            |      S )N )r6   r7   r8   r>   r9   default)_getr)   r#   rJ   r   r4   )r;   r6   r7   r8   r>   r9   rP   s          r   _get_access_tokenzTokenCache._get_access_tokenb   se    
 yy,,CDOOJ55BBC /'#xx'   	 		r   c                     | j                  | j                  j                   | j                  t        j                  j                     ||      |      S )N)r7   r8   rO   )rQ   r)   r'   rJ   r   )r;   r7   r8   rP   s       r   _get_app_metadatazTokenCache._get_app_metadatar   sQ    yy,,CDOOJ55BBC'#    	r   c                     | j                   5  | j                  j                  |i       j                  ||      cd d d        S # 1 sw Y   y xY wr
   )rH   rI   r   )r;   credential_typekeyrP   s       r   rQ   zTokenCache._get{   sA    ZZ 	J;;???B7;;CI	J 	J 	Js   ,AAentryquery
target_setreturnc           	      $   |rI|j                         D ci c]-  \  }}||dk(  r t        |t              r|j                         n|/ c}}ni }t	        ||       xr0 |r,|t        | j                  dd      j                               k  S dS c c}}w )Nr7   r9   r3   T)items
isinstancestrr5   r   setr   split)rX   rY   rZ   kv query_with_lowercase_environments         r   _is_matchingzTokenCache._is_matching   s      	,
 1 A.:a3Eqwwy1L,

  	) =uE % #eii"5;;=>>	%#	%,
s   2Bnowc             #   (  K   t        |xs g       }t        |t              sJ d       d}|| j                  j                  k(  r[t        |t
              rKd|v rGd|v rCd|v r?d|v r;|r9| j                  |d   |d   |d   |d   |      }|r| j                  ||      r| t        |      }| j                  5  t        |t        j                         n|      }g }| j                  j                  |i       j                         D ]]  }|| j                  j                  k(  r#t        |d         |k  r|j                  |       ?||k7  sE| j                  |||      sZ| _ |D ]  }	| j!                  |	        	 ddd       y# 1 sw Y   yxY ww)	zReturns a generator of matching entries.

        It is O(1) for AT hits, and O(n) for other types.
        Note that it holds a lock during the entire search.
        zInvalid parameter typeNr6   r7   r8   r>   
expires_on)rZ   )sortedr^   listr)   r#   r   rR   re   r`   rH   inttimerI   r   valuesappend	remove_at)
r;   rV   r9   rY   rg   preferred_resultrZ   expired_access_tokensrX   ats
             r   searchzTokenCache.search   s     "%&$'A)AA't22???5$'!U*}/Eu$E)9f#55'(%*>k"E'NF <  D$5$5 %% '&[
ZZ 	#S[diikc:C%!
 "=DDF 
 #t':':'G'GGE,/036)007--))%:)NK
  , #r"#'	# 	# 	#s+   B4F6BF	FF=	FFFc                r    t        j                  dt               t        | j	                  ||||            S )z Equivalent to list(search(...)).z7Use list(search(...)) instead to explicitly get a list.)r9   rY   rg   )warningswarnDeprecationWarningrk   rt   )r;   rV   r9   rY   rg   s        r   findzTokenCache.find   s3    E	  DKKeQTKUVVr   c           
         d }t        | ||j                  di       d       ||j                  di       d            }t        j                  dt	        j
                  |dd	t        
             | j                  ||      S )z:Handle a token obtaining event, and add tokens into cache.c                 b    | j                         D ci c]  \  }}|||v rdn| c}}S c c}}w )Nz********)r]   )
dictionarysensitive_fieldsrb   rc   s       r   make_clean_copyz'TokenCache.add.<locals>.make_clean_copy   s@     ',,.Aq &6!6:A=  s   +data)passwordclient_secretrefresh_token	assertionresponse)r   access_tokenr   id_tokenusername)r   r   zevent=%s   T)indent	sort_keysrP   rf   )r   r   loggerdebugjsondumpsr_   _TokenCache__add)r;   eventrg   r~   clean_events        r   addzTokenCache.add   s    	
  62!6 9  %UYYz2%> A 	
 	Z "
 	 zz%Sz))r   c                     d|v r=t        j                  t        |d               }d|v rd|v r| dj                  di |fS |r|d   }d|i|fS i dfS )z&Return client_info and home_account_idclient_infouidutidz{uid}.{utid}subNr(   )r   loadsr   rC   )r;   r   r   r   r   s        r   __parse_accountzTokenCache.__parse_account   sr    H$**[-1H%IJK#+(="$9N$9$9$HK$HHH!%(C3<$$4xr   c                 	   d x}}d|v rt        |d         \  }}}d|v r|d   }|j                  di       }|j                  di       }|j                  d      }|j                  d      }	|j                  d      }
|j                  d      xs |
rt        |
|d	   
      ni }| j                  ||      \  }}dj	                  t        |j                  d      xs g             }| j                  5  t        |t        j                         n|      }|r1|j                  d      rt        |j                  d            |z
  nd}t        |j                  d|            }t        |j                  d|            }| j                  j                  ||||j                  d	      |||j                  dd      t        |      t        ||z         t        ||z         d}|j                  |D ci c]  }|dv s|||    c}       d|v r|d   }t        ||z         |d<   | j                  | j                  j                  ||       |r|j                  d      s||||j                  d|j                  d|j                  d                  t        |      xs( |j                  d      xs |j                  d      xs d|j                  d|dk(  r| j                  j                   n| j                  j"                        d}t$        d d!t&        j(                  d"   f}|j                  d#      |v r|d#   |d$<   | j                  | j                  j*                  ||       |
rS| j                  j,                  |
||||j                  d	      d%}| j                  | j                  j,                  ||       |	ri| j                  j.                  |	|||j                  d	      |t        |      d&}d'|v r|d'   |d(<   | j                  | j                  j.                  ||       |j                  d	      |d)}d'|v r|j                  d'      |d(<   | j                  | j                  j0                  ||       d d d        y c c}w # 1 sw Y   y xY w)*Ntoken_endpointr7   r   r   r   r   r   r   r8   )r8   rN   scoperi   iX  
expires_inext_expires_in
token_typeBearer)rV   secretr6   r7   r8   r9   r>   r   	cached_atri   extended_expires_on>   key_id
refresh_in
refresh_onskip_account_creation_account_idoidr   r   r3   authority_typeadfs)r6   r7   r>   local_account_idr   r   authorization_coder   
GRANT_TYPE
grant_typeaccount_source)rV   r   r6   r7   r>   r8   )rV   r   r6   r7   r8   r9   last_modification_timefoci	family_id)r8   r7   )r   r   r   _TokenCache__parse_accountr4   rj   rH   rl   rm   r)   r#   r_   updatemodifyr   r.   r,   r-   _GRANT_TYPE_BROKERr   DEVICE_FLOWr%   r&   r$   r'   )r;   r   rg   r7   r>   _r   r   r   r   r   r   r   r6   r9   default_expires_inr   r   rs   rb   r   account%grant_types_that_establish_an_accountidtrtapp_metadatas                             r   __addzTokenCache.__add   s    #"eu$$07G1H$I!A{EE!.K99Z,yy$||N3 _5<<
+",,'89 YGOOHk0BCUW 	 (,';';Ho'V$_&7!3!9r:;ZZ \	VS[diikc:C "l3 \23c99< # !LL/ABD
!$<< *-"/ (,':':'G'G*'6#.!&;!7$""*,,|X"F!$S"%cJ&6"7+.s^/C+D 		t !q = 81d1g:  
  8+!),!7J'*3+;'<B|$D//<<b"E599-D#E'6#."(-		%'++E?3F3Fu3MN)P !.o > !88J/! 99Z0! &+ii(38F?**//!%!3!3!9!9';& '(<j&&|4965 99\*.SS05l0CG,-D//77'J'+':':'C'C&'6#."!&;!7 D//88#sC'+':':'H'H+'6#.!&;!7$.1#h X%&.v&6B{OD//==r2F #YY{3*L !,4LL,@[)KK++88,Uy\	V \	V01\	V \	Vs&   0C<R,	Q>
6Q>
>I7R>RRc                 $    | j                   |   di |}| j                  5  |r,| j                  j                  |i       }t	        |fi |||<   n,| j                  j                  |i       j                  |d        d d d        y # 1 sw Y   y xY w)Nr(   )rJ   rH   rI   
setdefaultr   pop)r;   rV   	old_entrynew_key_value_pairsrW   entriess         r   r   zTokenCache.modifyZ  s     /dooo.;;ZZ 	K"++00"E# +) + &&;??TJ	K 	K 	Ks   ABBc                     |j                  d      | j                  j                  k(  sJ | j                  | j                  j                  |      S NrV   )r   r)   r$   r   )r;   rt_items     r   	remove_rtzTokenCache.remove_rtl  sC    {{,-1D1D1R1RRRR{{4..<<gFFr   c                     |j                  d      | j                  j                  k(  sJ | j                  | j                  j                  ||t	        t        t        j                                     d      S )NrV   )r   r   )r   r)   r$   r   r_   rl   rm   )r;   r   new_rts      r   	update_rtzTokenCache.update_rtp  sc    {{,-1D1D1R1RRRR{{4..<<g&)#diik*:&;H  	r   c                     |j                  d      | j                  j                  k(  sJ | j                  | j                  j                  |      S r   )r   r)   r#   r   )r;   at_items     r   rp   zTokenCache.remove_atw  sC    {{,-1D1D1Q1QQQQ{{4..;;WEEr   c                     |j                  d      | j                  j                  k(  sJ | j                  | j                  j                  |      S r   )r   r)   r&   r   )r;   idt_items     r   
remove_idtzTokenCache.remove_idt{  sC    ||-.$2E2E2N2NNNN{{4..77BBr   c                 Z    d|v sJ | j                  | j                  j                  |      S )Nr   )r   r)   r%   )r;   account_items     r   remove_accountzTokenCache.remove_account  s-    <///{{4..66EEr   r
   rE   )r    r!   r"   __doc__r)   r.   rL   rR   rT   rQ   staticmethodr   r`   boolre   rt   ry   r   r   r   r   r   r   rp   r   r   r(   r   r   r   r      s    % % 6v  J 	%D 	% 	%3 	%$ 	% 	%-#d -#^WD W*4pVdK$GFCFr   r   c                   >     e Zd ZdZdZ fdZd fd	Zd Zd Z xZ	S )SerializableTokenCachea  This serialization can be a starting point to implement your own persistence.

    This class does NOT actually persist the cache on disk/db/etc..
    Depending on your need,
    the following simple recipe for file-based, unencrypted persistence may be sufficient::

        import os, atexit, msal
        cache_filename = os.path.join(  # Persist cache into this file
            os.getenv(
                # Automatically wipe out the cache from Linux when user's ssh session ends.
                # See also https://github.com/AzureAD/microsoft-authentication-library-for-python/issues/690
                "XDG_RUNTIME_DIR", ""),
            "my_cache.bin")
        cache = msal.SerializableTokenCache()
        if os.path.exists(cache_filename):
            cache.deserialize(open(cache_filename, "r").read())
        atexit.register(lambda:
            open(cache_filename, "w").write(cache.serialize())
            # Hint: The following optional line persists only when state changed
            if cache.has_state_changed else None
            )
        app = msal.ClientApplication(..., token_cache=cache)
        ...

    Alternatively, you may use a more sophisticated cache persistence library,
    `MSAL Extensions <https://github.com/AzureAD/microsoft-authentication-extensions-for-python>`_,
    which provides token cache persistence with encryption, and more.

    :var bool has_state_changed:
        Indicates whether the cache state in the memory has changed since last
        :func:`~serialize` or :func:`~deserialize` call.
    Fc                 <    t        t        | 
  |fi | d| _        y NT)superr   r   has_state_changed)r;   r   rD   	__class__s      r   r   zSerializableTokenCache.add  s     $d/@@!%r   c                 >    t         t        |   |||       d| _        y r   )r   r   r   r   )r;   rV   r   r   r   s       r   r   zSerializableTokenCache.modify  s#    $d2Y(;	=!%r   c                     | j                   5  |rt        j                  |      ni | _        d| _        ddd       y# 1 sw Y   yxY w)zEDeserialize the cache from a state previously obtained by serialize()FN)rH   r   r   rI   r   )r;   states     r   deserializez"SerializableTokenCache.deserialize  s<     ZZ 	+/4$**U+"DK%*D"	+ 	+ 	+s	   &<Ac                     | j                   5  d| _        t        j                  | j                  d      cddd       S # 1 sw Y   yxY w)z0Serialize the current cache state into a string.Fr   )r   N)rH   r   r   r   rI   rK   s    r   	serializez SerializableTokenCache.serialize  s:     ZZ 	5%*D"::dkk!4	5 	5 	5s	   (?Ar
   )
r    r!   r"   r   r   r   r   r   r   __classcell__)r   s   @r   r   r     s%    @ &&
+5r   r   )r   rF   rm   loggingrv   	authorityr   oauth2cli.oidcr   r   oauth2cli.oauth2r   	getLoggerr    r   r   r   r   objectr   r   r(   r   r   <module>r      s^         # 8 $ 
		8	$ %$
jF jFZ85Z 85r   