o
    ^i                     @   s   d Z ddlZddlZddlmZmZ ddlmZ ddlm	Z	 ddl
mZmZ ddlmZ ddlmZmZ d	d
lmZmZ dZG dd de	jeZG dd deZG dd deZdefdefdefgZdS )z(Tornado handlers for api specifications.    N)Anycast)ensure_async)web)	isoformatutcfromtimestamp)
authorized)IdentityProviderUpdatableField   )
APIHandlerJupyterHandlerapic                   @   sH   e Zd ZdZeZdd Zeje	dd Z
eje	dd Zdd	 Zd
S )APISpecHandlerz A spec handler for the REST API.c                 C   s   t jj| tjtd dS )z Initialize the API spec handler.)pathN)r   StaticFileHandler
initializeosr   dirname__file__self r   _/home/ubuntu/hpml_nyu/venv/lib/python3.10/site-packages/jupyter_server/services/api/handlers.pyr      s   zAPISpecHandler.initializec                 C   s   | j dddS )Napi.yamlF)include_body)getr   r   r   r   head   s   zAPISpecHandler.headc                 C   s   | j d tj| dS )zGet the API spec.z+Serving api spec (experimental, incomplete)r   )logwarningr   r   r   r   r   r   r   r   #   s   zAPISpecHandler.getc                 C   s   dS )zGet the content type.ztext/x-yamlr   r   r   r   r   get_content_type*   s   zAPISpecHandler.get_content_typeN)__name__
__module____qualname____doc__AUTH_RESOURCEauth_resourcer   r   authenticatedr   r   r   r    r   r   r   r   r      s    r   c                   @   s*   e Zd ZdZeZdZeje	dd Z
dS )APIStatusHandlerzAn API status handler.Fc                    sz   | j dtd}t|}t| j I dH }tdd |D }t| j	 }||t
||d}| tj|dd dS )	zGet the API status.startedr   Nc                 s   s    | ]}|d  V  qdS )connectionsNr   ).0kr   r   r   	<genexpr>>   s    z'APIStatusHandler.get.<locals>.<genexpr>)r)   last_activitykernelsr*   T)	sort_keys)settingsr   r   r   r   kernel_managerlist_kernelssumapplicationr.   lenfinishjsondumps)r   r)   r/   total_connectionsr.   modelr   r   r   r   5   s   zAPIStatusHandler.getN)r!   r"   r#   r$   r%   r&   _track_activityr   r'   r   r   r   r   r   r   r(   /   s    r(   c                   @   s,   e Zd ZdZejdd Zejdd ZdS )IdentityHandlerz.Get or patch the current user's identity modelc              
      s2  |  dd}d|}|r5zt|}W n ty( } ztd||d}~ww t|ts4td|ni }i }| j}|	 D ]=\}}t|t
rWt|trWtdd |D s]td|g  }	||< |D ]}
t| j| ||
|I dH }|r||	|
 qeq@| jj|d< | j|}||d	}| t| dS )
zGet the identity model.permissions zDpermissions should be a JSON dict of {"resource": ["action",]}, got   Nc                 s   s    | ]}t |tV  qd S )N)
isinstancestr)r+   actionr   r   r   r-   b   s    z&IdentityHandler.get.<locals>.<genexpr>updatable_fields)identityr>   )get_argumentr8   loads
ValueErrorr   	HTTPErrorrA   dictcurrent_useritemsrB   listallr   
authorizeris_authorizedappendidentity_providerrD   identity_modelwriter9   )r   permissions_jsonbad_permissions_msgpermissions_to_checker>   userresourceactionsallowedrC   r   rE   r;   r   r   r   r   L   sN   



zIdentityHandler.getc              
      s   t tttf |  }|stdd| jd }t|t	s$tddz|
| |}| d||d W dS  tyM } z	tdt||d}~w tya } z	td	t||d}~ww )
zUpdate user information.r@   zInvalid or missing JSON bodyrR   i  z)Identity provider not configured properlysuccess)statusrE   Ni  )r   rJ   r
   rB   get_json_bodyr   rI   r1   rA   r	   update_userrT   rS   rH   NotImplementedError)r   	user_datarR   updated_userrX   r   r   r   patchx   s&   


zIdentityHandler.patchN)r!   r"   r#   r$   r   r'   r   rd   r   r   r   r   r=   I   s    
+r=   z/api/spec.yamlz/api/statusz/api/me)r$   r8   r   typingr   r   jupyter_core.utilsr   tornador   jupyter_server._tzr   r   jupyter_server.auth.decoratorr   jupyter_server.auth.identityr	   r
   base.handlersr   r   r%   r   r   r(   r=   default_handlersr   r   r   r   <module>   s$    G