U
    pVc;                     @   sP   d dl m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                   @   s`   e Zd Zdej 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 )GmailHandlerzhttps://accountz/oauthc                 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redirect_uriZ
grant_typez*https://accounts.google.com/o/oauth2/token   u   с параметрамиu   вернулu   с пояснениемu0   Не удалось авторизоватьсяu0   Что же мы получили в ответ?)r   get_gmail_client_credsredirect_urlrequestsZpostZstatus_codeprintZurltext
ValueErrorZcontentZjson)r   r	   r
   paramsresponse r   ./modules/oauth/models/gmail.pyauthorize_tokens   s    
zGmailHandler.authorize_tokensc                 C   s   t jjstdttdd t jjdD }|sRtdt jjd td|d }d| t	j
 }t \}}|d	 }d
t	j
 d| t	j
 d| d| d| d}t|\}	}
|	rt|
d td|	 tddS )u4    TODO: Прокинуть параметры в CRM u9   Неавторизованный пользовательc                 s   s$   | ]}d |kr| dd V  qdS )z:Admins:r   N)split).0sr   r   r   	<genexpr>&   s      z7GmailHandler.send_credentials_to_crm.<locals>.<genexpr> ua   Ваша учётная запись не является администраторской: %su^   Ваша учётная запись не является администраторской.r   zhttps://refresh_tokenzssh supervisorz' /opt/fox_acrm/cloud/cloud_api_call.sh z: /opt/fox_acrm/contrib/setup_gmailbox.json refresh_token='z' client_id='z' client_secret='z' mailbox_type='google'zutf-8zexited withur   Не получилось передать полученные авторизационные данные в CRMN)r   ZauthscopePermissionErrorlistsetr   loggingerrorr   AUTH_SESSION_COOKIE_DOMAINr   r   r   r   decoder   )Zrequestr   Z	org_namesZorg_nameZcrmr	   r
   r   cmdresoutr   r   r   send_credentials_to_crm    s      ,
z$GmailHandler.send_credentials_to_crmc               
   C   s,   t d} |   W  5 Q R  S Q R X d S )Nz#/opt/account/custom/gmail_client_id)openreadlinestrip)fdr   r   r   _get_client_idH   s    
zGmailHandler._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:   для использования в gmail_authorize_tokens
        :return: [client_id, client_secret]
        z'/opt/account/custom/gmail_client_secretu   Не указаны учётные данные веб-клиента к gmail, обратитесь в тех.поддержку)r   r0   r,   r-   r.   FileNotFoundError)r	   r/   r
   r   r   r   r   M   s    
z#GmailHandler.get_gmail_client_credsc                  C   s2   t  } | t jddddd}t|dd}d| S )	u   
        :returns URL для перенаправления пользователя на экран согласия.
        zhttps://mail.google.com/r   ZconsentZoffline)r	   r   r    Zresponse_typepromptZaccess_typez~-._)Zsafez*https://accounts.google.com/o/oauth2/auth?)r   r0   r   r   )r	   r   Z
url_paramsr   r   r   make_url^   s    zGmailHandler.make_urlN)__name__
__module____qualname__r   r&   r   staticmethodr   r+   r0   strr   r4   r   r   r   r   r      s   

'
r   )Zurllib.parser   r$   r   Zcmf.includer   r   r   Zmodules.oauth.modelsr   r   r   r   r   r   <module>   s
   