From f753d416f31f5e490811a66bcc93dc2fa81becbd Mon Sep 17 00:00:00 2001 From: Bhautik Date: Sat, 19 Sep 2026 02:30:20 +0530 Subject: [PATCH] fix(security): redact delegated token in formatted output --- CHANGELOG.md | 5 +++++ src/createos/models.py | 2 +- tests/test_sdk.py | 2 ++ 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7bd8c08..b28a011 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,11 @@ Versions follow [Semantic Versioning](https://semver.org/). ## [Unreleased] +### Fixed + +- Redact plaintext sandbox access tokens from response representations to + prevent accidental disclosure in logs. + ### Changed - Set the next package version to `0.1.3` on the patch release line. diff --git a/src/createos/models.py b/src/createos/models.py index e14278b..16ce737 100644 --- a/src/createos/models.py +++ b/src/createos/models.py @@ -592,7 +592,7 @@ class Sandbox(Model): class SandboxAccessTokenCreateResponse(Model): """Plaintext delegated token returned only on creation or rotation.""" - token: str + token: str = field(repr=False) enabled: bool created_at: datetime rotated_at: datetime | None = None diff --git a/tests/test_sdk.py b/tests/test_sdk.py index c291147..58a2f8f 100644 --- a/tests/test_sdk.py +++ b/tests/test_sdk.py @@ -82,6 +82,8 @@ def handler(request): sandbox = client.get_sandbox("sb-1") created = sandbox.create_access_token() assert created.token == "skp_sb_first" and created.created_at.year == 2026 + assert created.token not in repr(created) + assert "enabled=True" in repr(created) assert sandbox.get_access_token().token_hint == "skp_sb...irst" worker = sandbox.with_access_token(created.token) assert worker is not sandbox and worker.files is not sandbox.files