diff --git a/Launcher.Next.App/LocalParityLaunchService.cs b/Launcher.Next.App/LocalParityLaunchService.cs index de21f4d..c115210 100644 --- a/Launcher.Next.App/LocalParityLaunchService.cs +++ b/Launcher.Next.App/LocalParityLaunchService.cs @@ -138,5 +138,23 @@ internal sealed class LocalParityLaunchService private static async Task HashAsync(string path, CancellationToken ct) { await using var stream = File.OpenRead(path); return Convert.ToHexString(await SHA256.HashDataAsync(stream, ct)); } private static string Fingerprint(string path, string salt) => Convert.ToHexString(SHA256.HashData(Encoding.UTF8.GetBytes(salt + "|" + path))); private static async Task WriteEvidenceAsync(string directory, object value, CancellationToken ct) { var final = Path.Combine(directory, "controlled-local-parity-launch.json"); var temp = final + ".tmp"; await using (var stream = new FileStream(temp, FileMode.CreateNew, FileAccess.Write, FileShare.None)) { await JsonSerializer.SerializeAsync(stream, value, cancellationToken: ct); await stream.FlushAsync(ct); } File.Move(temp, final); using var doc = JsonDocument.Parse(await File.ReadAllTextAsync(final, ct)); if (doc.RootElement.GetProperty("schemaVersion").GetInt32() != 3) throw new InvalidOperationException("LOCAL_PARITY_EVIDENCE_INVALID"); return final; } - private static string ThisCommit() { try { var start = new ProcessStartInfo("git", "rev-parse HEAD") { WorkingDirectory = AppContext.BaseDirectory, UseShellExecute = false, RedirectStandardOutput = true }; using var p = Process.Start(start); return p is null ? "unknown" : p.StandardOutput.ReadToEnd().Trim(); } catch { return "unknown"; } } + private static string ThisCommit() + { + var embedded = Environment.GetEnvironmentVariable("LAUNCHER_COMMIT"); + if (!string.IsNullOrWhiteSpace(embedded)) return embedded; + try + { + var releaseManifest = Path.Combine(AppContext.BaseDirectory, "owner-review-release.json"); + if (File.Exists(releaseManifest)) + { + using var document = JsonDocument.Parse(File.ReadAllText(releaseManifest)); + if (document.RootElement.TryGetProperty("launcherCommit", out var commit) && !string.IsNullOrWhiteSpace(commit.GetString())) return commit.GetString()!; + } + var start = new ProcessStartInfo("git", "rev-parse HEAD") { WorkingDirectory = AppContext.BaseDirectory, UseShellExecute = false, RedirectStandardOutput = true }; + using var process = Process.Start(start); + var value = process is null ? "" : process.StandardOutput.ReadToEnd().Trim(); + return string.IsNullOrWhiteSpace(value) ? "unknown" : value; + } + catch { return "unknown"; } + } }