o
    (fr                     @   s`  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	 d dl
mZ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mZ d dlmZmZ d dlmZmZmZmZ d d	l m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4 d d
l5m6Z6 d dl5m7Z8 d dl9m:Z: d dl9m7Z; d dl<m=Z=m>Z> d dl?m@Z@mAZAmBZB d dlCmDZD d dlEmFZF d dlGmHZHmIZImJZJ d dlKmLZL d dlMmNZN d dlOmPZP d dlQmRZRmSZSmTZT d dlUmVZV d dlWmXZX d dlYmZZZ d dl[m\Z\ G dd dZ]de+fddZ^de-fd d!Z_d"e`d#ead$eLfd%d&Zbd"e`d#ead'ead$eLfd(d)Zc	dod*ee` d+e`d,edd-edd.ee` d/e`fd0d1Zed$eLd2e`d/eafd3d4Zfdpd5d6Zgd$eLfd7d8Zhd$eLd/eafd9d:Zid;ee` d/e`fd<d=Zjd$eLd#ead/eafd>d?Zkd$eLd/eafd@dAZld$eLdBe`d/eafdCdDZmdBe`d$eLd#ead/eafdEdFZn	Gdqd+edHe`dIe`fdJdKZodLe`fdMdNZpdOe]dPe0fdQdRZqdOe]dPe1fdSdTZrdOe]dPe/fdUdVZsdOe]dPe$fdWdXZtdOe]dPe%fdYdZZudOe]dPe&fd[d\ZvdOe]dPe*fd]d^ZwdOe]dPe(fd_d`ZxdOe]dPe'fdadbZyde+d#ead$eLd/eeee f fdcddZzdedf Z{eBdgej|ej}e{eFj~eAe@d"ejdhe@diejdjdke@dlejdjdkgdmgdnZdS )r    N)DictList
NamedTupleOptionalSetTupleUnion)apt
exceptionsmessagessystemutil)attach_with_tokenenable_entitlement_by_name)	_initiate)MagicAttachRevokeOptions_revoke)MagicAttachWaitOptions_wait)CVE_OR_USN_REGEX	FixStatusUnfixedPackagestatus_message)ESM_APPS_POCKETESM_INFRA_POCKETSTANDARD_UPDATES_POCKETFixPlanAptUpgradeStepFixPlanAttachStepFixPlanEnableStepFixPlanNoOpAlreadyFixedStepFixPlanNoOpLivepatchFixStepFixPlanNoOpStatusFixPlanNoOpStepFixPlanResultFixPlanStepFixPlanUSNResultFixPlanWarning"FixPlanWarningFailUpdatingESMCache&FixPlanWarningPackageCannotBeInstalled#FixPlanWarningSecurityIssueNotFixedNoOpAlreadyFixedDataNoOpLivepatchFixDataUSNAdditionalData)CVEFixPlanOptions)_plan)USNFixPlanOptions)ContractExpiryStatus_is_attached)ProArgumentProArgumentGroup
ProCommand)action_detach)HelpCategory)CLOUD_TYPE_TO_TITLEPRO_CLOUD_URLSget_cloud_type)UAConfig)PRINT_WRAP_WIDTH)entitlement_factory)ApplicabilityStatusCanEnableFailureUserFacingStatus)notices)Notice)PRO_HOME_PAGE)colorize_commandsc                   @   sj   e Zd Zdededee defddZdd Z		dd
ee dede	e fddZ
dee defddZd	S )
FixContexttitledry_runaffected_pkgscfgc                 C   sJ   d| _ g | _t | _tj| _|| _|| _|| _	|| _
d| _d| _d| _d S )Nr   TF)	pkg_indexunfixed_pkgssetinstalled_pkgsr   SYSTEM_NON_VULNERABLE
fix_statusrE   rG   rF   rH   should_print_pkg_header warn_package_cannot_be_installedfixed_by_livepatch)selfrE   rF   rG   rH    rS   2/usr/lib/python3/dist-packages/uaclient/cli/fix.py__init__S   s   
zFixContext.__init__c                 C   sR   | j r'tjt| j jt| j dt| j d}tt	j
|tddd d S d S )N, )countpkgs    F)widthsubsequent_indentreplace_whitespace)rG   r   SECURITY_AFFECTED_PKGS	pluralizelenformatjoinsortedprinttextwrapfillr;   )rR   msgrS   rS   rT   print_fix_headerf   s"   zFixContext.print_fix_headerNsource_pkgsstatuspocketc                 C   s8   | j rtt||| jt| j|rt|nd d d S d S )N)pkg_listri   rI   num_pkgspocket_source)rO   rc   _format_packages_messagerI   r_   rG   get_pocket_description)rR   rh   ri   rj   rS   rS   rT   print_pkg_headerw   s   zFixContext.print_pkg_headerrX   unfixed_reasonc                 C   s"   |D ]}| j t||d qd S )N)pkgrq   )rJ   appendr   )rR   rX   rq   rr   rS   rS   rT   add_unfixed_packages   s
   
zFixContext.add_unfixed_packagesN)__name__
__module____qualname__strboolr   r:   rU   rg   r   rp   rt   rS   rS   rS   rT   rD   R   s(    

rD   cvec                 C   s8   dj | j | jdd | j g}td| d S )N{issue}: {description}issuedescriptionz! - https://ubuntu.com/security/{}
)r`   rE   upperr   rc   ra   )r{   linesrS   rS   rT   print_cve_header   s   r   fix_planc                 C   s   | j }dj|j |jdg}|j}t|trK|jr5|	t
j |jD ]}|	dt
jjj|d q#n|jrK|	t
j |jD ]	}|	d|  qAtd| d S )Nr|   r}   z - {})r{   z - r   )target_usn_planr`   rE   r   r   additional_data
isinstancer,   associated_cvesrs   r   SECURITY_FOUND_CVESurlsSECURITY_CVE_PAGEassociated_launchpad_bugsSECURITY_FOUND_LAUNCHPAD_BUGSrc   ra   )r   
target_usnr   r   r{   lp_bugrS   rS   rT   print_usn_header   s*   


r   security_issuerF   rH   c                 C   sz   t t| gd|d}|jjd j}|r$|jr$tjt	|j
pd|jdt|jjd  t  t|jjd ||\}}|S )N)cvesoptionsrH   r   unexpected-error	named_msg)cve_planr-   	cves_datar   errorrf   r
   AnonymousUbuntuProErrorr   NamedMessagecoder   rc   execute_fix_plan)r   rF   rH   r   r   ri   _rS   rS   rT   fix_cve   s   
r   
no_relatedc                 C   s  t t| gd|d}|jjd jj}|r%|jr%tjt	
|jpd|jdt|jjd  tdt	jj| d  t|jjd j||\}}|tjtjfvrO|S |jjd j}|rZ|r\|S tdt	jjdd	d
 |D d  tdt	j  i }	|D ]}
td|
j t|
|||	|
j< t  qztt	j t|| t	jd d}|D ]=}
|	|
j \}}t||
jt	jd |tjkrtdt	jjdd  d}|tjkr|D ]}|j rtd|j!|j  qd}q|rtdt	j"j| d  |S )N)usnsr   r   r   r   r   )issue_idz
- c                 s   s    | ]}|j V  qd S ru   )rE   ).0usnrS   rS   rT   	<genexpr>   s    zfix_usn.<locals>.<genexpr>)related_usnsz- {})contextF- fix operation	operationTz
  - {}: {})#usn_planr/   	usns_datar   r   r   rf   r
   r   r   r   r   r   rc   SECURITY_FIXING_REQUESTED_USNr`   r   r   rM   SYSTEM_NOT_AFFECTEDrelated_usns_planSECURITY_RELATED_USNSra   SECURITY_FIXING_RELATED_USNSrE   SECURITY_USN_SUMMARY_handle_fix_status_messageFIX_ISSUE_CONTEXT_REQUESTEDFIX_ISSUE_CONTEXT_RELATEDSYSTEM_VULNERABLE_UNTIL_REBOOTENABLE_REBOOT_REQUIRED_TMPLSYSTEM_STILL_VULNERABLErq   rr   SECURITY_RELATED_USN_ERROR)r   rF   r   rH   r   r   target_usn_statusr   r   related_usn_statusrelated_usn_planfailure_on_related_usnri   rJ   unfixed_pkgrS   rS   rT   fix_usn   s   




r   rk   ri   rI   rl   rm   returnc           	      C   s   | sdS g }g }| D ]}|d7 }| d|| | | q
tjddd| d dt|tdd	}d
|t||S )z;Format the packages and status to an user friendly message.    z{}/{}z{} {}:(rV   )rY   rZ   r[   z{}
{})rs   r`   rd   re   ra   rb   r;   r   )	rk   ri   rI   rl   rm   	msg_indexsrc_pkgssrc_pkg
msg_headerrS   rS   rT   rn   0  s    rn   tokenc              
   C   s\   t tdd|gg z
t| |dd W dS  tjy- } zt |j W Y d}~dS d}~ww )ztAttach to an Ubuntu Pro subscription with a given token.

    :return: True if attach performed without errors.
    proattachT)r   allow_enableNF)rc   rC   r   r
   UbuntuProErrorrf   )rH   r   errrS   rS   rT   _run_ua_attachL  s   
r   c                  C   s>   t  \} }| t v rttjjt| t| d dS dS )z:Alert the user when running Pro on cloud with PRO support.)rE   cloud_specific_urlN)	r9   r8   keysrc   r   SECURITY_USE_PRO_TMPLr`   r7   get)
cloud_typer   rS   rS   rT   *_inform_ubuntu_pro_existence_if_applicableZ  s   
r   c              
   C   s   t tj t| d}t dtjj|jd  t|jd}zt	|| d}W n  t
jyD } zt tj t|jd}t|| d |d }~ww t dtj  t| |jS )N)rH   r   )	user_code)magic_tokenr   )rc   r   CLI_MAGIC_ATTACH_INITr   CLI_MAGIC_ATTACH_SIGN_INr`   r   r   r   r   r
   MagicAttachTokenErrorCLI_MAGIC_ATTACH_FAILEDr   r   CLI_MAGIC_ATTACH_PROCESSINGr   contract_token)rH   initiate_respwait_options	wait_resperevoke_optionsrS   rS   rT   _perform_magic_attachf  s.   


	r   c                 C   sh   t   ttj tjtjg dd}|dkrdS |dkr t| S |dkr2ttj t	d}t
| |S dS )	zZPrompt for attach to a subscription or token.

    :return: True if attach performed.
    )sacvalid_choicesr   Fr   r   > T)r   rc   r   *SECURITY_UPDATE_NOT_INSTALLED_SUBSCRIPTIONr   prompt_choicesSECURITY_FIX_ATTACH_PROMPTr   PROMPT_ENTER_TOKENinputr   )rH   choicer   rS   rS   rT   _prompt_for_attach  s   


r   rJ   c                 C   s4   t | }tjtj|j|dt| dt	ddS )zFormat the list of unfixed packages into an message.

    :returns: A string containing the message output for the unfixed
              packages.
    rV   )rl   rX   rY   r   )
r_   rd   re   r   SECURITY_PKG_STILL_AFFECTEDr^   r`   ra   rb   r;   )rJ   num_pkgs_unfixedrS   rS   rT   _format_unfixed_packages_msg  s   r   c                 C   s4   t | j}|r|tjjkr|rttj dS dS dS )zuCheck if the Ubuntu Pro subscription is expired.

    :returns: True if subscription is expired and not renewed.
    FT)r1   contract_statusr0   EXPIREDvaluerc   r   (SECURITY_DRY_RUN_UA_EXPIRED_SUBSCRIPTION)rH   rF   contract_expiry_statusrS   rS   rT   _check_subscription_is_expired  s   

r   c                 C   s   ddl }t  ttj tjtjjt	dddgd}|dkr?ttj
 td}ttdd	gg t|jd
dd|  t| |S dS )zdPrompt for attach a new subscription token to the user.

    :return: True if attach performed.
    r   N)urlrr   r   r   r   detachTcli)
assume_yesr`   F)argparser   rc   r   %SECURITY_UPDATE_NOT_INSTALLED_EXPIREDr   r   SECURITY_FIX_RENEW_PROMPTr`   rB   PROMPT_EXPIRED_ENTER_TOKENr   rC   r5   	Namespacer   )rH   r  r   r   rS   rS   rT   _prompt_for_new_token  s   


r  servicec                 C   s   t tjj|d tjtjj|dddgd}|dkrEt tdd|gg t| |d\}}|sC|durCt	|t
rC|jdurCt |jj |S d	S )
zMPrompt for enable a pro service.

    :return: True if enable performed.
    r  r   r   r   r   enablerH   nameNF)rc   r   SECURITY_SERVICE_DISABLEDr`   r   r   SECURITY_FIX_ENABLE_PROMPTrC   r   r   r>   messagerf   )rH   r  r   retreasonrS   rS   rT   _prompt_for_enable  s"   
r  c                 C   s   t || d}|rN| \}}|tjkrdS | \}}|tjkrD|r0tdtj	j
|jd  dS t||jr8dS ttjj
|jd dS ttjj
|jd dS )zQ
    Verify if the Ubuntu Pro subscription has the required service enabled.
    r  Tr   r	  F)r<   user_facing_statusr?   ACTIVEapplicability_statusr=   
APPLICABLErc   r   'SECURITY_DRY_RUN_UA_SERVICE_NOT_ENABLEDr`   r  r  SECURITY_UA_SERVICE_NOT_ENABLED SECURITY_UA_SERVICE_NOT_ENTITLED)r  rH   rF   ent
ent_statusr   r  rS   rS   rT   )_handle_subscription_for_required_service  s<   

r  r   r   r   c                 C   s   | t jkr |rtjj||d}ntjj|d}tt| d S | t j	kr@|r0tj
j||d}ntjj|d}tt| d S | t jkr`|rPtjj||d}ntjj|d}tt| d S |rktjj||d}ntjj|d}tt| d S )N)r~   r   r~   )r   rM   r   %SECURITY_ISSUE_RESOLVED_ISSUE_CONTEXTr`   SECURITY_ISSUE_RESOLVEDrc   r   handle_unicode_charactersr   'SECURITY_ISSUE_UNAFFECTED_ISSUE_CONTEXTSECURITY_ISSUE_UNAFFECTEDr   )SECURITY_ISSUE_NOT_RESOLVED_ISSUE_CONTEXTSECURITY_ISSUE_NOT_RESOLVED)ri   r   r   rf   rS   rS   rT   r     s6   


r   rj   c                 C   s.   | t krtjS | tkrtjS | tkrtjS | S ru   )r   r   'SECURITY_UBUNTU_STANDARD_UPDATES_POCKETr   SECURITY_UA_INFRA_POCKETr   SECURITY_UA_APPS_POCKET)rj   rS   rS   rT   ro   @  s   ro   fix_contextstepc                 C   sh   | j |jjd|jjd d| _tjj|jj|jj	d}t
d|  | j|jjg|d d| _tj| _d S )Nreleasedrh   ri   rj   F)packageversionr   rX   rq   T)rp   datarelated_source_packagesrj   rO   r   FIX_CANNOT_INSTALL_PACKAGEr`   binary_packagebinary_package_versionrc   rt   source_packagerP   r   r   rN   )r(  r)  warn_msgrS   rS   rT   )_execute_package_cannot_be_installed_stepK  s    
r6  c                 C   sR   | j |jj|jjd |  jt|jj7  _| j|jjt|jjd tj	| _
d S )N)rh   ri   r.  )rp   r/  source_packagesri   rI   r_   rt   r   r   r   rN   r(  r)  rS   rS   rT   &_execute_security_issue_not_fixed_stepd  s   
r9  c                 C   s,   t  rttj d S tdtj d  d S )Nr   )r   we_are_currently_rootrc   r   CLI_FIX_FAIL_UPDATING_ESM_CACHE(CLI_FIX_FAIL_UPDATING_ESM_CACHE_NON_ROOTr8  rS   rS   rT   %_execute_fail_updating_esm_cache_stept  s   r=  c              
   C   sh  | j |jjd|jjd |  jt|jj7  _|jjs)| js#tt	j
 tj| _d S t sE| jsEtt	j tj| _| j|jjt	jd d S ttg dg d t|jj g | jratj| _d S zt  tjg d|jj ddid	 W n, ty } z t|d
t|}t| tj| _| j|jj|d W Y d }~d S d }~ww tj| _d| _| j|jj d S )Nr*  r+  r.  )r	   updatez&&)r	   install--only-upgrade-y)zapt-getr?  r@  rA  DEBIAN_FRONTENDnoninteractive)cmdoverride_env_varsrf   T)rp   r/  r7  rj   rI   r_   binary_packagesrP   rc   r   SECURITY_UPDATE_INSTALLEDr   rM   rN   r   r:  rF   SECURITY_APT_NON_ROOTr   rt   rC   rb   r	   run_apt_update_commandrun_apt_command	Exceptiongetattrry   rO   rL   r>  )r(  r)  r   rf   rS   rS   rT   _execute_apt_upgrade_step}  sl   





rM  c                 C   s   |j jdkrtnt}| j|j jd|d d| _t| jj	sD| j
r(tdtj  nHt| jsCtj| _| j|j jtjj|j jdd d S n,t| j| j
drp| j
rUttj nt| jsptj| _| j|j jtjj|j jdd d S tj| _d S )	N	esm-infrar*  r+  Fr   r	  r.  )rH   rF   )r/  required_servicer   r   rp   r7  rO   r1   rH   is_attachedrF   rc   r    SECURITY_DRY_RUN_UA_NOT_ATTACHEDr   r   r   rN   rt   SECURITY_UA_SERVICE_REQUIREDr`   r   r   r  $SECURITY_UA_SERVICE_WITH_EXPIRED_SUBrM   r(  r)  rj   rS   rS   rT   _execute_attach_step  sL   
	
rU  c                 C   st   |j jdkrtnt}| j|j jd|d d| _t|j j| j| j	s7| j
|j jtjj|j jdd tj| _d S tjS )NrN  r*  r+  Fr	  r.  )r/  r  r   r   rp   r7  rO   r  rH   rF   rt   r   %SECURITY_UA_SERVICE_NOT_ENABLED_SHORTr`   r   r   rN   rM   rT  rS   rS   rT   _execute_enable_step  s0   rW  c                 C   s*   |j jtjjkrttj tj	| _
d S d S ru   )r/  ri   r!   NOT_AFFECTEDr   rc   r   SECURITY_NO_AFFECTED_PKGSr   r   rN   r8  rS   rS   rT   _execute_noop_not_affected_step  s   
rZ  c                 C   s4   t |jtrttjj| j|jjd d| _	d S d S )N)r~   r-  T)
r   r/  r+   rc   r   CVE_FIXED_BY_LIVEPATCHr`   rE   patch_versionrQ   r8  rS   rS   rT   %_execute_noop_fixed_by_livepatch_step  s   
r]  c                 C   sL   t |jtr$| j|jjd|jjd ttj |  j	t
|jj7  _	d S d S )Nr*  r+  )r   r/  r*   rp   r7  rj   rc   r   rG  rI   r_   r8  rS   rS   rT    _execute_noop_already_fixed_step   s   
r^  c                 C   s  g | j | j}t| j|| jpg |d}|  t|dd dD ]t}t|tr,t	|| t|t
r6t|| t|tr@t|| t|trRt|| |jtjkrR nCt|trdt|| |jtjkrd n1t|trvt|| |jtjkrv nt|trt|| t|trt|| t|trt|| q t  |jrttt t!dd |jD  tj"|_|jtjkrt#j$|j%drtj&|_t'j(j)dd	}t| t*j+t,j-dd	 |j.st/|j| j |j|jfS )
N)rE   rF   rG   rH   c                 S   s   | j S ru   )order)xrS   rS   rT   <lambda>=  s    z"execute_fix_plan.<locals>.<lambda>)keyc                 S   s   g | ]}|j qS rS   )rr   )r   r   rS   rS   rT   
<listcomp>a  s    z$execute_fix_plan.<locals>.<listcomp>)rL   r   r   )0planwarningsrD   rE   affected_packagesrg   rb   r   r(   r6  r)   r9  r'   r=  r   rM  rN   r   rM   r   rU  r   rW  r"   rZ  r    r]  r   r^  rc   rJ   r   listrK   r   r   should_rebootrL   r   r   r   r`   r@   addrA   ENABLE_REBOOT_REQUIREDrQ   r   )r   rF   rH   	full_planr(  r)  
reboot_msgrS   rS   rT   r   -  s   

















r   c                K   sj   t t| jstj| jd| jrttj	 d| j
 v r(t| j| j|}|jS t| j| j| j|}|jS )Nr  r{   )rematchr   r   r
   InvalidSecurityIssueIdFormatrF   rc   r   SECURITY_DRY_RUN_WARNINGlowerr   r   r   	exit_code)argsrH   kwargsri   rS   rS   rT   
action_fix  s   
ru  fix)helpz	--dry-run
store_true)rw  actionz--no-related)	arguments)rw  r   ry  help_categoryargument_groupsru   )r   N)r   )rm  rd   typingr   r   r   r   r   r   r   uaclientr	   r
   r   r   r   uaclient.actionsr   r   +uaclient.api.u.pro.attach.magic.initiate.v1r   )uaclient.api.u.pro.attach.magic.revoke.v1r   r   'uaclient.api.u.pro.attach.magic.wait.v1r   r   'uaclient.api.u.pro.security.fix._commonr   r   r   r   /uaclient.api.u.pro.security.fix._common.plan.v1r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   +uaclient.api.u.pro.security.fix.cve.plan.v1r-   r.   r   +uaclient.api.u.pro.security.fix.usn.plan.v1r/   r   (uaclient.api.u.pro.status.is_attached.v1r0   r1   uaclient.cli.commandsr2   r3   r4   uaclient.cli.detachr5   uaclient.cli.parserr6   uaclient.clouds.identityr7   r8   r9   uaclient.configr:   uaclient.defaultsr;   uaclient.entitlementsr<   (uaclient.entitlements.entitlement_statusr=   r>   r?   uaclient.filesr@   uaclient.files.noticesrA   uaclient.messages.urlsrB   uaclient.statusrC   rD   r   r   ry   rz   r   r   intrn   r   r   r   r   r   r   r  r  r  r   ro   r6  r9  r=  rM  rU  rW  rZ  r]  r^  r   ru  CLI_ROOT_FIXCLI_FIX_DESCSECURITYCLI_FIX_ISSUECLI_FIX_DRY_RUNCLI_FIX_NO_RELATEDfix_commandrS   rS   rS   rT   <module>   s:   $
X?
l


,
%


	
>
/
!



R
