Skip to content

feat(content): implement manifest installation instructions execution and GeneralsOnline EAC registration - #399

Merged
undead2146 merged 26 commits into
developmentfrom
feat/installation-instructions-service
Aug 20, 2026
Merged

feat(content): implement manifest installation instructions execution and GeneralsOnline EAC registration#399
undead2146 merged 26 commits into
developmentfrom
feat/installation-instructions-service

Conversation

@undead2146

Copy link
Copy Markdown
Member

Summary

Implements the manifest installation instructions execution engine and configures Easy Anti-Cheat (EAC) product registration as a post-acquisition installation step on GeneralsOnline game client manifests, resolving issue #342.

Motivation & Solution

GeneralsOnline requires registration of the EAC product ID (fc1cc0d936424212b645105f084d08b0) via EasyAntiCheat_EOS_Setup.exe post-acquisition. To futureproof against arbitrary/malicious execution while ensuring clear UX and update idempotency:

  1. Replaced free-form commands with a typed, closed-kind installation step model (RunVerifiedInstaller, RemoveFile, RenameFile).
  2. Implemented IInstallationInstructionsService enforcing publisher trust boundaries, workspace path containment via PathHelper.IsPathContainedIn, and manifest file declaration + SHA-256 hash verification before execution.
  3. Added user notifications via INotificationService clearly communicating step execution.
  4. Added RunOnce / StepKey state persistence in UserSettings and detection logic so users cleanly skip the installation step on updates if already executed.

Changes

  • Core Models & Interfaces:
    • Added InstallationStepKind enum.
    • Refactored InstallationStep to typed model with Kind, TargetRelativePath, DestinationRelativePath, Arguments, RequiresElevation, StatusMessage, StepKey, and RunOnce.
    • Added typed methods to IContentManifestBuilder and ContentManifestBuilder.
    • Added IsPathContainedIn and NormalizeRelativePath to PathHelper.
    • Added ExecutedInstallationSteps collection and helper methods to UserSettings.
    • Added IInstallationInstructionsService contract.
  • Content Pipeline & Delivery:
    • Implemented InstallationInstructionsService with publisher allowlisting (TrustedExecutablePublishers), path containment verification, file integrity checks, user notifications, async execution, and RunOnce update skipping.
    • Wired IInstallationInstructionsService into BaseContentProvider.PrepareContentAsync and all 8 derived content providers.
    • Updated FileSystemDeliverer and HttpContentDeliverer to preserve InstallationInstructions.
    • Configured GeneralsOnlineManifestFactory to declare the EAC post-install step on 60Hz GameClient manifests when EasyAntiCheat_EOS_Setup.exe is present.
  • Tests:
    • Created InstallationInstructionsServiceTests covering security checks, hash verification, notifications, step execution, RunOnce skipping, and force bypass.
    • Updated GeneralsOnlineManifestFactoryEacTests, BaseContentProviderTests, GitHubContentProviderTests, ContentManifestBuilderTests, and PathHelperTests.

Verification

  • All unit tests written and verified
  • Strictly adheres to repository rules and coding standards
  • Cross-platform path containment and Windows elevation handling implemented

Closes #342

Comment thread GenHub/GenHub/Features/Content/Services/InstallationInstructionsService.cs Outdated
Comment thread GenHub/GenHub/Features/Content/Services/InstallationInstructionsService.cs Outdated
@community-outpost community-outpost deleted a comment from kilo-code-bot Bot Aug 19, 2026
@undead2146 undead2146 changed the title feat(content): implement manifest installation instructions execution engine and GeneralsOnline EAC registration (#342) feat(content): implement manifest installation instructions execution engine and GeneralsOnline EAC registration Aug 19, 2026
coderabbitai[bot]

This comment was marked as resolved.

@community-outpost community-outpost deleted a comment from kilo-code-bot Bot Aug 19, 2026
@community-outpost community-outpost deleted a comment from coderabbitai Bot Aug 19, 2026
@community-outpost community-outpost deleted a comment from coderabbitai Bot Aug 19, 2026
Comment thread GenHub/GenHub/Features/Content/Services/ContentProviders/BaseContentProvider.cs Outdated
Comment thread GenHub/GenHub/Features/Content/Services/ContentProviders/BaseContentProvider.cs Outdated
Comment thread GenHub/GenHub.Core/Models/Common/UserSettings.cs
Comment thread GenHub/GenHub/Features/Content/Services/InstallationInstructionsService.cs Outdated
Comment thread GenHub/GenHub/Features/Content/Services/InstallationInstructionsService.cs Outdated
Comment thread GenHub/GenHub/Features/Content/Services/InstallationInstructionsService.cs Outdated
Comment thread GenHub/GenHub/Features/Content/Services/InstallationInstructionsService.cs Outdated
Comment thread GenHub/GenHub/Features/Content/Services/ContentProviders/BaseContentProvider.cs Outdated
@community-outpost community-outpost deleted a comment from kilo-code-bot Bot Aug 19, 2026
@community-outpost community-outpost deleted a comment from coderabbitai Bot Aug 19, 2026
@community-outpost community-outpost deleted a comment from kilo-code-bot Bot Aug 19, 2026
@community-outpost community-outpost deleted a comment from qodo-code-review Bot Aug 19, 2026
@community-outpost community-outpost deleted a comment from qodo-code-review Bot Aug 19, 2026
@community-outpost community-outpost deleted a comment from deepsource-io Bot Aug 19, 2026
@coderabbitai coderabbitai Bot added Enhancement New feature or request Testing Topic related to (unit) tests labels Aug 19, 2026
@community-outpost community-outpost deleted a comment from deepsource-io Bot Aug 19, 2026
@community-outpost community-outpost deleted a comment from kilo-code-bot Bot Aug 19, 2026
coderabbitai[bot]

This comment was marked as resolved.

@community-outpost community-outpost deleted a comment from coderabbitai Bot Aug 19, 2026
@community-outpost community-outpost deleted a comment from coderabbitai Bot Aug 19, 2026
@community-outpost community-outpost deleted a comment from coderabbitai Bot Aug 19, 2026
@community-outpost community-outpost deleted a comment from kilo-code-bot Bot Aug 19, 2026
@community-outpost community-outpost deleted a comment from deepsource-io Bot Aug 19, 2026
@undead2146
undead2146 force-pushed the feat/installation-instructions-service branch from 2082054 to e4e493b Compare August 19, 2026 14:49
@community-outpost community-outpost deleted a comment from coderabbitai Bot Aug 19, 2026
@community-outpost community-outpost deleted a comment from deepsource-io Bot Aug 19, 2026
Comment thread GenHub/GenHub.Tests/GenHub.Tests.Core/Helpers/PathHelperTests.cs Outdated
@community-outpost community-outpost deleted a comment from kilo-code-bot Bot Aug 20, 2026
@community-outpost community-outpost deleted a comment from coderabbitai Bot Aug 20, 2026
@community-outpost community-outpost deleted a comment from deepsource-io Bot Aug 20, 2026
@coderabbitai coderabbitai Bot removed Enhancement New feature or request Testing Topic related to (unit) tests labels Aug 20, 2026
coderabbitai[bot]

This comment was marked as resolved.

@community-outpost community-outpost deleted a comment from coderabbitai Bot Aug 20, 2026
@community-outpost community-outpost deleted a comment from deepsource-io Bot Aug 20, 2026
@community-outpost community-outpost deleted a comment from deepsource-io Bot Aug 20, 2026
@community-outpost community-outpost deleted a comment from kilo-code-bot Bot Aug 20, 2026
@community-outpost community-outpost deleted a comment from coderabbitai Bot Aug 20, 2026
Comment thread GenHub/GenHub/Features/Content/Services/InstallationInstructionsService.cs Outdated
Comment thread GenHub/GenHub/Features/Content/Services/InstallationInstructionsService.cs Outdated
@community-outpost community-outpost deleted a comment from coderabbitai Bot Aug 20, 2026
@community-outpost community-outpost deleted a comment from kilo-code-bot Bot Aug 20, 2026
@bobtista

Copy link
Copy Markdown
Collaborator

non windows still fails with "requires administrator elevation, which is only supported on Windows"

HttpContentDeliverer should probably become its own PR - It's unrelated to installation instructions, it alters behavior for all HTTP content acquisition, and like half the blocking findings from bots on this PR.

…horization, and handle EAC registry exceptions
@community-outpost community-outpost deleted a comment from coderabbitai Bot Aug 20, 2026
@community-outpost community-outpost deleted a comment from deepsource-io Bot Aug 20, 2026
@community-outpost community-outpost deleted a comment from deepsource-io Bot Aug 20, 2026
@community-outpost community-outpost deleted a comment from coderabbitai Bot Aug 20, 2026
@community-outpost community-outpost deleted a comment from deepsource-io Bot Aug 20, 2026
@undead2146

Copy link
Copy Markdown
Member Author

Thanks @bobtista!

Updates in this revision:

  1. HttpContentDeliverer revert: Reverted HttpContentDeliverer to the development baseline so it can be addressed in its own focused PR without affecting this PR's scope.
  2. GeneralsOnline SHA256 propagation: The sha256 hash exposed by the Generals Online API is now populated on GeneralsOnlineRelease.Sha256 via GeneralsOnlineJsonCatalogParser, propagated to ManifestFile.Hash and InstallationInstructions.DownloadHash by GeneralsOnlineManifestFactory, and passed as expectedHash to IDownloadService.DownloadFileAsync in GeneralsOnlineDeliverer.
  3. Non-Windows behavior: Verified that non-Windows environments are handled cleanly with platform guards on GeneralsOnlineProvider and InstallationInstructionsService.

All 2,061 Core tests, Linux tests, and the full CI build matrix (Windows, Linux, macOS, Smoke Test, Kilo Review) are 100% passing.

@undead2146 undead2146 changed the title feat(content): implement manifest installation instructions execution engine and GeneralsOnline EAC registration feat(content): implement manifest installation instructions execution and GeneralsOnline EAC registration Aug 20, 2026
@undead2146
undead2146 merged commit 9ba33de into development Aug 20, 2026
14 checks passed
@undead2146
undead2146 deleted the feat/installation-instructions-service branch August 20, 2026 15:58
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.

2 participants