B
    `Z)                 @   s   d Z ddlmZm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 dd	lmZ dd
lmZ ddlmZ ddlmZ eeZG dd de
ZdS )z
oauthlib.oauth2.rfc6749.endpoint.metadata
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

An implementation of the `OAuth 2.0 Authorization Server Metadata`.

.. _`OAuth 2.0 Authorization Server Metadata`: https://tools.ietf.org/html/rfc8414
    )absolute_importunicode_literalsN   )unicode_type   )BaseEndpointcatch_errors_and_unavailability)AuthorizationEndpoint)IntrospectEndpoint)TokenEndpoint)RevocationEndpoint   )grant_typesc               @   s^   e Zd ZdZi dfddZe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 )MetadataEndpointa  OAuth2.0 Authorization Server Metadata endpoint.

   This specification generalizes the metadata format defined by
   `OpenID Connect Discovery 1.0` in a way that is compatible
   with OpenID Connect Discovery while being applicable to a wider set
   of OAuth 2.0 use cases.  This is intentionally parallel to the way
   that OAuth 2.0 Dynamic Client Registration Protocol [`RFC7591`_]
   generalized the dynamic client registration mechanisms defined by
   OpenID Connect Dynamic Client Registration 1.0
   in a way that is compatible with it.

   .. _`OpenID Connect Discovery 1.0`: https://openid.net/specs/openid-connect-discovery-1_0.html
   .. _`RFC7591`: https://tools.ietf.org/html/rfc7591
   Tc             C   sT   t |tstx|D ]}t |tstqW t|  || _|| _|| _|  | _	d S )N)

isinstancedictAssertionErrorr   __init__raise_errors	endpointsinitial_claimsvalidate_metadata_serverclaims)selfr   r   r   endpoint r   Y/home/dcms/DCMS/lib/python3.7/site-packages/oauthlib/oauth2/rfc6749/endpoints/metadata.pyr   -   s    

zMetadataEndpoint.__init__GETNc             C   s   ddi}|t | jdfS )z!Create metadata response
        zContent-Typezapplication/json   )jsondumpsr   )r   uriZhttp_methodbodyheadersr   r   r   create_metadata_response8   s    z)MetadataEndpoint.create_metadata_responseFc             C   s  | j s
d S ||kr&|r$td|n|r|| dsLtd||| d|| kspd|| kspd|| krtd||| n|r|| dstd	||| nZ|rt|| tstd
||| x0|| D ]$}t|tstd||| |qW d S )Nzkey {} is a mandatory metadata.httpszkey {}: {} must be an HTTPS URL?&#z8key {}: {} must not contain query or fragment componentshttpzkey {}: {} must be an URLzkey {}: {} must be an Arrayz/array {}: {} must contains only string (not {}))r   
ValueErrorformat
startswithr   listr   )r   arraykeyis_requiredis_listis_url	is_issuerelemr   r   r   validate_metadataB   s&    $
z"MetadataEndpoint.validate_metadatac             C   sX   | j |j   |dddg | j|ddd | j|ddd | j|dddd d	S )
z
        If the token endpoint is used in the grant type, the value of this
        parameter MUST be the same as the value of the "grant_type"
        parameter passed to the token endpoint defined in the grant type
        definition.
        Z%token_endpoint_auth_methods_supportedclient_secret_postclient_secret_basicT)r1   Z0token_endpoint_auth_signing_alg_values_supportedZtoken_endpoint)r0   r2   N)_grant_typesextendkeys
setdefaultr5   )r   r   r   r   r   r   validate_metadata_token[   s
    z(MetadataEndpoint.validate_metadata_tokenc             C   s   | dttdd |j  | dddg d|d krH| jd | j|dd	d	d
 | j|dd	d d|d kr|jd }t|t	j
st|dr|j}| dt|j  | j|dd	d | j|dd	d	d d S )NZresponse_types_supportedc             S   s   | dkS )Nnoner   )xr   r   r   <lambda>k       zBMetadataEndpoint.validate_metadata_authorization.<locals>.<lambda>Zresponse_modes_supportedqueryfragmenttokenZimplicitT)r0   r1   )r1   codedefault_grantZ code_challenge_methods_supportedZauthorization_endpoint)r0   r2   )r;   r-   filterZ_response_typesr:   r8   appendr5   r   r   ZAuthorizationCodeGranthasattrrE   Z_code_challenge_methods)r   r   r   Z
code_grantr   r   r   validate_metadata_authorizationi   s    
z0MetadataEndpoint.validate_metadata_authorizationc             C   sF   | dddg | j|ddd | j|ddd | j|dddd d S )	NZ*revocation_endpoint_auth_methods_supportedr6   r7   T)r1   Z5revocation_endpoint_auth_signing_alg_values_supportedZrevocation_endpoint)r0   r2   )r;   r5   )r   r   r   r   r   r   validate_metadata_revocation   s
    
z-MetadataEndpoint.validate_metadata_revocationc             C   sF   | dddg | j|ddd | j|ddd | j|dddd d S )	NZ-introspection_endpoint_auth_methods_supportedr6   r7   T)r1   Z8introspection_endpoint_auth_signing_alg_values_supportedZintrospection_endpoint)r0   r2   )r;   r5   )r   r   r   r   r   r   validate_metadata_introspection   s
    
z0MetadataEndpoint.validate_metadata_introspectionc             C   s  t | j}| j|dddd | j|ddd | j|ddd | j|ddd | j|d	dd | j|d
dd | j|ddd g | _xf| jD ]\}t|tr| || t|t	r| 
|| t|tr| || t|tr| || qW |d| j | j|ddd |S )a	  
        Authorization servers can have metadata describing their
        configuration.  The following authorization server metadata values
        are used by this specification. More details can be found in
        `RFC8414 section 2`_ :

       issuer
          REQUIRED

       authorization_endpoint
          URL of the authorization server's authorization endpoint
          [`RFC6749#Authorization`_].  This is REQUIRED unless no grant types are supported
          that use the authorization endpoint.

       token_endpoint
          URL of the authorization server's token endpoint [`RFC6749#Token`_].  This
          is REQUIRED unless only the implicit grant type is supported.

       scopes_supported
          RECOMMENDED.

       response_types_supported
          REQUIRED.

       * Other OPTIONAL fields:
       jwks_uri
       registration_endpoint
       response_modes_supported

       grant_types_supported
          OPTIONAL.  JSON array containing a list of the OAuth 2.0 grant
          type values that this authorization server supports.  The array
          values used are the same as those used with the "grant_types"
          parameter defined by "OAuth 2.0 Dynamic Client Registration
          Protocol" [`RFC7591`_].  If omitted, the default value is
          "["authorization_code", "implicit"]".

       token_endpoint_auth_methods_supported

       token_endpoint_auth_signing_alg_values_supported

       service_documentation

       ui_locales_supported

       op_policy_uri

       op_tos_uri

       revocation_endpoint

       revocation_endpoint_auth_methods_supported

       revocation_endpoint_auth_signing_alg_values_supported

       introspection_endpoint

       introspection_endpoint_auth_methods_supported

       introspection_endpoint_auth_signing_alg_values_supported

       code_challenge_methods_supported

       Additional authorization server metadata parameters MAY also be used.
       Some are defined by other specifications, such as OpenID Connect
       Discovery 1.0 [`OpenID.Discovery`_].

        .. _`RFC8414 section 2`: https://tools.ietf.org/html/rfc8414#section-2
        .. _`RFC6749#Authorization`: https://tools.ietf.org/html/rfc6749#section-3.1
        .. _`RFC6749#Token`: https://tools.ietf.org/html/rfc6749#section-3.2
        .. _`RFC7591`: https://tools.ietf.org/html/rfc7591
        .. _`OpenID.Discovery`: https://openid.net/specs/openid-connect-discovery-1_0.html
        ZissuerT)r0   r3   Zjwks_uri)r2   Zscopes_supported)r1   Zservice_documentationZui_locales_supportedZop_policy_uriZ
op_tos_uriZgrant_types_supported)copydeepcopyr   r5   r8   r   r   r   r<   r	   rI   r   rJ   r
   rK   r;   )r   r   r   r   r   r   r      s*    J



z)MetadataEndpoint.validate_metadata_server)r   NN)FFFF)__name__
__module____qualname____doc__r   r   r$   r5   r<   rI   rJ   rK   r   r   r   r   r   r      s    
r   )rQ   
__future__r   r   rL   r   loggingcommonr   baser   r   authorizationr	   Z
introspectr
   rC   r   Z
revocationr    r   	getLoggerrN   logr   r   r   r   r   <module>	   s   
