o
    +keB                      @   s   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 ddlm	Z	m
Z
mZmZmZmZ ddlmZ ddlmZmZmZmZmZ G d	d
 d
eZG dd deZG dd deZG dd deZdd ZG dd dZdS )    N)	unhexlify
a2b_base64
b2a_base64)sha256   )ManifestNoManifestErrorErroryes
bin_to_hex	dash_open)
Repository   )
KeyfileKeyKeyfileNotFoundErrorRepoKeyNotFoundErrorKeyBlobStorageidentify_keyc                   @      e Zd ZdZdS )UnencryptedRepoz9Keymanagement not available for unencrypted repositories.N__name__
__module____qualname____doc__ r   r   :usr/lib/python3.10/site-packages/borg/crypto/keymanager.pyr          r   c                   @   r   )UnknownKeyTypezKeytype {0} is unknown.Nr   r   r   r   r   r      r   r   c                   @   r   )RepoIdMismatchzHThis key backup seems to be for a different backup repository, aborting.Nr   r   r   r   r   r      r   r   c                   @   r   )NotABorgKeyFilez-This file is not a borg key backup, aborting.Nr   r   r   r   r   r       r   r    c                 C   s    t  }||  | d | S N)r   update	hexdigest)datanumhr   r   r   sha256_truncated   s   
r'   c                   @   s\   e Zd Z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d Zdd ZdS )
KeyManagerc                 C   s`   || _ d | _d | _z	| j tj}W n
 tjy   tw t	|}|j
| _| jtjkr.t d S r!   )
repositorykeyblobkeyblob_storagegetr   ZMANIFEST_IDr   ZObjectNotFoundr   r   ZSTORAGEr   Z
NO_STORAGEr   )selfr)   Zmanifest_datakeyr   r   r   __init__$   s   zKeyManager.__init__c                 C   s   | j tjkr2t| j}| }t|}d| dd  | _	W d    d S 1 s+w   Y  d S | j tj
krQ| j  }|sL| jj }t|d || _	d S d S )N r   )r+   r   KEYFILEr   r)   Zfind_keyopenjoin	readlinesr*   REPOZload_keydecodeZ	_locationZcanonical_pathr   )r-   ktargetfdkey_datalocr   r   r   load_keyblob3   s   

"

zKeyManager.load_keyblobc                 C   sV   | j tjkrt| j}||}| | d S | j tjkr)| j| j	
d d S d S )Nzutf-8)r+   r   r1   r   r)   Zget_existing_or_new_targetstore_keyfiler5   Zsave_keyr*   encode)r-   argsr7   r8   r   r   r   store_keyblobB   s   

zKeyManager.store_keyblobc                 C   s<   t j dt| jj d}|| j7 }| jds|d7 }|S )N 
)r   FILE_IDr   r)   idr*   endswith)r-   r$   r   r   r   get_keyfile_dataK   s
   
zKeyManager.get_keyfile_datac                 C   s>   t |d}||   W d    d S 1 sw   Y  d S )Nw)r   writerF   )r-   r8   r9   r   r   r   r=   R   s   "zKeyManager.store_keyfilec                 C   s   |d u rd}|  | d S )N-)r=   )r-   pathr   r   r   exportV   s   zKeyManager.exportc                 C   sn   |d u rd}t |d"}|  }tdd}|d| d }|| W d    d S 1 s0w   Y  d S )NrI   wbborgzpaperkey.htmls   </textarea>)r   rF   pkgutilget_datareplacer>   rH   )r-   rJ   r9   r:   htmlr   r   r   	export_qr\   s   "zKeyManager.export_qrc              
   C   s>  |d u rd}dd }d}t | j}|d7 }t|d d }t| jjd d }t|d}|d	|||||tt|d
 | d
 | 	dd7 }d}t|r|d7 }|d d }	t|j
ddd|	 d}
||dd|t|	 d|
 d7 }|dd  }t|sPt|d}|| W d    d S 1 sw   Y  d S )NrI   c                 S   s>   d}d}| D ]}|r|d dkr|d7 }||7 }|d7 }q|S )Nr0   r      rA   r   r   )sretichr   r   r   groupedj   s   
z+KeyManager.export_paperkey.<locals>.groupedz:To restore key use borg key import --paper /path/to/repo

zBORG PAPER KEY v1
         zid: {:d} / {} / {} - {}
/asciir   r   r   big	byteorder2d: z - rB   rG   )r   r*   lenr   r)   rD   r'   formatstrr>   to_bytesr   rH   )r-   rJ   rX   rK   binarylinesrepoidZcomplete_checksumidxZbinlinechecksumr9   r   r   r   export_paperkeyf   s2   


"$"zKeyManager.export_paperkeyc                 C   s   t j}|d t| jj d }t|jd#}|t|}||kr,|	|s)t
 t | | _W d    n1 s;w   Y  | | d S )NrA   rB   r)r   rC   r   r)   rD   r   rJ   readrc   
startswithr    r   r*   r@   )r-   r?   Zfile_id
first_liner9   Zfile_first_liner   r   r   import_keyfile   s   
	zKeyManager.import_keyfilec                 C   sh  zdd l }W n ty   td Y nw t| jjd d }z	 	 tddd}|dkr5tdr5t	 z	|
d	\}}W n tyK   td
 Y q!w z
|
d\}}}	W n tyc   td Y q!w t| dd|krutd q!zt|}
W n ty   td Y nw 	 ||krt d}d}	 t|dd}|dd}|dkrtdrt	 z	|
d	\}}W n ty   td
 Y qw zt|}W n tjy   td Y qw t|jddd| d|krtd| d q||7 }||
krn|d7 }qt|d|	krtd q dtt|dd | _| | W d S  t	y3   td Y d S w )Nr   z?Note: No line editing available due to missing readline supportrZ   Tzid: rA   r0   zAbort import? [yN]:rI   z1each line must contain exactly one '-', try againr\   z5the id line must contain exactly three '/', try againr]   r   z0line checksum did not match, try same line againz#internal error while parsing length    r   ra   rb   z8only characters 0-9 and a-f and '-' are valid, try againr^   r_   z&line checksum did not match, try line z againr[   zIThe overall checksum did not match, retry or enter a blank line to abort.rB   z
 - aborted)readlineImportErrorprintr   r)   rD   inputrP   r
   EOFErrorsplit
ValueErrorr'   lowerr>   intr   r   binasciir	   rf   r3   textwrapwrapr   r6   r*   r@   )r-   r?   rs   ri   Zidliner$   rk   Zid_linesZ	id_repoidZid_complete_checksumrh   resultrj   inlinepartr   r   r   import_paperkey   s    
zKeyManager.import_paperkeyN)r   r   r   r/   r<   r@   rF   r=   rK   rR   rl   rq   r   r   r   r   r   r(   #   s    	
$r(   )r|   rN   r}   r   r   r   Zhashlibr   helpersr   r   r	   r
   r   r   r)   r   r.   r   r   r   r   r   r   r   r   r    r'   r(   r   r   r   r   <module>   s     