3
ãdeE%  ã               @   sº   d dl Z yd dlmZ W n  ek
r8   d dlmZ Y nX d dlZejeƒZdZdZ	dZ
dZeee	degƒZddd	d
dgZdZG dd„ deƒZG dd„ deƒZdd„ Zdd„ Zdd„ ZdS )é    N)Úurlparsezlogin.microsoftonline.uszlogin.chinacloudapi.cnzlogin.microsoftonline.comzlogin-us.microsoftonline.comzb2clogin.comzb2clogin.cnzb2clogin.uszb2clogin.dezciamlogin.comz.ciamlogin.comc               @   s   e Zd Zdd„ Zdd„ ZdS )ÚAuthorityBuilderc             C   s   |j dƒ| _|jdƒ| _dS )z‘A helper to save caller from doing string concatenation.

        Usage is documented in :func:`application.ClientApplication.__init__`.
        ú/N)ÚrstripÚ	_instanceÚstripÚ_tenant)ÚselfÚinstanceÚtenant© r   úE/var/www/agendate/envp3/lib/python3.6/site-packages/msal/authority.pyÚ__init__#   s    zAuthorityBuilder.__init__c             C   s   dj | j| jƒS )Nzhttps://{}/{})Úformatr   r   )r	   r   r   r   Ú__str__+   s    zAuthorityBuilder.__str__N)Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   r   r   "   s   r   c               @   s,   e Zd ZdZeg ƒZddd„Zd	dd„ZdS )
Ú	AuthorityzØThis class represents an (already-validated) authority.

    Once constructed, it contains members named "*_endpoint" for this instance.
    TODO: It will also cache the previously-validated authority instances.
    TNc                sÊ  |ˆ _ t|tƒrt|ƒ}t|ƒ\}ˆ _}ˆ jjtƒ}|jƒ dkoD| ˆ _	|j
jdƒ}t‡ fdd„tD ƒƒp†t|ƒdko†|d jƒ jdƒˆ _ˆ j	pšˆ jpš| ˆ _ˆ jtk}	|dkrºd
jtƒn|}
|
oÌ|	pÊˆ j �rtdjˆ j|j
ƒˆ j |
ƒ}|jdƒdk�rtd| ƒ‚|d }nB|jdj|�r2t|j
ƒdk�r2|n|j
ˆ j	�rBdndd�d�jƒ }yt|ˆ j ƒ}W n$ tk
�r†   tdj|ƒƒ‚Y nX tjd|ƒ |d ˆ _|d ˆ _|jdƒˆ _tˆ jƒ\}}ˆ _ dS )a`  Creates an authority instance, and also validates it.

        :param validate_authority:
            The Authority validation process actually checks two parts:
            instance (a.k.a. host) and tenant. We always do a tenant discovery.
            This parameter only controls whether an instance discovery will be
            performed.
        Zadfsr   c             3   s   | ]}ˆ j jd | ƒV  qdS )Ú.N)r
   Úendswith)Ú.0Úd)r	   r   r   ú	<genexpr>Q   s    z%Authority.__init__.<locals>.<genexpr>é   é   Zb2c_NTz$https://{}/common/discovery/instancez"https://{}{}/oauth2/v2.0/authorizeÚerrorZinvalid_instancez»invalid_instance: The authority you provided, %s, is not whitelisted. If it is indeed your legit customized domain name, you can turn off this check by passing in validate_authority=FalseÚtenant_discovery_endpointz2{prefix}{version}/.well-known/openid-configurationé   Ú z/v2.0)ÚprefixÚversion)ÚpathzÅUnable to get authority configuration for {}. Authority would typically be in a format of https://login.microsoftonline.com/your_tenant Also please double check your tenant name or GUID is correct.zopenid_config = %sÚauthorization_endpointÚtoken_endpointÚdevice_authorization_endpoint)NT)!Ú_http_clientÚ
isinstancer   ÚstrÚcanonicalizer
   r   Ú_CIAM_DOMAIN_SUFFIXÚlowerZis_adfsr"   ÚsplitÚanyÚWELL_KNOWN_B2C_HOSTSÚlenÚ
startswithZ_is_b2cZ_is_known_to_developerÚWELL_KNOWN_AUTHORITY_HOSTSr   Ú
WORLD_WIDEÚ_instance_discoveryÚgetÚ
ValueErrorÚ_replaceÚgeturlÚtenant_discoveryÚloggerÚdebugr#   r$   r%   r   )r	   Zauthority_urlÚhttp_clientZvalidate_authorityZinstance_discoveryÚ	authorityr   Zis_ciamÚpartsZis_known_to_microsoftÚinstance_discovery_endpointÚpayloadr   Zopenid_configÚ_r   )r	   r   r   7   sV    
 




zAuthority.__init__c             C   sf   | j | jjkrb|p2| jjdj| j |d�d|dœd�}|jdkrR|jƒ  tj	|j
ƒS | jjj| j ƒ i S )Nz<https://{netloc}/common/userrealm/{username}?api-version=1.0)ÚnetlocÚusernamezapplication/json)ÚAcceptzclient-request-id)Úheadersi”  )r
   Ú	__class__Ú%_domains_without_user_realm_discoveryr&   r4   r   Ústatus_codeÚraise_for_statusÚjsonÚloadsÚtextÚadd)r	   rB   Zcorrelation_idÚresponseÚrespr   r   r   Úuser_realm_discoveryƒ   s    


zAuthority.user_realm_discovery)TN)NN)r   r   r   Ú__doc__ÚsetrF   r   rO   r   r   r   r   r   /   s
    
Ir   c             C   sª   t | ƒ}|jdkrš|jjdƒ}t|ƒdkr:|d r:|d nd }|jjtƒrv|rR|ndj|jj	tdƒd ƒ}||j|fS t|ƒdkrš|d rš||j|d fS t
d|  ƒ‚d S )NÚhttpsr   r   r   z{}.onmicrosoft.comr   a
  Your given address (%s) should consist of an https url with a minimum of one segment in a path: e.g. https://login.microsoftonline.com/{tenant} or https://{tenant_name}.ciamlogin.com/{tenant} or https://{tenant_name}.b2clogin.com/{tenant_name}.onmicrosoft.com/policy)r   Úschemer"   r,   r/   Úhostnamer   r*   r   Úrsplitr5   )Zauthority_or_auth_endpointr<   r=   Z
first_partr   r   r   r   r)   ”   s    
 r)   c             K   s(   |j |fd| ddœi|—Ž}tj|jƒS )NÚparamsz1.0)r#   zapi-version)r4   rI   rJ   rK   )Úurlr;   r>   ÚkwargsrN   r   r   r   r3   «   s
    
r3   c             K   st   |j | f|Ž}|jdkr$tj|jƒS d|j  ko8dk n  rTtdj| |j|jƒƒ‚|jƒ  td|j|jf ƒ‚d S )NéÈ   i�  iô  z7OIDC Discovery failed on {}. HTTP status: {}, Error: {}z)Unable to complete OIDC Discovery: %d, %s)	r4   rG   rI   rJ   rK   r5   r   rH   ÚRuntimeError)r   r;   rX   rN   r   r   r   r8   ²   s    

r8   )rI   Úurllib.parser   ÚImportErrorÚloggingÚ	getLoggerr   r9   ZAZURE_US_GOVERNMENTZAZURE_CHINAZAZURE_PUBLICr2   rQ   r1   r.   r*   Úobjectr   r   r)   r3   r8   r   r   r   r   Ú<module>   s4   
e