o
    ‹¨Êh~0  ã                   @   sî   d dl mZ d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	m
Z
 zd dlZW n	 ey7   Y nw 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 d d
lmZ G dd„ dejƒZG dd„ deƒZG dd„ deƒZdS )é    )Úabsolute_importN)Úinputé   )Úkeyczar)Úerrors)Úcredentials)ÚKeyringBackend)Ú
properties)ÚExceptionRaisedContextc                       s    e Zd ZdZ‡ fdd„Z‡  ZS )ÚEnvironCredentialzGRetrieve credentials from specifically named environment variables
    c                    s   t t| ƒ dd¡ d S )NÚGOOGLE_KEYRING_USERÚGOOGLE_KEYRING_PASSWORD)Úsuperr   Ú__init__©Úself©Ú	__class__© úE/var/www/html/env/lib/python3.10/site-packages/keyrings/alt/Google.pyr      s   
þzEnvironCredential.__init__)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   Ú__classcell__r   r   r   r   r      s    r   c                   @   sÄ   e Zd ZdZdZdZdZdZdddefdd	„Z	e
jed
d„ ƒƒZedd„ ƒZdd„ Zdd„ Zdd„ Zedd„ ƒZedd„ ƒZe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S )(ÚDocsKeyringzåBackend that stores keyring on Google Docs.
       Note that login and any other initialisation is deferred until it is
       actually required to allow this keyring class to be added to the
       global _all_keyring list.
    ÚGoogleKeyringr   r   éÿÿÿÿNTc                 C   s^   || _ || _|| _|| _|| _|| _d | _|stjj	 
¡ | _n|| _|| j_d| j_d| _d S )NT)Ú
credentialÚcrypterÚsourceÚ_collectionÚ
can_createÚinput_getterÚ_keyring_dictÚgdataÚdocsÚserviceÚDocsServiceÚ_clientÚsslÚ_login_reqd)r   r   r    r   Ú
collectionÚclientr"   r#   r   r   r   r   2   s   
zDocsKeyring.__init__c                 C   s$   |   ¡ stdƒ‚t ¡ stdƒ‚dS )NzRequires gdatazRequires keyczaré   )Ú
_has_gdataÚRuntimeErrorr   Úhas_keyczar)Úclsr   r   r   ÚpriorityF   s
   zDocsKeyring.priorityc                 C   s6   t ƒ �}tj W d   ƒ n1 sw   Y  t|ƒ S ©N)r
   r%   r   Úbool)r2   Úexcr   r   r   r/   O   s   ÿ
zDocsKeyring._has_gdatac                 C   s"   |   | j||¡}|r|  |¡}|S )z5Get password of the username for the service
        )Ú
_get_entryÚ_keyringÚ_decrypt)r   r'   ÚusernameÚresultr   r   r   Úget_passwordU   s   
zDocsKeyring.get_passwordc                 C   s  |   |pd¡}t | j¡}| |¡}|si }|||< |||< |  |¡}|| jkr-|| _dS || jkr„|  	¡ \| _
}|  | j||¡}|  |||¡}	|	|krQ|| _dS |	du sY|	|kr{| |i ¡}
||
|< |
||< |  |¡}|| jkrv|| _dS t d¡‚t d||f ¡‚t d¡‚)z5Set password for the username of the service
        Ú Nz$Failed write after conflict detectedzZConflict detected, service:%s and username:%s was set to a different value by someone elsezCould not save keyring)Ú_encryptÚcopyÚdeepcopyr8   ÚgetÚ_save_keyringÚOKr$   ÚCONFLICTÚ_readÚ
docs_entryr7   r   ÚPasswordSetError)r   r'   r:   ÚpasswordÚkeyring_working_copyÚservice_entriesÚsave_resultÚkeyring_dictÚexisting_pwdÚconflicting_pwdÚnew_service_entriesr   r   r   Úset_password]   sJ   





ÿþÿÿ
zDocsKeyring.set_passwordc                 C   s   |   | j||¡S r4   )Ú
_del_entryr8   )r   r'   r:   r   r   r   Údelete_password‹   s   zDocsKeyring.delete_passwordc              
   C   sà   | j  ¡ smz| j  | jj| jj| j j¡ W | j S  tjj	yR   t
j d| j j ¡ |  d¡}| jj| j _| jj| j _| j j| jj| jj| j j| j j|d� Y | j S  tjjy_   t d¡‚ tjjyl   t d¡‚w | j S )NzPlease visit zAnswer to the challenge? )Úcaptcha_tokenÚcaptcha_responsez"Users credential were unrecognizedzLogin Error)r)   ÚGetClientLoginTokenÚClientLoginr   r:   rH   r    r%   r'   ÚCaptchaRequiredÚsysÚstdoutÚwriteÚcaptcha_urlr#   ÚemailrS   ÚBadAuthenticationr   Ú	InitErrorÚError)r   Úanswerr   r   r   r-   Ž   s4   
þð
ûû

ÿzDocsKeyring.clientc                 C   s   | j p| jj d¡d S )Nú@r   )r!   r   r:   Úsplitr   r   r   r   r,   §   s   zDocsKeyring.collectionc                 C   s    | j d u r|  ¡ \| _| _ | j S r4   )r$   rE   rF   r   r   r   r   r8   «   s   
zDocsKeyring._keyringc                 C   s    d }|  |¡}|r|  |¡}|S r4   )rA   )r   rL   r'   r:   r;   rJ   r   r   r   r7   ±   s
   

zDocsKeyring._get_entryc                 C   sN   |  |¡}|st d¡‚z||= W n ty   t d¡‚w |s%||= d S d S )NzNo matching servicez	Not found)rA   r   ÚPasswordDeleteErrorÚKeyError)r   rL   r'   r:   rJ   r   r   r   rQ   ¸   s   



ÿ
ÿzDocsKeyring._del_entryc                 C   ó   |sdS | j  |¡S ©Nr=   )r   Údecrypt©r   Úvaluer   r   r   r9   Ã   ó   zDocsKeyring._decryptc                 C   re   rf   )r   Úencryptrh   r   r   r   r>   È   rj   zDocsKeyring._encryptc                 C   s
   d| j  S )Nz%s)Úkeyring_titler   r   r   r   Ú_get_doc_titleÍ   s   
zDocsKeyring._get_doc_titlec           
   
   C   sB  ddl m} || jgd�}|  ¡ |d< d|d< | j | ¡ ¡}|js9| jr-d }i }||fS t	 
d|  ¡ | jf ¡‚|jd }d}z<|jj}|d	7 }| j d
|¡}|jdkrZt	 
d¡‚| ¡ }| tj¡rm|ttjƒd … }t t | d¡¡¡}W ||fS  tjy� }	 zt	 
d|	¡‚d }	~	w ty  }	 zt	 
d|	¡‚d }	~	ww )Nr   ©ÚDocumentQuery©Ú
categoriesÚtitleÚtrueútitle-exactz+%s not found in %s and create not permittedr=   z&exportFormat=txtÚGETéÈ   z+Could not read existing Google Docs keyringzstring-escapez/Could not unpickle existing Google Docs keyringz-Could not decode existing Google Docs keyring)Úgdata.docs.servicero   r,   rm   r-   ÚQueryDocumentListFeedÚToUriÚentryr"   r   r^   ÚcontentÚsrcÚrequestÚstatusÚreadÚ
startswithÚcodecsÚBOM_UTF8ÚlenÚpickleÚloadsÚbase64Úurlsafe_b64decodeÚdecodeÚUnpicklingErrorÚ	TypeError)
r   ro   Útitle_queryr&   rF   rL   Úfile_contentsÚurlÚserver_responseÚexr   r   r   rE   Ð   sV   çÿÿ

ÿÿ	ùÿ€ÿ€ÿzDocsKeyring._readc                 C   s¦  ddl }| j}t t |¡¡}zg| jr+dt|ƒdœ}| jj	|| j 
¡ j|d�| _W |S ddlm} |dgd�}| j|d	< d
|d< | j | ¡ ¡}|jrQ|jd }	n| j | j¡}	t |¡}
|j|
dt|ƒdd�}| jj||  ¡ |	d�| _W |S  |jjyÒ } zNz3|jd  ¡  d¡dkr‘| j}n!d}|jd  |¡dkr¯|  ¡ \}}||kr«| j}n| j}n| j}W n t y¿   | j}Y nw W Y d}~|S W Y d}~|S d}~ww )z.Helper to actually write the keyring to Googler   Nz
text/plain)zContent-TypezContent-Length)Úextra_headersrn   Úfolderrp   rr   rs   rt   Útemp)Úfile_handleÚcontent_typeÚcontent_lengthÚ	file_name)Úfolder_or_uriÚreasonÚconflictr   z)Sorry, there was an error saving the fileÚbody)!r%   rC   r†   Úurlsafe_b64encoder„   ÚdumpsrF   rƒ   r-   ÚPutÚGetEditMediaLinkÚhrefrw   ro   r,   rx   ry   rz   ÚCreateFolderÚioÚBytesIOÚMediaSourceÚUploadrm   r'   ÚRequestErrorÚmessageÚlowerÚfindrD   rE   ÚFAILÚ	Exception)r   rL   r%   r;   rŒ   r�   ro   Úfolder_queryr&   Úfolder_entryr“   Úmedia_sourcer�   ÚmsgÚnew_docs_entryÚnew_keyring_dictr   r   r   rB   ÷   sp   ÿ

ý2Ô

ü
ýé€
ÿ
€
þ€ézDocsKeyring._save_keyring)r   r   r   r   rl   rC   r©   rD   r   r   r	   ÚClassPropertyÚclassmethodr3   r/   r<   rP   rR   Úpropertyr-   r,   r8   r7   rQ   r9   r>   rm   rE   rB   r   r   r   r   r   %   s<    
þ
.


'r   c                       s,   e Zd ZdZ‡ fdd„Z‡ fdd„Z‡  ZS )ÚKeyczarDocsKeyringzQGoogle Docs keyring using keyczar initialized from environment
    variables
    c                    s2   t  ¡ }tƒ }tj d¡}tt| ƒ |||¡ d S )NÚGOOGLE_KEYRING_SOURCE)	r   ÚEnvironCrypterr   ÚosÚenvironrA   r   r´   r   )r   r   r   r    r   r   r   r   :  s   
ÿzKeyczarDocsKeyring.__init__c                    s.   zt dƒ tt| ƒ ¡ W S  ty   Y dS w )z…Return if this keyring supports current environment:
        -1: not applicable
         0: suitable
         1: recommended
        zkeyczar.keyczarr   )Ú
__import__r   r´   Ú	supportedÚImportErrorr   r   r   r   rº   A  s   ÿzKeyczarDocsKeyring.supported)r   r   r   r   r   rº   r   r   r   r   r   r´   5  s    r´   )Ú
__future__r   r·   rX   r?   r�   r†   r¡   r„   Ú	six.movesr   rw   r%   r»   r=   r   Úkeyringr   r   Úkeyring.backendr   Úkeyring.utilr	   Úkeyring.errorsr
   r   r   r´   r   r   r   r   Ú<module>   s2    ÿ  