diff --git a/docs/browser-token-auth.md b/docs/browser-token-auth.md index a5011de..2e08df7 100644 --- a/docs/browser-token-auth.md +++ b/docs/browser-token-auth.md @@ -97,7 +97,7 @@ Tokens laufen nach einiger Zeit ab (typisch Stunden). Bei 401-Fehlern oder „Ni npm run token-refresh ``` -Öffnet einen Browser mit drive.internxt.com. Einloggen – die Tokens werden automatisch extrahiert und in der Konsole ausgegeben. In `.env` eintragen, Server neu starten. +Öffnet einen Browser mit drive.internxt.com. Einloggen – die Tokens werden extrahiert und `.env` automatisch aktualisiert. Server neu starten. ### Option B: Manuell diff --git a/src/token-refresh.js b/src/token-refresh.js index c2160e3..5448a46 100644 --- a/src/token-refresh.js +++ b/src/token-refresh.js @@ -1,14 +1,19 @@ /** * Token-Refresh: Öffnet drive.internxt.com im Browser, wartet auf Login, - * extrahiert Token und Mnemonic aus localStorage. + * extrahiert Token und Mnemonic aus localStorage und aktualisiert .env. * * Aufruf: npm run token-refresh - * - * Browser öffnet sich (headed). Einloggen, dann werden die Tokens ausgegeben. */ +import fs from 'fs'; +import path from 'path'; +import { fileURLToPath } from 'url'; import puppeteer from 'puppeteer'; +const __dirname = path.dirname(fileURLToPath(import.meta.url)); +const ENV_PATH = path.resolve(__dirname, '../.env'); +const ENV_EXAMPLE = path.resolve(__dirname, '../.env.example'); + const DRIVE_URL = 'https://drive.internxt.com'; const POLL_MS = 2000; const TIMEOUT_MS = 5 * 60 * 1000; // 5 Min @@ -21,6 +26,39 @@ async function getTokens(page) { }); } +function updateEnv(token, mnemonic) { + let content = ''; + if (fs.existsSync(ENV_PATH)) { + content = fs.readFileSync(ENV_PATH, 'utf8'); + } else if (fs.existsSync(ENV_EXAMPLE)) { + content = fs.readFileSync(ENV_EXAMPLE, 'utf8'); + } + + const lines = content.split('\n'); + const result = []; + let hasToken = false; + let hasMnemonic = false; + + const escape = (v) => (/\s/.test(v) ? `"${v.replace(/"/g, '\\"')}"` : v); + + for (const line of lines) { + if (/^\s*INXT_TOKEN\s*=/.test(line)) { + result.push(`INXT_TOKEN=${escape(token)}`); + hasToken = true; + } else if (/^\s*INXT_MNEMONIC\s*=/.test(line)) { + result.push(`INXT_MNEMONIC=${escape(mnemonic)}`); + hasMnemonic = true; + } else { + result.push(line); + } + } + + if (!hasToken) result.push(`INXT_TOKEN=${escape(token)}`); + if (!hasMnemonic) result.push(`INXT_MNEMONIC=${escape(mnemonic)}`); + + fs.writeFileSync(ENV_PATH, result.join('\n'), 'utf8'); +} + async function main() { console.log('Starte Browser – bitte auf', DRIVE_URL, 'einloggen.\n'); @@ -37,10 +75,8 @@ async function main() { while (Date.now() - start < TIMEOUT_MS) { const { token, mnemonic } = await getTokens(page); if (token && mnemonic) { - console.log('\n=== Tokens gefunden – in .env eintragen ===\n'); - console.log('INXT_TOKEN=' + token); - console.log('INXT_MNEMONIC=' + mnemonic); - console.log('\n===========================================\n'); + updateEnv(token, mnemonic); + console.log('\n.env aktualisiert. Server neu starten.\n'); await browser.close(); return; }