# Internxt Auth-Analyse: Web vs CLI vs Rclone ## Kernbefund: Client-Identifikation bestimmt Zugang Der Backend-Server blockiert bestimmte Account-Tiers basierend auf der **Client-Identifikation**: | Client | clientName | Login-Methode | Endpoint | Status für eingeschränkte Tiers | |--------|-----------|---------------|----------|--------------------------------| | **drive-web** | `drive-web` | `login()` | `/auth/login` | ✅ Erlaubt | | **drive-desktop** | `drive-desktop` | `login()` | `/auth/login` | ✅ Erlaubt | | **internxt-cli** | `internxt-cli` | `loginAccess()` | `/auth/login/access` | ❌ Blockiert | | **rclone** | (rclone-adapter) | loginAccess-ähnlich | `/auth/login/access` | ❌ Blockiert | ## Quellen ### drive-web ([auth.service.ts](drive-web/src/services/auth.service.ts)) ```typescript const getAuthClient = (authType: 'web' | 'desktop') => { const AUTH_CLIENT = { web: SdkFactory.getNewApiInstance().createAuthClient(), // clientName: "drive-web" desktop: SdkFactory.getNewApiInstance().createDesktopAuthClient(), // clientName: "drive-desktop" }; return AUTH_CLIENT[authType]; }; // Login mit authClient.login() - NICHT loginAccess() return authClient.login(loginDetails, cryptoProvider) ``` - **createAuthClient()**: `clientName: packageJson.name` = `"drive-web"` - **createDesktopAuthClient()**: `clientName: "drive-desktop"` - **Methode**: `login()` (nicht `loginAccess`) ### CLI ([auth.service.ts](https://github.com/internxt/cli/blob/main/src/services/auth.service.ts)) ```typescript const authClient = SdkManager.instance.getAuth(); const data = await authClient.loginAccess(loginDetails, CryptoService.cryptoProvider); ``` - **getAppDetails()**: `clientName: packageJson.clientName` = `"internxt-cli"` (aus [package.json](https://github.com/internxt/cli/blob/main/package.json)) - **Methode**: `loginAccess()` (nicht `login`) ### SDK Factory ([drive-web](drive-web/src/app/core/factory/sdk/index.ts)) ```typescript private static getAppDetails(): AppDetails { return { clientName: packageJson.name, // "drive-web" clientVersion: packageJson.version, customHeaders, }; } private static getDesktopAppDetails(): AppDetails { return { clientName: 'drive-desktop', clientVersion: packageJson.version, }; } ``` ## Lösung für WebDAV-Wrapper **Strategie:** Den Auth-Client so konfigurieren, dass er sich als `drive-web` ausgibt und `login()` statt `loginAccess()` verwendet. 1. **@internxt/sdk** mit `Auth.client(apiUrl, appDetails, apiSecurity)` verwenden 2. **appDetails** setzen: `{ clientName: "drive-web", clientVersion: "1.0" }` 3. **login()** aufrufen (nicht `loginAccess()`) 4. CryptoProvider wie in drive-web implementieren (passToHash, decryptText, getKeys, parseAndDecryptUserKeys) ## Abhängigkeiten für WebDAV-Wrapper - `@internxt/sdk` (Version 1.13.x oder kompatibel – drive-web nutzt 1.13.2) - `@internxt/lib` (für aes, Crypto) - Crypto-Logik aus drive-web: `app/crypto/services/keys.service`, `app/crypto/services/utils` - Keys-Format: ECC + Kyber (post-quantum) ## Aktueller Status (Stand: Analyse) - **CRYPTO_SECRET**: Korrekt (Salt-Decryption OK mit `6KYQBP847D4ATSFA`) - **loginWithoutKeys**: Liefert weiterhin "Wrong login credentials" – möglicherweise lehnt das Backend diesen Flow für bestimmte Account-Typen (z.B. mailbox.org-Partner) ab - **login() mit Keys**: Kyber-WASM schlägt unter Windows fehl (`@dashlane/pqc-kem-kyber512-node`) ## Nächste Schritte 1. **Ansatz B testen**: Browser-basierter Token-Extrakt – im Web einloggen, Session-Token aus localStorage/DevTools lesen, im Wrapper verwenden 2. **login() unter Linux**: Kyber-Paket könnte unter Linux funktionieren 3. **Internxt-Support**: Nachfragen, ob Partner-Accounts (mailbox.org) andere Auth-Flows nutzen ## CRYPTO_SECRET und API-URL Aus [internxt/cli .env.template](https://github.com/internxt/cli/blob/main/.env.template): - **DRIVE_API_URL**: `https://gateway.internxt.com/drive` - **APP_CRYPTO_SECRET**: `6KYQBP847D4ATSFA` Der PoC nutzt diese Werte als Fallback.