Skip to content

Commit f05a8a3

Browse files
committed
fix(logging): distinguish credential labels from secret values
1 parent 813a29c commit f05a8a3

2 files changed

Lines changed: 23 additions & 4 deletions

File tree

‎runpod/_logger.py‎

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -109,12 +109,20 @@ def log(self, message, message_level="INFO", job_id=None):
109109
print(f"{message_level.ljust(7)}| {message}", flush=True)
110110
return
111111

112-
def secret(self, secret_name, secret):
113-
"""Log the secret's name without exposing its value or length."""
112+
def secret(self, name=None, secret=None, **kwargs):
113+
"""Log a credential label without exposing its value or length.
114+
115+
`secret_name=` remains accepted for compatibility with older callers.
116+
"""
117+
if "secret_name" in kwargs:
118+
if name is not None:
119+
raise TypeError("Pass either name or secret_name, not both")
120+
name = kwargs.pop("secret_name")
121+
if kwargs:
122+
raise TypeError("Unexpected keyword argument to secret()")
114123
# Even a one-character value must be completely redacted. Do not call
115124
# str(secret): custom objects may reveal sensitive data or raise.
116-
self.info(f"{secret_name}: [REDACTED]")
117-
125+
self.info(f"{name}: [REDACTED]")
118126

119127
def debug(self, message, request_id: Optional[str] = None):
120128
"""

‎tests/test_serverless/test_modules/test_logger.py‎

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,17 @@ def __str__(self):
119119
self.logger.secret("credential", value)
120120
mock_log.assert_called_once_with("credential: [REDACTED]", "INFO", None)
121121

122+
def test_secret_legacy_keyword_label(self):
123+
with patch.object(self.logger, "log") as mock_log:
124+
self.logger.secret(secret_name="credential", secret="sensitive")
125+
mock_log.assert_called_once_with("credential: [REDACTED]", "INFO", None)
126+
127+
def test_secret_rejects_conflicting_or_unknown_labels(self):
128+
with self.assertRaises(TypeError):
129+
self.logger.secret("first", "sensitive", secret_name="second")
130+
with self.assertRaises(TypeError):
131+
self.logger.secret("credential", "sensitive", unexpected="value")
132+
122133
def test_log_tip(self):
123134
"""
124135
Tests that the tip method logs a tip.

0 commit comments

Comments
 (0)