Skip to content

Provide a verified signed Fedora repository - #46

Merged
dskvr merged 7 commits into
feature/35-signed-aptfrom
feature/36-signed-fedora-repo
Sep 29, 2026
Merged

dskvr merged 7 commits into
feature/35-signed-aptfrom
feature/36-signed-fedora-repo

Conversation

@dskvr

@dskvr dskvr commented Sep 5, 2026

Copy link
Copy Markdown
Member

Fedora 44 users currently need a signed-checksum download flow plus a local RPM signature exception. This adds the complete development surface for a project-owned Fedora repository: exact public-release provenance, embedded RPM and repodata signing, guarded publication, scoped bootstrap, lifecycle proof, protected automation, and gated website integration.

This is an intentional stack on #35 / PR #45 and targets feature/35-signed-apt. It reuses that PR’s SSH/POSIX publisher, protected-environment, public-activation, and guest-proof foundation. The Fedora work is isolated in its own generator, publisher, workflow, configuration, docs, and tests.

packaging/repositories/fedora-channel.json remains pending. Existing Fedora installation remains visible until the human operational tasks provision and publicly verify the channel. A reviewed activation record switches only the Fedora panel to sudo dnf install loopwire and links one-time setup separately.

resolves #36

Architecture and behavior

  • Selects project-owned hosting over COPR so the existing authenticated GitHub Release RPM remains the traceable source. The repository copy is signed without mutating the release asset; source and distributed hashes are recorded separately.
  • Requires gpgcheck=1, repo_gpgcheck=1, and sslverify=1. The RPM and detached repomd.xml signature are independently pinned to the repository OpenPGP key.
  • Retains global immutable RPMs, keys, checksum-named repodata, and private snapshots. Revision CAS, writer locking, collision rejection, durable recovery, and freshly signed rollback fail closed. Publication installs the new signature before atomically replacing repomd.xml; real DNF rejects the brief mixed state and accepts it after recovery.
  • Adds protected release/manual/weekly automation in packages-production, a repeat-safe Fedora setup/removal helper, exact HTTPS public verification, and a gated channel record.
  • Updates the Fedora homepage path, install/support/release/packaging docs, user guide, maintainer runbook, navigation, and unreleased notes. Automatic and signed direct-download installs remain available.

No audio/backend behavior or application dependencies changed. The checksum-pinned Fedora 44 tool image exercised RPM 6.0.2, createrepo_c 1.2.1, and DNF5 5.4.3.0.

Validation

  • Final pnpm check passed after the live guest fixes: all project verification, types, 295 workspace tests, 22 Rust tests, APT/Fedora repository suites, native packaging, production builds, and static-site checks.
  • Final pnpm verify:rpm-repository passed: 13 generator, 20 publisher, 7 bootstrap, 6 public HTTPS, 3 workflow preflight, 34 raw proof-verifier, and 4 channel-gate cases.
  • Real DNF accepted correctly signed package/metadata and rejected wrong signers, unsigned/tampered RPMs, changed metadata, and an interrupted signature/XML pair. Recovery, actual SSH without remote GPG, all journal checkpoints, separate-process locking, CAS, restrictive permissions, Nginx cache/404 behavior, version order and rollback passed.
  • A clean checksum-pinned Fedora 44 KVM guest used the actual public v0.1.0 Fedora RPM authenticated by SHA256SUMS.sig, release-assets.json, the public release commit, and tar RELEASE. It installed/reinstalled through DNF, upgraded to the explicitly synthetic fixture, downgraded to the public baseline, removed it, and removed the repository. Independent proof binds repository origin, embedded signatures, source/distributed hashes, installed /usr bytes, providers, backend JSON, GUI linkage, and a real X11 window.
  • Pending and activated-fixture Chromium checks passed all platform/keyboard/copy/no-JavaScript/responsive/motion paths. The activated fixture additionally proved the short Fedora command, separate setup link, and rendered URL/fingerprint command; pending state was restored.
  • Workflow contracts, actionlint, ShellCheck, Python/Node/Ruby/Bash syntax, docs/build checks and whitespace passed. Targeted re-review approved the strengthened public-release provenance.

Human operations remaining

The issue’s five Human operational tasks remain unchecked: confirm the project-owned provider/owner, provision HTTPS/SSH storage, establish signing/recovery ownership, configure packages-production, and complete the first public publication plus clean-client verification. No production host, account, key, credential, environment value, DNS/TLS, repository, deployment, or website activation was changed.

Loopwire’s verifier enforces its signed metadata deadline; DNF signature checks do not natively prevent replay of older correctly signed metadata. Operations therefore retain HTTPS/origin monitoring and weekly refresh. Power-loss and network filesystems were not exercised; production requires local POSIX flock/fsync/atomic-rename semantics.

Detailed requirement mapping and evidence

Record the project-owned provider decision, embedded RPM and repository
signature boundaries, Fedora 44 target, rollback policy, public activation
gate, and clean-guest evidence required by issue 36.

Constraint: This is an intentional stack on PR 45 to reuse publication foundations
Rejected: COPR | provider-built output requires separate provenance and promotion evidence
Confidence: high
Scope-risk: narrow
Tested: Plan maps every development task and human activation boundary in issue 36
Authenticate the published Fedora 44 release RPM, sign the staged repository
copy and repomd metadata with a dedicated OpenPGP identity, and publish through
the reviewed SSH/POSIX revision protocol. Add protected refresh and rollback,
a scoped DNF bootstrap, public activation gating, and clean-guest proof.

The checked-in channel remains pending until the human production tasks supply
and verify its public URL, signing key, origin and workflow environment.

Constraint: Fedora 44 x86_64 is the only repository target in this slice
Constraint: DNF does not natively enforce the project-signed metadata deadline
Rejected: COPR | provider-built packages require separate output and promotion proof
Confidence: high
Scope-risk: moderate
Directive: Preserve global immutable RPM/repodata URLs and publish repomd.xml last
Directive: Keep gpgcheck, repo_gpgcheck and sslverify enabled in client configuration
Tested: 13 generator, 20 publisher, 7 bootstrap, 6 HTTPS, 3 preflight, 34 proof and 4 channel cases
Tested: Real DNF package/metadata signatures, interruption recovery and actual SSH transport
Tested: Pending/verified browser fixtures, docs/build, workflow contracts, actionlint and ShellCheck
Not-tested: Fresh Fedora KVM lifecycle and full workspace gates follow this reproducible commit
Not-tested: Production origin/signing/environment/public activation remain human tasks
RPM 6 requires root ownership for its database lock even when the database is
outside the system path. Run only the disposable fixture database operations
through sudo while preserving the host RPM database and proof output.

Constraint: Signature verification must not import fixture keys into the guest system RPM database
Confidence: high
Scope-risk: narrow
Tested: Guest Bash syntax, ShellCheck, 34 proof-verifier regressions and whitespace
Not-tested: Clean Fedora KVM lifecycle rerun follows this commit
Fedora's RPM policy rejects database locks below a user's home even for a
root process. Use a unique root-owned /var/tmp database for the two offline
signature checks and remove it immediately, without touching the system RPM DB.

Constraint: Fedora RPM and SELinux policy controls usable database paths
Confidence: high
Scope-risk: narrow
Directive: Keep fixture key imports isolated from the system RPM database
Tested: Guest Bash syntax, ShellCheck, 34 proof mutations and whitespace
Not-tested: Clean Fedora KVM lifecycle rerun follows this commit
RPM 6 rejects a manually pre-created database directory under the Fedora guest
policy. Import the disposable public key directly through rpmkeys so RPM owns
initialization, verify both repository packages, and delete the database.

Constraint: RPM 6 owns initialization semantics for alternate database paths
Confidence: high
Scope-risk: narrow
Directive: Never point fixture rpmkeys operations at the system RPM database
Tested: Direct Fedora 44 rpmkeys alternate-db import; ShellCheck; 34 proof mutations
Not-tested: Clean Fedora KVM lifecycle rerun follows this commit
Lifecycle-stage signature checks reuse the disposable RPM database. Keep it
until the guest finishes and delete it from the exit trap together with the
HTTPS fixture, including on failures.

Constraint: Every install stage rechecks the exact repository RPM signature
Confidence: high
Scope-risk: narrow
Directive: Cleanup must remove the alternate database on every guest exit
Tested: Bash syntax, ShellCheck, 34 proof mutations and whitespace
Not-tested: Clean Fedora KVM lifecycle rerun follows this commit
Map all nine development requirements to the signed package, publication,
clean-guest, workflow and documentation evidence. Keep the five production
operations explicitly human-owned before public activation.

Constraint: The public release RPM is baseline proof; fixture signing and upgrade are not production material
Confidence: high
Scope-risk: narrow
Tested: Final pnpm check and Fedora KVM lifecycle proof at e73c5bb
Not-tested: Production origin and activation remain the issue's human tasks
@dskvr
dskvr merged commit 5e52a4f into feature/35-signed-apt Sep 29, 2026
8 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant