From 2cdfdb9b867881ed6b67d4c8a03fb88bda01282d Mon Sep 17 00:00:00 2001 From: Val Alexander Date: Fri, 14 Aug 2026 09:40:20 -0500 Subject: [PATCH] fix(hosted): prevent credential disclosure Signed-off-by: Codex --- deploy/coven-github/coven_github_adapter.py | 30 ++++++- .../coven-github/test_coven_github_adapter.py | 78 +++++++++++++++++++ 2 files changed, 107 insertions(+), 1 deletion(-) diff --git a/deploy/coven-github/coven_github_adapter.py b/deploy/coven-github/coven_github_adapter.py index 884d2d2..d066c4b 100644 --- a/deploy/coven-github/coven_github_adapter.py +++ b/deploy/coven-github/coven_github_adapter.py @@ -290,6 +290,14 @@ def trigger_enabled(policy, trigger): return trigger in set(enabled or []) +def comment_author_is_trusted(comment): + return str(comment.get("author_association") or "").upper() in { + "OWNER", + "MEMBER", + "COLLABORATOR", + } + + def build_task_from_event(event_name, delivery_id, payload, policy): repository = payload.get("repository") or {} installation = payload.get("installation") or {} @@ -319,6 +327,8 @@ def build_task_from_event(event_name, delivery_id, payload, policy): return ignored(base, "issue_comment_without_mention") if not trigger_enabled(policy, "issue_mention"): return ignored(base, "issue_mention_not_enabled") + if not comment_author_is_trusted(comment): + return ignored(base, "issue_mention_author_not_trusted") if issue.get("pull_request"): base.update( { @@ -356,6 +366,8 @@ def build_task_from_event(event_name, delivery_id, payload, policy): return ignored(base, "pr_review_comment_without_mention") if not trigger_enabled(policy, "pr_review_comment"): return ignored(base, "pr_review_comment_not_enabled") + if not comment_author_is_trusted(comment): + return ignored(base, "pr_review_comment_author_not_trusted") base.update( { "trigger": "pr_review_comment", @@ -1249,7 +1261,10 @@ def publish_result_if_configured(task, result_path, token): task["publication_state"] = "publication_skipped_no_issue_or_pr_number" return - body = publication_comment_body(task, result) + body = redact_secrets( + publication_comment_body(task, result), + [token, load_codex_access_token()], + ) repo = task.get("repository") url = "https://api.github.com/repos/{}/issues/{}/comments".format(repo, int(number)) try: @@ -1649,6 +1664,19 @@ def redact_tokenish(text): return redacted +def redact_secrets(text, secret_values=()): + redacted = str(text) + for secret in secret_values: + if secret: + redacted = redacted.replace(str(secret), "[redacted]") + redacted = redact_tokenish(redacted) + return re.sub( + r"(?