a
    !cB                     @   sv   d dl mZmZmZ d dlZd dlZd dlZd dlmZ d dl	m
Z
 edZdadd Zdd	 Zd
d Zdd ZdS )    )print_functionabsolute_importunicode_literalsN)which)_Zdnfc                   C   s$   t d u r tda ttdt  t S )Nrpmkeysz3Using rpmkeys executable at %s to verify signatures)_rpmkeys_binaryr   _loggerdebugr    r   r   5/usr/lib/python3.9/site-packages/dnf/rpm/miscutils.py_find_rpmkeys_binary   s    
r   c                 C   s   t | dk s | d dks | d r$dS d\}}}}| dd D ]R}d|v rN dS |d	r^d
}q<|drnd
}q<|dr~d
}q<|ds< dS q<|rdS |rdS |rdS dS )N   r   s   -:   )FFFF   s   : BADs   : NOKEYTs   : NOTTRUSTEDs
   : NOTFOUNDs   : OK   )lenendswith)dataZseen_sigZmissing_keyZnot_trustedZ
not_signedir   r   r   _process_rpm_output$   s*     



r   c           	      C   s   t  }|d u stj|s,ttd dS ddd|dddd	f}ttj}d
|d< t	j
|||t	jd| d}| d }W d    n1 s0    Y  |j}t|turtd|dks|dk rdS t|d}|r|S |rdS dS )Nz4Cannot find rpmkeys executable to verify signatures.r   r   z
--checksigz--rootz	--verbosez#--define=_pkgverify_level signaturez--define=_pkgverify_flags 0x0-CLC_ALL/)args
executableenvstdoutcwdstdinr   z Popen set return code to non-int   
)r   ospathisfiler	   Zcriticalr   dictenviron
subprocessPopenPIPEZcommunicate
returncodetypeintAssertionErrorr   split)	packageZinstallrootZrpmkeys_binaryr   r   pr   r+   retr   r   r   _verifyPackageUsingRpmkeys?   s:    

*r3   c              	   C   sH   t |t jt jB t jB }zt|| jj}W t | nt | 0 |S )a  Takes a transaction set and a package, check it's sigs,
    return 0 if they are all fine
    return 1 if the gpg key can't be found
    return 2 if the header is in someway damaged
    return 3 if the key is not trusted
    return 4 if the pkg is not gpg or pgp signed)	r#   openO_RDONLYO_NOCTTY	O_CLOEXECr3   tsZrootDirclose)r8   r0   Zfdnovaluer   r   r   checkSig`   s
    r;   )Z
__future__r   r   r   r#   r(   ZloggingZshutilr   Zdnf.i18nr   Z	getLoggerr	   r   r   r   r3   r;   r   r   r   r   <module>   s   
!