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__/dpbxbackend.cpython-310.pyc
o

�~�_�O�@sddlmZddlmZddlmZe��ddlmZddlmZddl	Z	ddl
Z
ddlZddlZddl
Z
ddlZddlZddlZddlZddlmZmZddlmZdd	lmZdd
lmZddlZdZdZe�d
�Zdd�Z ddd�Z!Gdd�dej"j#�Z$ej"�%de$�dS)�)�print_function)�division)�standard_library)�input)�strN)�log�config)�progress��BackendException)�ConnectionErroriiz \([0-9]+\)\.[^\.]+$cCsZt�d|f�t��}tj|d�|�d�|��D]}t�d|���q|�	�dS)NzException [%s]:)�filerz| )
r�Error�io�StringIO�	traceback�	print_exc�seek�	readlines�rstrip�close)�e�f�s�r�@/usr/lib/python3/dist-packages/duplicity/backends/dpbxbackend.py�
log_exception?s
rTcCsdd�}|S)z6a decorator for handling authentication and exceptionscs�fdd�}�j|_|S)Nc
sxz	�|g|�R�WSty }zt|�td|f��d}~wty;}zt|�t�d|ftjj��d}~ww)Nzdpbx api error "%s"zdpbx code error "%s")�ApiErrorrr�	Exceptionrr�	ErrorCode�backend_code_error)�self�argsr�rrr�wrapperLs���z*command.<locals>.decorate.<locals>.wrapper)�__doc__)rr$rr#r�decorateKszcommand.<locals>.decorater)�login_requiredr&rrr�commandIsr(c@s�eZdZdZdd�Zdd�Zdd�Zdd	�Zd
d�Zdd
�Z	dd�Z
e�dd��Zdd�Z
dd�Ze�dd��Ze�dd��Ze�dd��Ze�dd��Ze�dd��Zd d!�Zd"S)#�DPBXBackendz-Connect to remote store using Dr*pB*x servicec
Cs�tjj�||�z*ddlmaddlmamam	a	ddl
mamam
a
mamamamaddlmaWntyF}ztdt|���d}~wwd|_d|_d|_|��dS)Nr)�Dropbox)�	AuthError�
BadInputErrorr)�UploadSessionCursor�
CommitInfo�	WriteMode�GetMetadataError�DeleteError�UploadSessionLookupError�ListFolderError)�DropboxOAuth2FlowNoRedirectzvThis backend requires the dropbox package version 6.9.0
To install use "sudo pip install dropbox==6.9.0"
Exception: %s)�	duplicity�backend�Backend�__init__�dropboxr*�dropbox.exceptionsr+r,r�
dropbox.filesr-r.r/r0r1r2r3�
dropbox.oauthr4�ImportErrorrr�api_account�
api_client�	auth_flow�login)r!�
parsed_urlrrrrr8_s 	$���zDPBXBackend.__init__cCs6z|j��}t�d|�WdSt�d�YdS)NzUser authenticated as ,%sTzUser not authenticatedF)r?�users_get_current_accountr�Debug)r!�accountrrr�user_authenticated}s

zDPBXBackend.user_authenticatedcCstj�dd�S)N�DPBX_ACCESS_TOKEN)�os�environ�get�r!rrr�load_access_token�szDPBXBackend.load_access_tokencCstd|��)Nz<dpbx: Please set DPBX_ACCESS_TOKEN="%s" environment variabler
)r!�access_tokenrrr�save_access_token�s�zDPBXBackend.save_access_tokenc	
Cst�d�dD]
}|tjvrtd|��qtjd}tjd}tj��r)tj��s1t�	dtj
j�t||�}t�
d�|��}t�td�td	|�td
�td�td�td���}zt�
d
|�|�|�}Wnty~}ztd|��d}~wwt�d�|�|j�dS)Nz#dpbx: trying to obtain access token)�DPBX_APP_KEY�DPBX_APP_SECRETz%dpbx: %s environment variable not setrOrPz5dpbx error: cannot interact, but need human attentionzdpbx,auth_flow.start()�H------------------------------------------------------------------------z
1. Go to: z22. Click "Allow" (you might have to log in first).z3. Copy the authorization code.z#Enter the authorization code here: zdpbx,auth_flow.finish(%s)z'dpbx: Unable to obtain access token: %sz dpbx: Authentication successfull)r�InforHrIr�sys�stdout�isatty�stdin�
FatalErrorr�backend_command_errorr4rD�start�printr�strip�finishrrNrM)	r!�env_var�app_key�
app_secretr@�
authorize_url�	auth_code�
authresultrrrr�obtain_access_token�s<

�

�

��
zDPBXBackend.obtain_access_tokenc
Cs�|��dur
|��t|���|_d|_zt�d�|j��|_t�d|j�Wn"tt	fyK}zt�d|�t�
d�|��td��d}~wwt�
d|jjj
�dS)Nz'dpbx,users_get_current_account([token])zdpbx,%szdpbx,exception: %sz>dpbx: Authentication failed. Trying to obtain new access tokenz3dpbx: Please update DPBX_ACCESS_TOKEN and try againz&dpbx: Successfully authenticated as %s)rLrcr*r?r>rrDrCr,r+rRr�name�display_name)r!rrrrrA�s$

��

�zDPBXBackend.logincCsvt|t�r3|j}t|t�r|��r|����rtjj	SdSt|t
�r5|��r7|j��}|��r9tjj	SdSdSdSdS�N)
�
isinstancer�errorr0�is_path�get_path�is_not_foundrr�backend_not_foundr1�is_path_lookup�get_path_lookup)r!�	operationr�err�lookuprrr�_error_code�s
�
�zDPBXBackend._error_codecCs�tj�|jj�d��}dtj�||����	�}tj�
|j�}t�
d|�|tkr0|�||�}n|�||�}|j|krDtd|j|f��|j|krRtd|j|f��dS)N�/rz-dpbx: result path mismatch: %s (expected: %s)z-dpbx: result size mismatch: %s (expected: %s))�urllib�parse�unquoterB�path�lstriprH�join�decoder�getsizerdr	�report_transfer�DPBX_UPLOAD_CHUNK_SIZE�put_file_small�put_file_chunked�path_displayr�size)r!�source_path�remote_filename�
remote_dir�remote_path�	file_size�res_metadatarrr�_put�s 
�
��zDPBXBackend._putcCs�|��s|��tj�|j�}|�d�}z,t�d||f�|j	j
|��|tj
dddd�}t�d|�t�||�|W|��S|��w)N�rbz!dpbx,files_upload(%s, [%d bytes])FT��mode�
autorename�client_modified�mutezdpbx,files_upload(): %s)rFrArHrwr{rd�openrrDr?�files_upload�readr/�	overwriter	r|r)r!r�r�r�rr�rrrr~�s 
�zDPBXBackend.put_file_smallc
Cs�|��s|��tj�|j�}|�d�}�zb|�t�}t	�
dt|�|f�|j�
|�}t	�
d|�t|j|���}t|tjdddd�}d}	t�|��|�d}
t}tj}d}
|
r]|	�sWz}|
dure|
|_|��|jkrr|�|j�|�|�}|��|k}
|
s�t|�dkr�WqXd}
t}tj}|
s�t|�dks�J�t	�
dt|�|jf�|j�||j|j�nt	�
d	t|�|jf�|j�|||�}	|��|_t	�
d
|j|f�t�|j|�Wnxt�y}z/|j}t|t��r|� ��r|�!�j"}t	�
d|j|f�|
du�r	t#d��|}
WYd}~qX�d}~wt$�yR}z0t	�
d
|�|d8}|���s2|��|dk�r8�t	�%d�t&�'d�td}d}
WYd}~qXd}~ww|
r]|	r]|��|k�rbt#d��t	�
d|	�t�|��|�|	W|�(�S|�(�w)Nr�z6dpbx,files_upload_session_start([%d bytes]), total: %dz%dpbx,files_upload_session_start(): %sFTr�rz8dpbx,files_upload_sesssion_append([%d bytes], offset=%d)z8dpbx,files_upload_sesssion_finish([%d bytes], offset=%d)zprogress: %d of %dzEdpbx,files_upload_session_append: incorrect offset: %d (expected: %s)zdpbx: unable to chunk uploadz$dpbx,files_upload_session_append: %s�z'dpbx: sleeping a bit before chunk retry��zdpbx: something wrongz'dpbx,files_upload_sesssion_finish(): %s))rFrArHrwr{rdr�r�r}rrD�lenr?�files_upload_session_startr-�
session_id�tellr.r/r�r	r|r�num_retries�offsetr�files_upload_session_append�files_upload_session_finishrrhrgr2�is_incorrect_offset�get_incorrect_offset�correct_offsetrrrR�time�sleepr)r!r�r�r�r�buf�
upload_sid�
upload_cursor�commit_infor��requested_offset�current_chunk_size�retry_number�is_eofrrh�
new_offsetrrrr�s�


��

����

�
�
�



���LzDPBXBackend.put_file_chunkedcCs|��s|��tj�|jj�d��}dtj�	||�
����}t�
d|�|j�|�\}}t�
d|||f�|j}d}t�d|�z&|�d�}|�t�D]}	|�|	�t�|��|�qOW|rf|��|��n|rq|��|��wtj�|j�}
|
|kr�td|
|f��|��dS)Nrszdpbx,files_download(%s)zdpbx,files_download(%s): %s, %sr�wbz(dpbx: wrong file size: %d (expected: %d))rFrArtrurvrBrwrxrHryrzrrrDr?�files_downloadr�r	r|r��iter_content�DPBX_DOWNLOAD_BUF_SIZE�writer�rr{rdr�setdata)r!r��
local_pathr�r�r��http_fdr��to_fd�c�
local_sizerrr�_getls<
�

�
�
�zDPBXBackend._getc
Cs|��s|��dtj�|jj�d����}t	�
d|�g}z)|j�|�}t	�
d||f�	|�
dd�|jD��|js@n|j�|j�}q1Wn/tyx}z#t|jt�rm|j��rm|j����rmt	�
d||f�n�WYd}~nd}~ww|�|�|S)Nrszdpbx.files_list_folder(%s)zdpbx.list(%s): %sTcSsg|]}|j�qSr)rd)�.0�entryrrr�
<listcomp>�sz%DPBXBackend._list.<locals>.<listcomp>z)dpbx.list(%s): ignore missing folder (%s))rFrArtrurvrBrwrxrrrDr?�files_list_folder�extend�entries�has_more�files_list_folder_continue�cursorrrgrhr3rirjrk�check_renamed_files)r!r��res�resprrrr�_list�s4�����
zDPBXBackend._listcCs^|��s|��tj�|jj�d��}dtj�	||�
����}t�
d|�|j�|�dS)Nrszdpbx.files_delete(%s))rFrArtrurvrBrwrxrHryrzrrrDr?�files_delete)r!�filenamer�r�rrr�_delete�szDPBXBackend._deletecCst�d�dS)z0close backend session? no! just "flush" the dataz
dpbx.close():N)rrDrKrrr�_close�szDPBXBackend._closecCsv|��s|��tj�|jj�d��}dtj�	||�
����}t�
d|�|j�|�}t�
d||f�d|jiS)Nrszdpbx.files_get_metadata(%s)zdpbx.files_get_metadata(%s): %sr�)rFrArtrurvrBrwrxrHryrzrrrDr?�files_get_metadatar�)r!r�r�r��inforrr�_query�s
zDPBXBackend._querycCs�|��s|��dd�|D�}t|�dkrdSt�d�t�d�t�d�t�d�t�d�t�d	�t�d�t�d
�t�d�t�d�t�d�|D]	}t�d
|�qPt�d�t�d�t�d�dS)NcSsg|]}t�|�dur|�qSrf)�DPBX_AUTORENAMED_FILE_RE�search)r��xrrrr��sz3DPBXBackend.check_renamed_files.<locals>.<listcomp>rrQzGWarning! It looks like there are automatically renamed files on backendzAThey were probably created when using older version of duplicity.�zIPlease check your backup consistency. Most likely you will need to choosezMlargest file from duplicity-* (number).gpg and remove brackets from its name.z?These files are not managed by duplicity at all and will not bezremoved/rotated automatically.zAffected files:z	%sz.In any case it's better to create full backup.)rFrAr�r�Warn)r!�	file_list�bad_listr�rrrr��s*












zDPBXBackend.check_renamed_filesN)�__name__�
__module__�__qualname__r%r8rFrLrNrcrArrr(r�r~rr�r�r�r�r�r�rrrrr)\s0	
r
"



r)�dpbx)T)&�
__future__rr�futurer�install_aliases�builtinsrrrrH�rerSr�r�urllib.requestrt�urllib.parse�urllib.errorr5rrr	�duplicity.errorsr�requests.exceptionsr�duplicity.backendr}r��compiler�rr(r6r7r)�register_backendrrrr�<module>s<