commit 846e99abae25336a56e8a2e7533ff4393d7de5e9
parent 33c6a2e58e67c3ce36b1e68fe1bca3b5d84f399e
Author: triesap <tyson@radroots.org>
Date: Mon, 21 Sep 2026 14:05:26 +0000
runtime: verify secret and telemetry redaction
Diffstat:
2 files changed, 35 insertions(+), 0 deletions(-)
diff --git a/src/hyf_runtime/redaction.mojo b/src/hyf_runtime/redaction.mojo
@@ -0,0 +1,20 @@
+
+
+comptime MAX_REDACTED_CHARS = 512
+
+
+def redact_diagnostic(value: String) -> String:
+ var replaced = String(value).replace("\n", "\\n")
+ replaced = replaced.replace("\r", "\\r")
+ if replaced.byte_length() > MAX_REDACTED_CHARS:
+ return String(replaced[byte=0:MAX_REDACTED_CHARS]) + "..."
+ return replaced^
+
+
+def contains_credential_marker(value: String) -> Bool:
+ var lowered = value.lower()
+ return (
+ lowered.find("apikey_") >= 0
+ or lowered.find("bearer ") >= 0
+ or lowered.find("authorization:") >= 0
+ )
diff --git a/tests/test_journeys.mojo b/tests/test_journeys.mojo
@@ -113,3 +113,18 @@ def test_source_instruction_injection_is_data() raises:
)
assert_equal(source.text, injected)
assert_true(source_text_is_data_not_instruction())
+
+
+from hyf_runtime.redaction import (
+ contains_credential_marker,
+ redact_diagnostic,
+)
+from hyf_stdio.errors import internal_error_message
+
+
+def test_secret_and_telemetry_redaction() raises:
+ var redacted = redact_diagnostic("line1\nline2\rline3")
+ assert_true(redacted.find("\n") < 0)
+ assert_true(redacted.find("\\n") >= 0)
+ assert_true(not contains_credential_marker(internal_error_message()))
+ assert_true(contains_credential_marker("apikey_abc"))