3
	`%*                 @   sV  d Z ddlmZ ddlZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddl
mZ ejjdkrleZyddlmZ e W n ek
r   Y nX G dd deZG d	d
 d
eZG dd de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"e#d!krRd"d#  d$d#  e
j$  xe" D ]Z%e&e% q@W dS )%z4Handle GnuPG keys used to trust signed repositories.    )print_functionN)gettext   )Listc               @   s   e Zd ZdS )AptKeyErrorN)__name__
__module____qualname__ r
   r
   */usr/lib/python3/dist-packages/apt/auth.pyr   2   s   r   c               @   s   e Zd ZdZdS )AptKeyIDTooShortErrorz!Internal class do not rely on it.N)r   r   r	   __doc__r
   r
   r
   r   r   6   s   r   c               @   s    e Zd ZdZdd Zdd ZdS )
TrustedKeyzRepresents a trusted key.c             C   s    || _ t|| _|| _|| _d S )N)Zraw_name_namekeyiddate)selfr   r   r   r
   r
   r   __init__>   s    
zTrustedKey.__init__c             C   s   d| j | j| jf S )Nz%s
%s %s)r   r   r   )r   r
   r
   r   __str__F   s    zTrustedKey.__str__N)r   r   r	   r   r   r   r
   r
   r
   r   r   :   s   r   c        
      O   s0  d}t jjddg}|j|  tjj }d|d< d|d< zt jjdd	krtj	d
dd}|j
t jj jd |j  |j|d< tj||dtjtjtjd}|jdd}t|t}tjjdk r|r|jd}|j|\}}	|jrtd|jdj|||	f n|	rtjj
|	 |j S |dk	r*|j  X dS )z0Run the apt-key script with the given arguments.NzDir::Bin::Apt-Keyz/usr/bin/apt-keyCZLANG1Z$APT_KEY_DONT_WARN_ON_DANGEROUS_USAGEZDir/zapt-keyz.conf)prefixsuffixzUTF-8Z
APT_CONFIGT)envuniversal_newlinesstdinstdoutstderrr      zutf-8zGThe apt-key script failed with return code %s:
%s
stdout: %s
stderr: %s )apt_pkgconfigZ	find_fileextendosenvironcopyZfind_dirtempfileZNamedTemporaryFilewritedumpencodeflushr   
subprocessPopenPIPEget
isinstanceunicodesysversion_infomajorcommunicate
returncoder   joinr   stripclose)
argskwargsconfcmdr   proccontentZ	isunicodeoutputr   r
   r
   r   _call_apt_key_scriptJ   s>    








rB   c             C   s@   t jj| std|  t j| t js2td|  td|  dS )zImport a GnuPG key file to trust repositores signed by it.

    Keyword arguments:
    filename -- the absolute path to the public GnuPG key file
    z An absolute path is required: %szKey file cannot be accessed: %saddN)r%   pathabspathr   accessR_OKrB   )filenamer
   r
   r   add_key_from_file{   s
    rI   c             C   sR   t j }z,yt| || W n tk
r0    Y nX W ddd }tj||d X dS )zImport a GnuPG key file to trust repositores signed by it.

    Keyword arguments:
    keyid -- the long keyid (fingerprint) of the key, e.g.
             A1BD8E9D78F7FE5C3E65D8AF8B48AD6246925553
    keyserver -- the URL or hostname of the key server
    Nc             S   s(   t |d tr"|d jtjkr"d S  d S )N   )r1   OSErrorerrnoENOENT)funcrD   exc_infor
   r
   r   onerror   s    z'add_key_from_keyserver.<locals>.onerror)rP   )r(   Zmkdtemp_add_key_from_keyserver	ExceptionshutilZrmtree)r   	keyservertmp_keyring_dirrP   r
   r
   r   add_key_from_keyserver   s    	rV   c          
   C   sN  t | jddjddd k r$tdtjj|d}tjj|d}d	d
dd|g}tj|d|d|d|d| g }|dkrtd|| f tjj|d}tj|d|d|d| g }|dkrtd| tj	|d|ddddg tj
ddj d }d }	x*|j D ]}
|
jdr|
jdd }	P qW | jddj }|	|krBtd||f t| d S )!Nr!    Z0x      z,Only fingerprints (v4, 160bit) are supportedzsecring.gpgzpubring.gpgZgpgz--no-default-keyringz--no-optionsz	--homedirz--secret-keyringz	--keyringz--keyserverz--recvr   zrecv from '%s' failed for '%s'zexport-keyring.gpgz--outputz--exportzexport of '%s' failedz--fingerprintz--batchz--fixed-list-modez--with-colonsT)r   r   zfpr::	   g      D@)lenreplacer   r%   rD   r8   r-   callr   r.   r/   r6   
splitlines
startswithsplitupperrI   )r   rT   rU   Ztmp_secret_keyringZtmp_keyringZgpg_default_optionsresZtmp_export_keyringrA   Zgot_fingerprintlineZsigning_key_fingerprintr
   r
   r   rQ      sV    	


rQ   c             C   s   t ddddd| d dS )zImport a GnuPG key to trust repositores signed by it.

    Keyword arguments:
    content -- the content of the GnuPG public key
    advz--quietz--batchz--import-)r   N)rB   )r@   r
   r
   r   add_key   s    rg   c             C   s   t d|  dS )zRemove a GnuPG key to no longer trust repositores signed by it.

    Keyword arguments:
    fingerprint -- the fingerprint identifying the key
    ZrmN)rB   )fingerprintr
   r
   r   
remove_key   s    ri   c             C   s
   t d| S )zxReturn the GnuPG key in text format.

    Keyword arguments:
    fingerprint -- the fingerprint identifying the key
    Zexport)rB   )rh   r
   r
   r   
export_key   s    rj   c               C   s   t dS )a  Update the local keyring with the archive keyring and remove from
    the local keyring the archive keys which are no longer valid. The
    archive keyring is shipped in the archive-keyring package of your
    distribution, e.g. the debian-archive-keyring package in Debian.
    update)rB   r
   r
   r
   r   rk   
  s    rk   c               C   s   t dS )ay  Work similar to the update command above, but get the archive
    keyring from an URI instead and validate it against a master key.
    This requires an installed wget(1) and an APT build configured to
    have a server to fetch from and a master keyring to validate. APT
    in Debian does not support this command and relies on update
    instead, but Ubuntu's APT does.
    z
net-update)rB   r
   r
   r
   r   
net_update  s    	rl   c              C   s|   t ddddd} g }xb| jdD ]T}|jd}|d d	krB|d
 }|d dkr |d }|d }t|||}|j| q W |S )zaReturns a list of TrustedKey instances for each key which is
    used to trust repositories.
    re   z--with-colonsz--batchz--fixed-list-modez--list-keys
rZ   r   ZpubrY   uidr[      )rB   ra   r   append)rA   rc   rd   Zfieldsr   rn   Zcreation_datekeyr
   r
   r   	list_keys   s    
rr   __main__c               C   s   t dS )Nz;Ubuntu Archive Automatic Signing Key <ftpmaster@ubuntu.com>)r   r
   r
   r
   r   <lambda>9  s    rt   c               C   s   t dS )Nz:Ubuntu CD Image Automatic Signing Key <cdimage@ubuntu.com>)r   r
   r
   r
   r   rt   :  s    )'r   Z
__future__r   rL   r%   os.pathrS   r-   r3   r(   r"   r   r   r4   r5   strr2   Ztypingr   ImportErrorrR   r   r   objectr   rB   rI   rV   rQ   rg   ri   rj   rk   rl   rr   r   ZinitZtrusted_keyprintr
   r
   r
   r   <module>   sH   1H



