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

@ -44,12 +44,16 @@ export default [
route("account", "routes/settings.account.tsx"),
route("security", "routes/settings.security.tsx"),
route("connections", "routes/settings.connections.tsx"),
route("connections/komoot", "routes/settings.connections.komoot.tsx"),
]),
route("api/settings/profile", "routes/api.settings.profile.ts"),
route("api/settings/email", "routes/api.settings.email.ts"),
route("api/settings/passkey/delete", "routes/api.settings.passkey.delete.ts"),
route("api/settings/delete-account", "routes/api.settings.delete-account.ts"),
route("sync/import/komoot", "routes/sync.import.komoot.tsx"),
route("sync/import/:provider", "routes/sync.import.$provider.tsx"),
route("api/sync/komoot/verify", "routes/api.sync.komoot.verify.ts"),
route("api/sync/komoot/connect", "routes/api.sync.komoot.connect.ts"),
route("api/sync/connect/:provider", "routes/api.sync.connect.$provider.ts"),
route("api/sync/callback/:provider", "routes/api.sync.callback.$provider.ts"),
route("api/sync/disconnect/:provider", "routes/api.sync.disconnect.$provider.ts"),