diff --git a/scripts/pruefe-version.js b/scripts/pruefe-version.js index c3217fa..e08c28c 100644 --- a/scripts/pruefe-version.js +++ b/scripts/pruefe-version.js @@ -8,6 +8,15 @@ * mit neuer Signatur – die bereits veröffentlichten EXEs würden dann nicht mehr * dazu passen und kein Launcher nähme das Update an. * + * Außerdem sagt es, wie das Release in Gitea heißen muss: + * + * fertige Version 1.2.4 Tag 1.2.4 + * Vorabfassung 1.2.4-beta.1 Tag 0.0.0-1.2.4-beta.1 + Haken "Pre-Release" + * + * Der Vorsatz "0.0.0-" bei Vorabfassungen ist Pflicht: Launcher bis 1.2.3 kennen + * das Pre-Release-Feld nicht und würden "1.2.4-beta.1" als normales Update an + * ALLE Nutzer verteilen (siehe src/updater.js). + * * Ausnahme (z. B. Testbuild, der nie hochgeladen wird): AEROMC_GLEICHE_VERSION=1 */ @@ -15,25 +24,31 @@ const path = require('path'); const API = 'https://git.viper.ipv64.net/api/v1/repos/M_Viper/AeroMc-Launcher/releases?limit=50'; const version = require(path.join(__dirname, '..', 'package.json')).version; +const vorab = /^\d+(?:\.\d+){0,2}-/.test(version); +const tag = vorab ? `0.0.0-${version}` : version; (async () => { - if (process.env.AEROMC_GLEICHE_VERSION === '1') return; - let releases; - try { - const res = await fetch(API, { headers: { 'User-Agent': 'AeroMC-Release', Accept: 'application/json' } }); - if (!res.ok) throw new Error('HTTP ' + res.status); - releases = await res.json(); - } catch (err) { - console.warn(`\n! Gitea nicht erreichbar (${err.message}) – Versionsprüfung übersprungen.`); - return; - } - const norm = (v) => String(v || '').trim().replace(/^v/i, ''); - const treffer = (releases || []).find((r) => !r.draft && norm(r.tag_name) === version); - if (treffer) { - console.error(`\n✖ Version ${version} ist bereits in Gitea veröffentlicht (${treffer.published_at}).`); - console.error(' Bitte zuerst die Versionsnummer in package.json erhöhen – sonst passen die'); - console.error(' veröffentlichten Dateien nicht mehr zur Signatur.'); - process.exit(1); + if (process.env.AEROMC_GLEICHE_VERSION !== '1') { + try { + const res = await fetch(API, { headers: { 'User-Agent': 'AeroMC-Release', Accept: 'application/json' } }); + if (!res.ok) throw new Error('HTTP ' + res.status); + const norm = (v) => String(v || '').trim().replace(/^v/i, '').replace(/^0\.0\.0-(?=\d)/, ''); + const treffer = (await res.json() || []).find((r) => !r.draft && norm(r.tag_name) === version); + if (treffer) { + console.error(`\n✖ Version ${version} ist bereits in Gitea veröffentlicht (Tag ${treffer.tag_name}, ${treffer.published_at}).`); + console.error(' Bitte zuerst die Versionsnummer in package.json erhöhen – sonst passen die'); + console.error(' veröffentlichten Dateien nicht mehr zur Signatur.'); + process.exit(1); + } + } catch (err) { + console.warn(`\n! Gitea nicht erreichbar (${err.message}) – Versionsprüfung übersprungen.`); + } } console.log(`» Version ${version} ist noch nicht veröffentlicht – Build läuft.`); + if (vorab) { + console.log(` VORABFASSUNG – in Gitea so veröffentlichen: Tag ${tag} und Haken bei "Als Pre-Release kennzeichnen".`); + console.log(' Niemals mit dem Tag der reinen Versionsnummer: Ältere Launcher würden die Beta sonst an alle verteilen.'); + } else { + console.log(` In Gitea veröffentlichen mit dem Tag ${tag} (ohne Pre-Release-Haken).`); + } })(); diff --git a/scripts/sign-release.js b/scripts/sign-release.js index 5ea0355..015fdc8 100644 --- a/scripts/sign-release.js +++ b/scripts/sign-release.js @@ -64,6 +64,27 @@ function ladeZugang() { return { seite: z.seite, benutzer: z.benutzer, passwort: entschluesseln(z.passwort) }; } +/* + * Anfrage MIT Zugangsdaten an die WordPress-Seite. + * Weiterleitungen werden nie verfolgt: Sonst gingen die Kopfzeilen – vor allem + * der eigene X-AeroMC-Auth, den fetch bei einem Wechsel der Domain nicht von + * selbst entfernt – samt Anwendungspasswort an das Ziel der Weiterleitung. + * Gesendet wird außerdem nur über HTTPS und nur an die hinterlegte Seite. + */ +async function wordpressAnfrage(zugang, pfad, optionen) { + let ziel; + try { ziel = new URL(zugang.seite + pfad); } catch { throw new Error('Die hinterlegte WordPress-Adresse ist ungültig.'); } + if (ziel.protocol !== 'https:') throw new Error('Zugangsdaten werden nur über HTTPS gesendet – WordPress-Adresse prüfen.'); + const res = await fetch(ziel, Object.assign({}, optionen, { headers: kopfzeilen(zugang), redirect: 'manual' })); + if (res.status >= 300 && res.status < 400) { + const wohin = res.headers.get('location') || 'unbekannt'; + throw new Error(`Die Seite leitet weiter (HTTP ${res.status} → ${wohin}). Die Zugangsdaten wurden NICHT dorthin gesendet. +` + + ' Bitte die genaue Adresse eintragen: node scripts/sign-release.js wordpress'); + } + return res; +} + function kopfzeilen(zugang) { const daten = Buffer.from(`${zugang.benutzer}:${zugang.passwort}`).toString('base64'); return { @@ -101,7 +122,7 @@ function zugangsFehler(d, benutzer) { } async function pruefeZugang(zugang) { - const res = await fetch(`${zugang.seite}/wp-json/aeromc/v1/update-signatur/zugang`, { headers: kopfzeilen(zugang) }); + const res = await wordpressAnfrage(zugang, '/wp-json/aeromc/v1/update-signatur/zugang', {}); if (res.status === 404) throw new Error('Die Seite kennt die Signatur-Schnittstelle nicht – ist das Plugin "AeroMC Freunde" (ab 1.5.4) installiert und aktiviert?'); let d = null; try { d = await res.json(); } catch { /* keine JSON-Antwort */ } @@ -189,8 +210,8 @@ async function hochladen(sig) { console.log('» Signatur liegt bereits unverändert auf WordPress.'); return; } - const res = await fetch(`${zugang.seite}/wp-json/aeromc/v1/update-signatur`, { - method: 'POST', headers: kopfzeilen(zugang), body: JSON.stringify(sig), + const res = await wordpressAnfrage(zugang, '/wp-json/aeromc/v1/update-signatur', { + method: 'POST', body: JSON.stringify(sig), }); let antwort = {}; try { antwort = await res.json(); } catch { /* leer */ }