77from pathlib import Path
88
99import click
10+ from click .core import ParameterSource # click>=8
1011
1112from pyencrypt import __description__ , __version__
1213from pyencrypt .decrypt import decrypt_file
6970
7071DATETIME_FORMATS = ["%Y-%m-%dT%H:%M:%S %z" , "%Y-%m-%d %H:%M:%S" , "%Y-%m-%d" ]
7172
73+ ENVVAR_PREFIX = "PYE_ENCRYPT"
74+
7275
7376class KeyParamType (click .ParamType ):
7477 name = "key"
@@ -77,6 +80,17 @@ def _check_key(self, key: str) -> bool:
7780 return not (len (key ) % 4 or len (base64 .b64decode (key )) % 16 )
7881
7982 def convert (self , value , param , ctx ) -> str :
83+ if ctx .get_parameter_source (param .name ) == ParameterSource .ENVIRONMENT :
84+ visible_chars = 4
85+ masked = (
86+ value [:visible_chars ]
87+ + "*" * (len (value ) - 2 * visible_chars )
88+ + value [- visible_chars :]
89+ )
90+ click .echo (
91+ f'Using encryption key 🔑 { click .style (masked , fg = "yellow" )} from environment variable { click .style (param .envvar , fg = "bright_cyan" )} .'
92+ )
93+
8094 value = click .STRING .convert (value , param , ctx )
8195 if not self ._check_key (value ):
8296 self .fail (INVALID_KEY_MSG , param , ctx )
@@ -147,7 +161,13 @@ def cli():
147161 is_flag = True ,
148162)
149163@click .option (
150- "-k" , "--key" , default = None , help = KEY_OPTION_HELP , type = CustomParamType .KEY
164+ "-k" ,
165+ "--key" ,
166+ default = None ,
167+ help = KEY_OPTION_HELP ,
168+ type = CustomParamType .KEY ,
169+ envvar = f"{ ENVVAR_PREFIX } _KEY" ,
170+ show_envvar = True ,
151171)
152172@click .option (
153173 "--with-license" , default = False , help = "Add license to encrypted file" , is_flag = True
0 commit comments