o
    l>j.                     @  s  d Z ddlmZ ddlZddlmZ ddl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 ddlmZmZ ejdd	Zejd
d	ZdZdUddZ ej!edde d dVddZ"dWddZ#dXd"d#Z$dYd%d&Z%e&d!ddddd'eefdZd6d7Z'e&d8dddddd'ddd'eefd[dAdBZ(d\dDdEZ)e&dFej*d'dGdHd	ej*d'dIdJd	ej*d'dKdLd	ddddd'eef
d]dPdQZ+e&dRddeefd^dSdTZ,dS )_z$Authentication and session commands.    )annotationsN)PyiCloudService)CLIAbortCLIState	get_state)DEFAULT_LOG_LEVELDEFAULT_OUTPUT_FORMATAcceptTermsOptionChinaMainlandOptionHttpProxyOptionHttpsProxyOptionInteractiveOptionLogLevelOptionNoVerifySslOptionOutputFormatOptionPasswordOptionSessionDirOptionUsernameOptionstore_command_options)console_kv_tableconsole_tablez#Manage authentication and sessions.)helpz"Manage stored keyring credentials.zTrusted Sessionctxtyper.ContextreturnNonec                 C  s$   | j du rt|   t dS )z5Show subgroup help when invoked without a subcommand.N)invoked_subcommandtyperechoget_helpExit)r    r!   O/home/thesage/.local/lib/python3.10/site-packages/pyicloud/cli/commands/auth.py_group_root!   s   
r#   keyringT)nameinvoke_without_commandcallbackpathobjectexistsc                 C  s   |r| S |  dS )zNRender a canonical storage path with an inline missing marker for text output.z
 (missing)r!   )r(   r*   r!   r!   r"   _storage_path_display1   s   
r+   payloaddict[str, object]list[tuple[str, object]]c                 C  sh   d| d fd| d ft | d fd| d fd| d	 fd
| d fdt| d | d fdt| d | d fgS )z1Build text-mode rows for one auth status payload.Accountaccount_nameAuthenticatedauthenticatedtrusted_sessionzRequires 2FArequires_2fazRequires 2SArequires_2saPassword in Keyringhas_keyring_passwordSession Filesession_pathhas_session_file
Cookie Jarcookiejar_pathhas_cookiejar_file)TRUSTED_SESSIONr+   )r,   r!   r!   r"   _auth_status_rows9   s&   





r?   stater   statusc                 C  s&   |j | |j d| ||}|S )N)r0   r7   )r0   r7   auth_storage_info)r@   apirA   r,   r!   r!   r"   _auth_payloadT   s   
rD   boolc              	     s    j sr  }|s  jr dg d dS  j   dS  fdd|D } jrEt|dkr; |d  dS  d|d dS t|dkr\|d } jtdt	| dS  jt
d	d
tdddgdd |D  dS dS )zRCheck if the current state has an authenticated session, and print details if not.Fr2   accountsc                   s   g | ]
\}}t  ||qS r!   )rD   ).0rC   rA   r@   r!   r"   
<listcomp>i   s    z._auth_status_authenticated.<locals>.<listcomp>   r   TAuth StatuszActive iCloud Sessionsr/   r6   zSession File ExistszCookie Jar Existsc                 S  s.   g | ]}|d  |d |d |d |d fqS )r0   r3   r7   r:   r=   r!   )rH   r,   r!   r!   r"   rJ      s    )has_explicit_usernameactive_session_probesjson_output
write_jsonconsoleprintnot_logged_in_messagelenr   r?   r   r>   )r@   active_probespayloadsr,   r!   rI   r"   _auth_status_authenticated^   sP   rW   Fusernamer   session_dirr   
http_proxyr   https_proxyr   no_verify_sslr   output_formatr   	log_levelr   c              
   C  s   t | |||||||d t| }t|sdS | }	|	 }
|
d r(||	 n|  t||	|
}|jr<|	| dS |j
tdt| dS )z3Show the current authentication and session status.rX   rY   rZ   r[   r\   r]   r^   Nr2   rL   )r   r   rW   get_probe_apiget_auth_statusremember_accountprune_local_accountsrD   rO   rP   rQ   rR   r   r?   )r   rX   rY   rZ   r[   r\   r]   r^   r@   rC   rA   r,   r!   r!   r"   auth_status   s8   

rd   loginpasswordr   china_mainlandr
   interactiver   accept_termsr	   c                 C  s   t | |||||||||	|
|d t| }| }t||d|j|j|jd}|jr0|| dS |j	
d |j	
tdd|d ft|d	 fd
|d fd|d fg dS )z*Authenticate and persist a usable session.)rX   rY   rf   rg   rh   ri   rZ   r[   r\   r]   r^   T)r2   r3   r4   r5   NzAuthenticated session is ready.zAuth Sessionr/   r0   r3   r8   r9   r;   r<   )r   r   get_login_apirD   is_trusted_sessionr4   r5   rO   rP   rQ   rR   r   r>   )r   rX   rY   rf   rg   rh   ri   rZ   r[   r\   r]   r^   r@   rC   r,   r!   r!   r"   
auth_login   sN   





rl   PyiCloudService | Nonec                 C  sn   |   }|s| jr| dg d d S | j|   d S t|dkr/t| dd |D |d \}}|S )NFrF   rK   c                 S  s   g | ]\}}|j qS r!   )r0   )rH   rC   _statusr!   r!   r"   rJ     s    z-_auth_logout_find_account.<locals>.<listcomp>r   )	rN   rO   rP   rQ   rR   rS   rT   r   #multiple_logged_in_accounts_message)r@   rU   rC   rn   r!   r!   r"   _auth_logout_find_account   s   rp   logoutz--keep-trustedz2Preserve trusted-browser state for the next login.z--all-sessionsz)Attempt to sign out all browser sessions.z--remove-keyringzADelete the stored password for the selected account after logout.keep_trustedall_sessionsremove_keyringc              
   C  s2  t | ||||||	|
d t| }|jr| }|  n
t|}|du r&dS || z
|j||dd}W n tyF } zt	d|d}~ww d}|rQ|
|j}|  |j|jj|jj|d|}|jrm|| dS |d r{|r{|jd	 dS |d r|jd
 dS |r|jd dS |jd dS )z,Log out and clear local session persistence.r_   NT)rr   rs   clear_local_sessionz$Failed to clear local session state.F)r0   r9   r<   stored_password_removedremote_logout_confirmedz?Logged out, cleared local session, and removed stored password.z%Logged out and cleared local session.zPCleared local session, removed stored password; remote logout was not confirmed.z7Cleared local session; remote logout was not confirmed.)r   r   rM   r`   ra   rp   rb   rq   OSErrorr   delete_keyring_passwordr0   rc   sessionr9   r<   rO   rP   rQ   rR   )r   rr   rs   rt   rX   rY   rZ   r[   r\   r]   r^   r@   rC   resultexckeyring_removedr,   r!   r!   r"   auth_logout  sj   





r~   deletec                 C  sr   t | ||||d t| }|jstd||j}|j|d}|jr*|| dS |j	|r4d dS d dS )z!Delete a stored keyring password.)rX   rY   r]   r^   z:The --username option is required for auth keyring delete.)r0   rv   Nz%Deleted stored password from keyring.z.No stored password was found for that account.)
r   r   rM   r   ry   rX   rO   rP   rQ   rR   )r   rX   rY   r]   r^   r@   deletedr,   r!   r!   r"   auth_keyring_deleted  s.   

r   )r   r   r   r   )r(   r)   r*   r)   r   r)   )r,   r-   r   r.   )r@   r   rA   r-   r   r-   )r@   r   r   rE   )r   r   rX   r   rY   r   rZ   r   r[   r   r\   r   r]   r   r^   r   r   r   )r   r   rX   r   rY   r   rf   r   rg   r
   rh   r   ri   r	   rZ   r   r[   r   r\   r   r]   r   r^   r   r   r   )r@   r   r   rm   )r   r   rr   rE   rs   rE   rt   rE   rX   r   rY   r   rZ   r   r[   r   r\   r   r]   r   r^   r   r   r   )r   r   rX   r   rY   r   r]   r   r^   r   r   r   )-__doc__
__future__r   r   pyicloud.baser   pyicloud.cli.contextr   r   r   pyicloud.cli.optionsr   r   r	   r
   r   r   r   r   r   r   r   r   r   r   pyicloud.cli.outputr   r   Typerappkeyring_appr>   r#   	add_typerr+   r?   rD   rW   commandrd   rl   rp   Optionr~   r   r!   r!   r!   r"   <module>   s    @





5,
;U