
    VhNZ                        d dl mZ d dlmZ d dlZd dlZd dlmZ d dl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mZmZ d dlmZ  e       Z G d de      ZddZedk(  r e        yy)    )annotations)CLIN)	constants)context)option_helpers)AnsibleOptionsError)to_textto_bytes)
DataLoader)VaultEditorVaultLibmatch_encrypt_secret)Displayc                       e Zd ZdZdZdZdZdZ fdZ fdZ	 fdZ
 fd	Zd
 Zedd       Zd ZddZd Zd Zd Zd Zd Z xZS )VaultCLIa9   can encrypt any structured data file used by Ansible.
    This can include *group_vars/* or *host_vars/* inventory variables,
    variables loaded by *include_vars* or *vars_files*, or variable files
    passed on the ansible-playbook command line with *-e @file.yml* or *-e @file.json*.
    Role variables and defaults are also included!

    Because Ansible tasks, handlers, and other objects are data, these can also be encrypted with vault.
    If you'd like to not expose what variables you are using, you can keep an individual task file entirely encrypted.
    zansible-vaultstdinzthe command line argszthe interactive promptc                    d | _         d | _        d| _        d | _        d | _        d | _        d | _        t        t        | '  |       y )NF)
b_vault_passb_new_vault_passencrypt_string_read_stdinencrypt_secretencrypt_vault_idnew_encrypt_secretnew_encrypt_vault_idsuperr   __init__)selfargs	__class__s     A/home/dcms/DCMS/lib/python3.12/site-packages/ansible/cli/vault.pyr   zVaultCLI.__init__,   sJ      $).&" $"&$(!h&t,    c                   t         t        |   ddt        j                  j                  t        j                  d         z         t        j                  d      }t        j                  |       t        j                  |       | j                  j                  d      }d	|_        t        j                  d      }|j                  d
d ddt        j                                 t        j                  d      }|j                  dg ddt"        d       |j%                  dd||g      }|j'                  | j(                         |j                  dddd       |j                  ddddd        |j%                  d!d"||g      }|j'                  | j*                         |j                  dddd       |j%                  d#d$||g      }|j'                  | j,                         |j                  dddd       |j%                  d%d&|g      }|j'                  | j.                         |j                  dddd       |j%                  d'd(|||g      }	|	j'                  | j0                         |	j                  dddd       |j%                  d)d*|||g      }
|
j'                  | j2                         |
j                  dd+d,d       |
j                  d-d.d/dd01       |
j                  d2d3ddd45       |
j                  d6d7d8d9d:1       |
j                  d;d<d d=>       |j%                  d?d@||g      }|j'                  | j4                         |j7                         }|j                  dAd dBdCt        j                                 |j                  dDd dEt"        dFG       |j                  dddd       y )HNz4encryption/decryption utility for Ansible data fileszH
See '%s <command> --help' for more information on a specific command.

r   )descepilogF)add_helpaction)destTz--outputoutput_filez9output file name for encrypt or decrypt; use - for stdout)defaultr'   helptypez--encrypt-vault-idr   storezMthe vault id used to encrypt (required if more than one vault-id is provided))r)   r'   r&   r+   r*   createzCreate new vault encrypted file)r*   parents)funcr   Filename	file_name*)r*   metavarnargsz--skip-tty-checkz/allows editor to be opened when no tty attachedskip_tty_check
store_true)r)   r*   r'   r&   decryptzDecrypt vault encrypted fileeditzEdit vault encrypted fileviewzView vault encrypted fileencryptzEncrypt YAML fileencrypt_stringzEncrypt a stringzString to encryptstring_to_encryptz-pz--promptencrypt_string_promptz Prompt for the string to encrypt)r'   r&   r*   z--show-inputshow_string_inputz9Do not hide input when prompted for the string to encrypt)r'   r)   r&   r*   z-nz--nameencrypt_string_namesappendzSpecify the variable namez--stdin-nameencrypt_string_stdin_namez#Specify the variable name for stdin)r'   r)   r*   rekeyzRe-key a vault encrypted filez--new-vault-password-filenew_vault_password_filez!new vault password file for rekeyz--new-vault-idnew_vault_idz'the new vault identity to use for rekey)r)   r'   r+   r*   )r   r   init_parserospathbasenamesysargvopt_helpArgumentParseradd_vault_optionsadd_verbosity_optionsparseradd_subparsersrequiredadd_argumentunfrack_pathstr
add_parserset_defaultsexecute_createexecute_decryptexecute_editexecute_viewexecute_encryptexecute_encrypt_stringexecute_rekeyadd_mutually_exclusive_group)r   common
subparsersoutputvault_idcreate_parserdecrypt_parseredit_parserview_parserencrypt_parserenc_str_parserrekey_parserrekey_new_groupr   s                r    rE   zVaultCLI.init_parser9   s3   h)G`cecjcjcscstwt|t|}~t  dA  A 	* 	

 ((%8""6*&&v.[[//X/>
"
((%8J=!\!)!6!6!8 	 	:
 **E:2BEW%,3#r 	 	t #--h=^iqsyhz-{""(;(;"<""6
KWZ"[""#5uK|(8 	# 	O $..y?]hnpvgw.x##)=)=#>##F[X[#\ ++F9T_gio^p+q  d&7&7 8  j+UX Y ++F9T_e^f+g  d&7&7 8  j+UX Y#..y?R]cekmu\v.w##)=)=#>##F[X[#\#../?FXcikqs{b|.}##)D)D#E##F1DNail#m##D*;R+7)K 	$ 	M 	##N9LV[dp)d 	$ 	f##D(9O+3)D 	$ 	F 	##N9T,0)N 	$ 	P ",,W;Zekmudv,w!!t'9'9!:&CCE$$%@$Un*MT\TiTiTk 	% 	m$$%5t._b*S 	% 	U!!&z;VY!Zr!   c                   t         t        |   |      }|j                  t        _        |j
                  r#|j
                  D ]  }d|v st        d|z         t        |dd       r#t        |j                        dkD  rt        d      |j                  dk(  r\d|j                  v s$|j                  s|j                  s|j                  sd| _        |j                  r| j                  rt        d	      |S )
N;zK'%s' is not a valid vault id. The character ';' is not allowed in vault idsr(      z;At most one input file may be used with the --output optionr;   -TzEThe --prompt option is not supported if also reading input from stdin)r   r   post_process_args	verbositydisplay	vault_idsr   getattrlenr   r&   rA   r=   r   )r   optionsrb   r   s      r    ro   zVaultCLI.post_process_args   s    $9'B#--#-- H8#-.{  G  /G  H  HH 7M40S5F5J%&cdd>>--gll"g&G&GPWP\P\el  fC  fC15.,,1O1O)*qrrr!   c           
        t         t        |           t               }t	        j
                  d      }t        t        j                  d         }t        j                  }||z   }t        j                  d   }|dv rM| j                  ||t        t        j                  d         t        j                  d         }|st        d      |d	v rd }|d
vr%t        j                  d   xs t        j                  }d }| j                  ||t        t        j                  d         t        j                  d   d      }t        |      dkD  r0|s.t        ddj                  |D cg c]  }|d   	 c}      z        |st        d      t!        ||      }	|	d   | _        |	d   | _        |dv rt        j                  d   xs t        j                  }g }
|r|}
t        j                  d   r"|
j'                  t        j                  d          g }t        j                  d   r"|j'                  t        j                  d          | j                  ||
|t        j                  d   d      }|st        d      t!        ||      }|d   | _        |d   | _        |j-                         t/        |      }t1        |      | _        t        j                  d           t	        j
                  |       y c c}w )N?   rr   r&   )r7   r9   rB   r8   vault_password_filesask_vault_pass)rr   rx   ry   z3A vault password is required to use Ansible's Vault)r:   r;   r-   )r8   r   T)rr   rx   ry   create_new_passwordrm   zbThe vault-ids %s are available to encrypt. Specify the vault-id to encrypt with --encrypt-vault-id,r   )r   )rB   rD   rC   z=A new vault password is required to use Ansible's Vault rekeyr/   )r   r   runr   rF   umasklistr   CLIARGSCDEFAULT_VAULT_IDENTITY_LISTsetup_vault_secretsr   DEFAULT_VAULT_ENCRYPT_IDENTITYrt   joinr   r   r   r@   r   r   set_vault_secretsr   r   editor)r   loader	old_umaskrr   default_vault_idsr&   vault_secretsr   xr   new_vault_idsnew_vault_password_filesnew_vault_secretsr   vaultr   s                  r    r|   zVaultCLI.run   s   h!# HHUO	56	 99%	1	* 99 44VyJNw_uOvJwDKOOTdDe 5 gM !)*_``<<#X%#*??3E#F#j!JjJj  M((3<>B7??SiCj>k8?HX8Y=A	 ) C  =!A%.>)  +O*-((-3PQAaD3P*Q+R S S !)*_``1-CSUN
 %31$5D!"0"3DY&/ABfaFfFf M 1~.$$W__^%DE')$89(//@Y0Z[ ((3@>V8?HX8Y=A	 ) C  %)*ijj "66GGW"Y );1(=D%&8&;D#  / '!%(! 	s 4Qs   K/c                   t         j                  d   s5t        j                  j	                         rt
        j                  dd       t         j                  d   xs dgD ]F  }| j                  j                  || j                  | j                  t         j                  d          H t        j                  j	                         rt
        j                  dd       y	y	)
z; encrypt the supplied file using the provided vault secret r   z"Reading plaintext input from stdinTstderrrn   r(   )rb   r(   Encryption successfulN)r   r   rI   r   isattyrq   r   encrypt_filer   r   stdoutr   fs     r    r[   zVaultCLI.execute_encrypt   s     v&399+;+;+=OO@ON(1SE 	QAKK$$Q(;(;.2.C.C181O % Q	Q ::OO3DOA r!   c                    |xs d}d}|rd|z  }d|z  }g }t        |       }|j                  |       |j                         D ]  }|j                  d|z  |        dj                  |      }|S )N
    z%s: z
%s!vault | 
)r	   r@   
splitlinesr   )	b_ciphertextindentnameblock_format_var_nameblock_format_headerlinesvault_ciphertextlineyaml_ciphertexts	            r    format_ciphertext_yamlzVaultCLI.format_ciphertext_yaml  s    2 "$*TM!*-BB"<0()$//1 	8DLL3<67	8 ))E*r!   c                   d}g }t         j                  d   D cg c]
  }|dk7  s	| }}t         j                  d   rd}d}t        j                  d      }|dk7  r|}t         j                  d    }|rd	}nd
}t        j                  ||      }	|	dk(  rt	        d      t        |	      }|j                  || j                  |f       | j                  rt        j                  j                         rt        j                  dd       t        j                  j                         }
|
dk(  rt	        d      t        j                  j                         r&|
j                  d      st        j                  d       t        |
      }t         j                  d   }|j                  || j                  |f       t         j                  j!                  dd      rt#        t%        t         j                  d   |            }t'        |      t'        |      kD  rEt        j                  dd       t        j                  dt         j                  d   d   z  d       |t'        |      d D ]  }|j                  d|f        n|D cg c]  }d|f }}|D ]@  }|\  }}|dk(  rt	        d      t        |      }|j                  || j(                  |f       B | j+                  || j,                        }g }|D ]a  }|j!                  dd      }|j!                  dd      }|rt        j.                  j1                  |       |j                  t        |             c |j                  d       | j2                  j5                  dj7                  |      t         j                  d   xs d       t        j                  j                         rt        j                  dd       yyc c}w c c}w ) z= encrypt the supplied string using the provided vault secret Nr   rn   r=   zString to encrypt: z#Variable name (enter for no name): r   r>   zString to encrypt (hidden): zString to encrypt:)privatez@The plaintext provided from the prompt was empty, not encryptingzpReading plaintext input from stdin. (ctrl-d to end input, twice if your content does not already have a newline)Tr   zstdin was empty, not encryptingr   rA   r?   Fz=The number of --name options do not match the number of args.zCThe last named variable will be "%s". The rest will not have names.zKThe plaintext provided from the command line args was empty, not encryptingrb   erroutr!      
r(   r   )r   r   rq   promptr   r
   r@   FROM_PROMPTr   rI   r   r   r   readendswith
FROM_STDINgetr~   ziprt   	FROM_ARGS_format_output_vault_stringsr   r   writer   
write_datar   )r   b_plaintextb_plaintext_listr   r   msgr   name_prompt_response
hide_inputprompt_response
stdin_textname_and_text_list	extra_argname_and_text	plaintextoutputsb_outsra   r   r   s                       r    r\   zVaultCLI.execute_encrypt_string!  s     #??62?aa3h?? ??23'CD#*>>2W#X  $r)+ %__-@AAJ4*%nnS*nEO"$)*lmm"?3K##[$2B2BD$IJ ))zz  "  !S  \`  a)JR)*KLLzz  ":+>+>t+D%":.K ??#>?D##[$//4$HI ??5u=!%c'//:P*QSW&X!Y 4y3122 _'+   - !*,3OO<R,STV,W!X'+   -
 "#&8"9":; =	"))4*;<=
 6:!:4)!:!: 0 	IM+OD)B)*wxx"9-K##[$..$$GH	I 334DtOdOd3e 	)F**UD)C**UB'C

  %MM(3-(	) 	cuzz&17??=3Q3XUXY::OO3DOA E @F ";s   
O$O$O)c                4   d}t        |      dkD  rd}g }t        |      D ]u  \  }}|\  }}}	| j                  j                  || j                  |      }
| j                  |
|	      }d }|r|dz   }|	r	d|	||fz  }nd||fz  }|j                  ||d       w |S )	NFrm   Tr   )r   zD# The encrypted version of variable ("%s", the string #%d from %s).
z4# The encrypted version of the string #%d from %s.)
)r   r   )rt   	enumerater   encrypt_bytesr   r   r@   )r   r   rb   show_delimiterra   indexb_plaintext_infor   srcr   r   	yaml_texterr_msghuman_indexs                 r    r   z%VaultCLI._format_output_vault_strings  s      1$!N 
 (11A'B 	>#E#%5"Kd;;44[$BUBU`h4iL 33Lt3LIG#aieimoz|  iA  AGUYdfiXjjGMM)G<=!	>$ r!   c                   t         j                  d   s5t        j                  j	                         rt
        j                  dd       t         j                  d   xs dgD ]0  }| j                  j                  |t         j                  d          2 t        j                  j	                         rt
        j                  dd       y	y	)
z; decrypt the supplied file using the provided vault secret r   z#Reading ciphertext input from stdinTr   rn   r(   )r(   zDecryption successfulN)	r   r   rI   r   r   rq   r   decrypt_filer   r   s     r    rX   zVaultCLI.execute_decrypt  s     v&399+;+;+=OOA$OO(1SE 	TAKK$$QGOOM4R$S	T ::OO3DOA r!   c                \   t        t        j                  d         dk7  rt        d      t        j
                  j                         st        j                  d   rG| j                  j                  t        j                  d   d   | j                  | j                         yt        d      )	zf create and open a file in an editor that will be encrypted with the provided vault secret when closedr   rm   z8ansible-vault create can take only one filename argumentr5   r   r   z"not a tty, editor cannot be openedN)rt   r   r   r   rI   r   r   r   create_filer   r   )r   s    r    rW   zVaultCLI.execute_create  s     wv&'1,%&`aa::'//2B"CKK##GOOF$;A$>@S@S-1-B-B $ D &&JKKr!   c                j    t         j                  d   D ]  }| j                  j                  |        y)za open and decrypt an existing vaulted file in an editor, that will be encrypted again when closedr   N)r   r   r   	edit_filer   s     r    rY   zVaultCLI.execute_edit  s,    ( 	%AKK!!!$	%r!   c                    t         j                  d   D ]7  }| j                  j                  |      }| j	                  t        |             9 y)z_ open, decrypt and view an existing vaulted file using a pager using the supplied vault secret r   N)r   r   r   r   pagerr	   )r   r   r   s      r    rZ   zVaultCLI.execute_view  sC     ( 	+A --a0IJJwy)*	+r!   c                    t         j                  d   D ]3  }| j                  j                  || j                  | j
                         5 t        j                  dd       y)zN re-encrypt a vaulted file with a new secret, the previous secret is required r   zRekey successfulTr   N)r   r   r   
rekey_filer   r   rq   r   s     r    r]   zVaultCLI.execute_rekey  sR    ( 	>AKK""1d&=&=#'#<#<>	>
 	*48r!   )NNN)__name__
__module____qualname____doc__r   r   r   r   r   rE   ro   r|   r[   staticmethodr   r\   r   rX   rW   rY   rZ   r]   __classcell__)r   s   @r    r   r      sz     DJ'I*K-D[L0fPB  $lB`B
B
L%

+9r!   r   c                .    t         j                  |        y r   )r   cli_executor)r   s    r    mainr     s    $r!   __main__r   )
__future__r   ansible.clir   rF   rI   ansibler   r   r   ansible.cli.argumentsr   rK   ansible.errorsr   +ansible.module_utils.common.text.convertersr	   r
   ansible.parsing.dataloaderr   ansible.parsing.vaultr   r   r   ansible.utils.displayr   rq   r   r   r    r!   r    <module>r      s_    #  	 
 "  < . I 1 M M )
)G9s G9T  zF r!   