release.ps1: secrets in %USERPROFILE%\.msco (AppData is virtualized for packaged apps)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-03 23:33:54 +02:00
co-authored by Claude Opus 5.5
parent 77c51b52c5
commit e32ddadbc8
+14 -4
View File
@@ -3,14 +3,14 @@
# powershell -ExecutionPolicy Bypass -File release.ps1 -Product mod -File bin\Release\MSCO.dll
#
# Braucht den Release-Token des Keymasters (RELEASE_TOKEN in dessen .env), lokal verschlüsselt in
# %AppData%\MSCO\release-token.dpapi (Windows DPAPI, nur dein Windows-Konto kann ihn lesen - anlegen mit
# %USERPROFILE%\.msco\release-token.dpapi (Windows DPAPI, nur dein Windows-Konto kann ihn lesen - anlegen mit
# "release.ps1 -SaveToken"), sonst als Umgebungsvariable MSCO_RELEASE_TOKEN. Ohne Token wird nichts hochgeladen.
# MSCO_NO_RELEASE=1 schaltet das Hochladen ab (Test-Builds).
#
# Signatur: jede Datei wird mit dem privaten Release-Schlüssel signiert (RSA-3072, SHA-256) - der Launcher und das Setup
# installieren nur, was zu ihrem eingebauten öffentlichen Schlüssel passt. Selbst wer den Keymaster oder den Token
# übernimmt, kann so keine fremde Datei als MSCO-Update verteilen. Der Schlüssel liegt DPAPI-verschlüsselt in
# %AppData%\MSCO\release-signing-key.dpapi (einmal anlegen: "release.ps1 -NewSigningKey"; SICHERN: "-ExportSigningKey").
# %USERPROFILE%\.msco\release-signing-key.dpapi (einmal anlegen: "release.ps1 -NewSigningKey"; SICHERN: "-ExportSigningKey").
# Gibt es die Version auf dem Keymaster schon, passiert nichts - also einfach die Version erhöhen und bauen.
param(
[ValidateSet("mod", "launcher", "installer")][string]$Product,
@@ -27,7 +27,17 @@ $here = Split-Path -Parent $MyInvocation.MyCommand.Path
Add-Type -AssemblyName System.Security
$entropy = [Text.Encoding]::UTF8.GetBytes("MSCO release token v1")
$scope = [Security.Cryptography.DataProtectionScope]::CurrentUser
$tokenDpapi = Join-Path $env:APPDATA "MSCO\release-token.dpapi"
# Geheimnisse in %USERPROFILE%\.msco - nicht in AppData: das virtualisieren App-Pakete (z.B. die Claude-App), dann sähe
# ein normales Terminal die Dateien nicht. Die alte Ablage in AppData wird noch gelesen.
$secretDir = Join-Path $env:USERPROFILE ".msco"
function Find-Secret([string]$name) {
$new = Join-Path $secretDir $name
if (Test-Path $new) { return $new }
$old = Join-Path $env:APPDATA "MSCO\$name"
if (Test-Path $old) { return $old }
return $new
}
$tokenDpapi = Find-Secret "release-token.dpapi"
# Token einmal verschlüsselt ablegen: fragt verdeckt danach (oder nimmt MSCO_RELEASE_TOKEN)
if ($SaveToken) {
@@ -44,7 +54,7 @@ if ($SaveToken) {
exit 0
}
$keyEntropy = [Text.Encoding]::UTF8.GetBytes("MSCO release signing key v1")
$keyFile = Join-Path $env:APPDATA "MSCO\release-signing-key.dpapi"
$keyFile = Find-Secret "release-signing-key.dpapi"
# Neues Schlüsselpaar (nur einmal - der öffentliche Schlüssel ist in Launcher und Setup eingebaut)
if ($NewSigningKey) {