o
    +if0,                     @   s   d dl Z zd dlmZ W n ey   d dlmZ Y nw d dlZeeZdZdZ	dZ
dZeee	degZg d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.com)z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   | d| _|d| _dS )zA 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   G/var/www/html/corbot_env/lib/python3.10/site-packages/msal/authority.py__init__#   s   zAuthorityBuilder.__init__c                 C   s   d | 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                   @   sB   e Zd ZdZeg Z			dddZdd Zdd	 Zdd
dZ	dS )	AuthorityzThis 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           
      C   s   || _ |rtd| | |}ntd| | |||}zt|| j }W n ty@   |r5dj|dnd|d }t|w td|| |d | _	|d	 | _
|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$Initializing with OIDC authority: %sz%Initializing with Entra authority: %szUnable to get OIDC authority configuration for {url} because its OIDC Discovery endpoint is unavailable at {url}/.well-known/openid-configuration )urlzUnable to get authority configuration for {}. Authority would typically be in a format of https://login.microsoftonline.com/your_tenant or https://tenant_name.ciamlogin.com or https://tenant_name.b2clogin.com/tenant.onmicrosoft.com/policy. z> Also please double check your tenant name or GUID is correct.zopenid_config("%s") = %sauthorization_endpointtoken_endpointdevice_authorization_endpointN)_http_clientloggerinfo_initialize_oidc_authority_initialize_entra_authoritytenant_discovery
ValueErrorr   debugr   r   getr   canonicalizer   )
r	   authority_urlhttp_clientvalidate_authorityinstance_discoveryoidc_authority_urltenant_discovery_endpointopenid_configerror_message_r   r   r   r   7   sB   

zAuthority.__init__c                 C   s2   t |\}| _}| dk| _d| _d| _|d S )NadfsTz!/.well-known/openid-configuration)r#   r
   loweris_adfs_is_b2c_is_known_to_developer)r	   r(   	authorityr   r   r   r   r   g   s
   z$Authority._initialize_oidc_authorityc                    sF  t |tr	t|}t|\} _} jt}| dko|  _|j	
d}t fddtD p@t|dko@|d  d _ jpJ jpJ|  _ jtv }|dv rZd	tn|}	|	r|s jstd
 j|j	 j|	}
|
ddkr}td| |
d }|S |jdj|rt|j	dkr|n|j	 jrdnddd }|S )Nr-   r   c                 3   s     | ]} j d | V  qdS ).N)r
   endswith).0dr   r   r   	<genexpr>}   s    
z8Authority._initialize_entra_authority.<locals>.<genexpr>      b2c_)NTz$https://{}/common/discovery/instancez"https://{}{}/oauth2/v2.0/authorizeerrorinvalid_instancezinvalid_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 instance_discovery=Falser)   z2{prefix}{version}/.well-known/openid-configuration    z/v2.0)prefixversion)path)
isinstancer   strr#   r
   r4   _CIAM_DOMAIN_SUFFIXr.   r/   rA   splitanyWELL_KNOWN_B2C_HOSTSlen
startswithr0   r1   WELL_KNOWN_AUTHORITY_HOSTSr   
WORLD_WIDE_instance_discoveryr   r"   r    _replacegeturl)r	   r$   r&   r'   r2   r   is_ciampartsis_known_to_microsoftinstance_discovery_endpointpayloadr)   r   r   r   r   p   sb   

	z%Authority._initialize_entra_authorityc                 C   sf   | j | jjvr1|p| jjdj| j |dd|dd}|jdkr)|  t	|j
S | 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   r"   r   status_coderaise_for_statusjsonloadstextadd)r	   rU   correlation_idresponserespr   r   r   user_realm_discovery   s   

zAuthority.user_realm_discovery)TNN)NN)
r   r   r   __doc__setrY   r   r   r   rc   r   r   r   r   r   /   s    
0	1r   c                 C   s   t | }|jdkrM|jd}t|dkr|d r|d nd }|jtr;|r)|nd|j	tdd }||j|fS t|dkrM|d rM||j|d fS t
d|  )Nhttpsr   r9   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   schemerA   rE   rH   hostnamer4   rD   r   rsplitr    )authority_or_auth_endpointr2   rP   
first_partr   r   r   r   r#      s    
 r#   c                 K   s(   |j |fd| ddi|}t|jS )Nparamsz1.0)r   zapi-version)r"   r\   r]   r^   )r   r%   rR   kwargsrb   r   r   r   rL      s   rL   c                 K   st   |j | fi |}|jdkrt|jS d|j  krdk r,n ntd| |j|j|  td|j|jf )N   i  i  z7OIDC Discovery failed on {}. HTTP status: {}, Error: {}z)Unable to complete OIDC Discovery: %d, %s)	r"   rZ   r\   r]   r^   r    r   r[   RuntimeError)r)   r%   rm   rb   r   r   r   r      s   
r   )r\   urllib.parser   ImportErrorlogging	getLoggerr   r   AZURE_US_GOVERNMENTAZURE_CHINAAZURE_PUBLICrK   re   rJ   rG   rD   objectr   r   r#   rL   r   r   r   r   r   <module>   s4    
 