
­­­­­­­­­­­­­­­­­­
<!DOCTYPE html>
<html>
3
yb                  @   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               @   s   e Zd ZdZdS )UnencryptedRepoz9Keymanagement not available for unencrypted repositories.N)__name__
__module____qualname____doc__ r   r   "/usr/lib64/python3.6/keymanager.pyr      s   r   c               @   s   e Zd ZdZdS )UnknownKeyTypezKeytype {0} is unknown.N)r   r   r   r   r   r   r   r   r      s   r   c               @   s   e Zd ZdZdS )RepoIdMismatchzHThis key backup seems to be for a different backup repository, aborting.N)r   r   r   r   r   r   r   r   r      s   r   c               @   s   e Zd ZdZdS )NotABorgKeyFilez-This file is not a borg key backup, aborting.N)r   r   r   r   r   r   r   r   r      s   r   c             C   s    t  }|j|  |j d | S )N)r   updateZ	hexdigest)dataZ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   sf   || _ d | _d | _y| j jtj}W n tjk
r>   tY nX t	|}|j
| _| jtjkrbt d S )N)
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rNt| j}|j }t|d}dj|j dd  | _	W d Q R X n:| j tj
kr| jj j }|s| jjj }t|d || _	d S )Nr r   )r%   r   KEYFILEr   r#   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   sr   | j tjkrNt| j}y|j }W n tk
r@   |j|}Y nX | j| n | j tj	krn| jj
| jjd d S )Nzutf-8)r%   r   r,   r   r#   r-   r   Zget_new_targetstore_keyfiler1   Zsave_keyr$   encode)r'   argsr3   r4   r   r   r   store_keyblobB   s    
zKeyManager.store_keyblobc             C   s8   dt jt| jjf }|| j7 }| jjds4|d7 }|S )Nz%s %s

)r   FILE_IDr   r#   idr$   endswith)r'   r   r   r   r   get_keyfile_dataN   s
    
zKeyManager.get_keyfile_datac          	   C   s(   t |d}|j| j  W d Q R X d S )Nw)r   writerA   )r'   r4   r5   r   r   r   r9   U   s    zKeyManager.store_keyfilec             C   s   |d krd}| j | d S )N-)r9   )r'   pathr   r   r   exportY   s    zKeyManager.exportc             C   sX   |d krd}t |d8}| j }tjdd}|jd|j d }|j| W d Q R X d S )NrD   wbZborgzpaperkey.htmls   </textarea>)r   rA   pkgutilget_datareplacer:   rC   )r'   rE   r5   r6   Zhtmlr   r   r   	export_qr_   s    zKeyManager.export_qrc          	   C   s  |d krd}dd }d}t | j}|d7 }t|d d }t| jjd d }t|d}|d	j|||||tt|d
 | d
 | j	dd7 }d}x^t|r|d7 }|d d }	t|j
ddd|	 d}
|dj||t|	|
7 }|dd  }qW t|d}|j| W d Q R X d S )NrD   c             S   sB   d}d}x4| D ],}|r*|d dkr*|d7 }||7 }|d7 }qW |S )Nr+   r       r   r   )sretiZchr   r   r   groupedm   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: {0:d} / {1} / {2} - {3}
/asciir   r   r   big)	byteorderz{0:2d}: {1} - {2}
rB   )r   r$   lenr   r#   r?   r!   formatstrr:   to_bytesr   rC   )r'   rE   rQ   rF   ZbinarylinesrepoidZcomplete_checksumidxZbinlinechecksumr5   r   r   r   export_paperkeyi   s,    


(
zKeyManager.export_paperkeyc          
   C   s|   t j}|d t| jj d }t|jd>}|jt|}||krZ|j	|sTt
 nt |j | _W d Q R X | j| d S )NrM   r=   r*   )r   r>   r   r#   r?   r   rE   readrY   
startswithr   r   r$   r<   )r'   r;   Zfile_idZ
first_liner5   Zfile_first_liner   r   r   import_keyfile   s    
zKeyManager.import_keyfilec          )   C   s  ydd l }W n tk
r(   td Y nX t| jjd d }y<x4xtdjdd}|dkrntdrnt	 y|j
d\}}W n tk
r   td	 wHY nX y|j
d
\}}}	W n tk
r   td wHY nX t|j jdd|krtd qHyt|}
W n tk
r    td Y nX P qHW ||kr8t d}d}xtdj|}|jdd}|dkrvtdrvt	 y|j
d\}}W n" tk
r   td	 wBY nX yt|}W n$ tjk
r   td wBY nX t|jddd| d|krtdj| qB||7 }||
kr"P |d7 }qBW t|d|	krJtd qFdjtjt|jdd | _| j| P qFW W n t	k
r   td d S X d S )Nr   z?Note: No line editing available due to missing readline supportrS   zid: rM   r+   zAbort import? [yN]:rD   z1each line must contain exactly one '-', try againrU   z5the id line must contain exactly three '/', try againrV   r   z0line checksum did not match, try same line againz#internal error while parsing length    r   z{0:2d}: z8only characters 0-9 and a-f and '-' are valid, try againrW   )rX   z/line checksum did not match, try line {0} againrT   zIThe overall checksum did not match, retry or enter a blank line to abort.r=   z
 - aborted)readlineImportErrorprintr   r#   r?   inputrJ   r
   EOFErrorsplit
ValueErrorr!   lowerr:   intr   rZ   r   binasciir	   r\   r/   textwrapZwrapr   r2   r$   r<   )r'   r;   rf   r^   Zidliner   r`   Zid_linesZ	id_repoidZid_complete_checksumr]   resultr_   Zinlinepartr   r   r   import_paperkey   s    





 

zKeyManager.import_paperkeyN)r   r   r   r)   r8   r<   rA   r9   rF   rK   ra   rd   rs   r   r   r   r   r"   #   s   
$r"   )ro   rH   rp   r   r   r   Zhashlibr   Z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    