HEX
Server: Apache
System: Linux pdx1-shared-a1-38 6.6.104-grsec-jammy+ #3 SMP Tue Sep 16 00:28:11 UTC 2025 x86_64
User: mmickelson (3396398)
PHP: 8.1.31
Disabled: NONE
Upload Files
File: //usr/lib/python3/dist-packages/duplicity/backends/__pycache__/gdocsbackend.cpython-310.pyc
o

�~�_�$�@s�ddlmZddlmZe��ddlmZddlmZddlZ	ddl
Z
ddlZddl
ZddlZddlZddlmZddlmZGdd	�d	ejj�Z	ej�d
e�ejj�d
g�dS)�)�print_function)�standard_library)�input)�strN)�__version__)�BackendExceptionc@sTeZdZdZdZdZdd�Zdd�Zdd	�Zd
d�Z	dd
�Z
ddd�Zddd�ZdS)�GDocsBackendz>Connect to remote store using Google Google Documents List APIz
folder%3Arootzapplication/binaryc	
CsZtjj�||�zddladdladdladdl	aWnt
y.}ztdt|���d}~wwtj
jjdtd�|_d|j_d|jj_|�|jd|j|���t�|jdd�d	�}d}tj}|D]D}|�|d
|�}|dur�t|�dkr{|d}nt|�dkr�tj
jj d
|d�}|jj!||d�}nd}|r�|j"j#}qctd
|��td|��||_$dS)Nrz�Google Docs backend requires Google Data APIs Python Client Library (see http://code.google.com/p/gdata-python-client/).
Exception: %s�duplicity %s)�sourceTF�@��/�folder)�type�title)�
collectionz-Error while creating destination folder '%s'.z-Error while fetching destination folder '%s'.)%�	duplicity�backend�Backend�__init__�	atom.data�atom�gdata.client�gdata�gdata.docs.client�gdata.docs.data�ImportErrorrr�docs�client�
DocsClientr�ssl�http_client�debug�
_authorize�username�hostname�get_password�string�split�pathr�ROOT_FOLDER_ID�_fetch_entries�len�data�Resource�create_resource�resource_id�textr)	�self�
parsed_url�e�folder_names�
parent_folder�parent_folder_id�folder_name�entriesr�r:�A/usr/lib/python3/dist-packages/duplicity/backends/gdocsbackend.pyr+sB���



zGDocsBackend.__init__cCs�|�|�|��}tjj|j|tjtj�	|j
�tjjjtjj
jd�}|rPtjj
jtj
j|d�d�}|j��jd}|j||d�}|sOtd|��|jjjf��n
td|��|jjjf��|��rcJ�dS)N)�
chunk_size�
desired_class)r1)rz?convert=false)�entryz0Failed to upload file '%s' to remote folder '%s'z>Failed to initialize upload of file '%s' to remote folder '%s')�_delete�openrr�ResumableUploaderr�BACKUP_DOCUMENT_TYPE�osr)�getsize�name�DEFAULT_CHUNK_SIZErr-r.r�Titler�get_resumable_create_media_link�href�
UploadFiler�get_filenamerr1�close)r2�source_path�remote_filename�file�uploaderr>�urir:r:r;�_putWs,
����zGDocsBackend._putcCsT|�|jjjtj|�}t|�dkr|d}|j�||j	�dSt
d||jjjf��)Nrrz.Failed to find file '%s' in remote folder '%s')r+rr0r1rrBr,r�DownloadResourcerErr)r2rN�
local_pathr9r>r:r:r;�_getqs��zGDocsBackend._getcCs"|�|jjjtj�}dd�|D�S)NcSsg|]}|jj�qSr:)rr1)�.0r>r:r:r;�
<listcomp>sz&GDocsBackend._list.<locals>.<listcomp>)r+rr0r1rrB)r2r9r:r:r;�_list|s�zGDocsBackend._listcCs>|�|jjjtj|�}|D]}|jj|��j	ddd�q
dS)Nz?delete=trueT)�force)
r+rr0r1rrBr�delete�
get_edit_linkrI)r2�filenamer9r>r:r:r;r?�s��zGDocsBackend._deleteNc
Cs�z|jj||dtd||d�WdStjjyB}z#td|j�d}|s.ttd��}|r&|�	|||j
|�WYd}~dSd}~wtjjyNtd��w)Nr	�writely)r
�service�
captcha_token�captcha_responsez.A captcha challenge in required. Please visit zAnswer to the challenge? akInvalid user credentials given. Be aware that accounts that use 2-step verification require creating an application specific access code for using this Duplicity backend. Follow the instruction in http://www.google.com/support/accounts/bin/static.py?page=guide.cs&guide=1056283&topic=1056286 and create your application-specific password to run duplicity backups.)
r�client_loginrr�CaptchaChallenge�print�captcha_url�evalrr#r_�BadAuthenticationr)r2�email�passwordr_r`�	challenge�answerr:r:r;r#�s*�� ���zGDocsBackend._authorizecCsd|}|dkr
|d7}n|tjkr|d7}n|d7}|r)|dtj�|�d7}|jj|d�}|r�g}|D]N}|��}|rO|dkrF|dksO|tjkr�|dkr�|tjkrw|�	�D]}	|jj
|	jddtj
jjd	�}
|
ru|
jj|kru|�|�qXq6t|�	��d
kr�|�|�q6|S|}|S)Nz'/feeds/default/private/full/%s/contentsrz/-/folder?showfolders=truez?showfolders=falsez?showfolders=truez&title=z&title-exact=true)rQ)r=r)rrB�urllib�parse�quoter�get_all_resources�get_resource_typer*�in_collections�	get_entryrIrrr-r.r0r1�appendr,)r2�	folder_idrrrQr9�resultr>�
resource_type�link�folder_entryr:r:r;r+�s>



�
��
��zGDocsBackend._fetch_entries)NN)N)
�__name__�
__module__�__qualname__�__doc__r*rBrrRrUrXr?r#r+r:r:r:r;r%s,
rzgdata+gdocs)�
__future__r�futurer�install_aliases�builtinsrr�os.pathrCr'�urllib.requestrk�urllib.parse�urllib.error�duplicity.backendrr�duplicity.errorsrrrr�register_backend�uses_netloc�extendr:r:r:r;�<module>s$"