{"version":3,"file":"marketplaces-auth.mjs","sources":["../../src/config.ts","../../src/marketplace-context.ts","../../src/util/guid.util.ts","../../src/telegram/telegram-session-api.service.ts","../../src/telegram/admin-auth.service.ts","../../src/telegram/auth.service.ts","../../src/ui/auth.gateway.ts","../../src/ui/auth.component.ts","../../src/telegram/admin-auth.guard.ts","../../src/telegram/admin-auth-headers.interceptor.ts","../../src/ed25519/models/auth-error.model.ts","../../src/ed25519/auth-api.service.ts","../../src/ed25519/ed25519-keypair.service.ts","../../src/ed25519/jwt.service.ts","../../src/ed25519/session.service.ts","../../src/ed25519/auth.service.ts","../../src/ed25519/models/permission.model.ts","../../src/ed25519/permission.service.ts","../../src/ed25519/auth-facade.service.ts","../../src/ed25519/ed25519-verification.model.ts","../../src/ed25519/noop-ed25519-verification.service.ts","../../src/index.ts","../../src/marketplaces-auth.ts"],"sourcesContent":["import { EnvironmentProviders, InjectionToken, makeEnvironmentProviders } from '@angular/core';\n\nexport interface MarketplacesAuthConfig {\n /** Central auth service URL. It is not the tenant API URL. */\n apiUrl: string;\n /** Override only for SSR/custom-domain integrations. Browser default is location.hostname. */\n marketplaceDomain?: string | (() => string);\n telegramBotUsername?: string;\n credentialsPath?: string;\n yandexStartPath?: string;\n yandexSessionPath?: string;\n pollIntervalMs?: number;\n}\n\r\n/** Base URL for the auth backend, e.g. `https://api.example.com`. Provide from the consuming app's environment config. */\r\nexport const AUTH_API_URL = new InjectionToken('@marketplaces/auth AUTH_API_URL');\r\n\r\n/** Telegram bot username used to build QR/deep-link login URLs. Optional — falls back to a default if not provided. */\r\nexport const TELEGRAM_BOT_USERNAME = new InjectionToken('@marketplaces/auth TELEGRAM_BOT_USERNAME');\n\nexport const MARKETPLACES_AUTH_CONFIG = new InjectionToken('@marketplaces/auth config');\n\nexport function provideMarketplacesAuth(config: MarketplacesAuthConfig): EnvironmentProviders {\n const normalized: MarketplacesAuthConfig = {\n ...config,\n apiUrl: config.apiUrl.replace(/\\/$/, ''),\n credentialsPath: config.credentialsPath ?? '/auth/credentials/login',\n yandexStartPath: config.yandexStartPath ?? '/auth/yandex/sessions',\n yandexSessionPath: config.yandexSessionPath ?? '/auth/yandex/sessions',\n pollIntervalMs: config.pollIntervalMs ?? 1500,\n };\n return makeEnvironmentProviders([\n { provide: MARKETPLACES_AUTH_CONFIG, useValue: normalized },\n { provide: AUTH_API_URL, useValue: normalized.apiUrl },\n ...(normalized.telegramBotUsername\n ? [{ provide: TELEGRAM_BOT_USERNAME, useValue: normalized.telegramBotUsername }]\n : []),\n ]);\n}\n","import { HttpHeaders } from '@angular/common/http';\nimport { Injectable, inject } from '@angular/core';\nimport { MARKETPLACES_AUTH_CONFIG } from './config';\n\nexport const MARKETPLACE_DOMAIN_HEADER = 'X-Marketplace-Domain';\n\nexport function normalizeMarketplaceDomain(domain: string): string {\n return domain.trim().toLowerCase().replace(/\\.$/, '');\n}\n\n@Injectable({ providedIn: 'root' })\nexport class AuthMarketplaceContext {\n private readonly config = inject(MARKETPLACES_AUTH_CONFIG);\n\n domain(): string {\n const configured = this.config.marketplaceDomain;\n const domain = typeof configured === 'function'\n ? configured()\n : configured ?? (typeof location === 'undefined' ? '' : location.hostname);\n return normalizeMarketplaceDomain(domain);\n }\n\n headers(extra?: Record): HttpHeaders {\n const domain = this.domain();\n if (!domain) throw new Error('Marketplace domain cannot be resolved');\n return new HttpHeaders({ [MARKETPLACE_DOMAIN_HEADER]: domain, ...extra });\n }\n}\n","/** RFC4122 v4-ish GUID, using crypto when available. Shared by customer and admin session creation. */\r\nexport function generateGuid(): string {\r\n if (globalThis.crypto?.randomUUID) {\r\n return globalThis.crypto.randomUUID();\r\n }\r\n\r\n const bytes = new Uint8Array(16);\r\n if (globalThis.crypto?.getRandomValues) {\r\n globalThis.crypto.getRandomValues(bytes);\r\n } else {\r\n for (let index = 0; index < bytes.length; index++) {\r\n bytes[index] = Math.floor(Math.random() * 256);\r\n }\r\n }\r\n\r\n bytes[6] = (bytes[6] & 0x0f) | 0x40;\r\n bytes[8] = (bytes[8] & 0x3f) | 0x80;\r\n\r\n const hex = Array.from(bytes, byte => byte.toString(16).padStart(2, '0'));\r\n return `${hex.slice(0, 4).join('')}-${hex.slice(4, 6).join('')}-${hex.slice(6, 8).join('')}-${hex.slice(8, 10).join('')}-${hex.slice(10, 16).join('')}`;\r\n}\r\n","import { Injectable, inject } from '@angular/core';\r\nimport { HttpClient } from '@angular/common/http';\r\nimport { Observable, of, catchError, map } from 'rxjs';\r\nimport { AuthSession, WebSessionStart } from './models/session.model';\r\nimport { AUTH_API_URL, TELEGRAM_BOT_USERNAME } from '../config';\r\nimport { generateGuid } from '../util/guid.util';\nimport { AuthMarketplaceContext } from '../marketplace-context';\n\r\nconst SESSION_MAX_AGE_SECONDS = 60 * 60;\r\nconst DEFAULT_TELEGRAM_BOT_USERNAME = 'DexarSupport_bot';\r\n\r\n/**\r\n * The one Telegram QR/session API (`{authApiUrl}/users/sessions`). Customer\r\n * login (AuthService) and admin login (AdminAuthService) both call this same\r\n * service against this same endpoint - there is no separate admin backend.\r\n * This class only does the HTTP call + response normalization; it holds no\r\n * session state and writes no cookies, so each caller manages its own\r\n * storage/signals independently on top of it.\r\n */\r\n@Injectable({ providedIn: 'root' })\r\nexport class TelegramSessionApiService {\r\n private readonly http = inject(HttpClient);\r\n private readonly authApiUrl = inject(AUTH_API_URL);\r\n private readonly telegramBotUsername = inject(TELEGRAM_BOT_USERNAME, { optional: true });\n private readonly marketplaceContext = inject(AuthMarketplaceContext);\n\r\n createSession(): Observable {\r\n const webSessionID = generateGuid();\r\n\r\n return this.http.post>(\r\n `${this.authApiUrl}/users/sessions`,\r\n { webSessionID },\r\n { headers: this.marketplaceContext.headers({ WebSessionID: webSessionID }) }\n ).pipe(\r\n map(response => {\r\n const responseWebSessionID = this.extractSessionId(response, webSessionID);\r\n return {\r\n webSessionID: responseWebSessionID,\r\n url: this.getBotLoginUrl(responseWebSessionID),\r\n };\r\n })\r\n );\r\n }\r\n\r\n checkSessionOnce(webSessionID: string | null): Observable {\r\n if (!webSessionID) {\r\n return of(null);\r\n }\r\n\r\n return this.http.get>(\r\n `${this.authApiUrl}/users/sessions/${encodeURIComponent(webSessionID)}`,\n { headers: this.marketplaceContext.headers() }\n ).pipe(\r\n map(response => this.normalizeWebSession(response, webSessionID)),\r\n catchError(() => of(null))\r\n );\r\n }\r\n\r\n logout(webSessionID: string): Observable {\r\n return this.http.delete(`${this.authApiUrl}/users/sessions/${encodeURIComponent(webSessionID)}`, {\r\n headers: this.marketplaceContext.headers({ WebSessionID: webSessionID })\n }).pipe(catchError(() => of(null)));\r\n }\r\n\r\n getBotLoginUrl(webSessionID: string): string {\r\n return `https://t.me/${this.getBotUsername()}?start=${encodeURIComponent(webSessionID)}`;\r\n }\r\n\r\n getBotAppLoginUrl(webSessionID: string): string {\r\n return `tg://resolve?domain=${encodeURIComponent(this.getBotUsername())}&start=${encodeURIComponent(webSessionID)}`;\r\n }\r\n\r\n private getBotUsername(): string {\r\n return this.telegramBotUsername || DEFAULT_TELEGRAM_BOT_USERNAME;\r\n }\r\n\r\n private normalizeWebSession(response: Record | null, fallbackSessionId: string): AuthSession | null {\r\n if (!response) {\r\n return null;\r\n }\r\n\r\n const user = this.asRecord(this.readFirst(response, ['user', 'User', 'telegramUser', 'TelegramUser'])) ?? response;\r\n const status = this.readFirst(response, [\r\n 'status', 'Status', 'active', 'Active', 'loggedIn', 'LoggedIn',\r\n 'isLoggedIn', 'IsLoggedIn', 'authenticated', 'Authenticated'\r\n ]);\r\n const active = this.isActiveStatus(status);\r\n const sessionId = this.extractSessionId(response, fallbackSessionId);\r\n const username = this.readString(this.readFirst(user, ['username', 'Username']))\r\n ?? this.readString(this.readFirst(response, ['username', 'Username']));\r\n const firstName = this.readString(this.readFirst(user, ['firstName', 'first_name', 'FirstName', 'First_name']));\r\n const lastName = this.readString(this.readFirst(user, ['lastName', 'last_name', 'LastName', 'Last_name']));\r\n const fullName = [firstName, lastName].filter(Boolean).join(' ');\r\n const explicitDisplayName = this.readString(this.readFirst(response, ['displayName', 'DisplayName', 'name', 'Name']))\r\n ?? this.readString(this.readFirst(user, ['displayName', 'DisplayName', 'name', 'Name']));\r\n const displayName = explicitDisplayName ?? username ?? (fullName || 'Telegram User');\r\n const telegramUserId = this.readNumber(this.readFirst(user, ['userId', 'telegramUserId', 'telegramUserID', 'TelegramUserID', 'id', 'ID']))\r\n ?? this.readNumber(this.readFirst(response, ['userId', 'telegramUserId', 'telegramUserID', 'TelegramUserID', 'userID', 'UserID', 'UserId']))\r\n ?? null;\r\n const expiresAt = this.readString(this.readFirst(response, ['expiresAt', 'ExpiresAt', 'expires', 'Expires']))\r\n ?? new Date(Date.now() + SESSION_MAX_AGE_SECONDS * 1000).toISOString();\r\n\r\n return { sessionId, userId: telegramUserId, username, displayName, active, expires: expiresAt };\r\n }\r\n\r\n private extractSessionId(response: Record | null, fallbackSessionId: string): string {\r\n if (!response) {\r\n return fallbackSessionId;\r\n }\r\n return this.readString(this.readFirst(response, [\r\n 'webSessionID', 'WebSessionID', 'webSessionId', 'sessionID', 'SessionID', 'sessionId', 'id', 'ID'\r\n ])) ?? fallbackSessionId;\r\n }\r\n\r\n private readFirst(source: Record, keys: string[]): unknown {\r\n for (const key of keys) {\r\n if (Object.prototype.hasOwnProperty.call(source, key)) {\r\n return source[key];\r\n }\r\n }\r\n return undefined;\r\n }\r\n\r\n private readString(value: unknown): string | null {\r\n if (typeof value === 'string' && value.trim()) {\r\n return value;\r\n }\r\n if (typeof value === 'number' || typeof value === 'bigint') {\r\n return value.toString();\r\n }\r\n return null;\r\n }\r\n\r\n private readNumber(value: unknown): number | null {\r\n if (typeof value === 'number' && Number.isFinite(value)) {\r\n return value;\r\n }\r\n if (typeof value === 'string') {\r\n const parsed = Number(value);\r\n return Number.isFinite(parsed) ? parsed : null;\r\n }\r\n return null;\r\n }\r\n\r\n private asRecord(value: unknown): Record | null {\r\n return value !== null && typeof value === 'object' && !Array.isArray(value)\r\n ? value as Record\r\n : null;\r\n }\r\n\r\n private isActiveStatus(status: unknown): boolean {\r\n if (status === true || status === 1) {\r\n return true;\r\n }\r\n if (typeof status !== 'string') {\r\n return false;\r\n }\r\n return ['true', '1', 'active', 'authenticated', 'confirmed', 'success', 'logged_in'].includes(status.toLowerCase());\r\n }\r\n}\r\n","import { Injectable, signal, computed, inject, isDevMode } from '@angular/core';\r\nimport { Observable, tap } from 'rxjs';\r\nimport { AdminAuthStatus, AuthSession, WebSessionStart } from './models/session.model';\r\nimport { TelegramSessionApiService } from './telegram-session-api.service';\r\n\r\n/**\r\n * Admin login uses the exact same Telegram QR/session API as the customer\r\n * login (TelegramSessionApiService) - there is no separate admin backend\r\n * endpoint, and none should be invented client-side. Only the *storage* is\r\n * kept separate from AuthService, so an admin QR scan never authenticates\r\n * the customer session or vice versa: distinct cookie name, distinct\r\n * signals, distinct guard/interceptor.\r\n *\r\n * Since the session API itself has no concept of \"admin\", the frontend\r\n * cannot tell an admin Telegram session from a regular one. Actual admin\r\n * authorization must be enforced server-side when admin API calls are made\r\n * with the resulting session id - the frontend only decides where to\r\n * *store* the result.\r\n */\r\nconst ADMIN_SESSION_COOKIE = 'adminSessionID';\r\nconst ADMIN_TOKEN_STORAGE_KEY = 'adminToken';\r\nconst ADMIN_REFRESH_STORAGE_KEY = 'adminRefreshToken';\r\nconst ADMIN_SESSION_COOKIE_MAX_AGE_SECONDS = 60 * 60;\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class AdminAuthService {\r\n private readonly api = inject(TelegramSessionApiService);\r\n\r\n private readonly sessionSignal = signal(null);\r\n private readonly statusSignal = signal('unknown');\r\n private readonly showLoginSignal = signal(false);\r\n\r\n readonly session = this.sessionSignal.asReadonly();\r\n readonly status = this.statusSignal.asReadonly();\r\n readonly isAuthenticated = computed(() => this.statusSignal() === 'authenticated');\r\n readonly showLoginDialog = this.showLoginSignal.asReadonly();\r\n readonly displayName = computed(() => this.sessionSignal()?.displayName ?? null);\r\n\r\n private sessionCheckTimer?: ReturnType;\r\n\r\n constructor() {\r\n this.checkSession();\r\n }\r\n\r\n checkSession(): void {\r\n const webSessionID = this.getStoredAdminSessionID();\r\n if (!webSessionID) {\r\n this.clearAuthState('unauthenticated');\r\n return;\r\n }\r\n\r\n this.statusSignal.set('checking');\r\n this.checkSessionOnce(webSessionID).subscribe(session => {\r\n if (!session?.active) {\r\n this.clearAuthState('unauthenticated');\r\n }\r\n });\r\n }\r\n\r\n /** Check session without mutating internal state beyond activating on success (used for polling). */\r\n checkSessionOnce(webSessionID = this.getStoredAdminSessionID()): Observable {\r\n return this.api.checkSessionOnce(webSessionID).pipe(\r\n tap(session => {\r\n if (session?.active) {\r\n this.activateSession(session);\r\n }\r\n })\r\n );\r\n }\r\n\r\n /** Create a backend web session - identical call to the customer login (TelegramSessionApiService.createSession). */\r\n createWebSession(): Observable {\r\n return this.api.createSession();\r\n }\r\n\r\n getAdminAppLoginUrl(webSessionID: string): string {\r\n return this.api.getBotAppLoginUrl(webSessionID);\r\n }\r\n\r\n onLoginComplete(): void {\r\n this.hideLogin();\r\n if (!this.isAuthenticated()) {\r\n this.checkSession();\r\n }\r\n }\r\n\r\n requestLogin(): void {\r\n this.showLoginSignal.set(true);\r\n }\r\n\r\n /**\r\n * Dev-only shortcut for local testing without a reachable Telegram/session\r\n * backend: fabricates a local session and activates it directly, skipping\r\n * the QR flow entirely. No-ops in production builds (checked via Angular's\r\n * isDevMode() at runtime, not just build-time, so it is safe even if this\r\n * code ships). Never call this from anywhere reachable in a production build.\r\n */\r\n devBypassLogin(): void {\r\n if (!isDevMode()) {\r\n return;\r\n }\r\n this.hideLogin();\r\n this.activateSession({\r\n sessionId: `dev-bypass-${Date.now()}`,\r\n userId: 0,\r\n username: 'dev-admin',\r\n displayName: 'Dev Admin (local bypass)',\r\n active: true,\r\n expires: new Date(Date.now() + 60 * 60 * 1000).toISOString(),\r\n });\r\n }\r\n\r\n hideLogin(): void {\r\n this.showLoginSignal.set(false);\r\n }\r\n\r\n logout(): void {\n const webSessionID = this.sessionSignal()?.sessionId || this.getStoredAdminSessionID();\r\n if (!webSessionID) {\r\n this.clearAuthState('unauthenticated');\r\n return;\r\n }\r\n\r\n this.api.logout(webSessionID).subscribe(() => this.clearAuthState('unauthenticated'));\r\n }\n\n /** Accept a session/tokens returned by credentials or an external provider. */\n acceptSession(session: AuthSession, token?: string, refreshToken?: string): void {\n this.activateSession(session);\n if (token && refreshToken) this.setAdminTokens(token, refreshToken);\n }\n\r\n /** JWT pair storage, reserved for once the backend issues admin access/refresh tokens. Unused until then. */\r\n getAdminToken(): string | null {\r\n return typeof localStorage === 'undefined' ? null : localStorage.getItem(ADMIN_TOKEN_STORAGE_KEY);\r\n }\r\n\r\n setAdminTokens(token: string, refreshToken: string): void {\r\n if (typeof localStorage === 'undefined') {\r\n return;\r\n }\r\n localStorage.setItem(ADMIN_TOKEN_STORAGE_KEY, token);\r\n localStorage.setItem(ADMIN_REFRESH_STORAGE_KEY, refreshToken);\r\n }\r\n\r\n clearAdminTokens(): void {\r\n if (typeof localStorage === 'undefined') {\r\n return;\r\n }\r\n localStorage.removeItem(ADMIN_TOKEN_STORAGE_KEY);\r\n localStorage.removeItem(ADMIN_REFRESH_STORAGE_KEY);\r\n }\r\n\r\n private activateSession(session: AuthSession): void {\r\n this.sessionSignal.set(session);\r\n this.statusSignal.set('authenticated');\r\n this.setStoredAdminSessionID(session.sessionId);\r\n this.scheduleSessionRefresh(session.expires);\r\n }\r\n\r\n private clearAuthState(status: AdminAuthStatus): void {\r\n this.sessionSignal.set(null);\r\n this.statusSignal.set(status);\r\n this.clearStoredAdminSessionID();\r\n this.clearAdminTokens();\r\n this.clearSessionRefresh();\r\n }\r\n\r\n private scheduleSessionRefresh(expiresAt: string): void {\r\n this.clearSessionRefresh();\r\n const expiresMs = new Date(expiresAt).getTime();\r\n const nowMs = Date.now();\r\n const refreshIn = Number.isFinite(expiresMs)\r\n ? Math.max(expiresMs - nowMs - 60_000, 30_000)\r\n : ADMIN_SESSION_COOKIE_MAX_AGE_SECONDS * 1000;\r\n\r\n this.sessionCheckTimer = setTimeout(() => this.checkSession(), refreshIn);\r\n }\r\n\r\n private clearSessionRefresh(): void {\r\n if (this.sessionCheckTimer) {\r\n clearTimeout(this.sessionCheckTimer);\r\n this.sessionCheckTimer = undefined;\r\n }\r\n }\r\n\r\n private getStoredAdminSessionID(): string | null {\r\n if (typeof document === 'undefined') {\r\n return null;\r\n }\r\n const cookie = document.cookie.split('; ').find(row => row.startsWith(`${ADMIN_SESSION_COOKIE}=`));\r\n if (!cookie) {\r\n return null;\r\n }\r\n try {\r\n return decodeURIComponent(cookie.substring(ADMIN_SESSION_COOKIE.length + 1));\r\n } catch {\r\n return null;\r\n }\r\n }\r\n\r\n private setStoredAdminSessionID(webSessionID: string): void {\r\n if (typeof document === 'undefined') {\r\n return;\r\n }\r\n const secure = typeof window !== 'undefined' && window.location.protocol === 'https:' ? '; Secure' : '';\r\n document.cookie = `${ADMIN_SESSION_COOKIE}=${encodeURIComponent(webSessionID)}; Max-Age=${ADMIN_SESSION_COOKIE_MAX_AGE_SECONDS}; Path=/; SameSite=Strict${secure}`;\r\n }\r\n\r\n private clearStoredAdminSessionID(): void {\r\n if (typeof document === 'undefined') {\r\n return;\r\n }\r\n document.cookie = `${ADMIN_SESSION_COOKIE}=; Max-Age=0; Path=/; SameSite=Strict`;\r\n }\r\n}\r\n","import { Injectable, signal, computed, inject } from '@angular/core';\r\nimport { Observable, tap } from 'rxjs';\r\nimport { AuthSession, AuthStatus, WebSessionStart } from './models/session.model';\r\nimport { TelegramSessionApiService } from './telegram-session-api.service';\r\n\r\nconst WEB_SESSION_COOKIE = 'webSessionID';\r\nconst WEB_SESSION_COOKIE_MAX_AGE_SECONDS = 60 * 60;\r\n\r\n/** Customer-facing Telegram QR/session auth. Distinct storage/state from AdminAuthService by design. */\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class AuthService {\r\n private readonly api = inject(TelegramSessionApiService);\r\n\r\n private sessionSignal = signal(null);\r\n private statusSignal = signal('unknown');\r\n private showLoginSignal = signal(false);\r\n\r\n /** Current auth session */\r\n readonly session = this.sessionSignal.asReadonly();\r\n /** Current auth status */\r\n readonly status = this.statusSignal.asReadonly();\r\n /** Whether user is fully authenticated */\r\n readonly isAuthenticated = computed(() => this.statusSignal() === 'authenticated');\r\n /** Whether to show login dialog */\r\n readonly showLoginDialog = this.showLoginSignal.asReadonly();\r\n /** Display name of authenticated user */\r\n readonly displayName = computed(() => this.sessionSignal()?.displayName ?? null);\r\n\r\n private sessionCheckTimer?: ReturnType;\r\n\r\n constructor() {\r\n // On init, check existing session via cookie\r\n this.checkSession();\r\n }\r\n\r\n /** Check the current webSessionID cookie against the auth backend. */\r\n checkSession(): void {\r\n const webSessionID = this.getStoredWebSessionID();\r\n\r\n if (!webSessionID) {\r\n this.clearAuthState('unauthenticated');\r\n return;\r\n }\r\n\r\n this.statusSignal.set('checking');\r\n\r\n this.checkSessionOnce(webSessionID).subscribe(session => {\r\n if (!session?.active) {\r\n this.clearAuthState('unauthenticated');\r\n }\r\n });\r\n }\r\n\r\n /** Check session without updating internal state beyond activating on success (used for polling). */\r\n checkSessionOnce(webSessionID = this.getStoredWebSessionID()): Observable {\r\n return this.api.checkSessionOnce(webSessionID).pipe(\r\n tap(session => {\r\n if (session?.active) {\r\n this.activateSession(session);\r\n }\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Called after user completes Telegram login.\r\n */\r\n onTelegramLoginComplete(): void {\r\n this.hideLogin();\r\n\r\n if (!this.isAuthenticated()) {\r\n this.checkSession();\r\n }\r\n }\r\n\r\n /** Generate the Telegram login URL for bot-based auth */\r\n getTelegramLoginUrl(webSessionID: string): string {\r\n return this.api.getBotLoginUrl(webSessionID);\r\n }\r\n\r\n /** Generate a Telegram app deep link for mobile login without opening a browser tab. */\r\n getTelegramAppLoginUrl(webSessionID: string): string {\r\n return this.api.getBotAppLoginUrl(webSessionID);\r\n }\r\n\r\n /** Create a backend web session and return the Telegram start link for it. */\r\n createWebSession(): Observable {\r\n return this.api.createSession();\r\n }\r\n\r\n /** Show login dialog (called when user tries to pay without being logged in) */\r\n requestLogin(): void {\r\n this.showLoginSignal.set(true);\r\n }\r\n\r\n /** Hide login dialog */\r\n hideLogin(): void {\r\n this.showLoginSignal.set(false);\r\n }\r\n\r\n /** Logout — clears session on backend and locally */\r\n logout(): void {\n const webSessionID = this.sessionSignal()?.sessionId || this.getStoredWebSessionID();\r\n\r\n if (!webSessionID) {\r\n this.clearAuthState('unauthenticated');\r\n return;\r\n }\r\n\r\n this.api.logout(webSessionID).subscribe(() => {\r\n this.clearAuthState('unauthenticated');\r\n });\r\n }\n\n /** Accept a session returned by credentials or an external provider. */\n acceptSession(session: AuthSession): void {\n this.activateSession(session);\n }\n\r\n private activateSession(session: AuthSession): void {\r\n this.sessionSignal.set(session);\r\n this.statusSignal.set('authenticated');\r\n this.setStoredWebSessionID(session.sessionId);\r\n this.scheduleSessionRefresh(session.expires);\r\n }\r\n\r\n private clearAuthState(status: AuthStatus): void {\r\n this.sessionSignal.set(null);\r\n this.statusSignal.set(status);\r\n this.clearStoredWebSessionID();\r\n this.clearSessionRefresh();\r\n }\r\n\r\n /** Schedule a session re-check before it expires */\r\n private scheduleSessionRefresh(expiresAt: string): void {\r\n this.clearSessionRefresh();\r\n\r\n const expiresMs = new Date(expiresAt).getTime();\r\n const nowMs = Date.now();\r\n // Re-check 60 seconds before expiry, minimum 30s from now\r\n const refreshIn = Number.isFinite(expiresMs)\r\n ? Math.max(expiresMs - nowMs - 60_000, 30_000)\r\n : WEB_SESSION_COOKIE_MAX_AGE_SECONDS * 1000;\r\n\r\n this.sessionCheckTimer = setTimeout(() => {\r\n this.checkSession();\r\n }, refreshIn);\r\n }\r\n\r\n private clearSessionRefresh(): void {\r\n if (this.sessionCheckTimer) {\r\n clearTimeout(this.sessionCheckTimer);\r\n this.sessionCheckTimer = undefined;\r\n }\r\n }\r\n\r\n private getStoredWebSessionID(): string | null {\r\n if (typeof document === 'undefined') {\r\n return null;\r\n }\r\n\r\n const cookie = document.cookie\r\n .split('; ')\r\n .find(row => row.startsWith(`${WEB_SESSION_COOKIE}=`));\r\n\r\n if (!cookie) {\r\n return null;\r\n }\r\n\r\n try {\r\n return decodeURIComponent(cookie.substring(WEB_SESSION_COOKIE.length + 1));\r\n } catch {\r\n return null;\r\n }\r\n }\r\n\r\n private setStoredWebSessionID(webSessionID: string): void {\r\n if (typeof document === 'undefined') {\r\n return;\r\n }\r\n\r\n const secure = typeof window !== 'undefined' && window.location.protocol === 'https:' ? '; Secure' : '';\r\n document.cookie = `${WEB_SESSION_COOKIE}=${encodeURIComponent(webSessionID)}; Max-Age=${WEB_SESSION_COOKIE_MAX_AGE_SECONDS}; Path=/; SameSite=Lax${secure}`;\r\n }\r\n\r\n private clearStoredWebSessionID(): void {\r\n if (typeof document === 'undefined') {\r\n return;\r\n }\r\n\r\n document.cookie = `${WEB_SESSION_COOKIE}=; Max-Age=0; Path=/; SameSite=Lax`;\r\n }\r\n}\r\n","import { HttpClient, HttpErrorResponse } from '@angular/common/http';\nimport { Injectable, InjectionToken, inject } from '@angular/core';\nimport { Observable, catchError, map, of, throwError } from 'rxjs';\nimport { MARKETPLACES_AUTH_CONFIG } from '../config';\nimport { AuthMarketplaceContext } from '../marketplace-context';\nimport { AdminAuthService } from '../telegram/admin-auth.service';\nimport { AuthService } from '../telegram/auth.service';\nimport { AuthSession, WebSessionStart } from '../telegram/models/session.model';\nimport { AuthFailure, AuthMode, AuthResult, CredentialLogin, ExternalAuthStart } from './auth.models';\n\nexport interface MarketplacesAuthGateway {\n startQr(mode: AuthMode): Observable;\n checkQr(mode: AuthMode, attemptId: string): Observable;\n loginWithCredentials(mode: AuthMode, credentials: CredentialLogin): Observable;\n startYandex(mode: AuthMode, returnUrl: string): Observable;\n checkYandex(mode: AuthMode, attemptId: string): Observable;\n}\n\nexport const MARKETPLACES_AUTH_GATEWAY = new InjectionToken(\n '@marketplaces/auth gateway',\n { providedIn: 'root', factory: () => inject(HttpMarketplacesAuthGateway) }\n);\n\n@Injectable({ providedIn: 'root' })\nexport class HttpMarketplacesAuthGateway implements MarketplacesAuthGateway {\n private readonly http = inject(HttpClient);\n private readonly config = inject(MARKETPLACES_AUTH_CONFIG);\n private readonly context = inject(AuthMarketplaceContext);\n private readonly customerAuth = inject(AuthService);\n private readonly adminAuth = inject(AdminAuthService);\n\n startQr(mode: AuthMode): Observable {\n return mode === 'admin' ? this.adminAuth.createWebSession() : this.customerAuth.createWebSession();\n }\n checkQr(mode: AuthMode, attemptId: string): Observable {\n return mode === 'admin' ? this.adminAuth.checkSessionOnce(attemptId) : this.customerAuth.checkSessionOnce(attemptId);\n }\n loginWithCredentials(mode: AuthMode, credentials: CredentialLogin): Observable {\n return this.http.post(this.url(this.config.credentialsPath), { ...credentials, mode }, {\n headers: this.context.headers(),\n }).pipe(\n map(result => this.accept(mode, { ...result, method: 'credentials', mode })),\n catchError(error => throwError(() => this.failure('credentials', error)))\n );\n }\n startYandex(mode: AuthMode, returnUrl: string): Observable {\n return this.http.post(this.url(this.config.yandexStartPath), {\n provider: 'yandex', mode, returnUrl,\n }, { headers: this.context.headers() }).pipe(\n catchError(error => throwError(() => this.failure('yandex', error)))\n );\n }\n checkYandex(mode: AuthMode, attemptId: string): Observable {\n return this.http.get(\n `${this.url(this.config.yandexSessionPath)}/${encodeURIComponent(attemptId)}`,\n { headers: this.context.headers() }\n ).pipe(\n map(result => result ? this.accept(mode, { ...result, method: 'yandex', mode }) : null),\n catchError((error: HttpErrorResponse) => error.status === 404 || error.status === 202\n ? of(null)\n : throwError(() => this.failure('yandex', error)))\n );\n }\n private accept(mode: AuthMode, result: AuthResult): AuthResult {\n if (mode === 'admin') this.adminAuth.acceptSession(result.session, result.accessToken, result.refreshToken);\n else this.customerAuth.acceptSession(result.session);\n return result;\n }\n private url(path = ''): string { return `${this.config.apiUrl}${path.startsWith('/') ? path : `/${path}`}`; }\n private failure(method: 'credentials' | 'yandex', cause: unknown): AuthFailure {\n const response = cause instanceof HttpErrorResponse ? cause : null;\n return {\n method,\n code: response?.status === 401 ? 'invalid_credentials' : 'backend',\n message: response?.error?.message || response?.message || 'Authentication failed',\n cause,\n };\n }\n}\n","import { Component, DestroyRef, booleanAttribute, inject, input, output, signal } from '@angular/core';\nimport { FormField, form, required } from '@angular/forms/signals';\nimport * as QRCode from 'qrcode';\nimport { Subscription, switchMap, timer } from 'rxjs';\nimport { MARKETPLACES_AUTH_CONFIG } from '../config';\nimport { MARKETPLACES_AUTH_GATEWAY } from './auth.gateway';\nimport { AuthFailure, AuthMethod, AuthMode, AuthResult } from './auth.models';\n\n@Component({\n selector: 'mp-auth, marketplaces-auth',\n standalone: true,\n imports: [FormField],\n template: `\n
\n

{{ title() }}

\n
\n @if (qr()) { }\n @if (credentials()) { }\n @if (yandex()) { }\n
\n @if (method() === 'credentials') {\n
\n \n \n \n
\n }\n @if (method() === 'qr') {\n @if (qrImage()) { \"QR-код }\n \n }\n @if (method() === 'yandex') { }\n @if (busy()) {

Ожидаем подтверждение…

}\n @if (error()) {

{{ error()!.message }}

}\n
\n `,\n styles: [`\n :host{display:block}.mp-auth{font:inherit;color:inherit;display:grid;gap:1rem;max-width:25rem}\n h2,p{margin:0}.methods{display:flex;gap:.5rem;flex-wrap:wrap}.methods button{background:transparent;color:inherit}\n button,input{font:inherit;border:1px solid #c7c7c7;border-radius:.65rem;padding:.7rem .9rem}\n button{cursor:pointer}.active,button[type=submit]{background:#111;color:#fff;border-color:#111}\n button:disabled{opacity:.55;cursor:wait}form{display:grid;gap:.8rem}label{display:grid;gap:.35rem}\n img{display:block;width:min(15rem,100%);height:auto;border-radius:.75rem}.error{color:#b42318}\n `],\n})\nexport class MarketplacesAuthComponent {\n readonly qr = input(false, { transform: booleanAttribute });\n readonly credentials = input(false, { transform: booleanAttribute });\n readonly yandex = input(false, { transform: booleanAttribute });\n readonly mode = input('customer');\n readonly title = input('Вход');\n readonly authenticated = output();\n readonly authError = output();\n readonly cancelled = output();\n readonly method = signal(null);\n readonly busy = signal(false);\n readonly error = signal(null);\n readonly qrImage = signal(null);\n readonly externalUrl = signal(null);\n private readonly credentialsModel = signal({ login: '', password: '' });\n readonly credentialsForm = form(this.credentialsModel, path => {\n required(path.login, { message: 'Введите логин' });\n required(path.password, { message: 'Введите пароль' });\n });\n private readonly gateway = inject(MARKETPLACES_AUTH_GATEWAY);\n private readonly config = inject(MARKETPLACES_AUTH_CONFIG);\n private poll?: Subscription;\n\n constructor() {\n inject(DestroyRef).onDestroy(() => this.poll?.unsubscribe());\n queueMicrotask(() => this.select(this.qr() ? 'qr' : this.credentials() ? 'credentials' : this.yandex() ? 'yandex' : null));\n }\n select(method: AuthMethod | null): void { this.poll?.unsubscribe(); this.busy.set(false); this.error.set(null); this.method.set(method); }\n startQr(): void {\n this.begin();\n this.gateway.startQr(this.mode()).subscribe({\n next: attempt => void this.prepareQr(attempt.url, attempt.webSessionID).catch(cause => this.fail('qr', cause)),\n error: cause => this.fail('qr', cause),\n });\n }\n loginWithCredentials(event: Event): void {\n event.preventDefault();\n if (this.credentialsForm().invalid()) return;\n this.begin();\n this.gateway.loginWithCredentials(this.mode(), this.credentialsModel()).subscribe({\n next: result => this.finish(result), error: cause => this.fail('credentials', cause),\n });\n }\n startYandex(): void {\n this.begin();\n const returnUrl = typeof location === 'undefined' ? '' : location.href;\n this.gateway.startYandex(this.mode(), returnUrl).subscribe({\n next: attempt => {\n const popup = typeof window === 'undefined' ? null : window.open(attempt.authorizationUrl, 'mp-yandex-auth', 'popup,width=520,height=720');\n if (!popup) { this.fail('yandex', { method: 'yandex', code: 'popup_blocked', message: 'Браузер заблокировал окно Яндекса' }); return; }\n this.pollForYandex(attempt.attemptId);\n },\n error: cause => this.fail('yandex', cause),\n });\n }\n private pollForQr(attemptId: string): void {\n this.poll?.unsubscribe();\n this.poll = timer(0, this.config.pollIntervalMs ?? 1500).pipe(switchMap(() => this.gateway.checkQr(this.mode(), attemptId)))\n .subscribe({ next: session => { if (session?.active) this.finish({ method: 'qr', mode: this.mode(), session }); }, error: cause => this.fail('qr', cause) });\n }\n private async prepareQr(url: string, attemptId: string): Promise {\n this.externalUrl.set(url);\n this.qrImage.set(await QRCode.toDataURL(url, { width: 320, margin: 1 }));\n this.pollForQr(attemptId);\n }\n private pollForYandex(attemptId: string): void {\n this.poll?.unsubscribe();\n this.poll = timer(0, this.config.pollIntervalMs ?? 1500).pipe(switchMap(() => this.gateway.checkYandex(this.mode(), attemptId)))\n .subscribe({ next: result => { if (result) this.finish(result); }, error: cause => this.fail('yandex', cause) });\n }\n private begin(): void { this.poll?.unsubscribe(); this.error.set(null); this.busy.set(true); }\n private finish(result: AuthResult): void { this.poll?.unsubscribe(); this.busy.set(false); this.authenticated.emit(result); }\n private fail(method: AuthMethod, cause: unknown): void {\n this.poll?.unsubscribe(); this.busy.set(false);\n const failure: AuthFailure = this.isFailure(cause) ? cause : { method, code: 'backend', message: 'Не удалось выполнить вход', cause };\n this.error.set(failure); this.authError.emit(failure);\n }\n private isFailure(value: unknown): value is AuthFailure { return !!value && typeof value === 'object' && 'code' in value && 'message' in value; }\n}\n","import { inject } from '@angular/core';\r\nimport { CanActivateFn } from '@angular/router';\r\nimport { AdminAuthService } from './admin-auth.service';\r\n\r\n/** Guards `/admin/**`-style routes. Never shares state with the customer auth guard/service. */\r\nexport const adminAuthGuard: CanActivateFn = () => {\r\n const adminAuth = inject(AdminAuthService);\r\n\r\n if (adminAuth.isAuthenticated()) {\r\n return true;\r\n }\r\n\r\n adminAuth.requestLogin();\r\n return false;\r\n};\r\n","import { HttpInterceptorFn } from '@angular/common/http';\r\nimport { inject } from '@angular/core';\r\nimport { AdminAuthService } from './admin-auth.service';\r\n\r\n/** Backend paths that require an active AdminWebSessionID. Adjust to match your API surface if consuming this outside marketplaces. */\r\nconst ADMIN_GATED_PATH_SEGMENTS = ['/admin/', '/backoffice/', '/builder/', '/media/'];\r\n\r\n/**\r\n * Attaches admin session/token headers only to admin API requests. Scoped to\r\n * admin-gated paths so it never touches customer requests and never reads\r\n * the customer AuthService's session.\r\n */\r\nexport const adminAuthHeadersInterceptor: HttpInterceptorFn = (req, next) => {\r\n const isAdminRequest = ADMIN_GATED_PATH_SEGMENTS.some(segment => req.url.includes(segment));\r\n if (!isAdminRequest) {\r\n return next(req);\r\n }\r\n\r\n const adminAuth = inject(AdminAuthService);\r\n const session = adminAuth.session();\r\n const token = adminAuth.getAdminToken();\r\n\r\n let headers = req.headers;\r\n if (session?.sessionId) {\r\n headers = headers.set('AdminWebSessionID', session.sessionId);\r\n }\r\n if (token) {\r\n headers = headers.set('Authorization', `Bearer ${token}`);\r\n }\r\n\r\n return next(req.clone({ headers }));\r\n};\r\n","/**\r\n * Error codes the Ed25519 admin auth flow can surface to the UI. Each maps to\r\n * a dedicated screen rather than a generic toast, because the recovery\r\n * action differs per code (re-login vs. retry vs. wait).\r\n */\r\nexport type AuthErrorCode =\r\n | 'session-expired'\r\n | 'invalid-signature'\r\n | 'unauthorized'\r\n | 'forbidden'\r\n | 'backend-unavailable';\r\n\r\nexport interface AuthError {\r\n code: AuthErrorCode;\r\n message: string;\r\n /** HTTP status that produced this error, when known (absent for client-side errors, e.g. no Ed25519 support). */\r\n status?: number;\r\n}\r\n\r\n/** Maps a backend error envelope's `error.code` to the client's AuthErrorCode screens. Only codes with a dedicated screen are mapped; anything else falls back to the HTTP-status-derived code via authErrorCodeFromStatus. */\r\nconst BACKEND_ERROR_CODE_MAP: Record = {\r\n TOKEN_EXPIRED: 'session-expired',\r\n INVALID_SIGNATURE: 'invalid-signature',\r\n UNAUTHENTICATED: 'unauthorized',\r\n FORBIDDEN: 'forbidden',\r\n SERVICE_UNAVAILABLE: 'backend-unavailable',\r\n};\r\n\r\nexport function authErrorCodeFromBackendCode(code: unknown): AuthErrorCode | undefined {\r\n return typeof code === 'string' ? BACKEND_ERROR_CODE_MAP[code] : undefined;\r\n}\r\n\r\n/** Maps a backend HTTP status to the AuthErrorCode screen it should route to. */\r\nexport function authErrorCodeFromStatus(status: number): AuthErrorCode {\r\n switch (status) {\r\n case 401:\r\n return 'unauthorized';\r\n case 403:\r\n return 'forbidden';\r\n case 0:\r\n return 'backend-unavailable';\r\n default:\r\n return status >= 500 ? 'backend-unavailable' : 'unauthorized';\r\n }\r\n}\r\n","import { HttpClient } from '@angular/common/http';\r\nimport { Injectable, inject } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\nimport { AUTH_API_URL } from '../config';\r\nimport { AuthChallenge, AuthTokenPair, RefreshTokenRequest, VerifySignatureRequest } from './models/auth-api.model';\r\n\r\n/**\r\n * Thin HTTP client for the Ed25519 admin auth endpoints. These endpoints may\r\n * not exist on every backend yet - calling them before the backend ships\r\n * 404s or connection-errors, which AuthService maps to the\r\n * `backend-unavailable` error screen. No mock/fake responses are fabricated\r\n * here; this is real HttpClient wiring against the real contract.\r\n */\r\n@Injectable({ providedIn: 'root' })\r\nexport class AuthApiService {\r\n private readonly http = inject(HttpClient);\r\n private readonly baseUrl = `${inject(AUTH_API_URL)}/api/admin/auth`;\r\n\r\n requestChallenge(): Observable {\r\n return this.http.get(`${this.baseUrl}/challenge`);\r\n }\r\n\r\n verifySignature(request: VerifySignatureRequest): Observable {\r\n return this.http.post(`${this.baseUrl}/verify`, request);\r\n }\r\n\r\n refresh(request: RefreshTokenRequest): Observable {\r\n return this.http.post(`${this.baseUrl}/refresh`, request);\r\n }\r\n\r\n logout(refreshToken: string): Observable {\r\n return this.http.post(`${this.baseUrl}/logout`, { refreshToken } satisfies RefreshTokenRequest);\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\n\r\n/**\r\n * Manages the browser-local Ed25519 keypair used to sign admin auth\r\n * challenges. Real WebCrypto Ed25519 (RFC 8032 support landed in evergreen\r\n * browsers) - not a placeholder. The private key is generated\r\n * non-extractable and kept only in IndexedDB as a CryptoKey handle; it is\r\n * never serialized, never sent anywhere, and cannot be exported by design.\r\n *\r\n * Registering `publicKey` with an admin's account (associating it with a\r\n * role) is a backend-side, out-of-band operation (e.g. an Owner approving a\r\n * new admin's public key) - entirely outside this frontend's scope.\r\n */\r\nconst DB_NAME = 'admin-auth-ed25519';\r\nconst DB_VERSION = 1;\r\nconst STORE_NAME = 'keypair';\r\nconst KEY_RECORD_ID = 'device-keypair';\r\n\r\ninterface StoredKeyPair {\r\n id: string;\r\n publicKey: CryptoKey;\r\n privateKey: CryptoKey;\r\n publicKeyBase64: string;\r\n}\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class Ed25519KeypairService {\r\n private cached: StoredKeyPair | null = null;\r\n\r\n isSupported(): boolean {\r\n return typeof crypto !== 'undefined' && !!crypto.subtle && typeof indexedDB !== 'undefined';\r\n }\r\n\r\n /** Returns the device's Ed25519 keypair, generating and persisting one on first use. */\r\n async getOrCreateKeyPair(): Promise<{ publicKeyBase64: string }> {\r\n if (!this.isSupported()) {\r\n throw new Error('Ed25519 is not supported in this browser (requires WebCrypto + IndexedDB).');\r\n }\r\n const existing = await this.loadFromStore();\r\n if (existing) {\r\n this.cached = existing;\r\n return { publicKeyBase64: existing.publicKeyBase64 };\r\n }\r\n\r\n const generated = await this.generateAndPersist();\r\n this.cached = generated;\r\n return { publicKeyBase64: generated.publicKeyBase64 };\r\n }\r\n\r\n async sign(message: string): Promise {\r\n const keyPair = this.cached ?? (await this.loadFromStore());\r\n if (!keyPair) {\r\n throw new Error('No Ed25519 keypair available - call getOrCreateKeyPair() first.');\r\n }\r\n\r\n const signatureBuffer = await crypto.subtle.sign('Ed25519', keyPair.privateKey, new TextEncoder().encode(message));\r\n return this.toBase64(new Uint8Array(signatureBuffer));\r\n }\r\n\r\n /** Discards the local keypair (e.g. \"forget this device\"). A new keypair on next login requires re-registration with the backend. */\r\n async clear(): Promise {\r\n this.cached = null;\r\n const db = await this.openDatabase();\r\n await new Promise((resolve, reject) => {\r\n const tx = db.transaction(STORE_NAME, 'readwrite');\r\n tx.objectStore(STORE_NAME).delete(KEY_RECORD_ID);\r\n tx.oncomplete = () => resolve();\r\n tx.onerror = () => reject(tx.error);\r\n });\r\n }\r\n\r\n private async generateAndPersist(): Promise {\r\n const keyPair = (await crypto.subtle.generateKey({ name: 'Ed25519' }, false, ['sign', 'verify'])) as CryptoKeyPair;\r\n const publicKeyRaw = await crypto.subtle.exportKey('raw', keyPair.publicKey);\r\n const publicKeyBase64 = this.toBase64(new Uint8Array(publicKeyRaw));\r\n\r\n const record: StoredKeyPair = {\r\n id: KEY_RECORD_ID,\r\n publicKey: keyPair.publicKey,\r\n privateKey: keyPair.privateKey,\r\n publicKeyBase64\r\n };\r\n\r\n const db = await this.openDatabase();\r\n await new Promise((resolve, reject) => {\r\n const tx = db.transaction(STORE_NAME, 'readwrite');\r\n tx.objectStore(STORE_NAME).put(record);\r\n tx.oncomplete = () => resolve();\r\n tx.onerror = () => reject(tx.error);\r\n });\r\n\r\n return record;\r\n }\r\n\r\n private async loadFromStore(): Promise {\r\n const db = await this.openDatabase();\r\n return new Promise((resolve, reject) => {\r\n const tx = db.transaction(STORE_NAME, 'readonly');\r\n const request = tx.objectStore(STORE_NAME).get(KEY_RECORD_ID);\r\n request.onsuccess = () => resolve((request.result as StoredKeyPair | undefined) ?? null);\r\n request.onerror = () => reject(request.error);\r\n });\r\n }\r\n\r\n private openDatabase(): Promise {\r\n return new Promise((resolve, reject) => {\r\n const request = indexedDB.open(DB_NAME, DB_VERSION);\r\n request.onupgradeneeded = () => {\r\n if (!request.result.objectStoreNames.contains(STORE_NAME)) {\r\n request.result.createObjectStore(STORE_NAME, { keyPath: 'id' });\r\n }\r\n };\r\n request.onsuccess = () => resolve(request.result);\r\n request.onerror = () => reject(request.error);\r\n });\r\n }\r\n\r\n private toBase64(bytes: Uint8Array): string {\r\n let binary = '';\r\n for (const byte of bytes) {\r\n binary += String.fromCharCode(byte);\r\n }\r\n return btoa(binary);\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { JwtClaims } from './models/auth-api.model';\r\n\r\n/**\r\n * Client-side JWT *decoding* only - never verification. The signature is\r\n * meaningless to check here because the frontend has no trusted key to check\r\n * it against; verifying a JWT's signature is the backend's job on every\r\n * request. This service exists purely so the UI can read `role`/`exp` for\r\n * display and route-gating UX (e.g. \"session expires in 4m\").\r\n */\r\n@Injectable({ providedIn: 'root' })\r\nexport class JwtService {\r\n decode(token: string): JwtClaims | null {\r\n const parts = token.split('.');\r\n if (parts.length !== 3) {\r\n return null;\r\n }\r\n\r\n try {\r\n const payload = this.base64UrlDecode(parts[1]);\r\n const claims = JSON.parse(payload) as JwtClaims;\r\n return this.isJwtClaims(claims) ? claims : null;\r\n } catch {\r\n return null;\r\n }\r\n }\r\n\r\n isExpired(claims: JwtClaims, skewSeconds = 0): boolean {\r\n return claims.exp * 1000 <= Date.now() + skewSeconds * 1000;\r\n }\r\n\r\n private isJwtClaims(value: unknown): value is JwtClaims {\r\n if (!value || typeof value !== 'object') {\r\n return false;\r\n }\r\n const claims = value as Partial;\r\n return typeof claims.sub === 'string' && typeof claims.role === 'string' && typeof claims.exp === 'number';\r\n }\r\n\r\n private base64UrlDecode(input: string): string {\r\n const base64 = input.replace(/-/g, '+').replace(/_/g, '/').padEnd(input.length + ((4 - (input.length % 4)) % 4), '=');\r\n return decodeURIComponent(escape(atob(base64)));\r\n }\r\n}\r\n","import { Injectable, computed, signal } from '@angular/core';\r\nimport { AuthTokenPair, JwtClaims } from './models/auth-api.model';\r\nimport { JwtService } from './jwt.service';\r\n\r\nexport type SessionStatus = 'unknown' | 'restoring' | 'authenticated' | 'unauthenticated' | 'expired';\r\n\r\nconst TOKEN_STORAGE_KEY = 'ed25519AdminToken';\r\nconst REFRESH_STORAGE_KEY = 'ed25519AdminRefreshToken';\r\n/** Refresh this long before actual expiry, so a request never races an expiring token. */\r\nconst REFRESH_SKEW_MS = 60_000;\r\n\r\n/**\r\n * Holds the Ed25519-flow JWT/refresh-token pair and derived claims. Separate\r\n * from the telegram module's AdminAuthService (Telegram-session state) by\r\n * design - the two auth mechanisms are not merged until both ship on the\r\n * same backend and a migration decision is made.\r\n */\r\n@Injectable({ providedIn: 'root' })\r\nexport class SessionService {\r\n private readonly jwt = new JwtService();\r\n\r\n private readonly tokenSignal = signal(null);\r\n private readonly refreshTokenSignal = signal(null);\r\n private readonly claimsSignal = signal(null);\r\n private readonly statusSignal = signal('unknown');\r\n\r\n readonly token = this.tokenSignal.asReadonly();\r\n readonly claims = this.claimsSignal.asReadonly();\r\n readonly status = this.statusSignal.asReadonly();\r\n readonly isAuthenticated = computed(() => this.statusSignal() === 'authenticated');\r\n readonly role = computed(() => this.claimsSignal()?.role ?? null);\r\n\r\n private refreshTimer?: ReturnType;\r\n private refreshCallback?: () => void;\r\n\r\n /** Called once by AuthService on init to wire up the refresh trigger without a circular DI dependency. */\r\n onRefreshDue(callback: () => void): void {\r\n this.refreshCallback = callback;\r\n }\r\n\r\n /** Restores session state from persisted storage. Returns true if a (possibly expired) session was found. */\r\n restore(): boolean {\r\n this.statusSignal.set('restoring');\r\n const token = this.readStorage(TOKEN_STORAGE_KEY);\r\n const refreshToken = this.readStorage(REFRESH_STORAGE_KEY);\r\n if (!token || !refreshToken) {\r\n this.statusSignal.set('unauthenticated');\r\n return false;\r\n }\r\n\r\n const claims = this.jwt.decode(token);\r\n if (!claims) {\r\n this.clear();\r\n return false;\r\n }\r\n\r\n this.tokenSignal.set(token);\r\n this.refreshTokenSignal.set(refreshToken);\r\n this.claimsSignal.set(claims);\r\n\r\n if (this.jwt.isExpired(claims)) {\r\n this.statusSignal.set('expired');\r\n } else {\r\n this.statusSignal.set('authenticated');\r\n this.scheduleRefresh(claims);\r\n }\r\n return true;\r\n }\r\n\r\n activate(tokens: AuthTokenPair): void {\r\n const claims = this.jwt.decode(tokens.token);\r\n if (!claims) {\r\n throw new Error('Received a malformed JWT from the auth backend.');\r\n }\r\n\r\n this.tokenSignal.set(tokens.token);\r\n this.refreshTokenSignal.set(tokens.refreshToken);\r\n this.claimsSignal.set(claims);\r\n this.statusSignal.set('authenticated');\r\n this.writeStorage(TOKEN_STORAGE_KEY, tokens.token);\r\n this.writeStorage(REFRESH_STORAGE_KEY, tokens.refreshToken);\r\n this.scheduleRefresh(claims);\r\n }\r\n\r\n getRefreshToken(): string | null {\r\n return this.refreshTokenSignal();\r\n }\r\n\r\n markExpired(): void {\r\n this.statusSignal.set('expired');\r\n this.clearRefreshTimer();\r\n }\r\n\r\n clear(): void {\r\n this.tokenSignal.set(null);\r\n this.refreshTokenSignal.set(null);\r\n this.claimsSignal.set(null);\r\n this.statusSignal.set('unauthenticated');\r\n this.removeStorage(TOKEN_STORAGE_KEY);\r\n this.removeStorage(REFRESH_STORAGE_KEY);\r\n this.clearRefreshTimer();\r\n }\r\n\r\n private scheduleRefresh(claims: JwtClaims): void {\r\n this.clearRefreshTimer();\r\n const expiresInMs = claims.exp * 1000 - Date.now();\r\n const refreshInMs = Math.max(expiresInMs - REFRESH_SKEW_MS, 5_000);\r\n this.refreshTimer = setTimeout(() => this.refreshCallback?.(), refreshInMs);\r\n }\r\n\r\n private clearRefreshTimer(): void {\r\n if (this.refreshTimer) {\r\n clearTimeout(this.refreshTimer);\r\n this.refreshTimer = undefined;\r\n }\r\n }\r\n\r\n private readStorage(key: string): string | null {\r\n return typeof localStorage === 'undefined' ? null : localStorage.getItem(key);\r\n }\r\n\r\n private writeStorage(key: string, value: string): void {\r\n if (typeof localStorage !== 'undefined') {\r\n localStorage.setItem(key, value);\r\n }\r\n }\r\n\r\n private removeStorage(key: string): void {\r\n if (typeof localStorage !== 'undefined') {\r\n localStorage.removeItem(key);\r\n }\r\n }\r\n}\r\n","import { Injectable, inject, signal } from '@angular/core';\r\nimport { HttpErrorResponse } from '@angular/common/http';\r\nimport { catchError, switchMap, tap, throwError } from 'rxjs';\r\nimport { Observable } from 'rxjs';\r\nimport { AuthTokenPair } from './models/auth-api.model';\r\nimport { AuthError, authErrorCodeFromBackendCode, authErrorCodeFromStatus } from './models/auth-error.model';\r\nimport { AuthApiService } from './auth-api.service';\r\nimport { Ed25519KeypairService } from './ed25519-keypair.service';\r\nimport { SessionService } from './session.service';\r\n\r\nexport type LoginPhase = 'idle' | 'requesting-challenge' | 'signing' | 'verifying' | 'done';\r\n\r\n/**\r\n * Orchestrates the Ed25519 challenge/response admin auth flow end to end:\r\n *\r\n * GET /api/admin/auth/challenge -> { nonce }\r\n * sign(nonce) with local Ed25519 key -> signature\r\n * POST /api/admin/auth/verify -> { token, refreshToken }\r\n *\r\n * This is the lowest-level orchestrator; components should go through\r\n * AuthFacade rather than calling this directly. Exported from the package\r\n * barrel as `Ed25519AuthService` to avoid colliding with the telegram\r\n * module's `AuthService`.\r\n */\r\n@Injectable({ providedIn: 'root' })\r\nexport class AuthService {\r\n private readonly api = inject(AuthApiService);\r\n private readonly keypair = inject(Ed25519KeypairService);\r\n private readonly session = inject(SessionService);\r\n\r\n private readonly loginPhaseSignal = signal('idle');\r\n private readonly lastErrorSignal = signal(null);\r\n\r\n readonly loginPhase = this.loginPhaseSignal.asReadonly();\r\n readonly lastError = this.lastErrorSignal.asReadonly();\r\n\r\n constructor() {\r\n this.session.onRefreshDue(() => this.refresh().subscribe());\r\n }\r\n\r\n /** Restores a persisted session on app bootstrap. Call once from an APP_INITIALIZER or root component. */\r\n restoreSession(): void {\r\n this.session.restore();\r\n }\r\n\r\n login(): Observable {\r\n this.lastErrorSignal.set(null);\r\n this.loginPhaseSignal.set('requesting-challenge');\r\n\r\n return this.api.requestChallenge().pipe(\r\n switchMap(challenge =>\r\n this.signChallenge(challenge.nonce).pipe(\r\n switchMap(({ publicKeyBase64, signature }) => {\r\n this.loginPhaseSignal.set('verifying');\r\n return this.api.verifySignature({ publicKey: publicKeyBase64, signature, nonce: challenge.nonce });\r\n })\r\n )\r\n ),\r\n tap(tokens => {\r\n this.session.activate(tokens);\r\n this.loginPhaseSignal.set('done');\r\n }),\r\n catchError(error => this.handleAuthError(error, 'invalid-signature'))\r\n );\r\n }\r\n\r\n refresh(): Observable {\r\n const refreshToken = this.session.getRefreshToken();\r\n if (!refreshToken) {\r\n this.session.markExpired();\r\n return throwError(() => this.toAuthError({ code: 'session-expired', message: 'No refresh token available.' }));\r\n }\r\n\r\n return this.api.refresh({ refreshToken }).pipe(\r\n tap(tokens => this.session.activate(tokens)),\r\n catchError(error => this.handleAuthError(error, 'session-expired', () => this.session.markExpired()))\r\n );\r\n }\r\n\r\n logout(): Observable {\r\n const refreshToken = this.session.getRefreshToken();\r\n this.session.clear();\r\n if (!refreshToken) {\r\n return new Observable(subscriber => {\r\n subscriber.next();\r\n subscriber.complete();\r\n });\r\n }\r\n return this.api.logout(refreshToken).pipe(catchError(() => throwError(() => null)));\r\n }\r\n\r\n private signChallenge(nonce: string): Observable<{ publicKeyBase64: string; signature: string }> {\r\n this.loginPhaseSignal.set('signing');\r\n return new Observable<{ publicKeyBase64: string; signature: string }>(subscriber => {\r\n this.keypair\r\n .getOrCreateKeyPair()\r\n .then(({ publicKeyBase64 }) =>\r\n this.keypair.sign(nonce).then(signature => {\r\n subscriber.next({ publicKeyBase64, signature });\r\n subscriber.complete();\r\n })\r\n )\r\n .catch(error => subscriber.error(error));\r\n });\r\n }\r\n\r\n private handleAuthError(error: unknown, fallbackCode: AuthError['code'], onError?: () => void): Observable {\r\n onError?.();\r\n return throwError(() => this.toAuthError(this.toAuthErrorShape(error, fallbackCode)));\r\n }\r\n\r\n private toAuthErrorShape(error: unknown, fallbackCode: AuthError['code']): AuthError {\r\n if (error instanceof HttpErrorResponse) {\r\n const bodyCode = (error.error as { error?: { code?: unknown } } | null)?.error?.code;\r\n const code = authErrorCodeFromBackendCode(bodyCode) ?? authErrorCodeFromStatus(error.status);\r\n return { code, message: error.message, status: error.status };\r\n }\r\n if (error instanceof Error) {\r\n return { code: fallbackCode, message: error.message };\r\n }\r\n return { code: fallbackCode, message: 'Unknown authentication error.' };\r\n }\r\n\r\n private toAuthError(error: AuthError): AuthError {\r\n this.lastErrorSignal.set(error);\r\n return error;\r\n }\r\n}\r\n","/** Roles the Ed25519 JWT `role` claim is expected to carry. Ordered highest-to-lowest privilege; PermissionService does not rely on the order, it is documentation only. */\r\nexport type AdminRole = 'Owner' | 'Administrator' | 'Editor' | 'Support' | 'ReadOnly';\r\n\r\n/**\r\n * Coarse-grained permission keys. Intentionally small and domain-agnostic -\r\n * fine-grained, per-domain permissions stay server-side; the frontend only\r\n * needs enough to hide/disable UI, never to be the source of truth for\r\n * authorization.\r\n */\r\nexport type Permission =\r\n | 'backoffice.read'\r\n | 'backoffice.write'\r\n | 'builder.read'\r\n | 'builder.write'\r\n | 'users.manage'\r\n | 'settings.manage';\r\n\r\nexport const ROLE_PERMISSIONS: Readonly> = {\r\n Owner: ['backoffice.read', 'backoffice.write', 'builder.read', 'builder.write', 'users.manage', 'settings.manage'],\r\n Administrator: ['backoffice.read', 'backoffice.write', 'builder.read', 'builder.write', 'users.manage'],\r\n Editor: ['backoffice.read', 'backoffice.write', 'builder.read', 'builder.write'],\r\n Support: ['backoffice.read'],\r\n ReadOnly: ['backoffice.read', 'builder.read']\r\n};\r\n","import { Injectable, computed, inject } from '@angular/core';\r\nimport { Permission, ROLE_PERMISSIONS } from './models/permission.model';\r\nimport { SessionService } from './session.service';\r\n\r\n/**\r\n * Derives the current admin's permission set from their JWT `role` claim.\r\n * UI-only gate (hide/disable) - the backend must independently enforce\r\n * every mutation server-side.\r\n */\r\n@Injectable({ providedIn: 'root' })\r\nexport class PermissionService {\r\n private readonly session = inject(SessionService);\r\n\r\n readonly permissions = computed(() => {\r\n const role = this.session.role();\r\n return role ? ROLE_PERMISSIONS[role] : [];\r\n });\r\n\r\n has(permission: Permission): boolean {\r\n return this.permissions().includes(permission);\r\n }\r\n\r\n hasAny(permissions: readonly Permission[]): boolean {\r\n return permissions.some(permission => this.has(permission));\r\n }\r\n}\r\n","import { Injectable, inject } from '@angular/core';\r\nimport { Router } from '@angular/router';\r\nimport { finalize } from 'rxjs';\r\nimport { AuthService } from './auth.service';\r\nimport { PermissionService } from './permission.service';\r\nimport { SessionService } from './session.service';\r\nimport { Permission } from './models/permission.model';\r\n\r\n/**\r\n * Public surface for components/pages. Components should depend on this,\r\n * not on AuthService/SessionService/PermissionService directly, so the\r\n * orchestration details (which service owns what) can change without\r\n * touching UI code.\r\n */\r\n@Injectable({ providedIn: 'root' })\r\nexport class AuthFacade {\r\n private readonly auth = inject(AuthService);\r\n private readonly session = inject(SessionService);\r\n private readonly permissions = inject(PermissionService);\r\n private readonly router = inject(Router);\r\n\r\n readonly isAuthenticated = this.session.isAuthenticated;\r\n readonly status = this.session.status;\r\n readonly role = this.session.role;\r\n readonly loginPhase = this.auth.loginPhase;\r\n readonly lastError = this.auth.lastError;\r\n\r\n restoreSession(): void {\r\n this.auth.restoreSession();\r\n }\r\n\r\n login(onSuccessRedirectTo?: string): void {\r\n this.auth.login().subscribe({\r\n next: () => {\r\n if (onSuccessRedirectTo) {\r\n this.router.navigateByUrl(onSuccessRedirectTo);\r\n }\r\n },\r\n error: () => {\r\n const code = this.auth.lastError()?.code ?? 'unauthorized';\r\n this.router.navigate(['/admin-login/error', code]);\r\n }\r\n });\r\n }\r\n\r\n logout(redirectTo = '/admin-login'): void {\r\n this.auth\r\n .logout()\r\n .pipe(finalize(() => this.router.navigateByUrl(redirectTo)))\r\n .subscribe({ error: () => undefined });\r\n }\r\n\r\n can(permission: Permission): boolean {\r\n return this.permissions.has(permission);\r\n }\r\n}\r\n","import { Observable } from 'rxjs';\r\n\r\n/**\r\n * Prep interfaces for a future Ed25519 challenge/response admin auth flow.\r\n * No crypto is implemented here - verification is delegated to an injectable\r\n * service so the real implementation (native WebCrypto Ed25519 support, or a\r\n * backend verification call) can be swapped in once the backend API exists,\r\n * without touching AdminAuthService or components.\r\n */\r\nexport interface Ed25519Challenge {\r\n nonce: string;\r\n timestamp: string;\r\n /** Opaque challenge payload the client must sign with its private key. */\r\n payload: string;\r\n}\r\n\r\nexport interface Ed25519SignedResponse {\r\n challenge: Ed25519Challenge;\r\n publicKey: string;\r\n signature: string;\r\n}\r\n\r\nexport interface Ed25519VerificationResult {\r\n valid: boolean;\r\n reason?: string;\r\n}\r\n\r\nexport abstract class Ed25519VerificationService {\r\n abstract requestChallenge(): Observable;\r\n abstract verify(response: Ed25519SignedResponse): Observable;\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { Observable, throwError } from 'rxjs';\r\nimport { Ed25519Challenge, Ed25519SignedResponse, Ed25519VerificationResult, Ed25519VerificationService } from './ed25519-verification.model';\r\n\r\n/**\r\n * Default DI binding for Ed25519VerificationService until the backend ships\r\n * the real challenge/verify endpoints. Intentionally fails closed (throws)\r\n * rather than pretending to verify anything, so accidental use in a login\r\n * path is loud instead of silently accepting unsigned sessions.\r\n */\r\n@Injectable({ providedIn: 'root' })\r\nexport class NoopEd25519VerificationService implements Ed25519VerificationService {\r\n requestChallenge(): Observable {\r\n return throwError(() => new Error('Ed25519 challenge endpoint is not yet available from the backend.'));\r\n }\r\n\r\n verify(_response: Ed25519SignedResponse): Observable {\r\n return throwError(() => new Error('Ed25519 verification endpoint is not yet available from the backend.'));\r\n }\r\n}\r\n","// @marketplaces/auth — public API barrel.\r\n// Two independent auth mechanisms, per ADR-0001 (marketplaces repo:\r\n// docs/context/adrs/ADR-0001-extract-auth-and-payment-into-shared-marketplaces-packages.md):\r\n// - telegram/ — live Telegram QR/session auth (customer + admin)\r\n// - ed25519/ — future Ed25519 challenge/response admin auth (backend not shipped yet)\r\n// Provide AUTH_API_URL (and optionally TELEGRAM_BOT_USERNAME) from the consuming app's config.\r\n\r\nexport { AUTH_API_URL, TELEGRAM_BOT_USERNAME, MARKETPLACES_AUTH_CONFIG, provideMarketplacesAuth } from './config';\nexport type { MarketplacesAuthConfig } from './config';\nexport { MARKETPLACE_DOMAIN_HEADER, AuthMarketplaceContext, normalizeMarketplaceDomain } from './marketplace-context';\nexport { MarketplacesAuthComponent } from './ui/auth.component';\nexport { MARKETPLACES_AUTH_GATEWAY, HttpMarketplacesAuthGateway } from './ui/auth.gateway';\nexport type { MarketplacesAuthGateway } from './ui/auth.gateway';\nexport type { AuthMode, AuthMethod, CredentialLogin, AuthResult, ExternalAuthStart, AuthFailure } from './ui/auth.models';\n\r\n// Telegram module\r\nexport { AuthSession, WebSessionStart, AuthStatus, AdminAuthStatus } from './telegram/models/session.model';\r\nexport { TelegramSessionApiService } from './telegram/telegram-session-api.service';\r\nexport { AuthService } from './telegram/auth.service';\r\nexport { AdminAuthService } from './telegram/admin-auth.service';\r\nexport { adminAuthGuard } from './telegram/admin-auth.guard';\r\nexport { adminAuthHeadersInterceptor } from './telegram/admin-auth-headers.interceptor';\r\n\r\n// Ed25519 module (namespaced re-exports to avoid colliding with the telegram module's AuthService)\r\nexport { AuthService as Ed25519AuthService } from './ed25519/auth.service';\r\nexport { AuthFacade } from './ed25519/auth-facade.service';\r\nexport { AuthApiService } from './ed25519/auth-api.service';\r\nexport { SessionService } from './ed25519/session.service';\r\nexport { JwtService } from './ed25519/jwt.service';\r\nexport { Ed25519KeypairService } from './ed25519/ed25519-keypair.service';\r\nexport { PermissionService } from './ed25519/permission.service';\r\nexport {\r\n Ed25519VerificationService,\r\n Ed25519Challenge,\r\n Ed25519SignedResponse,\r\n Ed25519VerificationResult\r\n} from './ed25519/ed25519-verification.model';\r\nexport { NoopEd25519VerificationService } from './ed25519/noop-ed25519-verification.service';\r\nexport {\r\n AuthChallenge,\r\n VerifySignatureRequest,\r\n AuthTokenPair,\r\n RefreshTokenRequest,\r\n JwtClaims\r\n} from './ed25519/models/auth-api.model';\r\nexport { AuthErrorCode, AuthError, authErrorCodeFromBackendCode, authErrorCodeFromStatus } from './ed25519/models/auth-error.model';\r\nexport { AdminRole, Permission, ROLE_PERMISSIONS } from './ed25519/models/permission.model';\r\nexport type { LoginPhase } from './ed25519/auth.service';\r\nexport type { SessionStatus } from './ed25519/session.service';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["AuthService"],"mappings":"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"}