U
    -d                     @   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_nameZ
grant_typezhttps://oauth.yandex.ru/token   u   с параметрамиu   вернулu   с пояснениемu0   Не удалось авторизоватьсяu0   Что же мы получили в ответ?)r   get_yandex_client_credsr   requestspostZstatus_codeprintZurltext
ValueErrorZcontentjson)r   r	   r
   paramsresponse r    ./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jsonrpcZaccess_tokenmethodkwargsZcalliduI   Отправляем авторизацинные данные в EvaTeamz/api/)r   cookiesuv   Не получилось передать полученные авторизационные данные в EvaTeam)r   r   ZauthscopePermissionErrorsetr   loggingerrorlistr   AUTH_SESSION_COOKIE_DOMAINr   r   struuiduuid4r   r   r#   r   Z	exceptionr   )	Zrequestr   Z	org_namesZorg_nameZcrmr	   r
   r   Z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   r3   r/   r0   r1   FileNotFoundError)r	   r2   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   Zyes)r	   Z
login_hintZredirect_urir$   r   Zresponse_typestateZforce_confirmz~-._)Zsafez"https://oauth.yandex.ru/authorize?)r   r3   redirect_urlr   r+   r,   r-   r   )Zemailr	   r   Z
url_paramsr   r   r   make_url_   s    
zYandexHandler.make_urlN)__name__
__module____qualname__r   r*   r7   r   staticmethodr   r.   r3   r+   r   r8   r   r   r   r   r      s   

&
r   )Zurllib.parser   r'   r   r,   Zcmf.includer   r   r   Zmodules.oauth.modelsr   r   r   r   r   r   <module>   s   