3
ãdeR?  ã               @   sŠ   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d„ Zd	d
„ ZG dd„ deƒZG dd„ deƒZdS )é    Né   )Úcanonicalize)Údecode_partÚdecode_id_token)ÚClientZbrokerc             C   s   t |f| Ž|kS )N)Údict)ÚsmallÚbig© r
   úG/var/www/agendate/envp3/lib/python3.6/site-packages/msal/token_cache.pyÚis_subdict_of   s    r   c             C   s   | j d| j dƒƒS )NZpreferred_usernameZupn)Úget)Úid_token_claimsr
   r
   r   Ú_get_username   s    r   c               @   sŒ   e Zd ZdZG dd„ dƒZG dd„ dƒZdd„ Zdd	d
„Zddd„Zdd„ Z	ddd„Z
d dd„Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ ZdS )!Ú
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               @   s    e Zd ZdZdZdZdZdZdS )zTokenCache.CredentialTypeZAccessTokenZRefreshTokenZAccountZIdTokenZAppMetadataN)Ú__name__Ú
__module__Ú__qualname__ÚACCESS_TOKENÚREFRESH_TOKENÚACCOUNTÚID_TOKENÚAPP_METADATAr
   r
   r
   r   ÚCredentialType   s
   r   c               @   s   e Zd ZdZdZdS )zTokenCache.AuthorityTypeÚADFSÚMSSTSN)r   r   r   r   r   r
   r
   r
   r   ÚAuthorityType%   s   r   c                sl   t jƒ ˆ _i ˆ _ˆ jjd‡ fdd„	ˆ jjd‡ fdd„	ˆ jjd	‡ fdd„	ˆ jjd
dd„ˆ jj	ddd„iˆ _
d S )Nc                s.   dj | p
d|pdˆ jj|pdd|p$dgƒjƒ S )Nú-Ú )Újoinr   r   Úlower)Úhome_account_idÚenvironmentÚ	client_idÚtargetÚ!ignored_payload_from_a_real_token)Úselfr
   r   Ú<lambda>.   s    z%TokenCache.__init__.<locals>.<lambda>c                s2   dj | p
d|pdˆ jj|pd|p"d|p(dgƒjƒ S )Nr   r   )r   r   r   r    )r!   r"   r#   Úrealmr$   r%   )r&   r
   r   r'   9   s    c                s.   dj | p
d|pdˆ jj|pd|p"ddgƒjƒ S )Nr   r   )r   r   r   r    )r!   r"   r#   r(   r%   )r&   r
   r   r'   D   s    c             [   s    dj | p
d|pd|pdgƒjƒ S )Nr   r   )r   r    )r!   r"   r(   Z!ignored_payload_from_a_real_entryr
   r
   r   r'   O   s    c             [   s   dj | p
d|pdƒS )Nzappmetadata-{}-{}r   )Úformat)r"   r#   Úkwargsr
   r
   r   r'   W   s    )NNNN)NNNNN)NNNN)NNN)NN)Ú	threadingÚRLockÚ_lockÚ_cacher   r   r   r   r   r   Ú
key_makers)r&   r
   )r&   r   Ú__init__)   s    
 	 	 	zTokenCache.__init__Nc                sX   ˆpg ‰t ˆtƒstdƒ‚tˆƒ‰| j�& ‡ ‡‡fdd„| jj|i ƒjƒ D ƒS Q R X d S )NzInvalid parameter typec                s>   g | ]6}t ˆ pi |ƒrˆr2ˆt|jd dƒjƒ ƒkndr|‘qS )r$   r   T)r   Úsetr   Úsplit)Ú.0Úentry)Úqueryr$   Ú
target_setr
   r   ú
<listcomp>c   s   z#TokenCache.find.<locals>.<listcomp>)Ú
isinstanceÚlistÚAssertionErrorr1   r-   r.   r   Úvalues)r&   Úcredential_typer$   r5   r
   )r5   r$   r6   r   Úfind[   s    zTokenCache.findc          
   C   sZ   dd„ }t |||jdi ƒdƒ||jdi ƒdƒd�}tjdtj|ddtd�ƒ | j||d�S )z:Handle a token obtaining event, and add tokens into cache.c                s   ‡ fdd„| j ƒ D ƒS )Nc                s"   i | ]\}}|ˆ krd n||“qS )z********r
   )r3   ÚkÚv)Úsensitive_fieldsr
   r   ú
<dictcomp>m   s   z;TokenCache.add.<locals>.make_clean_copy.<locals>.<dictcomp>)Úitems)Ú
dictionaryr@   r
   )r@   r   Úmake_clean_copyl   s    
z'TokenCache.add.<locals>.make_clean_copyÚdataÚpasswordÚclient_secretÚrefresh_tokenÚ	assertionÚresponser   Úaccess_tokenÚid_tokenÚusername)rE   rJ   zevent=%sé   T)ÚindentÚ	sort_keysÚdefault)Únow)rF   rG   rH   rI   )r   rK   rH   rL   rM   )r   r   ÚloggerÚdebugÚjsonÚdumpsÚstrÚ_TokenCache__add)r&   ÚeventrR   rD   Zclean_eventr
   r
   r   Úaddj   s     


zTokenCache.addc             C   sZ   d|kr:t jt|d ƒƒ}d|kr:d|kr:|djf |ŽfS |rR|d }d|i|fS i dfS )z&Return client_info and home_account_idÚclient_infoÚuidZutidz{uid}.{utid}ÚsubN)rU   Úloadsr   r)   )r&   rJ   r   r[   r]   r
   r
   r   Z__parse_account„   s    zTokenCache.__parse_accountc             C   s.  d  }}d|kr"t |d ƒ\}}}d|kr2|d }|jdi ƒ}|jdi ƒ}|jdƒ}|jdƒ}	|jdƒ}
|jdƒpˆ|
r†t|
|d	 d
�ni }| j||ƒ\}}dj|jdƒpªg ƒ}| j��n t|d krÊtjƒ n|ƒ}|�r¦|jdƒròt|jdƒƒ| nd}t|jd|ƒƒ}t|jd|ƒƒ}| jj	||||jd	ƒ|||jddƒt
|ƒt
|| ƒt
|| ƒdœ}|jdƒ�rr|jdƒ|d< d|k�r”|d }t
|| ƒ|d< | j| jj	||ƒ |�rb|jdƒ �rb||||jd|jd|jdƒƒƒt|ƒ�pü|jdƒ�pü|jdƒ�püd|jd|dk�r| jjn| jjƒdœ}td d!tjd" f}|jd#ƒ|k�rP|d# |d$< | j| jj||ƒ |
�r–| jj|
||||jd	ƒd%œ}| j| jj||ƒ |	�ræ| jj|	|||jd	ƒ|t
|ƒd&œ}d'|k�rÔ|d' |d(< | j| jj||ƒ |jd	ƒ|d)œ}d'|k�r|jd'ƒ|d(< | j| jj||ƒ W d Q R X d S )*NZtoken_endpointr"   rJ   rE   rK   rH   rL   r   r#   )r#   ú ZscopeÚ
expires_oniX  Ú
expires_inÚext_expires_inÚ
token_typeZBearer)r<   Úsecretr!   r"   r#   r$   r(   rc   Z	cached_atr`   Zextended_expires_onZkey_idÚ
refresh_inZ
refresh_onZskip_account_creationZ_account_idÚoidr]   rM   r   Úauthority_typeZadfs)r!   r"   r(   Zlocal_account_idrM   rg   Zauthorization_coderF   Z
GRANT_TYPEZ
grant_typeZaccount_source)r<   rd   r!   r"   r(   r#   )r<   rd   r!   r"   r#   r$   Úlast_modification_timeZfociZ	family_id)r#   r"   )r   r   r   Ú_TokenCache__parse_accountr   r-   ÚintÚtimer   r   rW   Úmodifyr   r   r   r   Ú_GRANT_TYPE_BROKERr   ZDEVICE_FLOWr   r   r   r   )r&   rY   rR   r"   r(   Ú_rJ   rE   rK   rH   rL   r   r[   r!   r$   Zdefault_expires_inra   rb   Zatre   ÚaccountZ%grant_types_that_establish_an_accountZidtÚrtZapp_metadatar
   r
   r   Z__add‘   s¦    




 





zTokenCache.__addc          
   C   s`   | j | f |Ž}| j�@ |r<| jj|i ƒ}t|f|Ž||< n| jj|i ƒj|d ƒ W d Q R X d S )N)r/   r-   r.   Ú
setdefaultr   Úpop)r&   r<   Ú	old_entryÚnew_key_value_pairsÚkeyÚentriesr
   r
   r   rl      s    zTokenCache.modifyc             C   s&   |j dƒ| jjkst‚| j| jj|ƒS )Nr<   )r   r   r   r:   rl   )r&   Úrt_itemr
   r
   r   Ú	remove_rt  s    zTokenCache.remove_rtc             C   s:   |j dƒ| jjkst‚| j| jj||tttjƒ ƒƒdœƒS )Nr<   )rd   rh   )r   r   r   r:   rl   rW   rj   rk   )r&   rw   Znew_rtr
   r
   r   Ú	update_rt  s    zTokenCache.update_rtc             C   s&   |j dƒ| jjkst‚| j| jj|ƒS )Nr<   )r   r   r   r:   rl   )r&   Zat_itemr
   r
   r   Ú	remove_at  s    zTokenCache.remove_atc             C   s&   |j dƒ| jjkst‚| j| jj|ƒS )Nr<   )r   r   r   r:   rl   )r&   Zidt_itemr
   r
   r   Ú
remove_idt!  s    zTokenCache.remove_idtc             C   s   d|kst ‚| j| jj|ƒS )Nrg   )r:   rl   r   r   )r&   Zaccount_itemr
   r
   r   Úremove_account%  s    zTokenCache.remove_account)NN)N)N)N)r   r   r   Ú__doc__r   r   r0   r=   rZ   ri   rX   rl   rx   ry   rz   r{   r|   r
   r
   r
   r   r      s   2


o
r   c                   sB   e Zd ZdZdZ‡ fdd„Zd‡ fdd„	Zdd	„ Zd
d„ Z‡  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 persistence may be sufficient::

        import os, atexit, msal
        cache = msal.SerializableTokenCache()
        if os.path.exists("my_cache.bin"):
            cache.deserialize(open("my_cache.bin", "r").read())
        atexit.register(lambda:
            open("my_cache.bin", "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)
        ...

    :var bool has_state_changed:
        Indicates whether the cache state in the memory has changed since last
        :func:`~serialize` or :func:`~deserialize` call.
    Fc                s   t t| ƒj|f|Ž d| _d S )NT)Úsuperr~   rZ   Úhas_state_changed)r&   rY   r*   )Ú	__class__r
   r   rZ   C  s    zSerializableTokenCache.addNc                s   t t| ƒj|||ƒ d| _d S )NT)r   r~   rl   r€   )r&   r<   rs   rt   )r�   r
   r   rl   G  s    

zSerializableTokenCache.modifyc          	   C   s0   | j �  |rtj|ƒni | _d| _W dQ R X dS )zEDeserialize the cache from a state previously obtained by serialize()FN)r-   rU   r^   r.   r€   )r&   Ústater
   r
   r   ÚdeserializeL  s    z"SerializableTokenCache.deserializec             C   s(   | j � d| _tj| jdd�S Q R X dS )z0Serialize the current cache state into a string.FrN   )rO   N)r-   r€   rU   rV   r.   )r&   r
   r
   r   Ú	serializeS  s    z SerializableTokenCache.serialize)N)
r   r   r   r}   r€   rZ   rl   rƒ   r„   Ú__classcell__r
   r
   )r�   r   r~   *  s   r~   )rU   r+   rk   ÚloggingÚ	authorityr   Zoauth2cli.oidcr   r   Zoauth2cli.oauth2r   Ú	getLoggerr   rS   rm   r   r   Úobjectr   r~   r
   r
   r
   r   Ú<module>   s   
  