Docker, Token-Refresh mit Puppeteer, 401-Hinweise

- Dockerfile + .dockerignore
- token-refresh: Chromium öffnet drive.internxt.com, extrahiert Tokens
- 401-Antworten: Link zu drive.internxt.com
- Docs: Token-Erneuerung Option A (automatisch) / B (manuell)

Made-with: Cursor
This commit is contained in:
2026-02-28 12:32:03 +01:00
parent 7dbc6c8fe4
commit 6ca6132cf8
8 changed files with 1503 additions and 10 deletions

View File

@@ -234,7 +234,7 @@ async function handlePropfind(req, res) {
} catch (err) {
console.error('PROPFIND Fehler:', err.message);
if (err.message?.includes('Token') || err.response?.status === 401) {
res.status(401).send('Nicht autorisiert Token erneuern');
res.status(401).send('Nicht autorisiert Token abgelaufen. Neu einloggen: https://drive.internxt.com');
return;
}
res.status(500).send(err.message || 'Interner Fehler');
@@ -304,7 +304,7 @@ async function handleMkcol(req, res) {
} catch (err) {
console.error('MKCOL Fehler:', err.message);
if (err.message?.includes('Token') || err.response?.status === 401) {
res.status(401).send('Nicht autorisiert');
res.status(401).send('Nicht autorisiert Token erneuern: https://drive.internxt.com');
return;
}
res.status(500).send(err.message || 'Interner Fehler');
@@ -343,7 +343,7 @@ async function handleDelete(req, res) {
} catch (err) {
console.error('DELETE Fehler:', err.message);
if (err.message?.includes('Token') || err.response?.status === 401) {
res.status(401).send('Nicht autorisiert');
res.status(401).send('Nicht autorisiert Token erneuern: https://drive.internxt.com');
return;
}
res.status(500).send(err.message || 'Interner Fehler');
@@ -429,7 +429,7 @@ async function handleMove(req, res) {
} catch (err) {
console.error('MOVE Fehler:', err.message);
if (err.message?.includes('Token') || err.response?.status === 401) {
res.status(401).send('Nicht autorisiert');
res.status(401).send('Nicht autorisiert Token erneuern: https://drive.internxt.com');
return;
}
res.status(500).send(err.message || 'Interner Fehler');
@@ -499,7 +499,7 @@ async function handleGet(req, res) {
} catch (err) {
console.error('GET Fehler:', err.message);
if (err.message?.includes('Token') || err.response?.status === 401) {
res.status(401).send('Nicht autorisiert');
res.status(401).send('Nicht autorisiert Token erneuern: https://drive.internxt.com');
return;
}
if (!res.headersSent) res.status(500).send(err.message || 'Interner Fehler');
@@ -666,7 +666,7 @@ async function handlePut(req, res) {
} catch (err) {
console.error('PUT Fehler:', err.message);
if (err.message?.includes('Token') || err.response?.status === 401) {
res.status(401).send('Nicht autorisiert');
res.status(401).send('Nicht autorisiert Token erneuern: https://drive.internxt.com');
return;
}
if (!res.headersSent) res.status(500).send(err.message || 'Interner Fehler');

58
src/token-refresh.js Normal file
View File

@@ -0,0 +1,58 @@
/**
* Token-Refresh: Öffnet drive.internxt.com im Browser, wartet auf Login,
* extrahiert Token und Mnemonic aus localStorage.
*
* Aufruf: npm run token-refresh
*
* Browser öffnet sich (headed). Einloggen, dann werden die Tokens ausgegeben.
*/
import puppeteer from 'puppeteer';
const DRIVE_URL = 'https://drive.internxt.com';
const POLL_MS = 2000;
const TIMEOUT_MS = 5 * 60 * 1000; // 5 Min
async function getTokens(page) {
return page.evaluate(() => {
const token = localStorage.getItem('xNewToken') || localStorage.getItem('xToken');
const mnemonic = localStorage.getItem('xMnemonic');
return { token, mnemonic };
});
}
async function main() {
console.log('Starte Browser bitte auf', DRIVE_URL, 'einloggen.\n');
const browser = await puppeteer.launch({
headless: false,
defaultViewport: null,
args: ['--no-sandbox', '--disable-setuid-sandbox'],
});
const page = (await browser.pages())[0] || (await browser.newPage());
await page.goto(DRIVE_URL, { waitUntil: 'networkidle2' });
const start = Date.now();
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');
await browser.close();
return;
}
await new Promise((r) => setTimeout(r, POLL_MS));
}
console.log('Timeout keine Tokens gefunden. Bitte einloggen und erneut ausführen.');
await browser.close();
process.exit(1);
}
main().catch((e) => {
console.error(e);
process.exit(1);
});