Add Komoot import with public (bio verification) and authenticated modes

Two-mode import: public mode verifies Komoot account ownership by checking
that the user's trails.cool profile URL appears in their Komoot bio — no
credentials stored. Authenticated mode uses email + password (AES-256-GCM
encrypted) to import private tours as well.

Includes unit tests for crypto/komoot client and E2E tests for the full
connect + import flow.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Ullrich Schäfer 2026-05-23 10:18:46 +02:00
parent b63fd1a303
commit 03304c354b
No known key found for this signature in database
GPG key ID: A32FF691A0F752D9
22 changed files with 1612 additions and 4 deletions

View file

@ -418,6 +418,32 @@ export default {
},
},
},
komoot: {
title: "Komoot",
publicMode: "Nur öffentliche Touren",
authenticatedMode: "Alle Touren",
publicSection: "Verbinden mit Komoot-Bio-Verifizierung",
publicInstructions:
'Füge deinen trails.cool-Profillink in dein Komoot-Profil ("Über dich") ein und klicke auf Bestätigen.',
profileUrlLabel: "Komoot-Profil-URL oder Nutzer-ID",
profileUrlPlaceholder: "https://www.komoot.com/user/...",
verifyButton: "Bestätigen",
verifying: "Wird überprüft…",
verifyPending:
"Es kann einige Minuten dauern, bis Änderungen an deinem Komoot-Profil sichtbar sind.",
verifySuccess: "Komoot-Konto im öffentlichen Modus verbunden.",
verificationError:
"Eigentümerschaft konnte nicht bestätigt werden. Stelle sicher, dass dein trails.cool-Profillink in deinem Komoot-Profil steht, und versuche es in ein paar Minuten erneut.",
invalidUrl: "Bitte gib eine gültige Komoot-Profil-URL oder Nutzer-ID ein.",
authenticatedSection: "Mit E-Mail & Passwort verbinden",
emailLabel: "Komoot-E-Mail",
passwordLabel: "Komoot-Passwort",
connectButton: "Verbinden",
connecting: "Verbinde…",
connectSuccess: "Komoot-Konto verbunden.",
authError: "Ungültige Komoot-Zugangsdaten. Bitte E-Mail und Passwort prüfen.",
modeBadge: "Modus: {{mode}}",
},
sync: {
import: "Importieren",
importFrom: "Import von {{provider}}",

View file

@ -418,6 +418,32 @@ export default {
},
},
},
komoot: {
title: "Komoot",
publicMode: "Public tours only",
authenticatedMode: "All tours",
publicSection: "Connect with Komoot bio verification",
publicInstructions:
'Add your trails.cool profile link to your Komoot bio ("Über dich"), then click Verify.',
profileUrlLabel: "Komoot profile URL or user ID",
profileUrlPlaceholder: "https://www.komoot.com/user/...",
verifyButton: "Verify",
verifying: "Verifying…",
verifyPending:
"Allow a few minutes for changes to your Komoot bio to propagate before verifying.",
verifySuccess: "Komoot account connected in public mode.",
verificationError:
"Could not verify ownership. Make sure your trails.cool profile link is in your Komoot bio and try again in a few minutes.",
invalidUrl: "Please enter a valid Komoot profile URL or user ID.",
authenticatedSection: "Connect with email & password",
emailLabel: "Komoot email",
passwordLabel: "Komoot password",
connectButton: "Connect",
connecting: "Connecting…",
connectSuccess: "Komoot account connected.",
authError: "Invalid Komoot credentials. Please check your email and password.",
modeBadge: "Mode: {{mode}}",
},
sync: {
import: "Import",
importFrom: "Import from {{provider}}",