Skip to content

ci(fork-release): gate Tauri signing secrets behind release-signing environment - #14

Closed
Rwanbt wants to merge 1 commit into
devfrom
chore/g-004-release-signing-environment
Closed

Rwanbt wants to merge 1 commit into
devfrom
chore/g-004-release-signing-environment

Conversation

@Rwanbt

@Rwanbt Rwanbt commented Jul 20, 2026

Copy link
Copy Markdown
Owner

Summary

  • Adds environment: release-signing to the build-tauri job in fork-release.yml.
  • The two Tauri signing secrets (TAURI_SIGNING_PRIVATE_KEY, TAURI_SIGNING_PRIVATE_KEY_PASSWORD) were plain repo-level secrets on a public repo with zero Environment protection (found during G-001 GitHub audit).
  • release-signing Environment already created and configured (G-004, Unifia multi-AI runbook): required reviewer (Rwanbt), branch/tag policy restricted to dev, main, and v*-fork* tags.

Context

Part of the Unifia multi-AI orchestration runbook, Programme G (GitHub hardening). Full audit trail in the Obsidian vault: unifia-multi-ai-runbook/Logs/GITHUB-BASELINE-2026-07-20.md, unifia-multi-ai-runbook/Cards/G-004-*.

Note: publish.yml also references these secret names but is gated with if: github.repository == 'anomalyco/opencode' — it never runs on this fork, so it is out of scope for this change.

Remaining steps (not in this PR)

  • Migrate the actual secret values into the release-signing Environment (gh secret set TAURI_SIGNING_PRIVATE_KEY --env release-signing, same for the password) — requires the secret owner, cannot be done by an agent.
  • Once confirmed working, remove the old repo-level secrets.

Test plan

  • bun turbo typecheck passes (ran automatically via pre-push hook).
  • Manual: trigger fork-release.yml via workflow_dispatch after secrets are migrated, confirm the approval gate appears and the build succeeds once approved.

…nvironment

The TAURI_SIGNING_PRIVATE_KEY / TAURI_SIGNING_PRIVATE_KEY_PASSWORD secrets
were plain repo-level secrets on a public repo with no approval gate.
The build-tauri job now requires the release-signing Environment, which
enforces a manual reviewer approval and restricts which branches/tags can
access the secrets (dev, main, v*-fork* tags).

Secret values must still be migrated into the Environment by a human
(gh secret set ... --env release-signing) before this job can run.
@github-actions

Copy link
Copy Markdown

Hey! Your PR title ci(fork-release): gate Tauri signing secrets behind release-signing environment doesn't follow conventional commit format.

Please update it to start with one of:

  • feat: or feat(scope): new feature
  • fix: or fix(scope): bug fix
  • docs: or docs(scope): documentation changes
  • chore: or chore(scope): maintenance tasks
  • refactor: or refactor(scope): code refactoring
  • test: or test(scope): adding or updating tests

Where scope is the package name (e.g., app, desktop, opencode).

See CONTRIBUTING.md for details.

@github-actions

Copy link
Copy Markdown

This PR doesn't fully meet our contributing guidelines and PR template.

What needs to be fixed:

  • PR description is missing required template sections. Please use the PR template.

Please edit this PR description to address the above within 2 hours, or it will be automatically closed.

If you believe this was flagged incorrectly, please let a maintainer know.

@github-actions

Copy link
Copy Markdown

This pull request has been automatically closed because it was not updated to meet our contributing guidelines within the 2-hour window.

Feel free to open a new pull request that follows our guidelines.

@github-actions github-actions Bot closed this Jul 20, 2026
@Rwanbt
Rwanbt deleted the chore/g-004-release-signing-environment branch July 30, 2026 08:53
Rwanbt added a commit that referenced this pull request Oct 5, 2026
…297)

The 223 open alerts all carry the same most_recent_instance commit,
207ff45, which is origin/main and an ancestor of dev. The two analyses
since then, both on dev, completed with an empty error and 22 results each.
Of the 46 alerts carrying a security severity, 30 point at a path dev no
longer has; the remaining 16 can still describe dev, and 8 of those were
still true of the code at 26ba494.

github/index.ts took a URL out of a model-produced prompt and attached the
Action's GitHub token to the request, then wrote that URL to the log
unflattened (#14 critical, #23). attachmentUrl() now asserts the parsed
origin is https://github.com and the path is a user attachment before any
header exists; a URL that fails is dropped, never fetched. logSafe()
collapses control characters and bounds the line. The test asserts that
new URL() resolves ".." before the pathname is read, which is why
/user-attachments/../../settings/tokens is refused.

Three console scripts escaped only the quote in the env value they hand to
sst secret load (#2, #3, #4). The value is JSON read back from
sst secret list, so it holds escaped-quote pairs: escaping the quote alone
turned that into a double backslash followed by a quote, which closes the
value early, and a trailing backslash escaped the line's own closing quote.
quoteEnvValue() escapes the backslash first. Verified the test earns its
place: with the old escaping restored it is 0 pass / 3 fail.

checkMacosApp interpolated an IPC-supplied appName into a macOS .app path,
so a parent segment or a second separator could aim the existsSync probe
anywhere (#5). isBundleName() rejects anything that is not one plain
segment.

bundle-mobile.mjs joined its bun build arguments into a string and gave it
to execSync, i.e. a shell, with outdir coming from the command line (#8,
#35). execFileSync takes a list and spawns no shell.

formatDateForTable ended in .replace(",", ","), replacing a comma with
itself; removed, since Intl already emits the separator the locale wants
(#21).

Each fix has a regression test. No alert is dismissed and no query is
weakened.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant