Harden OOBE, launch-source and elevation flow
Introduce a per-user OOBE state model and hardened launch/elevation handling. Adds OobeStateFile/OobeLaunchDecision models, OobeStateService (persisting %LOCALAPPDATA%/.launcher/state/oobe-state.json), and LauncherExecutionContext to capture elevation and user SID. CommandContext now normalizes/infers launch-source values (normal, postinstall, apply-update, plugin-install, debug-preview) and exposes maintenance checks. LauncherFlowCoordinator propagates richer launcher context details for diagnostics and suppresses OOBE for elevated/maintenance contexts. PluginInstallerService avoids requesting elevation for user-scoped installs and returns a clear error when installation target is outside the current user's LocalAppData. LauncherClient maps and surfaces result codes, UpdateWorkflow and installer invocation now pass explicit --launch-source values, and WelcomeOobeStep persists OOBE completion via the new service. Adds unit tests (CommandContext, OobeStateService, PluginInstallerService), docs/specs/checklists for the contract, and makes internals visible to tests.
2026-04-22 09:25:22 +08:00
|
|
|
namespace LanMountainDesktop.Launcher.Models;
|
|
|
|
|
|
|
|
|
|
internal enum OobeStateStatus
|
|
|
|
|
{
|
|
|
|
|
FirstRun,
|
|
|
|
|
Completed,
|
|
|
|
|
Unavailable,
|
|
|
|
|
Suppressed
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
internal sealed class OobeStateFile
|
|
|
|
|
{
|
|
|
|
|
public int SchemaVersion { get; init; } = 1;
|
|
|
|
|
|
|
|
|
|
public string CompletedAtUtc { get; init; } = string.Empty;
|
|
|
|
|
|
|
|
|
|
public string UserName { get; init; } = string.Empty;
|
|
|
|
|
|
|
|
|
|
public string? UserSid { get; init; }
|
|
|
|
|
|
|
|
|
|
public string LaunchSource { get; init; } = string.Empty;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
internal sealed class OobeLaunchDecision
|
|
|
|
|
{
|
|
|
|
|
public OobeStateStatus Status { get; init; }
|
|
|
|
|
|
|
|
|
|
public bool ShouldShowOobe { get; init; }
|
|
|
|
|
|
|
|
|
|
public string StatePath { get; init; } = string.Empty;
|
|
|
|
|
|
|
|
|
|
public string LaunchSource { get; init; } = "normal";
|
|
|
|
|
|
|
|
|
|
public bool IsElevated { get; init; }
|
|
|
|
|
|
|
|
|
|
public string UserName { get; init; } = string.Empty;
|
|
|
|
|
|
|
|
|
|
public string? UserSid { get; init; }
|
|
|
|
|
|
|
|
|
|
public string ResultCode { get; init; } = "ok";
|
|
|
|
|
|
|
|
|
|
public string SuppressionReason { get; init; } = string.Empty;
|
|
|
|
|
|
|
|
|
|
public string ErrorMessage { get; init; } = string.Empty;
|
|
|
|
|
|
|
|
|
|
public bool UsedLegacyMarker { get; init; }
|
|
|
|
|
|
|
|
|
|
public bool MigratedLegacyMarker { get; init; }
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
internal sealed class OobeCompletionResult
|
|
|
|
|
{
|
|
|
|
|
public bool Success { get; init; }
|
|
|
|
|
|
|
|
|
|
public string ResultCode { get; init; } = "ok";
|
|
|
|
|
|
|
|
|
|
public string ErrorMessage { get; init; } = string.Empty;
|
|
|
|
|
}
|
|
|
|
|
|
2026-06-05 11:08:11 +08:00
|
|
|
internal sealed class OobeSessionDraft
|
|
|
|
|
{
|
|
|
|
|
public DataLocationMode DataLocationMode { get; init; } = DataLocationMode.System;
|
|
|
|
|
|
|
|
|
|
public bool MigrateExistingData { get; init; }
|
|
|
|
|
|
|
|
|
|
public HostAppSettingsStartupChoices StartupChoices { get; init; }
|
|
|
|
|
|
|
|
|
|
public PrivacyConfig PrivacyConfig { get; init; } = new();
|
|
|
|
|
|
|
|
|
|
public bool PrivacyAgreementAccepted { get; init; }
|
|
|
|
|
|
|
|
|
|
public string PrivacyUserId { get; init; } = string.Empty;
|
|
|
|
|
|
|
|
|
|
public string PrivacyDeviceId { get; init; } = string.Empty;
|
|
|
|
|
}
|
|
|
|
|
|
Harden OOBE, launch-source and elevation flow
Introduce a per-user OOBE state model and hardened launch/elevation handling. Adds OobeStateFile/OobeLaunchDecision models, OobeStateService (persisting %LOCALAPPDATA%/.launcher/state/oobe-state.json), and LauncherExecutionContext to capture elevation and user SID. CommandContext now normalizes/infers launch-source values (normal, postinstall, apply-update, plugin-install, debug-preview) and exposes maintenance checks. LauncherFlowCoordinator propagates richer launcher context details for diagnostics and suppresses OOBE for elevated/maintenance contexts. PluginInstallerService avoids requesting elevation for user-scoped installs and returns a clear error when installation target is outside the current user's LocalAppData. LauncherClient maps and surfaces result codes, UpdateWorkflow and installer invocation now pass explicit --launch-source values, and WelcomeOobeStep persists OOBE completion via the new service. Adds unit tests (CommandContext, OobeStateService, PluginInstallerService), docs/specs/checklists for the contract, and makes internals visible to tests.
2026-04-22 09:25:22 +08:00
|
|
|
internal sealed record LauncherExecutionSnapshot(
|
|
|
|
|
bool IsElevated,
|
|
|
|
|
string UserName,
|
|
|
|
|
string? UserSid);
|