o
    bQ                     @   s   d dl Z d dlmZ d dlmZ d dlmZ d dlmZ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mZ ddlmZ G dd deZ
dddZdddZdS )    N)HttpResponse)import_string)settings)OAuth2RequestHttpRequestAuthorizationServer)BearerToken)AuthorizationServerMetadata)generate_token)
json_dumps   )client_authenticatedtoken_revoked   )create_oauth_requestc                       sp   e Zd ZdZeZd fdd	Zdd Zdd Zd	d
 Z	dd Z
dd Zdd Zdd Zdd ZdddZ  ZS )r   aW  Django implementation of :class:`authlib.oauth2.rfc6749.AuthorizationServer`.
    Initialize it with client model and token model::

        from authlib.integrations.django_oauth2 import AuthorizationServer
        from your_project.models import OAuth2Client, OAuth2Token

        server = AuthorizationServer(OAuth2Client, OAuth2Token)
    Nc                    s   t tdi | _|| _|| _|d u r|  }|d u r:| jd}|r:t|}t	|}W d    n1 s5w   Y  |rE| 
|}|  tt| j| j| j||d d S )NZAUTHLIB_OAUTH2_PROVIDERmetadata_file)Zquery_clientZ
save_tokenr
   metadata)getattrr   configclient_modeltoken_modelcreate_bearer_token_generatorgetopenjsonloadmetadata_classvalidatesuperr   __init__get_client_by_idsave_oauth2_token)selfr   r   r
   r   r   f	__class__ v/var/www/secure340b-portal/env/lib/python3.10/site-packages/authlib/integrations/django_oauth2/authorization_server.pyr      s(   



zAuthorizationServer.__init__c                 C   s,   z	| j jj|dW S  | j jy   Y dS w )zDefault method for ``AuthorizationServer.query_client``. Developers MAY
        rewrite this function to meet their own needs.
        )	client_idN)r   objectsr   ZDoesNotExist)r"   r(   r&   r&   r'   r    5   s
   z$AuthorizationServer.get_client_by_idc                 C   s@   |j }|jr|jj}n|j}| jd|j|d|}|  |S )zDefault method for ``AuthorizationServer.save_token``. Developers MAY
        rewrite this function to meet their own needs.
        )r(   user_idNr&   )clientuserpkr*   r   r(   save)r"   tokenrequestr+   r*   itemr&   r&   r'   r!   >   s   
z%AuthorizationServer.save_oauth2_tokenc                 C   s
   t |tS N)r   r   )r"   r0   r&   r&   r'   create_oauth2_requestO   s   
z)AuthorizationServer.create_oauth2_requestc                 C   s   t |td}|j|_|S )NT)r   r   r,   )r"   r0   reqr&   r&   r'   create_json_requestR   s   z'AuthorizationServer.create_json_requestc                 C   s8   t |tr	t|}t||d}|D ]\}}|||< q|S )N)status)
isinstancedictr   r   )r"   status_codepayloadheadersrespkvr&   r&   r'   handle_responseW   s   

z#AuthorizationServer.handle_responsec                 O   sH   |dkrt j|d| ji| d S |dkr"tj|d| ji| d S d S )NZafter_authenticate_clientZsenderZafter_revoke_token)r   sendr%   r   )r"   nameargskwargsr&   r&   r'   send_signal_   s
   zAuthorizationServer.send_signalc                 C   sR   | j dd}t|d}| j dd}t|d}| j d}t|}t|||dS )	z/Default method to create BearerToken generator.access_token_generatorT*   refresh_token_generatorF0   Ztoken_expires_in)rE   rG   expires_generator)r   r   create_token_generator!create_token_expires_in_generatorr   )r"   confrE   rG   rI   r&   r&   r'   r   e   s   

z1AuthorizationServer.create_bearer_token_generatorc                 C   s&   |  |}|  t|dsd |_|S )Nprompt)Zget_authorization_grantvalidate_consent_requesthasattrrM   )r"   r0   Zgrantr&   r&   r'   get_consent_grantv   s
   

z%AuthorizationServer.get_consent_grantc                 C   s   |  |}||_| |S r2   )r3   r,   rP   )r"   r0   Zend_userr4   r&   r&   r'   rN   }   s   

z,AuthorizationServer.validate_consent_request)NNr2   )__name__
__module____qualname____doc__r	   r   r   r    r!   r3   r5   r?   rD   r   rP   rN   __classcell__r&   r&   r$   r'   r      s    	r   rF   c                    s:   t | r| S t| trt| S | du r fdd}|S d S )NTc                     s   t  S r2   )_generate_token)rB   rC   lengthr&   r'   token_generator   s   z/create_token_generator.<locals>.token_generator)callabler7   strr   )Ztoken_generator_confrX   rY   r&   rW   r'   rJ      s   
rJ   c                    s.   i    tj | r  |   fdd}|S )Nc                    s     |tjS r2   )r   r   ZDEFAULT_EXPIRES_IN)r+   Z
grant_typedatar&   r'   
expires_in   s   z5create_token_expires_in_generator.<locals>.expires_in)updater   ZGRANT_TYPES_EXPIRES_IN)Zexpires_in_confr^   r&   r\   r'   rK      s   
rK   )rF   r2   )r   Zdjango.httpr   Zdjango.utils.module_loadingr   Zdjango.confr   Zauthlib.oauth2r   r   r   Z_AuthorizationServerZauthlib.oauth2.rfc6750r   Zauthlib.oauth2.rfc8414r	   Zauthlib.common.securityr
   rV   Zauthlib.common.encodingr   Zsignalsr   r   Zdjango_helpersr   rJ   rK   r&   r&   r&   r'   <module>   s    
q