Skip to content

Commit f39abe3

Browse files
committed
Improve logging of environment variables
Fixes: #3542
1 parent c5dccb8 commit f39abe3

File tree

2 files changed

+39
-2
lines changed

2 files changed

+39
-2
lines changed

src/tox/tox_env/api.py

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,30 @@
3131
from tox.tox_env.installer import Installer
3232

3333
LOGGER = logging.getLogger(__name__)
34+
SECRET_ENV_VAR_REGEX = re.compile(
35+
r"""(?ix) # case-insensitive, verbose mode
36+
^\s* # optional leading whitespace
37+
(?P<key> # capture group: key
38+
(?:\w*(_)?)
39+
(?:
40+
(SECRET|TOKEN|KEY|PASSWORD|PWD|CRED|PRIVATE|AUTH|API)
41+
)
42+
(?:\w*) # allow variable prefixes/suffixes
43+
)\s*=\s* # equal sign with optional spaces
44+
(?P<value> # capture group: value
45+
(['"])? # optional opening quote
46+
([A-Za-z0-9\-_]{12,}) # suspicious value (long, alphanumeric)
47+
\1? # optional closing quote matching opening
48+
)
49+
"""
50+
)
51+
52+
53+
def redact_value(name: str, value: str) -> str:
54+
"""Returns a redacted text if the key name looks like a secret."""
55+
if SECRET_ENV_VAR_REGEX.match(name):
56+
return "*" * len(value)
57+
return value
3458

3559

3660
class ToxEnvCreateArgs(NamedTuple):
@@ -461,8 +485,8 @@ def _write_execute_log(env_name: str, log_file: Path, request: ExecuteRequest, s
461485
with log_file.open("wt", encoding="utf-8") as file:
462486
file.write(f"name: {env_name}\n")
463487
file.write(f"run_id: {request.run_id}\n")
464-
for env_key, env_value in request.env.items():
465-
file.write(f"env {env_key}: {env_value}\n")
488+
for env_key, env_value in sorted(request.env.items()):
489+
file.write(f"env {env_key}: {redact_value(name=env_key, value=env_value)}\n")
466490
for meta_key, meta_value in status.metadata.items():
467491
file.write(f"metadata {meta_key}: {meta_value}\n")
468492
file.write(f"cwd: {request.cwd}\n")

tests/tox_env/test_api.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@
22

33
from typing import TYPE_CHECKING
44

5+
import pytest
6+
7+
from tox.tox_env.api import redact_value
8+
59
if TYPE_CHECKING:
610
from pathlib import Path
711

@@ -32,3 +36,12 @@ def test_setenv_section_substitution(tox_project: ToxProjectCreator) -> None:
3236
project = tox_project({"tox.ini": ini})
3337
result = project.run()
3438
result.assert_success()
39+
40+
41+
@pytest.mark.parametrize(
42+
("key", "value", "expected"), [pytest.param("FOO", "bar", "bar"), pytest.param("GITHUB_TOKEN", "foo", "***")]
43+
)
44+
def test_redact(key: str, value: str, expected: str) -> None:
45+
"""Ensures that redact_value works as expected."""
46+
result = redact_value(key, value)
47+
assert result == expected

0 commit comments

Comments
 (0)