U
    pVc                     @   sX   d dl mZ d dlZd dlZd dlZd dlmZmZmZ d dl	m
Z
 G dd de
ZdS )    )	urlencodeN)configgrun_bash_command)BaseOauthHandlerc                   @   sd   e Zd Zdej d ZdZedd Zedd Z	edd	 Z
eeegd
ddZedd ZdS )YandexHandlerzhttps://accountz/oauthzEvaTeam Yandex Mail Clientc                 C   sl   t  \}}||| t jdd}td|}|jdkrVt|jd|d|jd|j t	dtd	||j
 | S )
u    После того как получили подтверждение из яндекса - превращаем его в токены authorization_code)	client_idclient_secretcodedevice_name
grant_typezhttps://oauth.yandex.ru/token   u   с параметрамиu   вернулu   с пояснениемu0   Не удалось авторизоватьсяu0   Что же мы получили в ответ?)r   get_yandex_client_credsr   requestspoststatus_codeprinturltext
ValueErrorcontentjson)r   r	   r
   paramsresponse r   +/opt/account/modules/oauth/models/yandex.pyauthorize_tokens   s    
zYandexHandler.authorize_tokensc           	      C   s   t d tjjstdtdd tjjdD }|sVtdtjjd tdt	|d }d	| t
j }t \}}d
dd|d ||ddtt d}z6t d tj|d || jd}t | t |  W n   td tdY nX dS )u4    TODO: Прокинуть параметры в CRM uX   Пытаемся отправить авторизацинные данные в EvaTeamu9   Неавторизованный пользовательc                 s   s$   | ]}d |kr| dd V  qdS )z:Admins:r   N)split).0sr   r   r   	<genexpr>)   s      z8YandexHandler.send_credentials_to_crm.<locals>.<genexpr> ua   Ваша учётная запись не является администраторской: %su^   Ваша учётная запись не является администраторской.r   zhttps://z2.0-foxNz$CmfMailbox.receive_oauth_credentialsrefresh_tokenZyandex)r$   r	   r
   Zmailbox_type)Zjsonrpcaccess_tokenmethodkwargsZcalliduI   Отправляем авторизацинные данные в EvaTeamz/api/)r   cookiesuv   Не получилось передать полученные авторизационные данные в EvaTeam)r   r   authscopePermissionErrorsetr   loggingerrorlistr   AUTH_SESSION_COOKIE_DOMAINr   r   struuiduuid4r   r   r(   r   	exceptionr   )	requestr   	org_namesorg_namecrmr	   r
   r   respr   r   r   send_credentials_to_crm"   s8    

z%YandexHandler.send_credentials_to_crmc               
   C   s,   t d} |   W  5 Q R  S Q R X d S )Nz$/opt/account/custom/yandex_client_id)openreadlinestrip)fdr   r   r   _get_client_idI   s    
zYandexHandler._get_client_id)returnc               	   C   sR   z,t  } td}|  }W 5 Q R X W n tk
rH   tdY nX | |fS )u  
        TODO: Когда-нибудь исправить на пул клиентских ID и хранение в БД
        TODO: Их, вероятно будет несколько, нужно будет сделать хранение маппинга g.auth.scope = [id, secret]
        TODO:   для использования в yandex_authorize_tokens
        :return: [client_id, client_secret]
        z(/opt/account/custom/yandex_client_secretu   Не указаны учётные данные веб-клиента к yandex, обратитесь в тех.поддержку)r   r?   r;   r<   r=   FileNotFoundError)r	   r>   r
   r   r   r   r   N   s    
z%YandexHandler.get_yandex_client_credsc              	   C   s@   t  }|| t jdt jdtt dd}t|dd}d| S )u   
        https://yandex.ru/dev/oauth/doc/dg/reference/auto-code-client.html#auto-code-client
        :returns URL для перенаправления пользователя на экран согласия.
        zmail:imap_ror   yes)r	   Z
login_hintredirect_urir*   r   response_typestateZforce_confirmz~-._)safez"https://oauth.yandex.ru/authorize?)r   r?   redirect_urlr   r1   r2   r3   r   )emailr	   r   
url_paramsr   r   r   make_url_   s    
zYandexHandler.make_urlN)__name__
__module____qualname__r   r0   rG   r   staticmethodr   r:   r?   r1   r   rJ   r   r   r   r   r      s   

&
r   )urllib.parser   r-   r   r2   cmf.includer   r   r   Zmodules.oauth.modelsr   r   r   r   r   r   <module>   s   