Source code for aeat.adapters.persistence.storage.master_key._master_key_io
"""Master-key byte encoding, secure writes, and passphrase resolution."""from__future__importannotationsimportbase64importgetpassimportosimportsecretsimportsysfromcollections.abcimportCallablefrompathlibimportPathfromtypingimportFinalfrom.....core.locksimportfsync_parent_dirfrom.....core.loggingimportget_loggerfrom..errorsimportSecretStoreError__all__=["PASSPHRASE_ENV_VAR","PassphraseCallback","_b64decode","_b64encode","_default_passphrase_callback","_zeroise","atomic_write_secure_bytes",]_log=get_logger(__name__)PASSPHRASE_ENV_VAR:Final[str]="AEAT_SECRET_PASSPHRASE"# noqa: S105 - env var name, not secret value"""Environment variable consulted by the file backend before prompting."""PassphraseCallback=Callable[[],str]"""Pluggable hook for tests — callable returning the passphrase as a str."""def_b64encode(data:bytes)->str:returnbase64.b64encode(data).decode("ascii")def_b64decode(text:str)->bytes:returnbase64.b64decode(text.encode("ascii"),validate=True)
[docs]defatomic_write_secure_bytes(target:Path,payload:bytes)->None:"""Atomically write ``payload`` to ``target`` with mode ``0o600``."""target.parent.mkdir(parents=True,exist_ok=True)tmp_path=target.with_name(f"{target.name}.{os.getpid()}.{secrets.token_hex(4)}.tmp")flags=os.O_WRONLY|os.O_CREAT|os.O_EXCLflags|=getattr(os,"O_NOINHERIT",0)flags|=getattr(os,"O_CLOEXEC",0)fd=os.open(tmp_path,flags,0o600)try:try:os.write(fd,payload)os.fsync(fd)finally:os.close(fd)os.replace(tmp_path,target)fsync_parent_dir(target)exceptBaseException:_log.error("master_key: atomic write failed target=%s",target,exc_info=True)try:os.unlink(tmp_path)exceptOSErrorascleanup_exc:_log.debug("master_key: atomic write tempfile cleanup failed error_type=%s",type(cleanup_exc).__name__,)raise
def_zeroise(buffer:bytearray|None)->None:"""Best-effort overwrite of a mutable buffer with zero bytes."""ifbufferisNone:returnforiinrange(len(buffer)):buffer[i]=0def_default_passphrase_callback(getpass_fn:Callable[[str],str]|None=None)->str:"""Resolve the operator's passphrase from env or stdin."""from.....core.configimportload_settingsconfigured=load_settings().aeat_secret_passphraseifconfiguredisnotNone:normalized=configured.get_secret_value().rstrip("\r\n")ifnotnormalized:raiseSecretStoreError(f"{PASSPHRASE_ENV_VAR} is set to whitespace-only; supply a non-empty passphrase.",)returnnormalizedifgetpass_fnisNoneand(notsys.stdin.isatty()ornotsys.stderr.isatty()):raiseSecretStoreError(f"{PASSPHRASE_ENV_VAR} is not set and stdin is not interactive; ""re-run the command from an interactive terminal (the CLI prompts "f"for the passphrase) or provide {PASSPHRASE_ENV_VAR} through the ""Settings environment.",)resolver=getpass_fnifgetpass_fnisnotNoneelsegetpass.getpassreturnresolver("AEAT secret-store passphrase: ")