ÿØÿà JFIF      ÿÛ C      

!"$"$ÿÛ C  ÿÂ p " ÿÄ              ÿÄ             ÿÚ    ÕÔË®
(%	aA*‚XYD¡(J„¡E¢RE,P€XYae )(E¤²€B¤R¥	BQ¤¢ X«)X…€¤   @  

  ..............................................................................................................................................................................
.............................................................................                                                  
                                                                                                                                                                                     ÿØÿà JFIF      ÿÛ C      

!"$"$ÿÛ C  ÿÂ p " ÿÄ              ÿÄ             ÿÚ    ÕÔË®
(%	aA*‚XYD¡(J„¡E¢RE,P€XYae )(E¤²€B¤R¥	BQ¤¢ X«)X…€¤   @  

  ..............................................................................................................................................................................
.............................................................................                                                  
                                                                                                                                                                                     o
    bH                     @   sp   d Z ddlZddlmZ ddlmZ eeZg dZ	dd Z
dd	 ZdddZdddZdd ZdddZdS )z0gpg.py - Collection of gpg key related functions    N)log)subp)gpgz--with-fingerprintz--no-default-keyringz--list-keysz	--keyringc              
   C   s\   zt j ddd| gdd\}}W |S  t jy- } ztd| | d}W Y d}~|S d}~ww )z*Export gpg key, armoured key gets returnedr   z--exportz--armourTZcapture&Failed to export armoured key "%s": %sN)r   ProcessExecutionErrorLOGdebug)keyarmour_error r   //usr/lib/python3/dist-packages/cloudinit/gpg.pyexport_armour   s   r   c                 C   s   t j ddg| ddjS )z~Dearmor gpg key, dearmored key gets returned

    note: man gpg(1) makes no mention of an --armour spelling, only --armor
    r   z	--dearmorF)datadecode)r   stdout)r
   r   r   r   dearmor'   s   r   Fc                 C   sN   g }| t |s|d ||  tj|dd\}}|r%td| | |S )zList keys from a keyring with fingerprints. Default to a stable machine
    parseable format.

    @param key_file: a string containing a filepath to a key
    @param human_output: return output intended for human parsing
    z--with-colonsTr   r   )extendGPG_LISTappendr   r   warning)Zkey_fileZhuman_outputcmdr   stderrr   r   r   list/   s   


r      r   c           	   
   C   s   t d| | ddd| d| g}|du rg }d}d}t|}	 |d	7 }ztj|dd
 t d| || W dS  tjyJ } z|}W Y d}~nd}~ww zt|}t d|j| t| W n t	yu } zt
d| |||f |d}~ww q)a  Receive gpg key from the specified keyserver.

    Retries are done by default because keyservers can be unreliable.
    Additionally, there is no way to determine the difference between
    a non-existant key and a failure.  In both cases gpg (at least 2.2.4)
    exits with status 2 and stderr: "keyserver receive failed: No data"
    It is assumed that a key provided to cloud-init exists on the keyserver
    so re-trying makes better sense than failing.

    @param key: a string key fingerprint (as passed to gpg --recv-keys).
    @param keyserver: the keyserver to request keys from.
    @param retries: an iterable of sleep lengths for retries.
                    Use None to indicate no retries.z&Importing key '%s' from keyserver '%s'r   z--no-ttyz--keyserver=%sz--recv-keysNr   Tr   r   z/Imported key '%s' from keyserver '%s' on try %dz6Import failed with exit code %d, will try again in %ssz@Failed to import key '%s' from keyserver '%s' after %d tries: %s)r   r	   iterr   r   nextZ	exit_codetimesleepStopIteration
ValueError)	r
   	keyserverZretriesr   Ztrynumr   ZsleepseZnaplenr   r   r   recv_keyB   sR   
r&   c              
   C   sV   zt j dddd| gdd W dS  t jy* } ztd| | W Y d}~dS d}~ww )	z0Delete the specified key from the local gpg ringr   z--batchz--yesz--delete-keysTr   zFailed delete key "%s": %sN)r   r   r   r   )r
   r   r   r   r   
delete_keys   s   r'   keyserver.ubuntu.comc                 C   s`   t | }|s.z"zt| |d t | }W n ty!   td|   w W t|  |S t|  w |S )zget gpg keyid from keyserver)r$   zFailed to obtain gpg key %s)r   r&   r#   r   Z	exceptionr'   )Zkeyidr$   r   r   r   r   
getkeybyid}   s   
r)   )F)r   )r(   )__doc__r    Z	cloudinitr   Zloggingr   Z	getLogger__name__r   r   r   r   r   r&   r'   r)   r   r   r   r   <module>   s   
	

1
