
­­­­­­­­­­­­­­­­­­
<!DOCTYPE html>
<html>
3
;j                 @   s   d dl Z d dlZd dlZd dlZddlmZmZmZmZm	Z	m
Z
mZ ejejgZdZdZdZddd	Zd
d Zdd Zejejejdd ddddZG dd deZejdd Zdd ZdS )    N   )authconfig	constantserrors
http_utilsselinuxutilsz/usr/bin/gpgz/var/lib/kcare/gpgzrelease.content.jsonFc       	      C   s   t j}|rtj}tjr&td d d }nt}xT|D ]L}y|| | }P W q0 tjk
rz } z||d krj|W Y d d }~X q0X q0W || }t	j
|| |S )Nr   r
   )r   urlopenr   urlopen_authr   FORCE_JSON_SIG_V3SIG_VERIFY_ORDERr   NotFoundr	   save_to_file)	urldstdo_authZurlopen_localZsig_extsZsig_ext	signatureZnfZsig_dst r   +/usr/libexec/kcare/python/kcarectl/fetch.pyfetch_signature   s     
r   c               C   s$   t jjts tjdjtddd S )Nz$No {0} present. Please install gnupgzgnupg not found)status)ospathisfileGPG_BINr   
KcareErrorformatr   r   r   r   check_gpg_bin)   s    r   c             C   s   t   |jtjrptjjtd}ytj	|| | W q tj
k
rl } ztjdj| t|W Y dd}~X qX nxt|d}|j }W dQ R X tjjtd}ytj|| | W n8 tk
r } ztjdj| t|W Y dd}~X nX dS )a8  
    Check a file signature using the gpg tool.
    If signature is wrong BadSignatureException will be raised.

    :param file_path: path to file which signature will be checked
    :param signature: a file with the signature
    :return: True in case of valid signature
    :raises: BadSignatureException
    zroot-keys.jsonzBad Signature: {0}: {1}Nrbzkcare_pub.key)r   endswithr   SIG_JSONr   r   joinGPG_KEY_DIRkcsig_verifyZverifyErrorr   BadSignatureExceptionr   stropenreadZrun_gpg_verify	Exception)	file_pathr   Z	root_keysefZsigdataZkeyringr   r   r   check_gpg_signature.   s    
*r/      )countdelayc             C   s^   t j| }tj|}tj|| |r2|j| | n|rNt| |dd}t|| t	j
|| |S )NT)r   )r   r   r   selinux_safe_tmpnamer	   r   checkr   r/   r   rename)r   r   Zcheck_signaturehash_checkerresponsetmpr   r   r   r   	fetch_urlM   s    


r9   c               @   s   e Zd Zdd Zdd ZdS )HashCheckerc             C   s6   || _ tj|jdd | _tjtj|d | _d S )N/files)	content_filer	   get_patch_server_urlrstrip
url_prefixjsonloads	read_filehashes)selfbaseurlr=   r   r   r   __init__^   s    zHashChecker.__init__c             C   sv   |t | jd  }|| jkr4tjdj|| jddtjt	j
|j }| j| d }||krrtjdj|||d S )Nz3Invalid checksum: {0} not found in content file {1}zinvalid checksum)r   sha256z<Invalid checksum: {0} has invalid checksum {1}, expected {2})lenr@   rD   r   r   r   r=   hashlibrH   r	   read_file_bin	hexdigestr'   )rE   r   fnameZcfnameZhshZexpected_hshr   r   r   r4   c   s    
zHashChecker.checkN)__name__
__module____qualname__rG   r4   r   r   r   r   r:   ]   s   r:   c             C   sj   t js
d S | jsd S | jt}tjj|s^ytt	j
| jt|t j W n tjk
r\   d S X t| j|S )N)r   USE_CONTENT_FILE_V3rF   
cache_pathCONTENT_FILEr   r   existsr9   r	   r>   USE_SIGNATUREr   r   r:   )levelr   r   r   r   get_hash_checkert   s    
rW   c                s    fdd}|S )z=Enrich request with a cache key, and save it if response had.c                 sh   t j }|d k	r.d|kr i |d< ||d tj<  | |}|jjtj}|d k	rd||krdt jtj| |S )Nheaders)r	   get_cache_keyr   CACHE_KEY_HEADERrX   getatomic_writeCACHE_KEY_DUMP_PATH)argskwargs	cache_keyrespZnew_cache_key)clblr   r   wrapper   s    
z$wrap_with_cache_key.<locals>.wrapperr   )rb   rc   r   )rb   r   wrap_with_cache_key   s    rd   )F)FN)rJ   rA   r   r%    r   r   r   r   r   r   r	   SIGr"   r   r   r$   rS   r   r   r/   retry	check_excr'   r9   objectr:   cachedrW   rd   r   r   r   r   <module>   s    $
