o
    ÙKÕi-  ã                	   @   sŽ  d dl Z d dlmZmZmZmZ d dlmZmZ d dl	m
Z
 d dlmZ d dlmZmZ d dlmZ d dlmZ d d	lmZmZmZ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 G dd„ deƒZ!G dd„ deeƒZ"G dd„ deƒZ#de$fdd„Z%dede"fdd„Z&dedee'ef de'de"fd d!„Z(ded"ede"fd#d$„Z)e
d%d&e)ed'�Z*d(d)d*e"egg d+d,d-œZ+dS ).é    N)ÚAnyÚDictÚListÚOptional)ÚsystemÚutil)ÚAPIEndpoint)ÚAdditionalInfo)ÚVulnerabilityParserÚget_vulnerabilities)Úget_apt_cache_datetime)ÚUAConfig)ÚBoolDataValueÚ
DataObjectÚDatetimeDataValueÚFieldÚFloatDataValueÚStringDataValueÚ	data_dictÚ	data_listc                   @   sN   e Zd Zededdd�ededdd�gZdddœdee dee fdd	„Zd
S )ÚCVEsOptionsÚ	unfixableFzShow only unfixable CVES.©ÚdocÚfixablezShow only fixable CVES.©r   r   c                C   ó   || _ || _d S ©Nr   )Úselfr   r   © r   úE/usr/lib/python3/dist-packages/uaclient/api/u/pro/security/cves/v1.pyÚ__init__)   s   
zCVEsOptions.__init__N)	Ú__name__Ú
__module__Ú__qualname__r   r   Úfieldsr   Úboolr!   r   r   r   r    r      s*    üüùüýür   c                   @   s`   e Zd Zededdd�ededdd�ededdd�ed	ed
d�gZdededed	efdd„ZdS )ÚCVEAffectedPackageÚnameFzThe CVE namer   Úfix_versionz.The version that fixes the CVE for the packageÚ
fix_statusz)The status of the CVE fix for the packageÚ
fix_originz*The pocket where the fix is available fromc                 C   ó   || _ || _|| _|| _d S r   ©r(   r)   r*   r+   )r   r(   r)   r*   r+   r   r   r    r!   N   s   
zCVEAffectedPackage.__init__N©r"   r#   r$   r   r   r%   Ústrr!   r   r   r   r    r'   3   sD    üüüýíÿÿÿÿr'   c                   @   sB   e Zd Zededd�edeeƒdd�gZdede	e fdd„Z
dS )	ÚAffectedPackageÚcurrent_versionz"The current version of the packager   Úcvesz The CVE that affects the packagec                C   r   r   ©r1   r2   )r   r1   r2   r   r   r    r!   e   s   
zAffectedPackage.__init__N)r"   r#   r$   r   r   r   r'   r%   r/   r   r!   r   r   r   r    r0   W   s"    ýýúÿÿr0   c                   @   s:   e Zd Zededd�ededd�gZdedefdd„ZdS )	Ú
RelatedUSNr(   zThe USN namer   ÚtitlezThe USN titlec                 C   r   r   ©r(   r5   )r   r(   r5   r   r   r    r!   z   s   
zRelatedUSN.__init__Nr.   r   r   r   r    r4   l   s    ýýúr4   c                   @   s¼   e Zd Zededd�ededd�ededd�edeeƒd	d
d�eded	dd�eded	dd�gZddddddœde	de
j
de	deee	  dee dee	 deee  deee	  fdd„ZdS )ÚCVEInfoÚdescriptionzThe CVE descriptionr   Úpublished_atzThe CVE published dateÚpriorityzThe ubuntu priority for the CVEÚnotesFzA list of notes for the CVEÚ
cvss_scorezThe CVE cvss scoreÚcvss_severityzThe CVE cvss severityN)r;   r<   r=   Úrelated_usnsÚrelated_packagesr>   r?   c          	      C   s4   || _ || _|| _|| _|| _|| _|| _|| _d S r   ©r8   r9   r:   r;   r<   r=   r>   r?   )	r   r8   r9   r:   r;   r<   r=   r>   r?   r   r   r    r!   ¤   s   
zCVEInfo.__init__)r"   r#   r$   r   r   r   r   r   r%   r/   Údatetimer   r   Úfloatr4   r!   r   r   r   r    r7      sr    ýýýüüüä*öýüû
úùø
	÷

ör7   c                
   @   sl   e Zd Zedeed�dd�edeed�dd�gZddœdee	ef dee	ef d	e
j
d
ee
j
 fdd„ZdS )Ú
CVEsResultÚpackages)Ú	value_clszcA dictionary where the keys are installed package names and the values are AffectedPackage objects.r   r2   zMA dictionary where the keys are CVE names and the values are CVEInfo objects.N)Úapt_updated_atÚvulnerability_data_published_atrF   c                C   r,   r   ©rD   r2   rG   rF   )r   rD   r2   rG   rF   r   r   r    r!   Ë   s   
zCVEsResult.__init__)r"   r#   r$   r   r   r0   r7   r%   r   r/   rA   r   r!   r   r   r   r    rC   ½   s,    ýýú÷
ý
üø	÷rC   c                   @   s`   e Zd ZdZdeeef deeef fdd„Zdeeef deeef deeef fdd	„Zd
S )Ú	CVEParserr2   Úaffected_pkgÚreturnc                 C   s   |  | ji ¡S r   )ÚgetÚvulnerability_type)r   rJ   r   r   r    Úget_package_vulnerabilitiesß   s   z%CVEParser.get_package_vulnerabilitiesÚvulnerability_infoÚvulnerabilities_datac                 C   s\   |  d¡r,g }|  di ¡  di ¡}|d D ]}| ||  |i ¡  dd¡dœ¡ q||d< |S )Nr>   Úsecurity_issuesÚusnsr5   Ú r6   )rL   Úappend)r   rO   rP   r>   Úusn_infoÚrelated_usnr   r   r    Ú _post_process_vulnerability_infoä   s   
ÿÿþÿ	z*CVEParser._post_process_vulnerability_infoN)	r"   r#   r$   rM   r   r/   r   rN   rW   r   r   r   r    rI   Ü   s    
ÿ

þ
þ
ý
ürI   rK   c                 C   s4   |   d¡o	|   d¡}|jr|rdS |jr|sdS dS )Nr)   r+   FT)rL   r   r   )ÚcveÚoptionsÚ
is_fixabler   r   r    Úcve_status_match_optionsÿ   s   

r[   rY   c                 C   s   t | tƒ ƒS r   )Ú_cvesr   )rY   r   r   r    r2   	  s   r2   ÚvulnerabilitiesrG   c           	   
      sâ   i }t ƒ ‰ t| di ¡ ¡ ƒD ]@\}}g }t| dg ¡dd„ d�D ]!}t|| ƒrB| t|d |d |d |d	 d
�¡ ˆ  |d ¡ q!|rOt|d |d�||< q‡ fdd„t| di ¡ ¡ dd„ d�D ƒ}t	||t
 |¡tƒ d�S )NrD   r2   c                 S   ó   | d S )Nr(   r   )rX   r   r   r    Ú<lambda>  ó    z(_parse_vulnerabilities.<locals>.<lambda>)Úkeyr(   r)   r*   r+   r-   r1   r3   c                    sj   i | ]1\}}|ˆ v r|t |d  t |d ¡|d |d |d |d dd„ | dg ¡D ƒ| d	g ¡d
�“qS )r8   r9   Úubuntu_priorityr;   r<   r=   c                 S   s(   g | ]}t | d d¡| dd¡d�‘qS )r(   rS   r5   r6   )r4   rL   )Ú.0rV   r   r   r    Ú
<listcomp>6  s    ü

þÿz5_parse_vulnerabilities.<locals>.<dictcomp>.<listcomp>r>   r?   r@   )r7   r   Úparse_rfc3339_daterL   )rc   Úcve_namerX   ©Úallowed_cvesr   r    Ú
<dictcomp>.  s     ì
û
òz*_parse_vulnerabilities.<locals>.<dictcomp>r]   c                 S   r^   )Nr   r   )Úvr   r   r    r_   A  r`   rH   )ÚsetÚsortedrL   Úitemsr[   rT   r'   Úaddr0   rC   r   re   r   )	rY   r]   rG   rD   Úpkg_nameÚpackage_infoÚpkg_cvesrX   r2   r   rg   r    Ú_parse_vulnerabilities  sP   ÿ
ÿ
üÿ€
þ€
þïÿúrr   Úcfgc                 C   sH   | j r| jrd| _ d| _t ¡ j}ttƒ ||d�}|j}t| ||j	d�S )zˆ
    This endpoint shows the CVE vulnerabilities in the system.
    By default, this API will show all CVEs that affect the system.
    F)Úparserrs   Úseries)rY   r]   rG   )
r   r   r   Úget_release_inforu   r   rI   Úvulnerabilities_inforr   rG   )rY   rs   ru   Úcve_vulnerabilities_resultÚcve_vulnerabilitiesr   r   r    r\   P  s   
ýýr\   Úv1ÚCVEs)Úversionr(   ÚfnÚoptions_clsÚ35Tzs
from uaclient.api.u.pro.security.cves.v1 import cves, CVEsOptions

options = CVEsOptions()
result = cves(options)
zpro api u.pro.security.cves.v1aŽ  
{
    "cves": {
      "CVE-2023-5678": {
        "cvss_score": 8.1,
        "cvss_severity": "high",
        "description": "description example",
        "notes": [
          "note example",
        ],
        "priority": "medium",
        "published_at": ".*"
      }
    },
    "packages": {
      "accountsservice": {
        "current_version": "0.6.40-2ubuntu11.6",
        "cves": [
          {
            "fix_origin": "esm-infra",
            "fix_status": "fixed",
            "fix_version": "0.6.40-2ubuntu11.6+esm1",
            "name": "CVE-2023-5678"
          }
        ]
      },
      "libaccountsservice0": {
        "current_version": "0.6.40-2ubuntu11.6",
        "cves": [
          {
            "fix_origin": "esm-infra",
            "fix_status": "fixed",
            "fix_version": "0.6.40-2ubuntu11.6+esm1",
            "name": "CVE-2023-5678"
          }
        ]
      }
    },
}
)Úintroduced_inÚrequires_networkÚexample_pythonÚresult_classÚignore_result_classesÚ
exceptionsÚexample_cliÚexample_json),rA   Útypingr   r   r   r   Úuaclientr   r   Úuaclient.api.apir   Úuaclient.api.data_typesr	   Ú+uaclient.api.u.pro.security.cves._common.v1r
   r   Úuaclient.aptr   Úuaclient.configr   Úuaclient.data_typesr   r   r   r   r   r   r   r   r   r'   r0   r4   r7   rC   rI   r&   r[   r2   r/   rr   r\   ÚendpointÚ_docr   r   r   r    Ú<module>   sj    ($>#
ÿ
þÿ
þý
üAÿþ
ý ü
ó