U
    
ڲgD                     @   s   d Z ddlmZ ddlZddlmZ ddlmZ dZG dd dZG d	d
 d
eZ	G dd deZ
G dd dZG dd deZG dd deZG dd dejZG dd dZdd Zdd Zdd Zdd Zdd  ZdS )!z.Firebase auth providers management sub module.    )parseN)_auth_utils)	_user_mgtd   c                   @   s<   e Zd ZdZdd Zedd Zedd Zedd	 Zd
S )ProviderConfigz9Parent type for all authentication provider config types.c                 C   s
   || _ d S N_data)selfdata r   B/tmp/pip-unpacked-wheel-p0r7i5ii/firebase_admin/_auth_providers.py__init__   s    zProviderConfig.__init__c                 C   s   | j d }|dd S )Nname/)r	   split)r
   r   r   r   r   provider_id"   s    
zProviderConfig.provider_idc                 C   s   | j dS )NdisplayNamer	   getr
   r   r   r   display_name'   s    zProviderConfig.display_namec                 C   s   | j ddS )NenabledFr   r   r   r   r   r   +   s    zProviderConfig.enabledN)	__name__
__module____qualname____doc__r   propertyr   r   r   r   r   r   r   r      s   

r   c                   @   sL   e Zd ZdZedd Zedd Zedd Zedd	 Zed
d Z	dS )OIDCProviderConfigz{Represents the OIDC auth provider configuration.

    See https://openid.net/specs/openid-connect-core-1_0-final.html.
    c                 C   s
   | j d S )Nissuerr   r   r   r   r   r    6   s    zOIDCProviderConfig.issuerc                 C   s
   | j d S )NclientIdr   r   r   r   r   	client_id:   s    zOIDCProviderConfig.client_idc                 C   s   | j dS )NclientSecretr   r   r   r   r   client_secret>   s    z OIDCProviderConfig.client_secretc                 C   s   | j di ddS )NresponseTypeidTokenFr   r   r   r   r   id_token_response_typeB   s    z)OIDCProviderConfig.id_token_response_typec                 C   s   | j di ddS )Nr%   codeFr   r   r   r   r   code_response_typeF   s    z%OIDCProviderConfig.code_response_typeN)
r   r   r   r   r   r    r"   r$   r'   r)   r   r   r   r   r   0   s   



r   c                   @   sL   e Zd ZdZedd Zedd Zedd Zedd	 Zed
d Z	dS )SAMLProviderConfigzRepresents he SAML auth provider configuration.

    See http://docs.oasis-open.org/security/saml/Post2.0/sstc-saml-tech-overview-2.0.html.
    c                 C   s   | j di d S )N	idpConfigidpEntityIdr   r   r   r   r   idp_entity_idQ   s    z SAMLProviderConfig.idp_entity_idc                 C   s   | j di d S )Nr+   ssoUrlr   r   r   r   r   sso_urlU   s    zSAMLProviderConfig.sso_urlc                 C   s    | j di d }dd |D S )Nr+   idpCertificatesc                 S   s   g | ]}|d  qS Zx509Certificater   ).0cr   r   r   
<listcomp>\   s     z8SAMLProviderConfig.x509_certificates.<locals>.<listcomp>r   )r
   certsr   r   r   x509_certificatesY   s    z$SAMLProviderConfig.x509_certificatesc                 C   s   | j di d S )NspConfigcallbackUrir   r   r   r   r   callback_url^   s    zSAMLProviderConfig.callback_urlc                 C   s   | j di d S )Nr7   
spEntityIdr   r   r   r   r   rp_entity_idb   s    zSAMLProviderConfig.rp_entity_idN)
r   r   r   r   r   r-   r/   r6   r9   r;   r   r   r   r   r*   K   s   



r*   c                   @   sL   e Zd ZdZdd Zedd Zedd Zedd	 Zd
d Z	dd Z
dS )ListProviderConfigsPageaj  Represents a page of AuthProviderConfig instances retrieved from a Firebase project.

    Provides methods for traversing the provider configs included in this page, as well as
    retrieving subsequent pages. The iterator returned by ``iterate_all()`` can be used to iterate
    through all provider configs in the Firebase project starting from this page.
    c                 C   s   || _ || _|||| _d S r   )	_download_max_results_current)r
   download
page_tokenmax_resultsr   r   r   r   o   s    z ListProviderConfigsPage.__init__c                 C   s   t dS )zBA list of ``AuthProviderConfig`` instances available in this page.N)NotImplementedErrorr   r   r   r   provider_configst   s    z(ListProviderConfigsPage.provider_configsc                 C   s   | j ddS )zKPage token string for the next page (empty string indicates no more pages).ZnextPageToken r?   r   r   r   r   r   next_page_tokeny   s    z'ListProviderConfigsPage.next_page_tokenc                 C   s
   t | jS )z6A boolean indicating whether more pages are available.)boolrG   r   r   r   r   has_next_page~   s    z%ListProviderConfigsPage.has_next_pagec                 C   s   | j r| | j| j| jS dS )zRetrieves the next page of provider configs, if available.

        Returns:
            ListProviderConfigsPage: Next page of provider configs, or None if this is the last
            page.
        N)rI   	__class__r=   rG   r>   r   r   r   r   get_next_page   s    z%ListProviderConfigsPage.get_next_pagec                 C   s   t | S )ae  Retrieves an iterator for provider configs.

        Returned iterator will iterate through all the provider configs in the Firebase project
        starting from this page. The iterator will never buffer more than one page of configs
        in memory at a time.

        Returns:
            iterator: An iterator of AuthProviderConfig instances.
        )_ProviderConfigIteratorr   r   r   r   iterate_all   s    
z#ListProviderConfigsPage.iterate_allN)r   r   r   r   r   r   rD   rG   rI   rK   rM   r   r   r   r   r<   g   s   


r<   c                   @   s   e Zd Zedd ZdS )_ListOIDCProviderConfigsPagec                 C   s   dd | j dg D S )Nc                 S   s   g | ]}t |qS r   )r   r2   r   r   r   r   r4      s     zA_ListOIDCProviderConfigsPage.provider_configs.<locals>.<listcomp>ZoauthIdpConfigsrF   r   r   r   r   rD      s    z-_ListOIDCProviderConfigsPage.provider_configsNr   r   r   r   rD   r   r   r   r   rN      s   rN   c                   @   s   e Zd Zedd ZdS )_ListSAMLProviderConfigsPagec                 C   s   dd | j dg D S )Nc                 S   s   g | ]}t |qS r   )r*   rO   r   r   r   r4      s     zA_ListSAMLProviderConfigsPage.provider_configs.<locals>.<listcomp>ZinboundSamlConfigsrF   r   r   r   r   rD      s    z-_ListSAMLProviderConfigsPage.provider_configsNrP   r   r   r   r   rQ      s   rQ   c                   @   s   e Zd Zedd ZdS )rL   c                 C   s   | j jS r   )Z_current_pagerD   r   r   r   r   items   s    z_ProviderConfigIterator.itemsN)r   r   r   r   rR   r   r   r   r   rL      s   rL   c                   @   s   e Zd ZdZdZd"ddZdd Zd#dd	Zd$d
dZdd Z	de
fddZde
fddZdd Zd%ddZd&ddZdd Zde
fddZde
fddZde
fddZd d! ZdS )'ProviderConfigClientz1Client for managing Auth provider configurations.z)https://identitytoolkit.googleapis.com/v2Nc                 C   s:   || _ |p| j}d||| _|r6|  jd|7  _d S )Nz{0}/projects/{1}z/tenants/{0})http_clientPROVIDER_CONFIG_URLformatbase_url)r
   rT   Z
project_idZ	tenant_idZurl_overrideZ
url_prefixr   r   r   r      s
    
zProviderConfigClient.__init__c                 C   s"   t | | dd|}t|S )Nr   /oauthIdpConfigs/{0})_validate_oidc_provider_id_make_requestrV   r   r
   r   bodyr   r   r   get_oidc_provider_config   s    z-ProviderConfigClient.get_oidc_provider_configc	                 C   s   t | t|dt|dd}	|dk	r6t|d|	d< |dk	rNt|d|	d< i }
|dkrj|dkrjtd	|dk	rt|d
|
d< |dk	rt|d|
d< |rt|d|	d< |
r|
|	d< d|}| jdd|	|d}t	|S )z=Creates a new OIDC provider config from the given parameters.r"   r    )r!   r    Nr   r   r   F,At least one response type must be returned.r'   r&   r)   r(   r$   r#   r%   zoauthIdpConfigId={0}post/oauthIdpConfigsjsonparams)
rY   _validate_non_empty_string_validate_urlr   validate_stringvalidate_boolean
ValueErrorrV   rZ   r   )r
   r   r"   r    r   r   r$   r'   r)   reqresponse_typerc   r\   r   r   r   create_oidc_provider_config   s8      
z0ProviderConfigClient.create_oidc_provider_configc	                 C   s(  t | i }	|dk	r8|tjkr(d|	d< nt|d|	d< |dk	rPt|d|	d< |rbt|d|	d< |rtt|d|	d< i }
|dkr|dkrtd	|dk	rt|d
|
d< |dk	rt|d|
d< |rt|d|	d< |
r|
|	d< |	stdt	|	}d
d|}d
|}| jd||	|d}t|S )zCUpdates an existing OIDC provider config with the given parameters.Nr   r   r   r"   r!   r    Fr^   r'   r&   r)   r(   r$   r#   r%   4At least one parameter must be specified for update.updateMask={0},rX   patchra   )rY   r   DELETE_ATTRIBUTEr   rf   rg   rd   re   rh   build_update_maskrV   joinrZ   r   )r
   r   r"   r    r   r   r$   r'   r)   ri   rj   update_maskrc   urlr\   r   r   r   update_oidc_provider_config   sH    

  

z0ProviderConfigClient.update_oidc_provider_configc                 C   s   t | | dd| d S )NdeleterX   )rY   rZ   rV   r
   r   r   r   r   delete_oidc_provider_config  s    z0ProviderConfigClient.delete_oidc_provider_configc                 C   s   t | j||S r   )rN   _fetch_oidc_provider_configsr
   rA   rB   r   r   r   list_oidc_provider_configs  s
      z/ProviderConfigClient.list_oidc_provider_configsc                 C   s   |  d||S )Nr`   _fetch_provider_configsrz   r   r   r   ry     s    z1ProviderConfigClient._fetch_oidc_provider_configsc                 C   s"   t | | dd|}t|S )Nr   /inboundSamlConfigs/{0})_validate_saml_provider_idrZ   rV   r*   r[   r   r   r   get_saml_provider_config  s    z-ProviderConfigClient.get_saml_provider_configc	                 C   s   t | t|dt|dt|dt|dt|ddd}	|dk	rTt|d	|	d
< |dk	rlt|d|	d< d|}
| jdd|	|
d}t	|S )z=Creates a new SAML provider config from the given parameters.r-   r/   )r,   r.   r0   r;   r9   )r:   r8   )r+   r7   Nr   r   r   zinboundSamlConfigId={0}r_   /inboundSamlConfigsra   )
r   rd   re   _validate_x509_certificatesr   rf   rg   rV   rZ   r*   )r
   r   r-   r/   r6   r;   r9   r   r   ri   rc   r\   r   r   r   create_saml_provider_config  s     
z0ProviderConfigClient.create_saml_provider_configc	                 C   s&  t | i }	|dk	r"t|d|	d< |dk	r8t|d|	d< |dk	rLt||	d< i }
|dk	rft|d|
d< |dk	r|t|d	|
d
< i }|dk	r|tjkrd|d< nt|d|d< |dk	rt|d|d< |	r|	|d< |
r|
|d< |st	dt
|}dd|}d|}| jd|||d}t|S )zCUpdates an existing SAML provider config with the given parameters.Nr-   r,   r/   r.   r0   r;   r:   r9   r8   r   r   r   r+   r7   rl   rm   rn   r~   ro   ra   )r   rd   re   r   r   rp   r   rf   rg   rh   rq   rV   rr   rZ   r*   )r
   r   r-   r/   r6   r;   r9   r   r   Z
idp_configZ	sp_configri   rs   rc   rt   r\   r   r   r   update_saml_provider_config4  s>    



z0ProviderConfigClient.update_saml_provider_configc                 C   s   t | | dd| d S )Nrv   r~   )r   rZ   rV   rw   r   r   r   delete_saml_provider_config]  s    z0ProviderConfigClient.delete_saml_provider_configc                 C   s   t | j||S r   )rQ   _fetch_saml_provider_configsrz   r   r   r   list_saml_provider_configsa  s
      z/ProviderConfigClient.list_saml_provider_configsc                 C   s   |  d||S )Nr   r|   rz   r   r   r   r   e  s    z1ProviderConfigClient._fetch_saml_provider_configsc                 C   sz   |dk	rt |tr|stdt |ts0td|dk s@|tkrNtdtd|}|rj|d|7 }| jd||d	S )
z'Fetches a page of auth provider configsNz&Page token must be a non-empty string.zMax results must be an integer.   zAMax results must be a positive integer less than or equal to {0}.zpageSize={0}z&pageToken={0}r   )rc   )
isinstancestrrh   intMAX_LIST_CONFIGS_RESULTSrV   rZ   )r
   pathrA   rB   rc   r   r   r   r}   h  s    

z,ProviderConfigClient._fetch_provider_configsc              
   K   sX   d | j|}z| jj||f|W S  tjjk
rR } zt|W 5 d }~X Y nX d S )Nz{0}{1})	rV   rW   rT   r\   requests
exceptionsRequestExceptionr   Zhandle_auth_backend_error)r
   methodr   kwargsrt   errorr   r   r   rZ   y  s
    z"ProviderConfigClient._make_request)NN)NNNNN)NNNNNNN)NN)NNNNNNN)r   r   r   r   rU   r   r]   rk   ru   rx   r   r{   ry   r   r   r   r   r   r   r}   rZ   r   r   r   r   rS      sL   
        
!           
*   
            
)rS   c                 C   s4   t | tstd| | ds0td| | S )NzFInvalid OIDC provider ID: {0}. Provider ID must be a non-empty string.zoidc.zInvalid OIDC provider ID: {0}.r   r   rh   rV   
startswithr   r   r   r   rY     s    

rY   c                 C   s4   t | tstd| | ds0td| | S )NzFInvalid SAML provider ID: {0}. Provider ID must be a non-empty string.zsaml.zInvalid SAML provider ID: {0}.r   r   r   r   r   r     s    

r   c                 C   s0   t | tstd|| | s,td|| S )z5Validates that the given value is a non-empty string.zInvalid type for {0}: {1}.z{0} must not be empty.)r   r   rh   rV   )valuelabelr   r   r   rd     s
    
rd   c                 C   sn   t | tr| std| |z&t| }|js@td|| | W S  tk
rh   td|| Y nX dS )z;Validates that the given value is a well-formed URL string.z9Invalid photo URL: "{0}". {1} must be a non-empty string.zMalformed {0}: "{1}".N)r   r   rh   rV   r   urlparsenetloc	Exception)rt   r   parsedr   r   r   re     s     
re   c                 C   s>   t | tr| stdtdd | D s0tddd | D S )Nz+x509_certificates must be a non-empty list.c                 S   s   g | ]}t |to|qS r   )r   r   r2   certr   r   r   r4     s     z/_validate_x509_certificates.<locals>.<listcomp>z6x509_certificates must only contain non-empty strings.c                 S   s   g | ]}d |iqS r1   r   r   r   r   r   r4     s     )r   listrh   all)r6   r   r   r   r     s
    r   )r   urllibr   r   Zfirebase_adminr   r   r   r   r   r*   r<   rN   rQ   ZPageIteratorrL   rS   rY   r   rd   re   r   r   r   r   r   <module>   s&   4 R

	