@masterteam/gateway-auth 0.0.16 → 0.0.18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"masterteam-gateway-auth.mjs","sources":["../../../../packages/masterteam/gateway-auth/src/gateway-auth.utils.ts","../../../../packages/masterteam/gateway-auth/src/gateway-auth.actions.ts","../../../../packages/masterteam/gateway-auth/src/gateway-auth.options.ts","../../../../packages/masterteam/gateway-auth/src/gateway-sso-session.service.ts","../../../../packages/masterteam/gateway-auth/src/gateway-auth.state.model.ts","../../../../packages/masterteam/gateway-auth/src/gateway-auth.state.ts","../../../../packages/masterteam/gateway-auth/src/gateway-auth.facade.ts","../../../../packages/masterteam/gateway-auth/src/gateway-auth.interceptor.ts","../../../../packages/masterteam/gateway-auth/src/components/gateway-sso-buttons/gateway-sso-buttons.ts","../../../../packages/masterteam/gateway-auth/src/components/gateway-sso-buttons/gateway-sso-buttons.html","../../../../packages/masterteam/gateway-auth/src/components/gateway-login-page/gateway-login-page.ts","../../../../packages/masterteam/gateway-auth/src/components/gateway-login-page/gateway-login-page.html","../../../../packages/masterteam/gateway-auth/src/components/gateway-mfa/gateway-mfa.ts","../../../../packages/masterteam/gateway-auth/src/components/gateway-mfa/gateway-mfa.html","../../../../packages/masterteam/gateway-auth/src/components/gateway-sso-callback/gateway-sso-callback.ts","../../../../packages/masterteam/gateway-auth/src/components/gateway-sso-callback/gateway-sso-callback.html","../../../../packages/masterteam/gateway-auth/src/masterteam-gateway-auth.ts"],"sourcesContent":["import {\r\n GatewayApiDateValue,\r\n GatewayAuthTokens,\r\n GatewayMappedTokens,\r\n GatewayMappedUser,\r\n GatewayRefreshData,\r\n GatewaySsoProvider,\r\n GatewayUserDetails,\r\n} from './gateway-auth.models';\r\n\r\nexport const GATEWAY_AUTH_DEVICE_TOKEN = 'web-app';\r\nexport const GATEWAY_AUTH_DEVICE_TOKEN_STORAGE_KEY =\r\n 'masterteam.gateway-auth.device-token';\r\nexport const GATEWAY_AUTH_ACCESS_TOKEN_REFRESH_SKEW_MS = 60 * 1000;\r\nexport const GATEWAY_AUTH_NGSW_BYPASS_PARAM = 'ngsw-bypass';\r\n\r\nexport type GatewayDeviceTokenOption =\r\n | string\r\n | (() => string | null | undefined);\r\n\r\nexport const GATEWAY_AUTH_ENDPOINTS = {\r\n login: 'auth/login',\r\n verifyMfa: 'auth/2fa/verify',\r\n resendMfa: 'auth/2fa/resend',\r\n refresh: 'auth/refresh',\r\n logout: 'auth/logout',\r\n ssoProviders: 'auth/sso/providers',\r\n ssoExchange: 'auth/sso/exchange',\r\n ssoTokenExchange: 'auth/sso/token-exchange',\r\n nafathStart: (providerKey: string) =>\r\n `auth/sso/nafath/${encodeURIComponent(providerKey)}/start`,\r\n nafathStatus: (providerKey: string) =>\r\n `auth/sso/nafath/${encodeURIComponent(providerKey)}/status`,\r\n ssoStart: (providerKey: string) =>\r\n `auth/sso/${encodeURIComponent(providerKey)}/start`,\r\n} as const;\r\n\r\nexport function isExpired(expireAt?: string | null, skewMs = 0): boolean {\r\n if (!expireAt) {\r\n return false;\r\n }\r\n\r\n const timestamp = new Date(expireAt).getTime();\r\n return !Number.isFinite(timestamp) || timestamp <= Date.now() + skewMs;\r\n}\r\n\r\nexport function resolveApiDateValue(\r\n value?: GatewayApiDateValue | null,\r\n): string | null {\r\n return value?.actualValue ?? value?.rawValue ?? null;\r\n}\r\n\r\nexport function mapGatewayTokens(\r\n tokens: GatewayAuthTokens | GatewayRefreshData,\r\n): GatewayMappedTokens {\r\n return {\r\n accessToken: tokens.accessToken,\r\n refreshToken: tokens.refreshToken,\r\n accessTokenExpiresAt: resolveApiDateValue(tokens.accessTokenExpiresAt),\r\n refreshTokenExpiresAt: resolveApiDateValue(tokens.refreshTokenExpiresAt),\r\n };\r\n}\r\n\r\nexport function resolveAccessTokenRefreshSkewMs(\r\n skewMs?: number | null,\r\n): number {\r\n return typeof skewMs === 'number' && Number.isFinite(skewMs) && skewMs >= 0\r\n ? skewMs\r\n : GATEWAY_AUTH_ACCESS_TOKEN_REFRESH_SKEW_MS;\r\n}\r\n\r\nexport function resolveGatewayDeviceToken(\r\n deviceToken?: GatewayDeviceTokenOption | null,\r\n): string {\r\n const configuredToken =\r\n typeof deviceToken === 'function' ? deviceToken() : deviceToken;\r\n const normalizedConfiguredToken = configuredToken?.trim();\r\n\r\n if (normalizedConfiguredToken) {\r\n return normalizedConfiguredToken;\r\n }\r\n\r\n if (typeof window === 'undefined') {\r\n return GATEWAY_AUTH_DEVICE_TOKEN;\r\n }\r\n\r\n try {\r\n const storedToken = window.localStorage\r\n ?.getItem(GATEWAY_AUTH_DEVICE_TOKEN_STORAGE_KEY)\r\n ?.trim();\r\n\r\n if (storedToken) {\r\n return storedToken;\r\n }\r\n\r\n const generatedToken = `web-${createSecureClientState()}`;\r\n window.localStorage?.setItem(\r\n GATEWAY_AUTH_DEVICE_TOKEN_STORAGE_KEY,\r\n generatedToken,\r\n );\r\n return generatedToken;\r\n } catch {\r\n return GATEWAY_AUTH_DEVICE_TOKEN;\r\n }\r\n}\r\n\r\nexport function withGatewayAuthNgswBypass(url: string): string {\r\n if (\r\n url.includes(`?${GATEWAY_AUTH_NGSW_BYPASS_PARAM}`) ||\r\n url.includes(`&${GATEWAY_AUTH_NGSW_BYPASS_PARAM}`)\r\n ) {\r\n return url;\r\n }\r\n\r\n const separator = url.includes('?') ? '&' : '?';\r\n return `${url}${separator}${GATEWAY_AUTH_NGSW_BYPASS_PARAM}=true`;\r\n}\r\n\r\ninterface PersistedGatewayAuthState {\r\n token?: unknown;\r\n accessToken?: unknown;\r\n refreshToken?: unknown;\r\n accessTokenExpiresAt?: unknown;\r\n refreshTokenExpiresAt?: unknown;\r\n user?: {\r\n token?: unknown;\r\n accessToken?: unknown;\r\n refreshToken?: unknown;\r\n accessTokenExpiresAt?: unknown;\r\n refreshTokenExpiresAt?: unknown;\r\n };\r\n}\r\n\r\nfunction readString(value: unknown): string | null {\r\n return typeof value === 'string' && value ? value : null;\r\n}\r\n\r\nexport function readPersistedGatewayAuthTokens(): GatewayAuthTokens | null {\r\n if (typeof window === 'undefined') {\r\n return null;\r\n }\r\n\r\n try {\r\n const rawState = window.localStorage?.getItem('auth');\r\n if (!rawState) {\r\n return null;\r\n }\r\n\r\n const parsedState = JSON.parse(rawState) as PersistedGatewayAuthState;\r\n const accessToken =\r\n readString(parsedState.token) ??\r\n readString(parsedState.accessToken) ??\r\n readString(parsedState.user?.token) ??\r\n readString(parsedState.user?.accessToken);\r\n const refreshToken =\r\n readString(parsedState.refreshToken) ??\r\n readString(parsedState.user?.refreshToken);\r\n\r\n if (!accessToken || !refreshToken) {\r\n return null;\r\n }\r\n\r\n const accessTokenExpiresAt =\r\n readString(parsedState.accessTokenExpiresAt) ??\r\n readString(parsedState.user?.accessTokenExpiresAt) ??\r\n '';\r\n const refreshTokenExpiresAt =\r\n readString(parsedState.refreshTokenExpiresAt) ??\r\n readString(parsedState.user?.refreshTokenExpiresAt) ??\r\n '';\r\n\r\n return {\r\n accessToken,\r\n accessTokenExpiresAt: { actualValue: accessTokenExpiresAt },\r\n refreshToken,\r\n refreshTokenExpiresAt: { actualValue: refreshTokenExpiresAt },\r\n };\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\nexport function mapGatewayUser(\r\n user: GatewayUserDetails,\r\n tokenData: GatewayMappedTokens,\r\n delegations?: unknown[],\r\n): GatewayMappedUser {\r\n const photo =\r\n typeof user.photo === 'string' ? { fileName: user.photo } : user.photo;\r\n const imageFallback = user.image ? { fileName: user.image } : undefined;\r\n const resolvedPhoto = photo ?? imageFallback;\r\n\r\n return {\r\n user: {\r\n ...user,\r\n photo: resolvedPhoto,\r\n },\r\n token: tokenData.accessToken,\r\n accessToken: tokenData.accessToken,\r\n refreshToken: tokenData.refreshToken,\r\n accessTokenExpiresAt: tokenData.accessTokenExpiresAt ?? undefined,\r\n refreshTokenExpiresAt: tokenData.refreshTokenExpiresAt ?? undefined,\r\n delegations: delegations ?? [],\r\n twoFactorRequired: false,\r\n };\r\n}\r\n\r\nexport function hasGatewayTokens(\r\n tokens?: Partial<GatewayAuthTokens | GatewayRefreshData> | null,\r\n): boolean {\r\n return Boolean(tokens?.accessToken && tokens?.refreshToken);\r\n}\r\n\r\nexport const GATEWAY_RATE_LIMIT_STATUS = 429;\r\nexport const GATEWAY_RATE_LIMIT_ERROR_CODE = 'RATE_001';\r\n\r\nexport interface GatewayRateLimitInfo {\r\n retryAfterSeconds: number | null;\r\n message: string;\r\n}\r\n\r\nexport function extractGatewayRateLimitInfo(\r\n error: unknown,\r\n): GatewayRateLimitInfo | null {\r\n const e = error as {\r\n status?: number;\r\n error?: {\r\n message?: string;\r\n errors?: {\r\n code?: string;\r\n message?: string;\r\n details?: { retryAfterSeconds?: number | string };\r\n };\r\n };\r\n headers?: { get?: (name: string) => string | null };\r\n } | null;\r\n\r\n if (!e || e.status !== GATEWAY_RATE_LIMIT_STATUS) {\r\n return null;\r\n }\r\n\r\n const detailSeconds = Number(e.error?.errors?.details?.retryAfterSeconds);\r\n const headerSeconds = Number(e.headers?.get?.('Retry-After'));\r\n const retryAfterSeconds =\r\n Number.isFinite(detailSeconds) && detailSeconds > 0\r\n ? Math.ceil(detailSeconds)\r\n : Number.isFinite(headerSeconds) && headerSeconds > 0\r\n ? Math.ceil(headerSeconds)\r\n : null;\r\n\r\n const message =\r\n e.error?.errors?.message ??\r\n e.error?.message ??\r\n 'Too many attempts. Please try again later.';\r\n\r\n return { retryAfterSeconds, message };\r\n}\r\n\r\nexport function getGatewayErrorMessage(\r\n error: unknown,\r\n fallback: string,\r\n): string {\r\n const response = error as {\r\n error?: {\r\n message?: string;\r\n Message?: string;\r\n errors?: { message?: string };\r\n };\r\n message?: string;\r\n };\r\n\r\n return (\r\n response.error?.message ??\r\n response.error?.Message ??\r\n response.error?.errors?.message ??\r\n response.message ??\r\n fallback\r\n );\r\n}\r\n\r\nexport function normalizeGatewayBase(baseUrl?: string | null): string {\r\n if (!baseUrl) {\r\n return '';\r\n }\r\n\r\n return baseUrl.replace(/\\/+$/, '');\r\n}\r\n\r\nexport function buildGatewayUrl(\r\n gatewayApiBaseUrl: string | undefined | null,\r\n path: string,\r\n): string {\r\n if (/^https?:\\/\\//i.test(path)) {\r\n return path;\r\n }\r\n\r\n const normalizedBase = normalizeGatewayBase(gatewayApiBaseUrl);\r\n if (!normalizedBase) {\r\n return path;\r\n }\r\n\r\n const normalizedPath = path.replace(/^\\/+/, '');\r\n if (normalizedPath.startsWith('api/')) {\r\n try {\r\n const base = new URL(normalizedBase);\r\n return `${base.origin}/${normalizedPath}`;\r\n } catch {\r\n return `${normalizedBase}/${normalizedPath}`;\r\n }\r\n }\r\n\r\n return `${normalizedBase}/${normalizedPath}`;\r\n}\r\n\r\nexport interface BuildSsoStartUrlOptions {\r\n gatewayApiBaseUrl: string;\r\n provider: GatewaySsoProvider;\r\n returnUrl: string;\r\n clientState: string;\r\n platform?: 'web' | 'mobile';\r\n}\r\n\r\nexport function buildSsoStartUrl({\r\n gatewayApiBaseUrl,\r\n provider,\r\n returnUrl,\r\n clientState,\r\n platform = 'web',\r\n}: BuildSsoStartUrlOptions): string {\r\n const startPath =\r\n provider.startUrl || GATEWAY_AUTH_ENDPOINTS.ssoStart(provider.key);\r\n const url = new URL(buildGatewayUrl(gatewayApiBaseUrl, startPath));\r\n url.searchParams.set('platform', platform);\r\n url.searchParams.set('returnUrl', returnUrl);\r\n url.searchParams.set('clientState', clientState);\r\n return url.toString();\r\n}\r\n\r\nexport function createSecureClientState(): string {\r\n if (typeof crypto !== 'undefined' && crypto.randomUUID) {\r\n return crypto.randomUUID();\r\n }\r\n\r\n const bytes = new Uint8Array(16);\r\n if (typeof crypto !== 'undefined' && crypto.getRandomValues) {\r\n crypto.getRandomValues(bytes);\r\n return Array.from(bytes, (value) =>\r\n value.toString(16).padStart(2, '0'),\r\n ).join('');\r\n }\r\n\r\n return `${Date.now().toString(36)}${Math.random().toString(36).slice(2)}`;\r\n}\r\n","import {\r\n AuthLoginData,\r\n AuthRateLimit,\r\n AuthTokens,\r\n LoginRequest,\r\n SsoProvider,\r\n User,\r\n} from './gateway-auth.state.model';\r\n\r\nexport class Login {\r\n static readonly type = '[Auth] Login';\r\n constructor(public payload: LoginRequest) {}\r\n}\r\n\r\nexport class VerifyMfa {\r\n static readonly type = '[Auth] Verify MFA';\r\n constructor(public code: string) {}\r\n}\r\n\r\nexport class ResendMfa {\r\n static readonly type = '[Auth] Resend MFA';\r\n}\r\n\r\nexport class LoadSsoProviders {\r\n static readonly type = '[Auth] Load SSO Providers';\r\n}\r\n\r\nexport class StartSso {\r\n static readonly type = '[Auth] Start SSO';\r\n constructor(public provider: SsoProvider) {}\r\n}\r\n\r\nexport class ExchangeSsoCode {\r\n static readonly type = '[Auth] Exchange SSO Code';\r\n constructor(\r\n public code: string,\r\n public state: string,\r\n ) {}\r\n}\r\n\r\nexport class LoginSuccess {\r\n static readonly type = '[Auth] Login Success';\r\n constructor(public session: AuthLoginData) {}\r\n}\r\n\r\nexport class LoginFailure {\r\n static readonly type = '[Auth] Login Failure';\r\n constructor(public error: string) {}\r\n}\r\n\r\nexport class Logout {\r\n static readonly type = '[Auth] Logout';\r\n constructor(public remote: boolean = false) {}\r\n}\r\n\r\nexport class UpdateUserData {\r\n static readonly type = '[Auth] Update User Data';\r\n constructor(public user: User) {}\r\n}\r\n\r\nexport class UpdateTokens {\r\n static readonly type = '[Auth] Update Tokens';\r\n constructor(public tokens: AuthTokens) {}\r\n}\r\n\r\nexport class ClearError {\r\n static readonly type = '[Auth] Clear Error';\r\n}\r\n\r\nexport class ClearPendingMfa {\r\n static readonly type = '[Auth] Clear Pending MFA';\r\n}\r\n\r\nexport class SetRateLimit {\r\n static readonly type = '[Auth] Set Rate Limit';\r\n constructor(public lock: AuthRateLimit) {}\r\n}\r\n\r\nexport class ClearRateLimit {\r\n static readonly type = '[Auth] Clear Rate Limit';\r\n}\r\n","import { InjectionToken } from '@angular/core';\nimport type { HttpRequest } from '@angular/common/http';\nimport { StateContext } from '@ngxs/store';\nimport { Observable } from 'rxjs';\nimport {\n GatewayLoginResponse,\n GatewayPlatform,\n GatewaySsoProvider,\n} from './gateway-auth.models';\nimport { AuthStateModel } from './gateway-auth.state.model';\nimport type { GatewayDeviceTokenOption } from './gateway-auth.utils';\n\nexport type GatewayAuthHookResult =\n | void\n | null\n | Observable<unknown>\n | Promise<unknown>;\n\nexport interface GatewayLoginLanguageOption {\n key: string;\n id?: string;\n label: string;\n dir?: 'ltr' | 'rtl';\n icon?: string;\n}\n\nexport interface GatewayLoginPageOptions {\n imageBasePath?: string;\n translationPrefix?: string;\n showLanguageToggle?: boolean;\n ssoButtonLabel?:\n | string\n | ((provider: GatewaySsoProvider, providerCount: number) => string);\n getLanguages?: () => readonly GatewayLoginLanguageOption[];\n getActiveLanguage?: () => string | null | undefined;\n setLanguage?: (langKey: string) => void;\n}\n\nexport interface GatewayAuthOptions {\n getGatewayApiBaseUrl: () => string | null | undefined;\n getApplicationApiBaseUrl?: () => string | null | undefined;\n shouldUseGatewayApiBaseUrl?: (request: HttpRequest<unknown>) => boolean;\n deviceToken?: GatewayDeviceTokenOption;\n accessTokenRefreshSkewMs?: number;\n platform?: GatewayPlatform;\n loginRoute?: string;\n mfaRoute?: string;\n ssoCallbackPath?: string;\n defaultAuthenticatedRoute?: string | (() => string | null | undefined);\n preserveSsoProvidersOnLogout?: boolean;\n loginPage?: GatewayLoginPageOptions;\n afterLogin?: (\n session: GatewayLoginResponse,\n ctx: StateContext<AuthStateModel>,\n ) => GatewayAuthHookResult;\n beforeLocalLogout?: (\n ctx: StateContext<AuthStateModel>,\n ) => GatewayAuthHookResult;\n}\n\nexport const GATEWAY_AUTH_OPTIONS = new InjectionToken<GatewayAuthOptions>(\n 'GATEWAY_AUTH_OPTIONS',\n {\n factory: () => ({\n getGatewayApiBaseUrl: () => null,\n accessTokenRefreshSkewMs: 60 * 1000,\n platform: 'web',\n loginRoute: '/auth/login',\n mfaRoute: '/auth/mfa',\n ssoCallbackPath: '/auth/sso/callback',\n defaultAuthenticatedRoute: '/',\n preserveSsoProvidersOnLogout: true,\n loginPage: {\n imageBasePath: '/Settings/login-image/',\n translationPrefix: 'login',\n },\n }),\n },\n);\n","import { createSecureClientState } from './gateway-auth.utils';\n\nconst PENDING_SSO_STATE_KEY = 'gatewayAuth.pendingSsoState';\n\nexport class GatewaySsoSession {\n createAndStoreState(): string {\n const state = createSecureClientState();\n this.storage?.setItem(PENDING_SSO_STATE_KEY, state);\n return state;\n }\n\n getPendingState(): string | null {\n return this.storage?.getItem(PENDING_SSO_STATE_KEY) ?? null;\n }\n\n clearPendingState(): void {\n this.storage?.removeItem(PENDING_SSO_STATE_KEY);\n }\n\n consumeExpectedState(state: string | null): boolean {\n const expectedState = this.getPendingState();\n this.clearPendingState();\n return Boolean(state && expectedState && state === expectedState);\n }\n\n clearCallbackQuery(path = '/auth/sso/callback'): void {\n if (typeof window === 'undefined' || !window.history?.replaceState) {\n return;\n }\n\n window.history.replaceState({}, document.title, path);\n }\n\n clearAll(): void {\n this.clearPendingState();\n }\n\n private get storage(): Storage | null {\n if (typeof sessionStorage === 'undefined') {\n return null;\n }\n\n return sessionStorage;\n }\n}\n","import {\r\n GatewayAuthTokens,\r\n GatewayLoginRequest,\r\n GatewayLoginResponse,\r\n GatewayMappedUser,\r\n GatewayRefreshData,\r\n GatewayResponse,\r\n GatewaySsoProvider,\r\n GatewayTwoFactorChallenge,\r\n GatewayUserDetails,\r\n} from './gateway-auth.models';\r\n\r\nexport type UserDetails = GatewayUserDetails;\r\nexport type User = GatewayMappedUser;\r\nexport type LoginRequest = GatewayLoginRequest;\r\nexport type ApiDateValue = NonNullable<\r\n GatewayAuthTokens['accessTokenExpiresAt']\r\n>;\r\nexport type AuthTokens = GatewayAuthTokens;\r\nexport type AuthLoginData = GatewayLoginResponse;\r\nexport type AuthRefreshData = GatewayRefreshData;\r\nexport type TwoFactorChallenge = GatewayTwoFactorChallenge;\r\nexport type SsoProvider = GatewaySsoProvider;\r\nexport type Response<T> = GatewayResponse<T>;\r\n\r\nexport type AuthRateLimitScope =\r\n | 'login'\r\n | 'verifyMfa'\r\n | 'resendMfa'\r\n | 'ssoExchange';\r\n\r\nexport interface AuthRateLimit {\r\n retryUntilMs: number | null;\r\n totalSeconds: number | null;\r\n message: string;\r\n scope: AuthRateLimitScope;\r\n}\r\n\r\nexport interface AuthStateModel {\r\n user: User | null;\r\n token: string | null;\r\n refreshToken: string | null;\r\n accessTokenExpiresAt: string | null;\r\n refreshTokenExpiresAt: string | null;\r\n loading: boolean;\r\n mfaResendLoading: boolean;\r\n ssoLoading: boolean;\r\n ssoCallbackLoading: boolean;\r\n error: string | null;\r\n twoFactorRequired: boolean;\r\n pendingMfa: TwoFactorChallenge | null;\r\n ssoProviders: SsoProvider[];\r\n rateLimit: AuthRateLimit | null;\r\n}\r\n\r\nexport const AUTH_STATE_DEFAULTS: AuthStateModel = {\r\n user: null,\r\n token: null,\r\n refreshToken: null,\r\n accessTokenExpiresAt: null,\r\n refreshTokenExpiresAt: null,\r\n loading: false,\r\n mfaResendLoading: false,\r\n ssoLoading: false,\r\n ssoCallbackLoading: false,\r\n error: null,\r\n twoFactorRequired: false,\r\n pendingMfa: null,\r\n ssoProviders: [],\r\n rateLimit: null,\r\n};\r\n\r\nfunction pruneRateLimit(\r\n rateLimit: AuthRateLimit | null | undefined,\r\n): AuthRateLimit | null {\r\n if (!rateLimit) {\r\n return null;\r\n }\r\n if (\r\n typeof rateLimit.retryUntilMs === 'number' &&\r\n rateLimit.retryUntilMs <= Date.now()\r\n ) {\r\n return null;\r\n }\r\n return rateLimit;\r\n}\r\n\r\nexport function sanitizePersistedAuthState(\r\n obj: Partial<AuthStateModel> | null,\r\n) {\r\n return {\r\n ...AUTH_STATE_DEFAULTS,\r\n ...(obj ?? {}),\r\n loading: false,\r\n mfaResendLoading: false,\r\n ssoLoading: false,\r\n ssoCallbackLoading: false,\r\n error: null,\r\n twoFactorRequired: false,\r\n pendingMfa: null,\r\n ssoProviders: [],\r\n rateLimit: pruneRateLimit(obj?.rateLimit ?? null),\r\n };\r\n}\r\n","import { HttpClient } from '@angular/common/http';\r\nimport { Injectable, inject } from '@angular/core';\r\nimport { Router } from '@angular/router';\r\nimport { ModalService } from '@masterteam/components/modal';\r\nimport { Action, Selector, State, StateContext } from '@ngxs/store';\r\nimport { EMPTY, Observable, from, isObservable, of } from 'rxjs';\r\nimport { catchError, mergeMap, tap } from 'rxjs/operators';\r\nimport {\r\n ClearError,\r\n ClearPendingMfa,\r\n ClearRateLimit,\r\n ExchangeSsoCode,\r\n LoadSsoProviders,\r\n Login,\r\n LoginFailure,\r\n LoginSuccess,\r\n Logout,\r\n ResendMfa,\r\n SetRateLimit,\r\n StartSso,\r\n UpdateTokens,\r\n UpdateUserData,\r\n VerifyMfa,\r\n} from './gateway-auth.actions';\r\nimport {\r\n GATEWAY_AUTH_OPTIONS,\r\n GatewayAuthHookResult,\r\n} from './gateway-auth.options';\r\nimport {\r\n GatewayLoginResponse,\r\n GatewayResponse,\r\n GatewaySsoProvidersData,\r\n GatewayTwoFactorChallenge,\r\n} from './gateway-auth.models';\r\nimport {\r\n buildGatewayUrl,\r\n buildSsoStartUrl,\r\n extractGatewayRateLimitInfo,\r\n GATEWAY_AUTH_ENDPOINTS,\r\n getGatewayErrorMessage,\r\n hasGatewayTokens,\r\n mapGatewayTokens,\r\n mapGatewayUser,\r\n resolveGatewayDeviceToken,\r\n} from './gateway-auth.utils';\r\nimport { GatewaySsoSession } from './gateway-sso-session.service';\r\nimport {\r\n AUTH_STATE_DEFAULTS,\r\n AuthLoginData,\r\n AuthRateLimit,\r\n AuthRateLimitScope,\r\n AuthStateModel,\r\n SsoProvider,\r\n User,\r\n} from './gateway-auth.state.model';\r\n\r\n@State<AuthStateModel>({\r\n name: 'auth',\r\n defaults: AUTH_STATE_DEFAULTS,\r\n})\r\n@Injectable()\r\nexport class GatewayAuthState {\r\n private readonly http = inject(HttpClient);\r\n private readonly options = inject(GATEWAY_AUTH_OPTIONS);\r\n private readonly router = inject(Router);\r\n private readonly modalService = inject(ModalService);\r\n private readonly ssoSession = new GatewaySsoSession();\r\n\r\n @Selector()\r\n static user(state: AuthStateModel): User | null {\r\n return state.user;\r\n }\r\n\r\n @Selector()\r\n static loading(state: AuthStateModel): boolean {\r\n return state.loading;\r\n }\r\n\r\n @Selector()\r\n static mfaResendLoading(state: AuthStateModel): boolean {\r\n return state.mfaResendLoading;\r\n }\r\n\r\n @Selector()\r\n static ssoLoading(state: AuthStateModel): boolean {\r\n return state.ssoLoading;\r\n }\r\n\r\n @Selector()\r\n static ssoCallbackLoading(state: AuthStateModel): boolean {\r\n return state.ssoCallbackLoading;\r\n }\r\n\r\n @Selector()\r\n static error(state: AuthStateModel): string | null {\r\n return state.error;\r\n }\r\n\r\n @Selector()\r\n static token(state: AuthStateModel): string | null {\r\n return state.token;\r\n }\r\n\r\n @Selector()\r\n static refreshToken(state: AuthStateModel): string | null {\r\n return state.refreshToken;\r\n }\r\n\r\n @Selector()\r\n static accessTokenExpiresAt(state: AuthStateModel): string | null {\r\n return state.accessTokenExpiresAt;\r\n }\r\n\r\n @Selector()\r\n static refreshTokenExpiresAt(state: AuthStateModel): string | null {\r\n return state.refreshTokenExpiresAt;\r\n }\r\n\r\n @Selector()\r\n static twoFactorRequired(state: AuthStateModel): boolean {\r\n return state.twoFactorRequired;\r\n }\r\n\r\n @Selector()\r\n static pendingMfa(state: AuthStateModel) {\r\n return state.pendingMfa;\r\n }\r\n\r\n @Selector()\r\n static ssoProviders(state: AuthStateModel): SsoProvider[] {\r\n return state.ssoProviders;\r\n }\r\n\r\n @Selector()\r\n static rateLimit(state: AuthStateModel): AuthRateLimit | null {\r\n return state.rateLimit;\r\n }\r\n\r\n @Selector()\r\n static isAdmin(state: AuthStateModel): boolean {\r\n return state.user?.isAdmin || false;\r\n }\r\n\r\n @Selector()\r\n static userDetails(state: AuthStateModel) {\r\n return state.user?.user || null;\r\n }\r\n\r\n @Action(Login)\r\n login(ctx: StateContext<AuthStateModel>, action: Login) {\r\n if (this.isRateLimitActive(ctx, 'login')) {\r\n return EMPTY;\r\n }\r\n\r\n ctx.patchState({\r\n loading: true,\r\n error: null,\r\n pendingMfa: null,\r\n twoFactorRequired: false,\r\n });\r\n\r\n return this.http\r\n .post<GatewayResponse<GatewayLoginResponse>>(\r\n this.gatewayAuthMutationUrl(GATEWAY_AUTH_ENDPOINTS.login),\r\n {\r\n userName: action.payload.userName,\r\n password: action.payload.password,\r\n isEncrypted: action.payload.isEncrypted ?? false,\r\n deviceToken: action.payload.deviceToken || this.deviceToken,\r\n recaptchaToken: action.payload.recaptchaToken,\r\n recaptchaAction: action.payload.recaptchaAction,\r\n },\r\n )\r\n .pipe(\r\n mergeMap((response) => this.handleLoginResponse(ctx, response.data)),\r\n catchError((error) => {\r\n if (this.handleRateLimit(ctx, error, 'login')) {\r\n return of(null);\r\n }\r\n ctx.dispatch(\r\n new LoginFailure(getGatewayErrorMessage(error, 'Login failed')),\r\n );\r\n return of(null);\r\n }),\r\n );\r\n }\r\n\r\n @Action(VerifyMfa)\r\n verifyMfa(ctx: StateContext<AuthStateModel>, action: VerifyMfa) {\r\n const pendingMfa = ctx.getState().pendingMfa;\r\n if (!pendingMfa) {\r\n ctx.dispatch(new LoginFailure('The verification session expired.'));\r\n this.navigateToLogin();\r\n return EMPTY;\r\n }\r\n\r\n ctx.patchState({ loading: true, error: null });\r\n\r\n return this.http\r\n .post<GatewayResponse<GatewayLoginResponse>>(\r\n this.gatewayAuthMutationUrl(GATEWAY_AUTH_ENDPOINTS.verifyMfa),\r\n {\r\n userId: pendingMfa.userId,\r\n tempSessionId: pendingMfa.tempSessionId,\r\n code: action.code,\r\n deviceToken: this.deviceToken,\r\n },\r\n )\r\n .pipe(\r\n mergeMap((response) => this.handleLoginResponse(ctx, response.data)),\r\n catchError((error) => {\r\n if (this.handleRateLimit(ctx, error, 'verifyMfa')) {\r\n return of(null);\r\n }\r\n const message = getGatewayErrorMessage(\r\n error,\r\n 'Invalid verification code',\r\n );\r\n const shouldClearMfa = error?.status === 403;\r\n ctx.patchState({\r\n loading: false,\r\n error: message,\r\n pendingMfa: shouldClearMfa ? null : pendingMfa,\r\n twoFactorRequired: !shouldClearMfa,\r\n });\r\n if (shouldClearMfa) {\r\n this.navigateToLogin();\r\n }\r\n return of(null);\r\n }),\r\n );\r\n }\r\n\r\n @Action(ResendMfa)\r\n resendMfa(ctx: StateContext<AuthStateModel>) {\r\n const pendingMfa = ctx.getState().pendingMfa;\r\n if (!pendingMfa) {\r\n ctx.dispatch(new LoginFailure('The verification session expired.'));\r\n this.navigateToLogin();\r\n return EMPTY;\r\n }\r\n\r\n if (this.isRateLimitActive(ctx, 'resendMfa')) {\r\n return EMPTY;\r\n }\r\n\r\n ctx.patchState({ mfaResendLoading: true, error: null });\r\n\r\n return this.http\r\n .post<GatewayResponse<GatewayTwoFactorChallenge>>(\r\n this.gatewayAuthMutationUrl(GATEWAY_AUTH_ENDPOINTS.resendMfa),\r\n {\r\n userId: pendingMfa.userId,\r\n tempSessionId: pendingMfa.tempSessionId,\r\n },\r\n )\r\n .pipe(\r\n tap((response) => {\r\n ctx.patchState({\r\n pendingMfa: response.data,\r\n twoFactorRequired: true,\r\n mfaResendLoading: false,\r\n error: null,\r\n });\r\n }),\r\n catchError((error) => {\r\n if (this.handleRateLimit(ctx, error, 'resendMfa')) {\r\n ctx.patchState({ mfaResendLoading: false });\r\n return of(null);\r\n }\r\n ctx.patchState({\r\n mfaResendLoading: false,\r\n error: getGatewayErrorMessage(error, 'Failed to resend code'),\r\n });\r\n return of(null);\r\n }),\r\n );\r\n }\r\n\r\n @Action(LoadSsoProviders)\r\n loadSsoProviders(ctx: StateContext<AuthStateModel>) {\r\n ctx.patchState({ ssoLoading: true });\r\n\r\n return this.http\r\n .get<GatewayResponse<GatewaySsoProvidersData>>(\r\n this.gatewayUrl(GATEWAY_AUTH_ENDPOINTS.ssoProviders),\r\n {\r\n params: { platform: this.options.platform ?? 'web' },\r\n },\r\n )\r\n .pipe(\r\n tap((response) => {\r\n ctx.patchState({\r\n ssoProviders: (response.data?.providers ?? []).filter(\r\n (provider) => provider.enabled,\r\n ),\r\n ssoLoading: false,\r\n });\r\n }),\r\n catchError(() => {\r\n ctx.patchState({\r\n ssoProviders: [],\r\n ssoLoading: false,\r\n });\r\n return of(null);\r\n }),\r\n );\r\n }\r\n\r\n @Action(StartSso)\r\n startSso(ctx: StateContext<AuthStateModel>, action: StartSso) {\r\n if (action.provider.flow !== 'browser_redirect') {\r\n ctx.patchState({\r\n error: 'This SSO provider is not available for browser sign-in.',\r\n });\r\n return;\r\n }\r\n\r\n const gatewayApiBaseUrl = this.options.getGatewayApiBaseUrl();\r\n if (!gatewayApiBaseUrl || typeof window === 'undefined') {\r\n ctx.patchState({ error: 'SSO is not configured.' });\r\n return;\r\n }\r\n\r\n const clientState = this.ssoSession.createAndStoreState();\r\n const callbackPath = this.options.ssoCallbackPath ?? '/auth/sso/callback';\r\n const startUrl = buildSsoStartUrl({\r\n gatewayApiBaseUrl,\r\n provider: action.provider,\r\n returnUrl: `${window.location.origin}${callbackPath}`,\r\n clientState,\r\n platform: this.options.platform ?? 'web',\r\n });\r\n\r\n window.location.assign(startUrl);\r\n }\r\n\r\n @Action(ExchangeSsoCode)\r\n exchangeSsoCode(ctx: StateContext<AuthStateModel>, action: ExchangeSsoCode) {\r\n ctx.patchState({ ssoCallbackLoading: true, error: null });\r\n\r\n return this.http\r\n .post<GatewayResponse<GatewayLoginResponse>>(\r\n this.gatewayAuthMutationUrl(GATEWAY_AUTH_ENDPOINTS.ssoExchange),\r\n {\r\n code: action.code,\r\n state: action.state,\r\n deviceToken: this.deviceToken,\r\n },\r\n )\r\n .pipe(\r\n mergeMap((response) => this.handleLoginResponse(ctx, response.data)),\r\n catchError((error) => {\r\n if (this.handleRateLimit(ctx, error, 'ssoExchange')) {\r\n ctx.patchState({ ssoCallbackLoading: false });\r\n return of(null);\r\n }\r\n ctx.patchState({\r\n ssoCallbackLoading: false,\r\n error: getGatewayErrorMessage(\r\n error,\r\n 'SSO sign-in failed. Please try again.',\r\n ),\r\n });\r\n return of(null);\r\n }),\r\n );\r\n }\r\n\r\n @Action(LoginSuccess)\r\n loginSuccess(ctx: StateContext<AuthStateModel>, action: LoginSuccess) {\r\n return this.handleLoginResponse(ctx, action.session);\r\n }\r\n\r\n @Action(LoginFailure)\r\n loginFailure(ctx: StateContext<AuthStateModel>, action: LoginFailure) {\r\n ctx.patchState({\r\n loading: false,\r\n ssoCallbackLoading: false,\r\n error: action.error,\r\n user: null,\r\n token: null,\r\n refreshToken: null,\r\n accessTokenExpiresAt: null,\r\n refreshTokenExpiresAt: null,\r\n pendingMfa: null,\r\n twoFactorRequired: false,\r\n });\r\n }\r\n\r\n @Action(Logout)\r\n logout(ctx: StateContext<AuthStateModel>, action: Logout) {\r\n const { token, refreshToken, ssoProviders } = ctx.getState();\r\n this.modalService.closeAll();\r\n this.ssoSession.clearAll();\r\n this.toObservable(this.options.beforeLocalLogout?.(ctx)).subscribe();\r\n ctx.patchState({\r\n ...AUTH_STATE_DEFAULTS,\r\n ssoProviders: this.options.preserveSsoProvidersOnLogout\r\n ? ssoProviders\r\n : [],\r\n });\r\n this.navigateToLogin();\r\n\r\n if (action.remote && token) {\r\n this.http\r\n .post<GatewayResponse<boolean>>(\r\n this.gatewayAuthMutationUrl(GATEWAY_AUTH_ENDPOINTS.logout),\r\n {\r\n refreshToken,\r\n deviceToken: this.deviceToken,\r\n },\r\n {\r\n headers: {\r\n Authorization: `Bearer ${token}`,\r\n noMessage: 'true',\r\n },\r\n },\r\n )\r\n .pipe(catchError(() => EMPTY))\r\n .subscribe();\r\n }\r\n }\r\n\r\n @Action(UpdateUserData)\r\n updateUserData(ctx: StateContext<AuthStateModel>, action: UpdateUserData) {\r\n ctx.patchState({\r\n user: action.user,\r\n });\r\n }\r\n\r\n @Action(UpdateTokens)\r\n updateTokens(ctx: StateContext<AuthStateModel>, action: UpdateTokens) {\r\n const tokenData = mapGatewayTokens(action.tokens);\r\n const state = ctx.getState();\r\n const updatedUser = state.user\r\n ? {\r\n ...state.user,\r\n token: tokenData.accessToken ?? state.user.token,\r\n accessToken: tokenData.accessToken ?? state.user.accessToken,\r\n refreshToken: tokenData.refreshToken ?? state.user.refreshToken,\r\n accessTokenExpiresAt: tokenData.accessTokenExpiresAt ?? undefined,\r\n refreshTokenExpiresAt: tokenData.refreshTokenExpiresAt ?? undefined,\r\n }\r\n : state.user;\r\n\r\n ctx.patchState({\r\n token: tokenData.accessToken,\r\n refreshToken: tokenData.refreshToken,\r\n accessTokenExpiresAt: tokenData.accessTokenExpiresAt,\r\n refreshTokenExpiresAt: tokenData.refreshTokenExpiresAt,\r\n user: updatedUser,\r\n });\r\n }\r\n\r\n @Action(ClearError)\r\n clearError(ctx: StateContext<AuthStateModel>) {\r\n ctx.patchState({ error: null });\r\n }\r\n\r\n @Action(ClearPendingMfa)\r\n clearPendingMfa(ctx: StateContext<AuthStateModel>) {\r\n ctx.patchState({ pendingMfa: null, twoFactorRequired: false });\r\n }\r\n\r\n @Action(SetRateLimit)\r\n setRateLimit(ctx: StateContext<AuthStateModel>, action: SetRateLimit) {\r\n ctx.patchState({\r\n loading: false,\r\n mfaResendLoading: false,\r\n ssoCallbackLoading: false,\r\n error: null,\r\n rateLimit: action.lock,\r\n });\r\n }\r\n\r\n @Action(ClearRateLimit)\r\n clearRateLimit(ctx: StateContext<AuthStateModel>) {\r\n ctx.patchState({ rateLimit: null });\r\n }\r\n\r\n private isRateLimitActive(\r\n ctx: StateContext<AuthStateModel>,\r\n scope: AuthRateLimitScope,\r\n ): boolean {\r\n const lock = ctx.getState().rateLimit;\r\n if (!lock || lock.scope !== scope) {\r\n return false;\r\n }\r\n if (lock.retryUntilMs && lock.retryUntilMs <= Date.now()) {\r\n ctx.patchState({ rateLimit: null });\r\n return false;\r\n }\r\n return lock.retryUntilMs === null || lock.retryUntilMs > Date.now();\r\n }\r\n\r\n private handleRateLimit(\r\n ctx: StateContext<AuthStateModel>,\r\n error: unknown,\r\n scope: AuthRateLimitScope,\r\n ): boolean {\r\n const info = extractGatewayRateLimitInfo(error);\r\n if (!info) {\r\n return false;\r\n }\r\n\r\n const retryUntilMs = info.retryAfterSeconds\r\n ? Date.now() + info.retryAfterSeconds * 1000\r\n : null;\r\n\r\n ctx.dispatch(\r\n new SetRateLimit({\r\n retryUntilMs,\r\n totalSeconds: info.retryAfterSeconds,\r\n message: info.message,\r\n scope,\r\n }),\r\n );\r\n return true;\r\n }\r\n\r\n private handleLoginResponse(\r\n ctx: StateContext<AuthStateModel>,\r\n session: GatewayLoginResponse | AuthLoginData,\r\n ): Observable<unknown> {\r\n if (session.requiresTwoFactor) {\r\n ctx.patchState({\r\n user: null,\r\n token: null,\r\n refreshToken: null,\r\n accessTokenExpiresAt: null,\r\n refreshTokenExpiresAt: null,\r\n pendingMfa: session.twoFactor,\r\n twoFactorRequired: true,\r\n loading: false,\r\n ssoCallbackLoading: false,\r\n error: null,\r\n });\r\n this.router.navigate([this.options.mfaRoute ?? '/auth/mfa'], {\r\n replaceUrl: true,\r\n });\r\n return of(null);\r\n }\r\n\r\n if (!hasGatewayTokens(session.tokens)) {\r\n ctx.dispatch(new LoginFailure('Login failed'));\r\n return of(null);\r\n }\r\n\r\n const tokenData = mapGatewayTokens(session.tokens);\r\n const user = mapGatewayUser(session.user, tokenData, session.delegations);\r\n\r\n ctx.patchState({\r\n user,\r\n token: tokenData.accessToken,\r\n refreshToken: tokenData.refreshToken,\r\n accessTokenExpiresAt: tokenData.accessTokenExpiresAt,\r\n refreshTokenExpiresAt: tokenData.refreshTokenExpiresAt,\r\n loading: false,\r\n ssoCallbackLoading: false,\r\n error: null,\r\n pendingMfa: null,\r\n twoFactorRequired: false,\r\n });\r\n\r\n return this.toObservable(this.options.afterLogin?.(session, ctx)).pipe(\r\n tap(() => {\r\n this.router.navigateByUrl(this.resolveAuthenticatedRoute(), {\r\n replaceUrl: true,\r\n });\r\n }),\r\n );\r\n }\r\n\r\n private get deviceToken(): string {\r\n return resolveGatewayDeviceToken(this.options.deviceToken);\r\n }\r\n\r\n private gatewayUrl(path: string): string {\r\n return buildGatewayUrl(this.options.getGatewayApiBaseUrl(), path);\r\n }\r\n\r\n private gatewayAuthMutationUrl(path: string): string {\r\n return this.gatewayUrl(path);\r\n }\r\n\r\n private navigateToLogin(): void {\r\n this.router.navigate([this.options.loginRoute ?? '/auth/login'], {\r\n replaceUrl: true,\r\n });\r\n }\r\n\r\n private resolveAuthenticatedRoute(): string {\r\n const tree = this.router.parseUrl(this.router.url);\r\n const returnUrl = this.sanitizeLocalRoute(\r\n tree.queryParams['returnUrl'] as string | undefined,\r\n );\r\n if (returnUrl !== null) {\r\n return returnUrl;\r\n }\r\n\r\n const configuredRoute =\r\n typeof this.options.defaultAuthenticatedRoute === 'function'\r\n ? this.options.defaultAuthenticatedRoute()\r\n : this.options.defaultAuthenticatedRoute;\r\n return this.sanitizeLocalRoute(configuredRoute) ?? '/';\r\n }\r\n\r\n private sanitizeLocalRoute(route?: string | null): string | null {\r\n if (!route) {\r\n return null;\r\n }\r\n if (/^https?:\\/\\//i.test(route)) {\r\n return null;\r\n }\r\n return route.startsWith('/') ? route : `/${route}`;\r\n }\r\n\r\n private toObservable(result: GatewayAuthHookResult): Observable<unknown> {\r\n if (!result) {\r\n return of(null);\r\n }\r\n if (isObservable(result)) {\r\n return result;\r\n }\r\n if (result instanceof Promise) {\r\n return from(result);\r\n }\r\n return of(result);\r\n }\r\n}\r\n","import { Injectable, computed, inject } from '@angular/core';\r\nimport { select, Store } from '@ngxs/store';\r\nimport {\r\n ClearError,\r\n ClearPendingMfa,\r\n ClearRateLimit,\r\n ExchangeSsoCode,\r\n LoadSsoProviders,\r\n Login,\r\n Logout,\r\n ResendMfa,\r\n StartSso,\r\n UpdateTokens,\r\n UpdateUserData,\r\n VerifyMfa,\r\n} from './gateway-auth.actions';\r\nimport { GatewayAuthState } from './gateway-auth.state';\r\nimport {\r\n AuthTokens,\r\n LoginRequest,\r\n SsoProvider,\r\n User,\r\n} from './gateway-auth.state.model';\r\nimport { isExpired } from './gateway-auth.utils';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class GatewayAuthFacade {\r\n private readonly store = inject(Store);\r\n\r\n readonly user = select(GatewayAuthState.user);\r\n readonly loading = select(GatewayAuthState.loading);\r\n readonly mfaResendLoading = select(GatewayAuthState.mfaResendLoading);\r\n readonly ssoLoading = select(GatewayAuthState.ssoLoading);\r\n readonly ssoCallbackLoading = select(GatewayAuthState.ssoCallbackLoading);\r\n readonly error = select(GatewayAuthState.error);\r\n readonly token = select(GatewayAuthState.token);\r\n readonly refreshToken = select(GatewayAuthState.refreshToken);\r\n readonly accessTokenExpiresAt = select(GatewayAuthState.accessTokenExpiresAt);\r\n readonly refreshTokenExpiresAt = select(\r\n GatewayAuthState.refreshTokenExpiresAt,\r\n );\r\n readonly twoFactorRequired = select(GatewayAuthState.twoFactorRequired);\r\n readonly pendingMfa = select(GatewayAuthState.pendingMfa);\r\n readonly ssoProviders = select(GatewayAuthState.ssoProviders);\r\n readonly rateLimit = select(GatewayAuthState.rateLimit);\r\n readonly isAdmin = select(GatewayAuthState.isAdmin);\r\n readonly userDetails = select(GatewayAuthState.userDetails);\r\n\r\n readonly hasError = computed(() => this.error() !== null);\r\n readonly isReady = computed(() => !this.loading() && this.error() === null);\r\n readonly userDisplayName = computed(\r\n () => this.user()?.user?.displayName || '',\r\n );\r\n readonly userEmail = computed(() => this.user()?.user?.email || '');\r\n readonly hasUser = computed(() => this.user() !== null);\r\n readonly hasPendingMfa = computed(() => this.pendingMfa() !== null);\r\n\r\n readonly isAuthenticated = computed(() => {\r\n const token = this.token();\r\n const accessExpiresAt = this.accessTokenExpiresAt();\r\n if (token && !isExpired(accessExpiresAt)) {\r\n return true;\r\n }\r\n const refreshToken = this.refreshToken();\r\n const refreshExpiresAt = this.refreshTokenExpiresAt();\r\n return !!refreshToken && !isExpired(refreshExpiresAt);\r\n });\r\n\r\n login(loginRequest: LoginRequest): void {\r\n this.store.dispatch(new Login(loginRequest));\r\n }\r\n\r\n verifyMfa(code: string): void {\r\n this.store.dispatch(new VerifyMfa(code));\r\n }\r\n\r\n resendMfa(): void {\r\n this.store.dispatch(new ResendMfa());\r\n }\r\n\r\n loadSsoProviders(): void {\r\n this.store.dispatch(new LoadSsoProviders());\r\n }\r\n\r\n startSso(provider: SsoProvider): void {\r\n this.store.dispatch(new StartSso(provider));\r\n }\r\n\r\n exchangeSsoCode(code: string, state: string): void {\r\n this.store.dispatch(new ExchangeSsoCode(code, state));\r\n }\r\n\r\n logout(remote: boolean = false): void {\r\n this.store.dispatch(new Logout(remote));\r\n }\r\n\r\n updateUserData(user: User): void {\r\n this.store.dispatch(new UpdateUserData(user));\r\n }\r\n\r\n updateTokens(tokens: AuthTokens): void {\r\n this.store.dispatch(new UpdateTokens(tokens));\r\n }\r\n\r\n clearError(): void {\r\n this.store.dispatch(new ClearError());\r\n }\r\n\r\n clearPendingMfa(): void {\r\n this.store.dispatch(new ClearPendingMfa());\r\n }\r\n\r\n clearRateLimit(): void {\r\n this.store.dispatch(new ClearRateLimit());\r\n }\r\n\r\n hasRole(role: string): boolean {\r\n const userRoles = this.user()?.user?.roles;\r\n return Array.isArray(userRoles) ? userRoles.includes(role) : false;\r\n }\r\n\r\n hasGroup(group: string): boolean {\r\n const userGroups = this.user()?.user?.groups;\r\n return Array.isArray(userGroups) ? userGroups.includes(group) : false;\r\n }\r\n\r\n isTokenExpired(): boolean {\r\n const accessExpiresAt = this.accessTokenExpiresAt();\r\n return accessExpiresAt ? isExpired(accessExpiresAt) : false;\r\n }\r\n}\r\n","import {\r\n HttpBackend,\r\n HttpClient,\r\n HttpContextToken,\r\n HttpInterceptorFn,\r\n HttpRequest,\r\n} from '@angular/common/http';\r\nimport { inject } from '@angular/core';\r\nimport {\r\n catchError,\r\n finalize,\r\n firstValueFrom,\r\n from,\r\n map,\r\n Observable,\r\n shareReplay,\r\n switchMap,\r\n tap,\r\n throwError,\r\n} from 'rxjs';\r\nimport { GatewayAuthFacade } from './gateway-auth.facade';\r\nimport { GATEWAY_AUTH_OPTIONS } from './gateway-auth.options';\r\nimport { GatewayRefreshData, GatewayResponse } from './gateway-auth.models';\r\nimport { AuthTokens } from './gateway-auth.state.model';\r\nimport {\r\n buildGatewayUrl,\r\n GATEWAY_AUTH_ENDPOINTS,\r\n isExpired,\r\n readPersistedGatewayAuthTokens,\r\n resolveAccessTokenRefreshSkewMs,\r\n resolveApiDateValue,\r\n resolveGatewayDeviceToken,\r\n} from './gateway-auth.utils';\r\n\r\nexport const GATEWAY_AUTH_RETRY_CONTEXT = new HttpContextToken<boolean>(\r\n () => false,\r\n);\r\n\r\nconst GATEWAY_AUTH_ENDPOINT_PATHS = new Set<string>([\r\n GATEWAY_AUTH_ENDPOINTS.login,\r\n GATEWAY_AUTH_ENDPOINTS.refresh,\r\n GATEWAY_AUTH_ENDPOINTS.logout,\r\n]);\r\n\r\nconst GATEWAY_AUTH_ENDPOINT_PREFIXES = ['auth/2fa/', 'auth/sso/'] as const;\r\n\r\nconst isAbsoluteUrl = (url: string): boolean => /^https?:\\/\\//i.test(url);\r\n\r\nconst isAssetRequest = (url: string): boolean =>\r\n url.startsWith('/assets') || url.startsWith('assets');\r\n\r\nconst normalizeBase = (baseUrl?: string | null): string =>\r\n baseUrl?.replace(/\\/+$/, '') ?? '';\r\n\r\nconst buildAbsoluteUrl = (\r\n baseUrl: string | null | undefined,\r\n url: string,\r\n): string => {\r\n if (isAbsoluteUrl(url) || !baseUrl) {\r\n return url;\r\n }\r\n\r\n return `${normalizeBase(baseUrl)}/${url.replace(/^\\/+/, '')}`;\r\n};\r\n\r\nconst normalizePath = (path: string): string => {\r\n const trimmed = path.replace(/^\\/+/, '');\r\n const withoutQuery = trimmed.split('?')[0] || '';\r\n return withoutQuery.startsWith('api/') ? withoutQuery.slice(4) : withoutQuery;\r\n};\r\n\r\nexport function resolveGatewayAuthPath(\r\n url: string,\r\n gatewayApiBaseUrl?: string | null,\r\n): string {\r\n if (isAbsoluteUrl(url)) {\r\n try {\r\n return normalizePath(new URL(url).pathname);\r\n } catch {\r\n return normalizePath(url);\r\n }\r\n }\r\n\r\n if (gatewayApiBaseUrl && url.startsWith(gatewayApiBaseUrl)) {\r\n return normalizePath(url.slice(gatewayApiBaseUrl.length));\r\n }\r\n\r\n return normalizePath(url);\r\n}\r\n\r\nexport function isGatewayAuthRequestUrl(\r\n url: string,\r\n gatewayApiBaseUrl?: string | null,\r\n): boolean {\r\n const path = resolveGatewayAuthPath(url, gatewayApiBaseUrl).toLowerCase();\r\n\r\n return (\r\n GATEWAY_AUTH_ENDPOINT_PATHS.has(path) ||\r\n GATEWAY_AUTH_ENDPOINT_PREFIXES.some((prefix) => path.startsWith(prefix))\r\n );\r\n}\r\n\r\nlet inflightRefresh$: Observable<AuthTokens> | null = null;\r\n\r\ninterface WebLockManager {\r\n request<T>(name: string, callback: () => Promise<T>): Promise<T>;\r\n}\r\n\r\ntype NavigatorWithLocks = Navigator & {\r\n locks?: WebLockManager;\r\n};\r\n\r\nconst getBrowserRefreshLock = (): WebLockManager | null => {\r\n if (typeof navigator === 'undefined') {\r\n return null;\r\n }\r\n\r\n const locks = (navigator as NavigatorWithLocks).locks;\r\n return typeof locks?.request === 'function' ? locks : null;\r\n};\r\n\r\nconst runWithRefreshLock = <T>(operation: () => Promise<T>): Promise<T> => {\r\n const locks = getBrowserRefreshLock();\r\n return locks\r\n ? locks.request('masterteam-gateway-auth-refresh', operation)\r\n : operation();\r\n};\r\n\r\nconst getCurrentAuthTokens = (auth: GatewayAuthFacade): AuthTokens | null => {\r\n const accessToken = auth.token();\r\n const refreshToken = auth.refreshToken();\r\n\r\n if (!accessToken || !refreshToken) {\r\n return null;\r\n }\r\n\r\n return {\r\n accessToken,\r\n accessTokenExpiresAt: {\r\n actualValue: auth.accessTokenExpiresAt() ?? '',\r\n },\r\n refreshToken,\r\n refreshTokenExpiresAt: {\r\n actualValue: auth.refreshTokenExpiresAt() ?? '',\r\n },\r\n };\r\n};\r\n\r\nconst tokenHasUsableAccessToken = (\r\n tokens: AuthTokens,\r\n refreshSkewMs: number,\r\n): boolean =>\r\n !!tokens.accessToken &&\r\n !isExpired(resolveApiDateValue(tokens.accessTokenExpiresAt), refreshSkewMs);\r\n\r\nconst tokenHasUsableRefreshToken = (tokens: AuthTokens): boolean =>\r\n !!tokens.refreshToken &&\r\n !isExpired(resolveApiDateValue(tokens.refreshTokenExpiresAt));\r\n\r\nconst getSynchronizedTokens = (\r\n auth: GatewayAuthFacade,\r\n staleRefreshToken: string,\r\n refreshSkewMs: number,\r\n): AuthTokens | null => {\r\n const candidates = [\r\n getCurrentAuthTokens(auth),\r\n readPersistedGatewayAuthTokens(),\r\n ];\r\n\r\n return (\r\n candidates.find(\r\n (tokens): tokens is AuthTokens =>\r\n !!tokens &&\r\n tokens.refreshToken !== staleRefreshToken &&\r\n tokenHasUsableAccessToken(tokens, refreshSkewMs),\r\n ) ?? null\r\n );\r\n};\r\n\r\nconst getLatestRefreshToken = (\r\n auth: GatewayAuthFacade,\r\n fallbackRefreshToken: string,\r\n): string => {\r\n const candidates = [\r\n getCurrentAuthTokens(auth),\r\n readPersistedGatewayAuthTokens(),\r\n ];\r\n const latestTokens = candidates.find(\r\n (tokens): tokens is AuthTokens =>\r\n !!tokens &&\r\n tokens.refreshToken !== fallbackRefreshToken &&\r\n tokenHasUsableRefreshToken(tokens),\r\n );\r\n\r\n return latestTokens?.refreshToken ?? fallbackRefreshToken;\r\n};\r\n\r\nconst executeRefresh = (\r\n http: HttpClient,\r\n gatewayApiBaseUrl: string | null | undefined,\r\n refreshToken: string,\r\n auth: GatewayAuthFacade,\r\n deviceToken: string,\r\n refreshSkewMs: number,\r\n): Promise<AuthTokens> =>\r\n runWithRefreshLock(async () => {\r\n const synchronizedTokens = getSynchronizedTokens(\r\n auth,\r\n refreshToken,\r\n refreshSkewMs,\r\n );\r\n\r\n if (synchronizedTokens) {\r\n auth.updateTokens(synchronizedTokens);\r\n return synchronizedTokens;\r\n }\r\n\r\n const latestRefreshToken = getLatestRefreshToken(auth, refreshToken);\r\n const url = buildGatewayUrl(\r\n gatewayApiBaseUrl,\r\n GATEWAY_AUTH_ENDPOINTS.refresh,\r\n );\r\n\r\n return firstValueFrom(\r\n http\r\n .post<GatewayResponse<GatewayRefreshData>>(url, {\r\n refreshToken: latestRefreshToken,\r\n deviceToken,\r\n })\r\n .pipe(\r\n map((response) => response.data),\r\n map((tokens) => {\r\n if (!tokens?.accessToken || !tokens.refreshToken) {\r\n throw new Error('Invalid refresh response');\r\n }\r\n return tokens as AuthTokens;\r\n }),\r\n tap((tokens) => auth.updateTokens(tokens)),\r\n ),\r\n );\r\n });\r\n\r\nconst refreshTokens$ = (\r\n http: HttpClient,\r\n gatewayApiBaseUrl: string | null | undefined,\r\n refreshToken: string,\r\n auth: GatewayAuthFacade,\r\n deviceToken: string,\r\n refreshSkewMs: number,\r\n): Observable<AuthTokens> => {\r\n if (!inflightRefresh$) {\r\n inflightRefresh$ = from(\r\n executeRefresh(\r\n http,\r\n gatewayApiBaseUrl,\r\n refreshToken,\r\n auth,\r\n deviceToken,\r\n refreshSkewMs,\r\n ),\r\n ).pipe(\r\n shareReplay({ bufferSize: 1, refCount: true }),\r\n finalize(() => {\r\n inflightRefresh$ = null;\r\n }),\r\n );\r\n }\r\n\r\n return inflightRefresh$;\r\n};\r\n\r\nconst prepareRequest = (\r\n req: HttpRequest<unknown>,\r\n token: string | null,\r\n markRetried: boolean,\r\n baseUrl: string | null | undefined,\r\n) => {\r\n let modifiedReq = req;\r\n\r\n if (token) {\r\n modifiedReq = modifiedReq.clone({\r\n setHeaders: {\r\n Authorization: `Bearer ${token}`,\r\n },\r\n });\r\n }\r\n\r\n if (!isAbsoluteUrl(modifiedReq.url) && !isAssetRequest(modifiedReq.url)) {\r\n modifiedReq = modifiedReq.clone({\r\n url: buildAbsoluteUrl(baseUrl, modifiedReq.url),\r\n });\r\n }\r\n\r\n if (markRetried) {\r\n modifiedReq = modifiedReq.clone({\r\n context: modifiedReq.context.set(GATEWAY_AUTH_RETRY_CONTEXT, true),\r\n });\r\n }\r\n\r\n return modifiedReq;\r\n};\r\n\r\nexport const gatewayAuthInterceptor: HttpInterceptorFn = (req, next) => {\r\n if (isAssetRequest(req.url)) {\r\n return next(req);\r\n }\r\n\r\n const auth = inject(GatewayAuthFacade);\r\n const options = inject(GATEWAY_AUTH_OPTIONS);\r\n const http = new HttpClient(inject(HttpBackend));\r\n\r\n const gatewayApiBaseUrl = options.getGatewayApiBaseUrl();\r\n const appApiBaseUrl = options.getApplicationApiBaseUrl?.();\r\n const useGatewayBaseUrl = options.shouldUseGatewayApiBaseUrl?.(req) ?? false;\r\n const baseUrl = useGatewayBaseUrl ? gatewayApiBaseUrl : appApiBaseUrl;\r\n const deviceToken = resolveGatewayDeviceToken(options.deviceToken);\r\n const refreshSkewMs = resolveAccessTokenRefreshSkewMs(\r\n options.accessTokenRefreshSkewMs,\r\n );\r\n\r\n const accessToken = auth.token();\r\n const refreshToken = auth.refreshToken();\r\n const accessTokenExpiresAt = auth.accessTokenExpiresAt();\r\n const refreshTokenExpiresAt = auth.refreshTokenExpiresAt();\r\n const accessTokenValid =\r\n !!accessToken && !isExpired(accessTokenExpiresAt, refreshSkewMs);\r\n const canRefresh = !!refreshToken && !isExpired(refreshTokenExpiresAt);\r\n const alreadyRetried = req.context.get(GATEWAY_AUTH_RETRY_CONTEXT);\r\n const isAuthRequest = isGatewayAuthRequestUrl(req.url, gatewayApiBaseUrl);\r\n const tokenToAttach = !isAuthRequest && accessTokenValid ? accessToken : null;\r\n\r\n if (!isAuthRequest && !accessTokenValid && canRefresh) {\r\n return refreshTokens$(\r\n http,\r\n gatewayApiBaseUrl,\r\n refreshToken,\r\n auth,\r\n deviceToken,\r\n refreshSkewMs,\r\n ).pipe(\r\n switchMap((tokens) =>\r\n next(prepareRequest(req, tokens.accessToken, true, baseUrl)),\r\n ),\r\n catchError((error) => {\r\n auth.logout();\r\n return throwError(() => error);\r\n }),\r\n );\r\n }\r\n\r\n return next(prepareRequest(req, tokenToAttach, false, baseUrl)).pipe(\r\n catchError((error) => {\r\n if (error?.status === 401 && !isAuthRequest && !alreadyRetried) {\r\n const latestRefreshToken = auth.refreshToken();\r\n const latestRefreshTokenExpiresAt = auth.refreshTokenExpiresAt();\r\n const canRefreshNow =\r\n !!latestRefreshToken && !isExpired(latestRefreshTokenExpiresAt);\r\n\r\n if (canRefreshNow) {\r\n return refreshTokens$(\r\n http,\r\n gatewayApiBaseUrl,\r\n latestRefreshToken,\r\n auth,\r\n deviceToken,\r\n refreshSkewMs,\r\n ).pipe(\r\n switchMap((tokens) =>\r\n next(prepareRequest(req, tokens.accessToken, true, baseUrl)),\r\n ),\r\n catchError((refreshError) => {\r\n auth.logout();\r\n return throwError(() => refreshError);\r\n }),\r\n );\r\n }\r\n }\r\n\r\n if (error?.status === 401 && !isAuthRequest) {\r\n auth.logout();\r\n }\r\n\r\n return throwError(() => error);\r\n }),\r\n );\r\n};\r\n","import {\n ChangeDetectionStrategy,\n Component,\n OnInit,\n computed,\n inject,\n input,\n} from '@angular/core';\nimport { Button } from '@masterteam/components/button';\nimport { GatewayAuthFacade } from '../../gateway-auth.facade';\nimport { GATEWAY_AUTH_OPTIONS } from '../../gateway-auth.options';\nimport { SsoProvider } from '../../gateway-auth.state.model';\n\n@Component({\n selector: 'mt-gateway-sso-buttons',\n imports: [Button],\n templateUrl: './gateway-sso-buttons.html',\n styleUrl: './gateway-sso-buttons.css',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport default class GatewaySsoButtons implements OnInit {\n private readonly authFacade = inject(GatewayAuthFacade);\n private readonly options = inject(GATEWAY_AUTH_OPTIONS);\n\n readonly dividerLabel = input('or');\n readonly providers = this.authFacade.ssoProviders;\n readonly loading = this.authFacade.ssoLoading;\n readonly providerCount = computed(() => this.providers().length);\n\n ngOnInit(): void {\n this.authFacade.loadSsoProviders();\n }\n\n buttonLabel(provider: SsoProvider): string {\n const label = this.options.loginPage?.ssoButtonLabel;\n if (typeof label === 'function') {\n return label(provider, this.providerCount());\n }\n return label || 'Continue with SSO';\n }\n\n buttonTooltip(): string {\n return 'Sign in using single sign-on';\n }\n\n startSso(provider: SsoProvider): void {\n this.authFacade.startSso(provider);\n }\n}\n","@if (providers().length > 0) {\n <div class=\"gateway-sso-divider\">\n <span></span>\n <span>{{ dividerLabel() }}</span>\n <span></span>\n </div>\n\n <div class=\"gateway-sso-list\">\n @for (provider of providers(); track provider.key) {\n <mt-button\n [label]=\"buttonLabel(provider)\"\n [tooltip]=\"buttonTooltip()\"\n icon=\"security.lock-01\"\n size=\"large\"\n variant=\"outlined\"\n fluid\n type=\"button\"\n [disabled]=\"loading()\"\n (onClick)=\"startSso(provider)\"\n />\n }\n </div>\n}\n","import { NgTemplateOutlet } from '@angular/common';\r\nimport {\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n effect,\r\n inject,\r\n OnInit,\r\n signal,\r\n} from '@angular/core';\r\nimport {\r\n FormsModule,\r\n NonNullableFormBuilder,\r\n ReactiveFormsModule,\r\n Validators,\r\n} from '@angular/forms';\r\nimport { TranslocoDirective, TranslocoService } from '@jsverse/transloco';\r\nimport {\r\n BrandDisplayFacade,\r\n ManageBrndingService,\r\n} from '@masterteam/brand-display';\r\nimport { Button } from '@masterteam/components/button';\r\nimport { SelectField } from '@masterteam/components/select-field';\r\nimport { TextField } from '@masterteam/components/text-field';\r\nimport { SecureImagePipe } from '@masterteam/components/upload-field';\r\nimport { Icon } from '@masterteam/icons';\r\nimport { GatewayAuthFacade } from '../../gateway-auth.facade';\r\nimport {\r\n GATEWAY_AUTH_OPTIONS,\r\n GatewayLoginLanguageOption,\r\n} from '../../gateway-auth.options';\r\nimport { resolveGatewayDeviceToken } from '../../gateway-auth.utils';\r\nimport GatewaySsoButtons from '../gateway-sso-buttons/gateway-sso-buttons';\r\n\r\nconst DEFAULT_LANGUAGE_OPTIONS: readonly GatewayLoginLanguageOption[] = [\r\n { key: 'en', label: 'English', dir: 'ltr', icon: 'map.globe-01' },\r\n { key: 'ar', label: 'Arabic', dir: 'rtl', icon: 'custom.saudi-flag' },\r\n];\r\n\r\ninterface GatewayLoginImage {\r\n fileName?: string | null;\r\n}\r\n\r\ninterface GatewayLoginBrandData {\r\n backgroundColor?: string | null;\r\n textColor?: string | null;\r\n repeated?: boolean | null;\r\n backgroundImage?: GatewayLoginImage | null;\r\n loginBrandImage?: GatewayLoginImage | null;\r\n formWizardPosition?: 'start' | 'center' | 'end' | null;\r\n}\r\n\r\ninterface GatewayBrandDisplayData {\r\n login?: GatewayLoginBrandData | null;\r\n loginLogo?: string | null;\r\n}\r\n\r\ninterface GatewayLoginLanguageViewOption extends GatewayLoginLanguageOption {\r\n id: string;\r\n}\r\n\r\n@Component({\r\n selector: 'mt-gateway-login-page',\r\n imports: [\r\n NgTemplateOutlet,\r\n FormsModule,\r\n ReactiveFormsModule,\r\n TranslocoDirective,\r\n TextField,\r\n Button,\r\n SelectField,\r\n SecureImagePipe,\r\n Icon,\r\n GatewaySsoButtons,\r\n ],\r\n templateUrl: './gateway-login-page.html',\r\n styleUrl: './gateway-login-page.css',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport default class GatewayLoginPage implements OnInit {\r\n private readonly authFacade = inject(GatewayAuthFacade);\r\n private readonly fb = inject(NonNullableFormBuilder);\r\n private readonly brandDisplayFacade = inject(BrandDisplayFacade);\r\n private readonly branding = inject(ManageBrndingService);\r\n private readonly transloco = inject(TranslocoService);\r\n private readonly options = inject(GATEWAY_AUTH_OPTIONS);\r\n\r\n readonly loginForm = this.fb.group({\r\n username: ['', [Validators.required]],\r\n password: ['', [Validators.required]],\r\n });\r\n\r\n readonly loading = this.authFacade.loading;\r\n readonly error = this.authFacade.error;\r\n readonly passwordVisible = signal(false);\r\n readonly selectedLanguage = signal('');\r\n\r\n private readonly nowMs = signal(Date.now());\r\n\r\n readonly rateLimit = computed(() => {\r\n const lock = this.authFacade.rateLimit();\r\n return lock && lock.scope === 'login' ? lock : null;\r\n });\r\n readonly rateLimitSecondsLeft = computed(() => {\r\n const lock = this.rateLimit();\r\n if (!lock?.retryUntilMs) return null;\r\n return Math.max(0, Math.ceil((lock.retryUntilMs - this.nowMs()) / 1000));\r\n });\r\n readonly rateLimitProgress = computed(() => {\r\n const lock = this.rateLimit();\r\n const left = this.rateLimitSecondsLeft();\r\n if (!lock?.totalSeconds || left === null) return 0;\r\n return Math.max(0, Math.min(100, (left / lock.totalSeconds) * 100));\r\n });\r\n readonly rateLimitCountdownLabel = computed(() => {\r\n const left = this.rateLimitSecondsLeft();\r\n if (left === null) return '';\r\n const minutes = Math.floor(left / 60);\r\n const seconds = left % 60;\r\n return minutes > 0\r\n ? `${minutes}:${String(seconds).padStart(2, '0')}`\r\n : `${seconds}s`;\r\n });\r\n readonly isRateLimited = computed(() => {\r\n const lock = this.rateLimit();\r\n if (!lock) return false;\r\n if (lock.retryUntilMs === null) return true;\r\n return (this.rateLimitSecondsLeft() ?? 0) > 0;\r\n });\r\n protected get submitDisabled(): boolean {\r\n return this.loginForm.invalid || this.loading() || this.isRateLimited();\r\n }\r\n private readonly loginOptions = computed(() => this.options.loginPage);\r\n private readonly defaultDisplayData = computed(\r\n () =>\r\n this.brandDisplayFacade.defaultBrandDisplayData() as GatewayBrandDisplayData | null,\r\n );\r\n private readonly loginData = computed(\r\n () => this.branding.loginData() as GatewayLoginBrandData | undefined,\r\n );\r\n\r\n readonly translationPrefix = computed(\r\n () => this.loginOptions()?.translationPrefix ?? 'login',\r\n );\r\n readonly imageBasePath = computed(\r\n () => this.loginOptions()?.imageBasePath ?? '/Settings/login-image/',\r\n );\r\n readonly languageOptions = computed<GatewayLoginLanguageViewOption[]>(() => {\r\n const configured = this.loginOptions()?.getLanguages?.();\r\n const languages = configured?.length\r\n ? configured\r\n : DEFAULT_LANGUAGE_OPTIONS;\r\n return languages.map((language) => ({\r\n ...language,\r\n id: language.id || language.key,\r\n }));\r\n });\r\n readonly activeLanguage = computed(\r\n () =>\r\n this.loginOptions()?.getActiveLanguage?.() ||\r\n this.languageOptions()[0]?.id ||\r\n 'en',\r\n );\r\n readonly showLanguageToggle = computed(\r\n () =>\r\n (this.loginOptions()?.showLanguageToggle ?? true) &&\r\n this.languageOptions().length > 1,\r\n );\r\n\r\n readonly productTagline = computed(() => {\r\n const lang = this.activeLanguage() === 'ar' ? 'ar' : 'en';\r\n return this.branding.getProductTagline(lang);\r\n });\r\n\r\n readonly pageStyles = computed(() => {\r\n const login = this.loginData();\r\n const defaultLogin = this.defaultDisplayData()?.login;\r\n const backgroundColor =\r\n login?.backgroundColor || defaultLogin?.backgroundColor;\r\n const repeated = login?.repeated || defaultLogin?.repeated;\r\n\r\n return {\r\n 'background-color': backgroundColor,\r\n 'background-size': repeated ? 'auto' : 'cover',\r\n 'background-position': 'center',\r\n 'background-repeat': repeated ? 'repeat' : 'no-repeat',\r\n 'background-position-y': 'top',\r\n };\r\n });\r\n\r\n readonly textColor = computed(\r\n () =>\r\n this.loginData()?.textColor ||\r\n this.defaultDisplayData()?.login?.textColor,\r\n );\r\n readonly logoUrl = computed(\r\n () => this.loginData()?.loginBrandImage?.fileName || null,\r\n );\r\n readonly defaultLogoUrl = computed(\r\n () => this.defaultDisplayData()?.loginLogo || null,\r\n );\r\n readonly backgroundImage = computed(\r\n () => this.loginData()?.backgroundImage?.fileName || null,\r\n );\r\n readonly formPosition = computed(() => {\r\n const position = this.loginData()?.formWizardPosition || 'start';\r\n return position === 'center' || position === 'end' ? position : 'start';\r\n });\r\n readonly logoAlignment = computed(\r\n () => 'flex items-center gap-4 mb-4 w-full justify-start',\r\n );\r\n readonly formContainerClasses = computed(() => {\r\n const baseClasses = 'flex flex-col justify-center p-8';\r\n const position = this.formPosition();\r\n\r\n if (position === 'center') {\r\n return `${baseClasses} w-full items-center`;\r\n }\r\n if (position === 'start') {\r\n return `${baseClasses} w-full md:w-1/2 items-center`;\r\n }\r\n return `${baseClasses} w-full md:w-1/2 items-start`;\r\n });\r\n\r\n constructor() {\r\n effect(() => {\r\n this.selectedLanguage.set(this.activeLanguage());\r\n });\r\n\r\n effect((onCleanup) => {\r\n const lock = this.rateLimit();\r\n if (!lock?.retryUntilMs) {\r\n return;\r\n }\r\n\r\n if (lock.retryUntilMs <= Date.now()) {\r\n this.authFacade.clearRateLimit();\r\n return;\r\n }\r\n\r\n this.nowMs.set(Date.now());\r\n const id = window.setInterval(() => {\r\n this.nowMs.set(Date.now());\r\n if (lock.retryUntilMs! <= Date.now()) {\r\n this.authFacade.clearRateLimit();\r\n }\r\n }, 1000);\r\n\r\n onCleanup(() => window.clearInterval(id));\r\n });\r\n }\r\n\r\n ngOnInit(): void {\r\n this.brandDisplayFacade.getBrandDisplay();\r\n }\r\n\r\n togglePasswordVisibility(): void {\r\n this.passwordVisible.update((visible) => !visible);\r\n }\r\n\r\n onLanguageChange(): void {\r\n const langKey = this.selectedLanguage();\r\n if (!langKey) return;\r\n\r\n const configuredSetter = this.loginOptions()?.setLanguage;\r\n if (configuredSetter) {\r\n configuredSetter(langKey);\r\n return;\r\n }\r\n\r\n const selected = this.languageOptions().find(\r\n (lang) => lang.key === langKey,\r\n );\r\n this.transloco.setActiveLang(langKey);\r\n document.documentElement.setAttribute('lang', langKey);\r\n if (selected?.dir) {\r\n document.documentElement.setAttribute('dir', selected.dir);\r\n }\r\n }\r\n\r\n onSubmit(): void {\r\n if (this.loginForm.invalid) {\r\n this.loginForm.markAllAsTouched();\r\n return;\r\n }\r\n\r\n if (this.isRateLimited()) {\r\n return;\r\n }\r\n\r\n const { username, password } = this.loginForm.getRawValue();\r\n this.authFacade.login({\r\n userName: username,\r\n password,\r\n isEncrypted: false,\r\n deviceToken: resolveGatewayDeviceToken(this.options.deviceToken),\r\n });\r\n }\r\n}\r\n","@if (formPosition()) {\r\n <ng-container *transloco=\"let t; prefix: translationPrefix()\">\r\n <div\r\n class=\"w-screen h-screen flex overflow-hidden\"\r\n [style]=\"pageStyles()\"\r\n [style.backgroundImage]=\"\r\n backgroundImage()\r\n ? (backgroundImage()\r\n | secureImage: false : undefined : imageBasePath())\r\n : null\r\n \"\r\n >\r\n @if (formPosition() === \"end\") {\r\n <ng-container [ngTemplateOutlet]=\"brandPanel\" />\r\n }\r\n\r\n <div [class]=\"formContainerClasses()\">\r\n @if (formPosition() === \"center\") {\r\n <div\r\n class=\"flex flex-col items-center text-center mb-8 space-y-4\"\r\n [style.color]=\"textColor()\"\r\n >\r\n <img\r\n [src]=\"\r\n logoUrl()\r\n ? (logoUrl()\r\n | secureImage: true : undefined : imageBasePath())\r\n : defaultLogoUrl()\r\n \"\r\n alt=\"BrandLogo\"\r\n class=\"h-20 mx-auto\"\r\n />\r\n @if (productTagline(); as tagline) {\r\n <h3 class=\"text-2xl font-medium\">{{ tagline }}</h3>\r\n }\r\n </div>\r\n }\r\n\r\n <div\r\n class=\"glass-card relative w-full max-w-md rounded-xl pb-8 px-10 pt-12 space-y-[4vh]\"\r\n [style.color]=\"textColor()\"\r\n >\r\n <div class=\"text-center space-y-[4vh]\">\r\n <h2 class=\"text-3xl font-bold\">{{ t(\"signin\") }}</h2>\r\n <p>{{ t(\"welcome-subtitle\") }}</p>\r\n </div>\r\n\r\n <form\r\n [formGroup]=\"loginForm\"\r\n (ngSubmit)=\"onSubmit()\"\r\n class=\"space-y-[1rem]\"\r\n >\r\n <mt-text-field [label]=\"t('username')\" formControlName=\"username\" />\r\n\r\n <div class=\"relative\">\r\n <mt-text-field\r\n [label]=\"t('password')\"\r\n [type]=\"passwordVisible() ? 'text' : 'password'\"\r\n formControlName=\"password\"\r\n />\r\n <button\r\n type=\"button\"\r\n class=\"password-toggle-btn cursor-pointer absolute end-3 top-7 h-10 flex items-center justify-center text-lg leading-none z-10\"\r\n [attr.aria-label]=\"\r\n passwordVisible() ? t('hide-password') : t('show-password')\r\n \"\r\n (click)=\"togglePasswordVisibility()\"\r\n ></button>\r\n </div>\r\n\r\n <mt-button\r\n [label]=\"\r\n isRateLimited() && rateLimitSecondsLeft() !== null\r\n ? t('rate-limit-retry-in', {\r\n time: rateLimitCountdownLabel(),\r\n })\r\n : t('signin')\r\n \"\r\n size=\"large\"\r\n severity=\"primary\"\r\n fluid\r\n type=\"submit\"\r\n [loading]=\"loading()\"\r\n [disabled]=\"submitDisabled\"\r\n styleClass=\"mt-2\"\r\n />\r\n\r\n @if (rateLimit(); as lock) {\r\n <div\r\n class=\"rate-limit-banner flex items-start gap-3 rounded-lg border border-red-300/40 bg-red-500/10 p-3 text-sm\"\r\n role=\"alert\"\r\n aria-live=\"polite\"\r\n >\r\n <mt-icon\r\n class=\"text-base text-red-500 mt-0.5 shrink-0\"\r\n icon=\"alert.alert-circle\"\r\n />\r\n <div class=\"flex-1 min-w-0 space-y-1\">\r\n <p class=\"font-medium\">{{ t(\"rate-limit-title\") }}</p>\r\n <p class=\"text-xs opacity-90\">\r\n @if (rateLimitSecondsLeft() !== null) {\r\n {{\r\n t(\"rate-limit-countdown\", {\r\n time: rateLimitCountdownLabel(),\r\n })\r\n }}\r\n } @else {\r\n {{ lock.message || t(\"rate-limit-blocked\") }}\r\n }\r\n </p>\r\n @if (rateLimitSecondsLeft() !== null) {\r\n <div\r\n class=\"rate-limit-progress h-1 w-full overflow-hidden rounded-full bg-red-500/20\"\r\n >\r\n <div\r\n class=\"h-full bg-red-500 transition-[width] duration-1000 ease-linear\"\r\n [style.width.%]=\"rateLimitProgress()\"\r\n ></div>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n } @else if (error(); as errorMessage) {\r\n <p class=\"text-sm text-red-500 text-center\">\r\n {{ errorMessage }}\r\n </p>\r\n }\r\n\r\n <mt-gateway-sso-buttons [dividerLabel]=\"t('or')\" />\r\n\r\n @if (showLanguageToggle()) {\r\n <div class=\"pt-1 w-35 mx-auto\">\r\n <mt-select-field\r\n [(ngModel)]=\"selectedLanguage\"\r\n [ngModelOptions]=\"{ standalone: true }\"\r\n [options]=\"languageOptions()\"\r\n optionLabel=\"label\"\r\n optionValue=\"id\"\r\n (onChange)=\"onLanguageChange()\"\r\n size=\"small\"\r\n />\r\n </div>\r\n }\r\n </form>\r\n\r\n <p\r\n class=\"absolute text-center text-xs text-gray-400 pt-6 bottom-4 left-1/2 -translate-x-1/2 w-full\"\r\n >\r\n {{ t(\"copyright\") }}\r\n </p>\r\n </div>\r\n </div>\r\n\r\n @if (formPosition() === \"start\") {\r\n <ng-container [ngTemplateOutlet]=\"brandPanel\" />\r\n }\r\n </div>\r\n\r\n <ng-template #brandPanel>\r\n <div\r\n class=\"hidden md:flex flex-col justify-center items-start w-1/2 p-12\"\r\n [style.color]=\"textColor()\"\r\n >\r\n <div class=\"w-full max-w-full rounded-xl p-1 space-y-2 h-1/2 ps-24\">\r\n <div [class]=\"logoAlignment()\">\r\n <img\r\n [src]=\"\r\n logoUrl()\r\n ? (logoUrl()\r\n | secureImage: true : undefined : imageBasePath())\r\n : defaultLogoUrl()\r\n \"\r\n alt=\"Logo\"\r\n class=\"h-20\"\r\n />\r\n </div>\r\n @if (productTagline(); as tagline) {\r\n <h3 class=\"text-2xl\">{{ tagline }}</h3>\r\n }\r\n </div>\r\n </div>\r\n </ng-template>\r\n </ng-container>\r\n} @else {\r\n <div class=\"w-screen h-screen flex items-center justify-center\">\r\n <mt-icon\r\n class=\"text-4xl text-primary animate-spin animate-duration-2000\"\r\n icon=\"general.loading-02\"\r\n />\r\n </div>\r\n}\r\n","import { CommonModule } from '@angular/common';\r\nimport {\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n inject,\r\n OnInit,\r\n} from '@angular/core';\r\nimport { FormBuilder, ReactiveFormsModule, Validators } from '@angular/forms';\r\nimport { Router } from '@angular/router';\r\nimport { TranslocoDirective, TranslocoService } from '@jsverse/transloco';\r\nimport { Button } from '@masterteam/components/button';\r\nimport { TextField } from '@masterteam/components/text-field';\r\nimport { Icon } from '@masterteam/icons';\r\nimport { GatewayAuthFacade } from '../../gateway-auth.facade';\r\nimport { GATEWAY_AUTH_OPTIONS } from '../../gateway-auth.options';\r\n\r\n@Component({\r\n selector: 'mt-gateway-mfa',\r\n imports: [\r\n CommonModule,\r\n ReactiveFormsModule,\r\n Button,\r\n TextField,\r\n Icon,\r\n TranslocoDirective,\r\n ],\r\n templateUrl: './gateway-mfa.html',\r\n styleUrls: ['./gateway-mfa.css'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport default class GatewayMfa implements OnInit {\r\n private readonly auth = inject(GatewayAuthFacade);\r\n private readonly fb = inject(FormBuilder);\r\n private readonly router = inject(Router);\r\n private readonly options = inject(GATEWAY_AUTH_OPTIONS);\r\n private readonly transloco = inject(TranslocoService);\r\n\r\n readonly pendingMfa = this.auth.pendingMfa;\r\n readonly loading = this.auth.loading;\r\n readonly resendLoading = this.auth.mfaResendLoading;\r\n readonly error = this.auth.error;\r\n\r\n readonly deliveryChannel = computed(\r\n () =>\r\n this.pendingMfa()?.deliveryChannel ||\r\n this.transloco.translate('gatewayAuth.mfa.configuredChannel'),\r\n );\r\n readonly expiresAt = computed(() => this.pendingMfa()?.expiresAtUtc ?? null);\r\n\r\n readonly form = this.fb.group({\r\n code: ['', [Validators.required, Validators.pattern(/^[0-9]{4,8}$/)]],\r\n });\r\n\r\n ngOnInit(): void {\r\n if (!this.pendingMfa()) {\r\n this.router.navigate([this.options.loginRoute ?? '/auth/login'], {\r\n replaceUrl: true,\r\n });\r\n }\r\n }\r\n\r\n verify(): void {\r\n if (this.form.invalid) {\r\n this.form.markAllAsTouched();\r\n return;\r\n }\r\n\r\n const code = this.form.controls.code.value ?? '';\r\n this.form.reset();\r\n this.auth.verifyMfa(code);\r\n }\r\n\r\n resend(): void {\r\n this.form.reset();\r\n this.auth.resendMfa();\r\n }\r\n\r\n backToLogin(): void {\r\n this.auth.clearPendingMfa();\r\n this.router.navigate([this.options.loginRoute ?? '/auth/login'], {\r\n replaceUrl: true,\r\n });\r\n }\r\n}\r\n","<ng-container *transloco=\"let t; prefix: 'gatewayAuth.mfa'\">\r\n <div\r\n class=\"min-h-screen w-screen flex items-center justify-center p-6 bg-surface-50\"\r\n >\r\n <div\r\n class=\"w-full max-w-md rounded-xl bg-white p-8 shadow-sm border border-surface-200\"\r\n >\r\n <div class=\"flex justify-center mb-6\">\r\n <div\r\n class=\"h-12 w-12 rounded-full bg-primary/10 flex items-center justify-center\"\r\n >\r\n <mt-icon\r\n icon=\"security.lock-01\"\r\n class=\"text-primary text-2xl\"\r\n ></mt-icon>\r\n </div>\r\n </div>\r\n\r\n <div class=\"text-center space-y-2 mb-6\">\r\n <h1 class=\"text-2xl font-semibold text-surface-950\">\r\n {{ t(\"title\") }}\r\n </h1>\r\n <p class=\"text-sm text-surface-600\">\r\n {{ t(\"instruction\", { channel: deliveryChannel() }) }}\r\n </p>\r\n @if (expiresAt(); as expiry) {\r\n <p class=\"text-xs text-surface-500\">\r\n {{ t(\"expiresAt\", { time: expiry | date: \"shortTime\" }) }}\r\n </p>\r\n }\r\n </div>\r\n\r\n <form [formGroup]=\"form\" (ngSubmit)=\"verify()\" class=\"space-y-4\">\r\n <mt-text-field\r\n [label]=\"t('code')\"\r\n formControlName=\"code\"\r\n [pInputs]=\"{ inputMode: 'numeric', autocomplete: 'one-time-code' }\"\r\n />\r\n\r\n @if (error(); as errorMessage) {\r\n <p class=\"text-sm text-red-500 text-center\">{{ errorMessage }}</p>\r\n }\r\n\r\n <mt-button\r\n [label]=\"t('verify')\"\r\n type=\"submit\"\r\n severity=\"primary\"\r\n size=\"large\"\r\n fluid\r\n [loading]=\"loading()\"\r\n [disabled]=\"form.invalid || loading()\"\r\n />\r\n </form>\r\n\r\n <div class=\"flex items-center justify-between gap-3 pt-5\">\r\n <mt-button\r\n [label]=\"t('back')\"\r\n type=\"button\"\r\n text\r\n [disabled]=\"loading()\"\r\n (onClick)=\"backToLogin()\"\r\n />\r\n <mt-button\r\n [label]=\"t('resend')\"\r\n type=\"button\"\r\n variant=\"outlined\"\r\n [loading]=\"resendLoading()\"\r\n [disabled]=\"loading() || resendLoading()\"\r\n (onClick)=\"resend()\"\r\n />\r\n </div>\r\n </div>\r\n </div>\r\n</ng-container>\r\n","import { CommonModule } from '@angular/common';\r\nimport {\r\n ChangeDetectionStrategy,\r\n Component,\r\n inject,\r\n OnInit,\r\n signal,\r\n} from '@angular/core';\r\nimport { ActivatedRoute, Router } from '@angular/router';\r\nimport { TranslocoDirective, TranslocoService } from '@jsverse/transloco';\r\nimport { Button } from '@masterteam/components/button';\r\nimport { Icon } from '@masterteam/icons';\r\nimport { GatewayAuthFacade } from '../../gateway-auth.facade';\r\nimport { GATEWAY_AUTH_OPTIONS } from '../../gateway-auth.options';\r\nimport { GatewaySsoSession } from '../../gateway-sso-session.service';\r\n\r\n@Component({\r\n selector: 'mt-gateway-sso-callback',\r\n imports: [CommonModule, Button, Icon, TranslocoDirective],\r\n templateUrl: './gateway-sso-callback.html',\r\n styleUrls: ['./gateway-sso-callback.css'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport default class GatewaySsoCallback implements OnInit {\r\n private readonly route = inject(ActivatedRoute);\r\n private readonly router = inject(Router);\r\n private readonly auth = inject(GatewayAuthFacade);\r\n private readonly options = inject(GATEWAY_AUTH_OPTIONS);\r\n private readonly transloco = inject(TranslocoService);\r\n private readonly ssoSession = new GatewaySsoSession();\r\n\r\n readonly loading = this.auth.ssoCallbackLoading;\r\n readonly exchangeError = this.auth.error;\r\n readonly callbackError = signal<string | null>(null);\r\n\r\n ngOnInit(): void {\r\n const params = this.route.snapshot.queryParamMap;\r\n const error = params.get('error');\r\n const errorCode = params.get('errorCode');\r\n const code = params.get('code');\r\n const state = params.get('state');\r\n\r\n this.ssoSession.clearCallbackQuery(\r\n this.options.ssoCallbackPath ?? '/auth/sso/callback',\r\n );\r\n\r\n if (!this.ssoSession.consumeExpectedState(state)) {\r\n this.callbackError.set(this.safeSsoMessage('invalid_state'));\r\n return;\r\n }\r\n\r\n if (error) {\r\n this.callbackError.set(this.safeSsoMessage(errorCode ?? 'sso_failed'));\r\n return;\r\n }\r\n\r\n if (!code || !state) {\r\n this.callbackError.set(this.safeSsoMessage('invalid_state'));\r\n return;\r\n }\r\n\r\n this.auth.exchangeSsoCode(code, state);\r\n }\r\n\r\n retry(): void {\r\n this.router.navigate([this.options.loginRoute ?? '/auth/login'], {\r\n replaceUrl: true,\r\n });\r\n }\r\n\r\n private safeSsoMessage(errorCode: string): string {\r\n const t = (key: string) =>\r\n this.transloco.translate(`gatewayAuth.ssoCallback.${key}`);\r\n const messages: Record<string, string> = {\r\n invalid_state: t('sessionExpired'),\r\n sso_exchange_expired: t('sessionExpired'),\r\n sso_exchange_used: t('sessionAlreadyUsed'),\r\n sso_user_not_found: t('notConfigured'),\r\n sso_provisioning_not_allowed: t('notConfigured'),\r\n };\r\n\r\n return messages[errorCode] ?? t('fallbackError');\r\n }\r\n}\r\n","<ng-container *transloco=\"let t; prefix: 'gatewayAuth.ssoCallback'\">\r\n <div\r\n class=\"min-h-screen w-screen flex items-center justify-center p-6 bg-surface-50\"\r\n >\r\n <div\r\n class=\"w-full max-w-md rounded-xl bg-white p-8 shadow-sm border border-surface-200 text-center\"\r\n >\r\n @if (callbackError() || exchangeError(); as errorMessage) {\r\n <div class=\"space-y-5\">\r\n <mt-icon\r\n icon=\"alert.alert-circle\"\r\n class=\"text-red-500 text-4xl\"\r\n ></mt-icon>\r\n <div class=\"space-y-2\">\r\n <h1 class=\"text-xl font-semibold text-surface-950\">\r\n {{ t(\"errorTitle\") }}\r\n </h1>\r\n <p class=\"text-sm text-surface-600\">{{ errorMessage }}</p>\r\n </div>\r\n <mt-button\r\n [label]=\"t('backToSignIn')\"\r\n severity=\"primary\"\r\n (onClick)=\"retry()\"\r\n ></mt-button>\r\n </div>\r\n } @else {\r\n <div class=\"space-y-5\">\r\n <mt-icon\r\n icon=\"general.loading-02\"\r\n class=\"text-primary text-4xl animate-spin animate-duration-2000\"\r\n >\r\n </mt-icon>\r\n <div class=\"space-y-2\">\r\n <h1 class=\"text-xl font-semibold text-surface-950\">\r\n {{ t(\"completing\") }}\r\n </h1>\r\n <p class=\"text-sm text-surface-600\">\r\n {{ t(\"pleaseWait\") }}\r\n </p>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n</ng-container>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["tap","catchError"],"mappings":"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"}
1
+ {"version":3,"file":"masterteam-gateway-auth.mjs","sources":["../../../../packages/masterteam/gateway-auth/src/gateway-auth.utils.ts","../../../../packages/masterteam/gateway-auth/src/gateway-auth.actions.ts","../../../../packages/masterteam/gateway-auth/src/gateway-auth.options.ts","../../../../packages/masterteam/gateway-auth/src/gateway-sso-session.service.ts","../../../../packages/masterteam/gateway-auth/src/gateway-auth.state.model.ts","../../../../packages/masterteam/gateway-auth/src/gateway-auth.state.ts","../../../../packages/masterteam/gateway-auth/src/gateway-auth.facade.ts","../../../../packages/masterteam/gateway-auth/src/gateway-auth.interceptor.ts","../../../../packages/masterteam/gateway-auth/src/components/gateway-sso-buttons/gateway-sso-buttons.ts","../../../../packages/masterteam/gateway-auth/src/components/gateway-sso-buttons/gateway-sso-buttons.html","../../../../packages/masterteam/gateway-auth/src/components/gateway-login-page/gateway-login-page.ts","../../../../packages/masterteam/gateway-auth/src/components/gateway-login-page/gateway-login-page.html","../../../../packages/masterteam/gateway-auth/src/components/gateway-mfa/gateway-mfa.ts","../../../../packages/masterteam/gateway-auth/src/components/gateway-mfa/gateway-mfa.html","../../../../packages/masterteam/gateway-auth/src/components/gateway-sso-callback/gateway-sso-callback.ts","../../../../packages/masterteam/gateway-auth/src/components/gateway-sso-callback/gateway-sso-callback.html","../../../../packages/masterteam/gateway-auth/src/masterteam-gateway-auth.ts"],"sourcesContent":["import type { HttpClient } from '@angular/common/http';\r\nimport { firstValueFrom } from 'rxjs';\r\nimport {\r\n GatewayApiDateValue,\r\n GatewayApplicationContextData,\r\n GatewayAuthTokens,\r\n GatewayMappedTokens,\r\n GatewayMappedUser,\r\n GatewayRefreshData,\r\n GatewayResponse,\r\n GatewaySsoProvider,\r\n GatewayUserDetails,\r\n} from './gateway-auth.models';\r\n\r\nexport const GATEWAY_AUTH_DEVICE_TOKEN = 'web-app';\r\nexport const GATEWAY_AUTH_DEVICE_TOKEN_STORAGE_KEY =\r\n 'masterteam.gateway-auth.device-token';\r\nexport const GATEWAY_AUTH_ACCESS_TOKEN_REFRESH_SKEW_MS = 60 * 1000;\r\nexport const GATEWAY_AUTH_NGSW_BYPASS_PARAM = 'ngsw-bypass';\r\n\r\nexport type GatewayDeviceTokenOption =\r\n | string\r\n | (() => string | null | undefined);\r\n\r\nexport const GATEWAY_AUTH_ENDPOINTS = {\r\n login: 'auth/login',\r\n verifyMfa: 'auth/2fa/verify',\r\n resendMfa: 'auth/2fa/resend',\r\n refresh: 'auth/refresh',\r\n logout: 'auth/logout',\r\n meApplications: 'auth/me/applications',\r\n applicationContext: 'public/application-context',\r\n ssoProviders: 'auth/sso/providers',\r\n ssoExchange: 'auth/sso/exchange',\r\n ssoTokenExchange: 'auth/sso/token-exchange',\r\n applicationLaunch: (applicationCode: string) =>\r\n `applications/${encodeURIComponent(applicationCode)}/launch`,\r\n nafathStart: (providerKey: string) =>\r\n `auth/sso/nafath/${encodeURIComponent(providerKey)}/start`,\r\n nafathStatus: (providerKey: string) =>\r\n `auth/sso/nafath/${encodeURIComponent(providerKey)}/status`,\r\n ssoStart: (providerKey: string) =>\r\n `auth/sso/${encodeURIComponent(providerKey)}/start`,\r\n} as const;\r\n\r\nexport function isExpired(expireAt?: string | null, skewMs = 0): boolean {\r\n if (!expireAt) {\r\n return false;\r\n }\r\n\r\n const timestamp = new Date(expireAt).getTime();\r\n return !Number.isFinite(timestamp) || timestamp <= Date.now() + skewMs;\r\n}\r\n\r\nexport function resolveApiDateValue(\r\n value?: GatewayApiDateValue | null,\r\n): string | null {\r\n return value?.actualValue ?? value?.rawValue ?? null;\r\n}\r\n\r\nexport function mapGatewayTokens(\r\n tokens: GatewayAuthTokens | GatewayRefreshData,\r\n): GatewayMappedTokens {\r\n return {\r\n accessToken: tokens.accessToken,\r\n refreshToken: tokens.refreshToken,\r\n accessTokenExpiresAt: resolveApiDateValue(tokens.accessTokenExpiresAt),\r\n refreshTokenExpiresAt: resolveApiDateValue(tokens.refreshTokenExpiresAt),\r\n };\r\n}\r\n\r\nexport function resolveAccessTokenRefreshSkewMs(\r\n skewMs?: number | null,\r\n): number {\r\n return typeof skewMs === 'number' && Number.isFinite(skewMs) && skewMs >= 0\r\n ? skewMs\r\n : GATEWAY_AUTH_ACCESS_TOKEN_REFRESH_SKEW_MS;\r\n}\r\n\r\nexport function resolveApplicationCodeOption(\r\n applicationCode?: string | (() => string | null | undefined) | null,\r\n): string | null {\r\n const value =\r\n typeof applicationCode === 'function' ? applicationCode() : applicationCode;\r\n const normalized = value?.trim();\r\n return normalized ? normalized : null;\r\n}\r\n\r\nconst applicationContextCache = new Map<string, Promise<string | null>>();\r\n\r\nexport function buildApplicationContextUrl(\r\n applicationApiBaseUrl: string | null | undefined,\r\n): string | null {\r\n if (!applicationApiBaseUrl) {\r\n return null;\r\n }\r\n const base = normalizeGatewayBase(applicationApiBaseUrl);\r\n if (!base) {\r\n return null;\r\n }\r\n const path = GATEWAY_AUTH_ENDPOINTS.applicationContext;\r\n if (/\\/api\\/?$/i.test(base)) {\r\n return `${base.replace(/\\/+$/, '')}/${path}`;\r\n }\r\n return `${base}/api/${path}`;\r\n}\r\n\r\nexport function clearApplicationContextCache(\r\n applicationApiBaseUrl?: string | null,\r\n): void {\r\n if (applicationApiBaseUrl) {\r\n applicationContextCache.delete(applicationApiBaseUrl);\r\n return;\r\n }\r\n applicationContextCache.clear();\r\n}\r\n\r\nexport async function fetchApplicationContextCode(\r\n http: HttpClient,\r\n applicationApiBaseUrl: string | null | undefined,\r\n): Promise<string | null> {\r\n const url = buildApplicationContextUrl(applicationApiBaseUrl);\r\n if (!url || !applicationApiBaseUrl) {\r\n return null;\r\n }\r\n\r\n const cacheKey = applicationApiBaseUrl;\r\n const cached = applicationContextCache.get(cacheKey);\r\n if (cached) {\r\n return cached;\r\n }\r\n\r\n const promise = firstValueFrom(\r\n http.get<GatewayResponse<GatewayApplicationContextData>>(url),\r\n )\r\n .then((response) => response?.data?.applicationCode?.trim() || null)\r\n .catch(() => null);\r\n\r\n applicationContextCache.set(cacheKey, promise);\r\n const code = await promise;\r\n if (!code) {\r\n applicationContextCache.delete(cacheKey);\r\n }\r\n return code;\r\n}\r\n\r\nexport function resolveGatewayDeviceToken(\r\n deviceToken?: GatewayDeviceTokenOption | null,\r\n): string {\r\n const configuredToken =\r\n typeof deviceToken === 'function' ? deviceToken() : deviceToken;\r\n const normalizedConfiguredToken = configuredToken?.trim();\r\n\r\n if (normalizedConfiguredToken) {\r\n return normalizedConfiguredToken;\r\n }\r\n\r\n if (typeof window === 'undefined') {\r\n return GATEWAY_AUTH_DEVICE_TOKEN;\r\n }\r\n\r\n try {\r\n const storedToken = window.localStorage\r\n ?.getItem(GATEWAY_AUTH_DEVICE_TOKEN_STORAGE_KEY)\r\n ?.trim();\r\n\r\n if (storedToken) {\r\n return storedToken;\r\n }\r\n\r\n const generatedToken = `web-${createSecureClientState()}`;\r\n window.localStorage?.setItem(\r\n GATEWAY_AUTH_DEVICE_TOKEN_STORAGE_KEY,\r\n generatedToken,\r\n );\r\n return generatedToken;\r\n } catch {\r\n return GATEWAY_AUTH_DEVICE_TOKEN;\r\n }\r\n}\r\n\r\nexport function withGatewayAuthNgswBypass(url: string): string {\r\n if (\r\n url.includes(`?${GATEWAY_AUTH_NGSW_BYPASS_PARAM}`) ||\r\n url.includes(`&${GATEWAY_AUTH_NGSW_BYPASS_PARAM}`)\r\n ) {\r\n return url;\r\n }\r\n\r\n const separator = url.includes('?') ? '&' : '?';\r\n return `${url}${separator}${GATEWAY_AUTH_NGSW_BYPASS_PARAM}=true`;\r\n}\r\n\r\ninterface PersistedGatewayAuthState {\r\n token?: unknown;\r\n accessToken?: unknown;\r\n refreshToken?: unknown;\r\n accessTokenExpiresAt?: unknown;\r\n refreshTokenExpiresAt?: unknown;\r\n user?: {\r\n token?: unknown;\r\n accessToken?: unknown;\r\n refreshToken?: unknown;\r\n accessTokenExpiresAt?: unknown;\r\n refreshTokenExpiresAt?: unknown;\r\n };\r\n}\r\n\r\nfunction readString(value: unknown): string | null {\r\n return typeof value === 'string' && value ? value : null;\r\n}\r\n\r\nexport function readPersistedGatewayAuthTokens(): GatewayAuthTokens | null {\r\n if (typeof window === 'undefined') {\r\n return null;\r\n }\r\n\r\n try {\r\n const rawState = window.localStorage?.getItem('auth');\r\n if (!rawState) {\r\n return null;\r\n }\r\n\r\n const parsedState = JSON.parse(rawState) as PersistedGatewayAuthState;\r\n const accessToken =\r\n readString(parsedState.token) ??\r\n readString(parsedState.accessToken) ??\r\n readString(parsedState.user?.token) ??\r\n readString(parsedState.user?.accessToken);\r\n const refreshToken =\r\n readString(parsedState.refreshToken) ??\r\n readString(parsedState.user?.refreshToken);\r\n\r\n if (!accessToken || !refreshToken) {\r\n return null;\r\n }\r\n\r\n const accessTokenExpiresAt =\r\n readString(parsedState.accessTokenExpiresAt) ??\r\n readString(parsedState.user?.accessTokenExpiresAt) ??\r\n '';\r\n const refreshTokenExpiresAt =\r\n readString(parsedState.refreshTokenExpiresAt) ??\r\n readString(parsedState.user?.refreshTokenExpiresAt) ??\r\n '';\r\n\r\n return {\r\n accessToken,\r\n accessTokenExpiresAt: { actualValue: accessTokenExpiresAt },\r\n refreshToken,\r\n refreshTokenExpiresAt: { actualValue: refreshTokenExpiresAt },\r\n };\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\nexport function mapGatewayUser(\r\n user: GatewayUserDetails,\r\n tokenData: GatewayMappedTokens,\r\n delegations?: unknown[],\r\n): GatewayMappedUser {\r\n const photo =\r\n typeof user.photo === 'string' ? { fileName: user.photo } : user.photo;\r\n const imageFallback = user.image ? { fileName: user.image } : undefined;\r\n const resolvedPhoto = photo ?? imageFallback;\r\n\r\n return {\r\n user: {\r\n ...user,\r\n photo: resolvedPhoto,\r\n },\r\n token: tokenData.accessToken,\r\n accessToken: tokenData.accessToken,\r\n refreshToken: tokenData.refreshToken,\r\n accessTokenExpiresAt: tokenData.accessTokenExpiresAt ?? undefined,\r\n refreshTokenExpiresAt: tokenData.refreshTokenExpiresAt ?? undefined,\r\n delegations: delegations ?? [],\r\n twoFactorRequired: false,\r\n };\r\n}\r\n\r\nexport function hasGatewayTokens(\r\n tokens?: Partial<GatewayAuthTokens | GatewayRefreshData> | null,\r\n): boolean {\r\n return Boolean(tokens?.accessToken && tokens?.refreshToken);\r\n}\r\n\r\nexport const GATEWAY_RATE_LIMIT_STATUS = 429;\r\nexport const GATEWAY_RATE_LIMIT_ERROR_CODE = 'RATE_001';\r\n\r\nexport interface GatewayRateLimitInfo {\r\n retryAfterSeconds: number | null;\r\n message: string;\r\n}\r\n\r\nexport function extractGatewayRateLimitInfo(\r\n error: unknown,\r\n): GatewayRateLimitInfo | null {\r\n const e = error as {\r\n status?: number;\r\n error?: {\r\n message?: string;\r\n errors?: {\r\n code?: string;\r\n message?: string;\r\n details?: { retryAfterSeconds?: number | string };\r\n };\r\n };\r\n headers?: { get?: (name: string) => string | null };\r\n } | null;\r\n\r\n if (!e || e.status !== GATEWAY_RATE_LIMIT_STATUS) {\r\n return null;\r\n }\r\n\r\n const detailSeconds = Number(e.error?.errors?.details?.retryAfterSeconds);\r\n const headerSeconds = Number(e.headers?.get?.('Retry-After'));\r\n const retryAfterSeconds =\r\n Number.isFinite(detailSeconds) && detailSeconds > 0\r\n ? Math.ceil(detailSeconds)\r\n : Number.isFinite(headerSeconds) && headerSeconds > 0\r\n ? Math.ceil(headerSeconds)\r\n : null;\r\n\r\n const message =\r\n e.error?.errors?.message ??\r\n e.error?.message ??\r\n 'Too many attempts. Please try again later.';\r\n\r\n return { retryAfterSeconds, message };\r\n}\r\n\r\nexport function getGatewayErrorMessage(\r\n error: unknown,\r\n fallback: string,\r\n): string {\r\n const response = error as {\r\n error?: {\r\n message?: string;\r\n Message?: string;\r\n errors?: { message?: string };\r\n };\r\n message?: string;\r\n };\r\n\r\n return (\r\n response.error?.message ??\r\n response.error?.Message ??\r\n response.error?.errors?.message ??\r\n response.message ??\r\n fallback\r\n );\r\n}\r\n\r\nexport function normalizeGatewayBase(baseUrl?: string | null): string {\r\n if (!baseUrl) {\r\n return '';\r\n }\r\n\r\n return baseUrl.replace(/\\/+$/, '');\r\n}\r\n\r\nexport function buildGatewayUrl(\r\n gatewayApiBaseUrl: string | undefined | null,\r\n path: string,\r\n): string {\r\n if (/^https?:\\/\\//i.test(path)) {\r\n return path;\r\n }\r\n\r\n const normalizedBase = normalizeGatewayBase(gatewayApiBaseUrl);\r\n if (!normalizedBase) {\r\n return path;\r\n }\r\n\r\n const normalizedPath = path.replace(/^\\/+/, '');\r\n if (normalizedPath.startsWith('api/')) {\r\n try {\r\n const base = new URL(normalizedBase);\r\n return `${base.origin}/${normalizedPath}`;\r\n } catch {\r\n return `${normalizedBase}/${normalizedPath}`;\r\n }\r\n }\r\n\r\n return `${normalizedBase}/${normalizedPath}`;\r\n}\r\n\r\nexport interface BuildSsoStartUrlOptions {\r\n gatewayApiBaseUrl: string;\r\n provider: GatewaySsoProvider;\r\n returnUrl: string;\r\n clientState: string;\r\n platform?: 'web' | 'mobile';\r\n}\r\n\r\nexport function buildSsoStartUrl({\r\n gatewayApiBaseUrl,\r\n provider,\r\n returnUrl,\r\n clientState,\r\n platform = 'web',\r\n}: BuildSsoStartUrlOptions): string {\r\n const startPath =\r\n provider.startUrl || GATEWAY_AUTH_ENDPOINTS.ssoStart(provider.key);\r\n const url = new URL(buildGatewayUrl(gatewayApiBaseUrl, startPath));\r\n url.searchParams.set('platform', platform);\r\n url.searchParams.set('returnUrl', returnUrl);\r\n url.searchParams.set('clientState', clientState);\r\n return url.toString();\r\n}\r\n\r\nexport function createSecureClientState(): string {\r\n if (typeof crypto !== 'undefined' && crypto.randomUUID) {\r\n return crypto.randomUUID();\r\n }\r\n\r\n const bytes = new Uint8Array(16);\r\n if (typeof crypto !== 'undefined' && crypto.getRandomValues) {\r\n crypto.getRandomValues(bytes);\r\n return Array.from(bytes, (value) =>\r\n value.toString(16).padStart(2, '0'),\r\n ).join('');\r\n }\r\n\r\n return `${Date.now().toString(36)}${Math.random().toString(36).slice(2)}`;\r\n}\r\n","import {\n AuthLoginData,\n AuthRateLimit,\n AuthTokens,\n AppSession,\n ApplicationListItem,\n LoginRequest,\n SsoProvider,\n User,\n} from './gateway-auth.state.model';\n\nexport class Login {\n static readonly type = '[Auth] Login';\n constructor(public payload: LoginRequest) {}\n}\n\nexport class VerifyMfa {\n static readonly type = '[Auth] Verify MFA';\n constructor(public code: string) {}\n}\n\nexport class ResendMfa {\n static readonly type = '[Auth] Resend MFA';\n}\n\nexport class LoadSsoProviders {\n static readonly type = '[Auth] Load SSO Providers';\n}\n\nexport class StartSso {\n static readonly type = '[Auth] Start SSO';\n constructor(public provider: SsoProvider) {}\n}\n\nexport class ExchangeSsoCode {\n static readonly type = '[Auth] Exchange SSO Code';\n constructor(\n public code: string,\n public state: string,\n ) {}\n}\n\nexport class LoginSuccess {\n static readonly type = '[Auth] Login Success';\n constructor(public session: AuthLoginData) {}\n}\n\nexport class LoginFailure {\n static readonly type = '[Auth] Login Failure';\n constructor(public error: string) {}\n}\n\nexport class Logout {\n static readonly type = '[Auth] Logout';\n constructor(public remote: boolean = false) {}\n}\n\nexport class UpdateUserData {\n static readonly type = '[Auth] Update User Data';\n constructor(public user: User) {}\n}\n\nexport class UpdateTokens {\n static readonly type = '[Auth] Update Tokens';\n constructor(public tokens: AuthTokens) {}\n}\n\nexport class ClearError {\n static readonly type = '[Auth] Clear Error';\n}\n\nexport class ClearPendingMfa {\n static readonly type = '[Auth] Clear Pending MFA';\n}\n\nexport class SetRateLimit {\n static readonly type = '[Auth] Set Rate Limit';\n constructor(public lock: AuthRateLimit) {}\n}\n\nexport class ClearRateLimit {\n static readonly type = '[Auth] Clear Rate Limit';\n}\n\nexport class LoadApplications {\n static readonly type = '[Auth] Load Applications';\n}\n\nexport class SetApplications {\n static readonly type = '[Auth] Set Applications';\n constructor(public applications: ApplicationListItem[]) {}\n}\n\nexport class LaunchApplication {\n static readonly type = '[Auth] Launch Application';\n constructor(\n public applicationCode: string,\n public returnUrl?: string,\n public navigate: boolean = false,\n ) {}\n}\n\nexport class SetAppSession {\n static readonly type = '[Auth] Set App Session';\n constructor(public session: AppSession) {}\n}\n\nexport class UpdateAppTokens {\n static readonly type = '[Auth] Update App Tokens';\n constructor(\n public applicationCode: string,\n public tokens: AuthTokens,\n ) {}\n}\n\nexport class ClearAppSession {\n static readonly type = '[Auth] Clear App Session';\n constructor(public applicationCode: string) {}\n}\n\nexport class ClearAllAppSessions {\n static readonly type = '[Auth] Clear All App Sessions';\n}\n","import { InjectionToken } from '@angular/core';\nimport type { HttpRequest } from '@angular/common/http';\nimport { StateContext } from '@ngxs/store';\nimport { Observable } from 'rxjs';\nimport {\n GatewayLoginResponse,\n GatewayPlatform,\n GatewaySsoProvider,\n} from './gateway-auth.models';\nimport { AuthStateModel } from './gateway-auth.state.model';\nimport type { GatewayDeviceTokenOption } from './gateway-auth.utils';\n\nexport type GatewayAuthHookResult =\n | void\n | null\n | Observable<unknown>\n | Promise<unknown>;\n\nexport type GatewayApplicationCodeOption =\n | string\n | (() => string | null | undefined);\n\nexport interface GatewayLoginLanguageOption {\n key: string;\n id?: string;\n label: string;\n dir?: 'ltr' | 'rtl';\n icon?: string;\n}\n\nexport interface GatewayLoginPageOptions {\n imageBasePath?: string;\n translationPrefix?: string;\n showLanguageToggle?: boolean;\n ssoButtonLabel?:\n | string\n | ((provider: GatewaySsoProvider, providerCount: number) => string);\n getLanguages?: () => readonly GatewayLoginLanguageOption[];\n getActiveLanguage?: () => string | null | undefined;\n setLanguage?: (langKey: string) => void;\n}\n\nexport interface GatewayAuthOptions {\n getGatewayApiBaseUrl: () => string | null | undefined;\n getApplicationApiBaseUrl?: () => string | null | undefined;\n shouldUseGatewayApiBaseUrl?: (request: HttpRequest<unknown>) => boolean;\n deviceToken?: GatewayDeviceTokenOption;\n accessTokenRefreshSkewMs?: number;\n platform?: GatewayPlatform;\n loginRoute?: string;\n mfaRoute?: string;\n ssoCallbackPath?: string;\n defaultAuthenticatedRoute?: string | (() => string | null | undefined);\n preserveSsoProvidersOnLogout?: boolean;\n loginPage?: GatewayLoginPageOptions;\n applicationCode?: GatewayApplicationCodeOption;\n autoLaunchApplicationOnLogin?: boolean;\n resolveApplicationCodeForRequest?: (\n request: HttpRequest<unknown>,\n ) => string | null | undefined;\n afterLogin?: (\n session: GatewayLoginResponse,\n ctx: StateContext<AuthStateModel>,\n ) => GatewayAuthHookResult;\n beforeLocalLogout?: (\n ctx: StateContext<AuthStateModel>,\n ) => GatewayAuthHookResult;\n}\n\nexport const GATEWAY_AUTH_OPTIONS = new InjectionToken<GatewayAuthOptions>(\n 'GATEWAY_AUTH_OPTIONS',\n {\n factory: () => ({\n getGatewayApiBaseUrl: () => null,\n accessTokenRefreshSkewMs: 60 * 1000,\n platform: 'web',\n loginRoute: '/auth/login',\n mfaRoute: '/auth/mfa',\n ssoCallbackPath: '/auth/sso/callback',\n defaultAuthenticatedRoute: '/',\n preserveSsoProvidersOnLogout: true,\n autoLaunchApplicationOnLogin: false,\n loginPage: {\n imageBasePath: '/Settings/login-image/',\n translationPrefix: 'login',\n },\n }),\n },\n);\n","import { createSecureClientState } from './gateway-auth.utils';\n\nconst PENDING_SSO_STATE_KEY = 'gatewayAuth.pendingSsoState';\n\nexport class GatewaySsoSession {\n createAndStoreState(): string {\n const state = createSecureClientState();\n this.storage?.setItem(PENDING_SSO_STATE_KEY, state);\n return state;\n }\n\n getPendingState(): string | null {\n return this.storage?.getItem(PENDING_SSO_STATE_KEY) ?? null;\n }\n\n clearPendingState(): void {\n this.storage?.removeItem(PENDING_SSO_STATE_KEY);\n }\n\n consumeExpectedState(state: string | null): boolean {\n const expectedState = this.getPendingState();\n this.clearPendingState();\n return Boolean(state && expectedState && state === expectedState);\n }\n\n clearCallbackQuery(path = '/auth/sso/callback'): void {\n if (typeof window === 'undefined' || !window.history?.replaceState) {\n return;\n }\n\n window.history.replaceState({}, document.title, path);\n }\n\n clearAll(): void {\n this.clearPendingState();\n }\n\n private get storage(): Storage | null {\n if (typeof sessionStorage === 'undefined') {\n return null;\n }\n\n return sessionStorage;\n }\n}\n","import {\n GatewayAppSession,\n GatewayApplicationListItem,\n GatewayAuthTokens,\n GatewayLoginRequest,\n GatewayLoginResponse,\n GatewayMappedUser,\n GatewayRefreshData,\n GatewayResponse,\n GatewaySsoProvider,\n GatewayTwoFactorChallenge,\n GatewayUserDetails,\n} from './gateway-auth.models';\n\nexport type UserDetails = GatewayUserDetails;\nexport type User = GatewayMappedUser;\nexport type LoginRequest = GatewayLoginRequest;\nexport type ApiDateValue = NonNullable<\n GatewayAuthTokens['accessTokenExpiresAt']\n>;\nexport type AuthTokens = GatewayAuthTokens;\nexport type AuthLoginData = GatewayLoginResponse;\nexport type AuthRefreshData = GatewayRefreshData;\nexport type TwoFactorChallenge = GatewayTwoFactorChallenge;\nexport type SsoProvider = GatewaySsoProvider;\nexport type Response<T> = GatewayResponse<T>;\nexport type ApplicationListItem = GatewayApplicationListItem;\nexport type AppSession = GatewayAppSession;\n\nexport type AuthRateLimitScope =\n | 'login'\n | 'verifyMfa'\n | 'resendMfa'\n | 'ssoExchange';\n\nexport interface AuthRateLimit {\n retryUntilMs: number | null;\n totalSeconds: number | null;\n message: string;\n scope: AuthRateLimitScope;\n}\n\nexport interface AuthStateModel {\n user: User | null;\n token: string | null;\n refreshToken: string | null;\n accessTokenExpiresAt: string | null;\n refreshTokenExpiresAt: string | null;\n loading: boolean;\n mfaResendLoading: boolean;\n ssoLoading: boolean;\n ssoCallbackLoading: boolean;\n error: string | null;\n twoFactorRequired: boolean;\n pendingMfa: TwoFactorChallenge | null;\n ssoProviders: SsoProvider[];\n rateLimit: AuthRateLimit | null;\n applications: ApplicationListItem[];\n applicationsLoading: boolean;\n appSessions: Record<string, AppSession>;\n appLaunchLoading: Record<string, boolean>;\n}\n\nexport const AUTH_STATE_DEFAULTS: AuthStateModel = {\n user: null,\n token: null,\n refreshToken: null,\n accessTokenExpiresAt: null,\n refreshTokenExpiresAt: null,\n loading: false,\n mfaResendLoading: false,\n ssoLoading: false,\n ssoCallbackLoading: false,\n error: null,\n twoFactorRequired: false,\n pendingMfa: null,\n ssoProviders: [],\n rateLimit: null,\n applications: [],\n applicationsLoading: false,\n appSessions: {},\n appLaunchLoading: {},\n};\n\nfunction pruneRateLimit(\n rateLimit: AuthRateLimit | null | undefined,\n): AuthRateLimit | null {\n if (!rateLimit) {\n return null;\n }\n if (\n typeof rateLimit.retryUntilMs === 'number' &&\n rateLimit.retryUntilMs <= Date.now()\n ) {\n return null;\n }\n return rateLimit;\n}\n\nfunction pruneAppSessions(\n appSessions: Record<string, AppSession> | null | undefined,\n): Record<string, AppSession> {\n if (!appSessions || typeof appSessions !== 'object') {\n return {};\n }\n const pruned: Record<string, AppSession> = {};\n for (const [code, session] of Object.entries(appSessions)) {\n if (!session || typeof session !== 'object') {\n continue;\n }\n if (!session.accessToken || !session.refreshToken) {\n continue;\n }\n pruned[code] = session;\n }\n return pruned;\n}\n\nexport function sanitizePersistedAuthState(\n obj: Partial<AuthStateModel> | null,\n) {\n return {\n ...AUTH_STATE_DEFAULTS,\n ...(obj ?? {}),\n loading: false,\n mfaResendLoading: false,\n ssoLoading: false,\n ssoCallbackLoading: false,\n error: null,\n twoFactorRequired: false,\n pendingMfa: null,\n ssoProviders: [],\n rateLimit: pruneRateLimit(obj?.rateLimit ?? null),\n applications: obj?.applications ?? [],\n applicationsLoading: false,\n appSessions: pruneAppSessions(obj?.appSessions ?? null),\n appLaunchLoading: {},\n };\n}\n","import { HttpClient } from '@angular/common/http';\nimport { Injectable, inject } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { ModalService } from '@masterteam/components/modal';\nimport { Action, Selector, State, StateContext } from '@ngxs/store';\nimport { defer, EMPTY, Observable, from, isObservable, of } from 'rxjs';\nimport { catchError, mergeMap, switchMap, tap } from 'rxjs/operators';\nimport {\n ClearAllAppSessions,\n ClearAppSession,\n ClearError,\n ClearPendingMfa,\n ClearRateLimit,\n ExchangeSsoCode,\n LaunchApplication,\n LoadApplications,\n LoadSsoProviders,\n Login,\n LoginFailure,\n LoginSuccess,\n Logout,\n ResendMfa,\n SetAppSession,\n SetApplications,\n SetRateLimit,\n StartSso,\n UpdateAppTokens,\n UpdateTokens,\n UpdateUserData,\n VerifyMfa,\n} from './gateway-auth.actions';\nimport {\n GATEWAY_AUTH_OPTIONS,\n GatewayAuthHookResult,\n} from './gateway-auth.options';\nimport {\n GatewayApplicationLaunchData,\n GatewayApplicationsData,\n GatewayLoginResponse,\n GatewayResponse,\n GatewaySsoProvidersData,\n GatewayTwoFactorChallenge,\n} from './gateway-auth.models';\nimport {\n buildGatewayUrl,\n buildSsoStartUrl,\n extractGatewayRateLimitInfo,\n fetchApplicationContextCode,\n GATEWAY_AUTH_ENDPOINTS,\n getGatewayErrorMessage,\n hasGatewayTokens,\n mapGatewayTokens,\n mapGatewayUser,\n resolveApplicationCodeOption,\n resolveGatewayDeviceToken,\n} from './gateway-auth.utils';\nimport { GatewaySsoSession } from './gateway-sso-session.service';\nimport {\n AppSession,\n ApplicationListItem,\n AUTH_STATE_DEFAULTS,\n AuthLoginData,\n AuthRateLimit,\n AuthRateLimitScope,\n AuthStateModel,\n SsoProvider,\n User,\n} from './gateway-auth.state.model';\n\n@State<AuthStateModel>({\n name: 'auth',\n defaults: AUTH_STATE_DEFAULTS,\n})\n@Injectable()\nexport class GatewayAuthState {\n private readonly http = inject(HttpClient);\n private readonly options = inject(GATEWAY_AUTH_OPTIONS);\n private readonly router = inject(Router);\n private readonly modalService = inject(ModalService);\n private readonly ssoSession = new GatewaySsoSession();\n\n @Selector()\n static user(state: AuthStateModel): User | null {\n return state.user;\n }\n\n @Selector()\n static loading(state: AuthStateModel): boolean {\n return state.loading;\n }\n\n @Selector()\n static mfaResendLoading(state: AuthStateModel): boolean {\n return state.mfaResendLoading;\n }\n\n @Selector()\n static ssoLoading(state: AuthStateModel): boolean {\n return state.ssoLoading;\n }\n\n @Selector()\n static ssoCallbackLoading(state: AuthStateModel): boolean {\n return state.ssoCallbackLoading;\n }\n\n @Selector()\n static error(state: AuthStateModel): string | null {\n return state.error;\n }\n\n @Selector()\n static token(state: AuthStateModel): string | null {\n return state.token;\n }\n\n @Selector()\n static refreshToken(state: AuthStateModel): string | null {\n return state.refreshToken;\n }\n\n @Selector()\n static accessTokenExpiresAt(state: AuthStateModel): string | null {\n return state.accessTokenExpiresAt;\n }\n\n @Selector()\n static refreshTokenExpiresAt(state: AuthStateModel): string | null {\n return state.refreshTokenExpiresAt;\n }\n\n @Selector()\n static twoFactorRequired(state: AuthStateModel): boolean {\n return state.twoFactorRequired;\n }\n\n @Selector()\n static pendingMfa(state: AuthStateModel) {\n return state.pendingMfa;\n }\n\n @Selector()\n static ssoProviders(state: AuthStateModel): SsoProvider[] {\n return state.ssoProviders;\n }\n\n @Selector()\n static rateLimit(state: AuthStateModel): AuthRateLimit | null {\n return state.rateLimit;\n }\n\n @Selector()\n static isAdmin(state: AuthStateModel): boolean {\n return state.user?.isAdmin || false;\n }\n\n @Selector()\n static userDetails(state: AuthStateModel) {\n return state.user?.user || null;\n }\n\n @Selector()\n static applications(state: AuthStateModel): ApplicationListItem[] {\n return state.applications;\n }\n\n @Selector()\n static applicationsLoading(state: AuthStateModel): boolean {\n return state.applicationsLoading;\n }\n\n @Selector()\n static appSessions(state: AuthStateModel): Record<string, AppSession> {\n return state.appSessions;\n }\n\n @Selector()\n static appLaunchLoading(state: AuthStateModel): Record<string, boolean> {\n return state.appLaunchLoading;\n }\n\n @Action(Login)\n login(ctx: StateContext<AuthStateModel>, action: Login) {\n if (this.isRateLimitActive(ctx, 'login')) {\n return EMPTY;\n }\n\n ctx.patchState({\n loading: true,\n error: null,\n pendingMfa: null,\n twoFactorRequired: false,\n });\n\n return this.resolveApplicationCode$(action.payload.applicationCode).pipe(\n switchMap((applicationCode) =>\n this.http\n .post<GatewayResponse<GatewayLoginResponse>>(\n this.gatewayAuthMutationUrl(GATEWAY_AUTH_ENDPOINTS.login),\n {\n userName: action.payload.userName,\n password: action.payload.password,\n applicationCode: applicationCode ?? undefined,\n isEncrypted: action.payload.isEncrypted ?? false,\n deviceToken: action.payload.deviceToken || this.deviceToken,\n recaptchaToken: action.payload.recaptchaToken,\n recaptchaAction: action.payload.recaptchaAction,\n },\n )\n .pipe(\n mergeMap((response) =>\n this.handleLoginResponse(ctx, response.data, applicationCode),\n ),\n catchError((error) => {\n if (this.handleRateLimit(ctx, error, 'login')) {\n return of(null);\n }\n ctx.dispatch(\n new LoginFailure(\n getGatewayErrorMessage(error, 'Login failed'),\n ),\n );\n return of(null);\n }),\n ),\n ),\n );\n }\n\n private resolveApplicationCode$(\n explicitCode?: string,\n ): Observable<string | null> {\n if (explicitCode) {\n return of(explicitCode);\n }\n const configured = resolveApplicationCodeOption(this.options.applicationCode);\n if (configured) {\n return of(configured);\n }\n const applicationApiBaseUrl = this.options.getApplicationApiBaseUrl?.();\n if (!applicationApiBaseUrl) {\n return of(null);\n }\n return defer(() =>\n from(fetchApplicationContextCode(this.http, applicationApiBaseUrl)),\n );\n }\n\n @Action(VerifyMfa)\n verifyMfa(ctx: StateContext<AuthStateModel>, action: VerifyMfa) {\n const pendingMfa = ctx.getState().pendingMfa;\n if (!pendingMfa) {\n ctx.dispatch(new LoginFailure('The verification session expired.'));\n this.navigateToLogin();\n return EMPTY;\n }\n\n ctx.patchState({ loading: true, error: null });\n\n return this.http\n .post<GatewayResponse<GatewayLoginResponse>>(\n this.gatewayAuthMutationUrl(GATEWAY_AUTH_ENDPOINTS.verifyMfa),\n {\n userId: pendingMfa.userId,\n tempSessionId: pendingMfa.tempSessionId,\n code: action.code,\n deviceToken: this.deviceToken,\n },\n )\n .pipe(\n mergeMap((response) => this.handleLoginResponse(ctx, response.data)),\n catchError((error) => {\n if (this.handleRateLimit(ctx, error, 'verifyMfa')) {\n return of(null);\n }\n const message = getGatewayErrorMessage(\n error,\n 'Invalid verification code',\n );\n const shouldClearMfa = error?.status === 403;\n ctx.patchState({\n loading: false,\n error: message,\n pendingMfa: shouldClearMfa ? null : pendingMfa,\n twoFactorRequired: !shouldClearMfa,\n });\n if (shouldClearMfa) {\n this.navigateToLogin();\n }\n return of(null);\n }),\n );\n }\n\n @Action(ResendMfa)\n resendMfa(ctx: StateContext<AuthStateModel>) {\n const pendingMfa = ctx.getState().pendingMfa;\n if (!pendingMfa) {\n ctx.dispatch(new LoginFailure('The verification session expired.'));\n this.navigateToLogin();\n return EMPTY;\n }\n\n if (this.isRateLimitActive(ctx, 'resendMfa')) {\n return EMPTY;\n }\n\n ctx.patchState({ mfaResendLoading: true, error: null });\n\n return this.http\n .post<GatewayResponse<GatewayTwoFactorChallenge>>(\n this.gatewayAuthMutationUrl(GATEWAY_AUTH_ENDPOINTS.resendMfa),\n {\n userId: pendingMfa.userId,\n tempSessionId: pendingMfa.tempSessionId,\n },\n )\n .pipe(\n tap((response) => {\n ctx.patchState({\n pendingMfa: response.data,\n twoFactorRequired: true,\n mfaResendLoading: false,\n error: null,\n });\n }),\n catchError((error) => {\n if (this.handleRateLimit(ctx, error, 'resendMfa')) {\n ctx.patchState({ mfaResendLoading: false });\n return of(null);\n }\n ctx.patchState({\n mfaResendLoading: false,\n error: getGatewayErrorMessage(error, 'Failed to resend code'),\n });\n return of(null);\n }),\n );\n }\n\n @Action(LoadSsoProviders)\n loadSsoProviders(ctx: StateContext<AuthStateModel>) {\n ctx.patchState({ ssoLoading: true });\n\n return this.http\n .get<GatewayResponse<GatewaySsoProvidersData>>(\n this.gatewayUrl(GATEWAY_AUTH_ENDPOINTS.ssoProviders),\n {\n params: { platform: this.options.platform ?? 'web' },\n },\n )\n .pipe(\n tap((response) => {\n ctx.patchState({\n ssoProviders: (response.data?.providers ?? []).filter(\n (provider) => provider.enabled,\n ),\n ssoLoading: false,\n });\n }),\n catchError(() => {\n ctx.patchState({\n ssoProviders: [],\n ssoLoading: false,\n });\n return of(null);\n }),\n );\n }\n\n @Action(StartSso)\n startSso(ctx: StateContext<AuthStateModel>, action: StartSso) {\n if (action.provider.flow !== 'browser_redirect') {\n ctx.patchState({\n error: 'This SSO provider is not available for browser sign-in.',\n });\n return;\n }\n\n const gatewayApiBaseUrl = this.options.getGatewayApiBaseUrl();\n if (!gatewayApiBaseUrl || typeof window === 'undefined') {\n ctx.patchState({ error: 'SSO is not configured.' });\n return;\n }\n\n const clientState = this.ssoSession.createAndStoreState();\n const callbackPath = this.options.ssoCallbackPath ?? '/auth/sso/callback';\n const startUrl = buildSsoStartUrl({\n gatewayApiBaseUrl,\n provider: action.provider,\n returnUrl: `${window.location.origin}${callbackPath}`,\n clientState,\n platform: this.options.platform ?? 'web',\n });\n\n window.location.assign(startUrl);\n }\n\n @Action(ExchangeSsoCode)\n exchangeSsoCode(ctx: StateContext<AuthStateModel>, action: ExchangeSsoCode) {\n ctx.patchState({ ssoCallbackLoading: true, error: null });\n\n return this.http\n .post<GatewayResponse<GatewayLoginResponse>>(\n this.gatewayAuthMutationUrl(GATEWAY_AUTH_ENDPOINTS.ssoExchange),\n {\n code: action.code,\n state: action.state,\n deviceToken: this.deviceToken,\n },\n )\n .pipe(\n mergeMap((response) => this.handleLoginResponse(ctx, response.data)),\n catchError((error) => {\n if (this.handleRateLimit(ctx, error, 'ssoExchange')) {\n ctx.patchState({ ssoCallbackLoading: false });\n return of(null);\n }\n ctx.patchState({\n ssoCallbackLoading: false,\n error: getGatewayErrorMessage(\n error,\n 'SSO sign-in failed. Please try again.',\n ),\n });\n return of(null);\n }),\n );\n }\n\n @Action(LoginSuccess)\n loginSuccess(ctx: StateContext<AuthStateModel>, action: LoginSuccess) {\n return this.handleLoginResponse(ctx, action.session);\n }\n\n @Action(LoginFailure)\n loginFailure(ctx: StateContext<AuthStateModel>, action: LoginFailure) {\n ctx.patchState({\n loading: false,\n ssoCallbackLoading: false,\n error: action.error,\n user: null,\n token: null,\n refreshToken: null,\n accessTokenExpiresAt: null,\n refreshTokenExpiresAt: null,\n pendingMfa: null,\n twoFactorRequired: false,\n applications: [],\n appSessions: {},\n appLaunchLoading: {},\n });\n }\n\n @Action(Logout)\n logout(ctx: StateContext<AuthStateModel>, action: Logout) {\n const { token, refreshToken, ssoProviders } = ctx.getState();\n this.modalService.closeAll();\n this.ssoSession.clearAll();\n this.toObservable(this.options.beforeLocalLogout?.(ctx)).subscribe();\n ctx.patchState({\n ...AUTH_STATE_DEFAULTS,\n ssoProviders: this.options.preserveSsoProvidersOnLogout\n ? ssoProviders\n : [],\n });\n this.navigateToLogin();\n\n if (action.remote && token) {\n this.http\n .post<GatewayResponse<boolean>>(\n this.gatewayAuthMutationUrl(GATEWAY_AUTH_ENDPOINTS.logout),\n {\n refreshToken,\n deviceToken: this.deviceToken,\n },\n {\n headers: {\n Authorization: `Bearer ${token}`,\n noMessage: 'true',\n },\n },\n )\n .pipe(catchError(() => EMPTY))\n .subscribe();\n }\n }\n\n @Action(UpdateUserData)\n updateUserData(ctx: StateContext<AuthStateModel>, action: UpdateUserData) {\n ctx.patchState({\n user: action.user,\n });\n }\n\n @Action(UpdateTokens)\n updateTokens(ctx: StateContext<AuthStateModel>, action: UpdateTokens) {\n const tokenData = mapGatewayTokens(action.tokens);\n const state = ctx.getState();\n const updatedUser = state.user\n ? {\n ...state.user,\n token: tokenData.accessToken ?? state.user.token,\n accessToken: tokenData.accessToken ?? state.user.accessToken,\n refreshToken: tokenData.refreshToken ?? state.user.refreshToken,\n accessTokenExpiresAt: tokenData.accessTokenExpiresAt ?? undefined,\n refreshTokenExpiresAt: tokenData.refreshTokenExpiresAt ?? undefined,\n }\n : state.user;\n\n ctx.patchState({\n token: tokenData.accessToken,\n refreshToken: tokenData.refreshToken,\n accessTokenExpiresAt: tokenData.accessTokenExpiresAt,\n refreshTokenExpiresAt: tokenData.refreshTokenExpiresAt,\n user: updatedUser,\n });\n }\n\n @Action(ClearError)\n clearError(ctx: StateContext<AuthStateModel>) {\n ctx.patchState({ error: null });\n }\n\n @Action(ClearPendingMfa)\n clearPendingMfa(ctx: StateContext<AuthStateModel>) {\n ctx.patchState({ pendingMfa: null, twoFactorRequired: false });\n }\n\n @Action(SetRateLimit)\n setRateLimit(ctx: StateContext<AuthStateModel>, action: SetRateLimit) {\n ctx.patchState({\n loading: false,\n mfaResendLoading: false,\n ssoCallbackLoading: false,\n error: null,\n rateLimit: action.lock,\n });\n }\n\n @Action(ClearRateLimit)\n clearRateLimit(ctx: StateContext<AuthStateModel>) {\n ctx.patchState({ rateLimit: null });\n }\n\n @Action(LoadApplications)\n loadApplications(ctx: StateContext<AuthStateModel>) {\n ctx.patchState({ applicationsLoading: true });\n\n return this.http\n .get<\n GatewayResponse<GatewayApplicationsData>\n >(this.gatewayUrl(GATEWAY_AUTH_ENDPOINTS.meApplications))\n .pipe(\n tap((response) => {\n ctx.patchState({\n applications: response.data?.applications ?? [],\n applicationsLoading: false,\n });\n }),\n catchError((error) => {\n ctx.patchState({\n applicationsLoading: false,\n error: getGatewayErrorMessage(error, 'Failed to load applications'),\n });\n return of(null);\n }),\n );\n }\n\n @Action(SetApplications)\n setApplications(ctx: StateContext<AuthStateModel>, action: SetApplications) {\n ctx.patchState({ applications: action.applications });\n }\n\n @Action(LaunchApplication)\n launchApplication(\n ctx: StateContext<AuthStateModel>,\n action: LaunchApplication,\n ) {\n const code = action.applicationCode;\n ctx.patchState({\n appLaunchLoading: {\n ...ctx.getState().appLaunchLoading,\n [code]: true,\n },\n });\n\n const params: Record<string, string> = {};\n if (action.returnUrl) {\n params['returnUrl'] = action.returnUrl;\n }\n const deviceToken = this.deviceToken;\n if (deviceToken) {\n params['deviceToken'] = deviceToken;\n }\n\n return this.http\n .get<\n GatewayResponse<GatewayApplicationLaunchData>\n >(this.gatewayUrl(GATEWAY_AUTH_ENDPOINTS.applicationLaunch(code)), { params })\n .pipe(\n tap((response) => {\n const data = response.data;\n if (!data || !hasGatewayTokens(data.tokens)) {\n ctx.patchState({\n appLaunchLoading: this.removeLoadingFlag(ctx, code),\n });\n return;\n }\n\n const mapped = mapGatewayTokens(data.tokens);\n const session: AppSession = {\n applicationCode: data.applicationCode,\n applicationName: data.applicationName,\n launchUrl: data.launchUrl,\n accessToken: mapped.accessToken,\n refreshToken: mapped.refreshToken,\n accessTokenExpiresAt: mapped.accessTokenExpiresAt,\n refreshTokenExpiresAt: mapped.refreshTokenExpiresAt,\n };\n ctx.patchState({\n appSessions: {\n ...ctx.getState().appSessions,\n [data.applicationCode]: session,\n },\n appLaunchLoading: this.removeLoadingFlag(ctx, code),\n });\n\n if (action.navigate && session.launchUrl) {\n try {\n window.location.assign(session.launchUrl);\n } catch {\n // ignore navigation errors in non-browser env\n }\n }\n }),\n catchError((error) => {\n ctx.patchState({\n appLaunchLoading: this.removeLoadingFlag(ctx, code),\n error: getGatewayErrorMessage(\n error,\n 'Failed to launch application',\n ),\n });\n return of(null);\n }),\n );\n }\n\n @Action(SetAppSession)\n setAppSession(ctx: StateContext<AuthStateModel>, action: SetAppSession) {\n ctx.patchState({\n appSessions: {\n ...ctx.getState().appSessions,\n [action.session.applicationCode]: action.session,\n },\n });\n }\n\n @Action(UpdateAppTokens)\n updateAppTokens(ctx: StateContext<AuthStateModel>, action: UpdateAppTokens) {\n const existing = ctx.getState().appSessions[action.applicationCode];\n if (!existing) {\n return;\n }\n const mapped = mapGatewayTokens(action.tokens);\n ctx.patchState({\n appSessions: {\n ...ctx.getState().appSessions,\n [action.applicationCode]: {\n ...existing,\n accessToken: mapped.accessToken,\n refreshToken: mapped.refreshToken,\n accessTokenExpiresAt: mapped.accessTokenExpiresAt,\n refreshTokenExpiresAt: mapped.refreshTokenExpiresAt,\n },\n },\n });\n }\n\n @Action(ClearAppSession)\n clearAppSession(ctx: StateContext<AuthStateModel>, action: ClearAppSession) {\n const sessions = { ...ctx.getState().appSessions };\n delete sessions[action.applicationCode];\n ctx.patchState({ appSessions: sessions });\n }\n\n @Action(ClearAllAppSessions)\n clearAllAppSessions(ctx: StateContext<AuthStateModel>) {\n ctx.patchState({ appSessions: {}, applications: [] });\n }\n\n private removeLoadingFlag(\n ctx: StateContext<AuthStateModel>,\n code: string,\n ): Record<string, boolean> {\n const next = { ...ctx.getState().appLaunchLoading };\n delete next[code];\n return next;\n }\n\n private isRateLimitActive(\n ctx: StateContext<AuthStateModel>,\n scope: AuthRateLimitScope,\n ): boolean {\n const lock = ctx.getState().rateLimit;\n if (!lock || lock.scope !== scope) {\n return false;\n }\n if (lock.retryUntilMs && lock.retryUntilMs <= Date.now()) {\n ctx.patchState({ rateLimit: null });\n return false;\n }\n return lock.retryUntilMs === null || lock.retryUntilMs > Date.now();\n }\n\n private handleRateLimit(\n ctx: StateContext<AuthStateModel>,\n error: unknown,\n scope: AuthRateLimitScope,\n ): boolean {\n const info = extractGatewayRateLimitInfo(error);\n if (!info) {\n return false;\n }\n\n const retryUntilMs = info.retryAfterSeconds\n ? Date.now() + info.retryAfterSeconds * 1000\n : null;\n\n ctx.dispatch(\n new SetRateLimit({\n retryUntilMs,\n totalSeconds: info.retryAfterSeconds,\n message: info.message,\n scope,\n }),\n );\n return true;\n }\n\n private handleLoginResponse(\n ctx: StateContext<AuthStateModel>,\n session: GatewayLoginResponse | AuthLoginData,\n resolvedApplicationCode?: string | null,\n ): Observable<unknown> {\n if (session.requiresTwoFactor) {\n ctx.patchState({\n user: null,\n token: null,\n refreshToken: null,\n accessTokenExpiresAt: null,\n refreshTokenExpiresAt: null,\n pendingMfa: session.twoFactor,\n twoFactorRequired: true,\n loading: false,\n ssoCallbackLoading: false,\n error: null,\n });\n this.router.navigate([this.options.mfaRoute ?? '/auth/mfa'], {\n replaceUrl: true,\n });\n return of(null);\n }\n\n if (!hasGatewayTokens(session.tokens)) {\n ctx.dispatch(new LoginFailure('Login failed'));\n return of(null);\n }\n\n const tokenData = mapGatewayTokens(session.tokens);\n const user = mapGatewayUser(session.user, tokenData, session.delegations);\n\n ctx.patchState({\n user,\n token: tokenData.accessToken,\n refreshToken: tokenData.refreshToken,\n accessTokenExpiresAt: tokenData.accessTokenExpiresAt,\n refreshTokenExpiresAt: tokenData.refreshTokenExpiresAt,\n loading: false,\n ssoCallbackLoading: false,\n error: null,\n pendingMfa: null,\n twoFactorRequired: false,\n appSessions: {},\n appLaunchLoading: {},\n });\n\n return this.toObservable(this.options.afterLogin?.(session, ctx)).pipe(\n mergeMap(() =>\n this.maybeAutoLaunchApplication(ctx, resolvedApplicationCode),\n ),\n tap(() => {\n this.router.navigateByUrl(this.resolveAuthenticatedRoute(), {\n replaceUrl: true,\n });\n }),\n );\n }\n\n private maybeAutoLaunchApplication(\n ctx: StateContext<AuthStateModel>,\n resolvedApplicationCode?: string | null,\n ): Observable<unknown> {\n if (!this.options.autoLaunchApplicationOnLogin) {\n return of(null);\n }\n const code =\n resolvedApplicationCode ??\n resolveApplicationCodeOption(this.options.applicationCode);\n if (!code) {\n return of(null);\n }\n return ctx.dispatch(new LaunchApplication(code));\n }\n\n private get deviceToken(): string {\n return resolveGatewayDeviceToken(this.options.deviceToken);\n }\n\n private gatewayUrl(path: string): string {\n return buildGatewayUrl(this.options.getGatewayApiBaseUrl(), path);\n }\n\n private gatewayAuthMutationUrl(path: string): string {\n return this.gatewayUrl(path);\n }\n\n private navigateToLogin(): void {\n this.router.navigate([this.options.loginRoute ?? '/auth/login'], {\n replaceUrl: true,\n });\n }\n\n private resolveAuthenticatedRoute(): string {\n const tree = this.router.parseUrl(this.router.url);\n const returnUrl = this.sanitizeLocalRoute(\n tree.queryParams['returnUrl'] as string | undefined,\n );\n if (returnUrl !== null) {\n return returnUrl;\n }\n\n const configuredRoute =\n typeof this.options.defaultAuthenticatedRoute === 'function'\n ? this.options.defaultAuthenticatedRoute()\n : this.options.defaultAuthenticatedRoute;\n return this.sanitizeLocalRoute(configuredRoute) ?? '/';\n }\n\n private sanitizeLocalRoute(route?: string | null): string | null {\n if (!route) {\n return null;\n }\n if (/^https?:\\/\\//i.test(route)) {\n return null;\n }\n return route.startsWith('/') ? route : `/${route}`;\n }\n\n private toObservable(result: GatewayAuthHookResult): Observable<unknown> {\n if (!result) {\n return of(null);\n }\n if (isObservable(result)) {\n return result;\n }\n if (result instanceof Promise) {\n return from(result);\n }\n return of(result);\n }\n}\n","import { Injectable, computed, inject } from '@angular/core';\nimport { select, Store } from '@ngxs/store';\nimport {\n ClearAllAppSessions,\n ClearAppSession,\n ClearError,\n ClearPendingMfa,\n ClearRateLimit,\n ExchangeSsoCode,\n LaunchApplication,\n LoadApplications,\n LoadSsoProviders,\n Login,\n Logout,\n ResendMfa,\n SetAppSession,\n SetApplications,\n StartSso,\n UpdateAppTokens,\n UpdateTokens,\n UpdateUserData,\n VerifyMfa,\n} from './gateway-auth.actions';\nimport { GatewayAuthState } from './gateway-auth.state';\nimport {\n AppSession,\n ApplicationListItem,\n AuthTokens,\n LoginRequest,\n SsoProvider,\n User,\n} from './gateway-auth.state.model';\nimport { isExpired } from './gateway-auth.utils';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class GatewayAuthFacade {\n private readonly store = inject(Store);\n\n readonly user = select(GatewayAuthState.user);\n readonly loading = select(GatewayAuthState.loading);\n readonly mfaResendLoading = select(GatewayAuthState.mfaResendLoading);\n readonly ssoLoading = select(GatewayAuthState.ssoLoading);\n readonly ssoCallbackLoading = select(GatewayAuthState.ssoCallbackLoading);\n readonly error = select(GatewayAuthState.error);\n readonly token = select(GatewayAuthState.token);\n readonly refreshToken = select(GatewayAuthState.refreshToken);\n readonly accessTokenExpiresAt = select(GatewayAuthState.accessTokenExpiresAt);\n readonly refreshTokenExpiresAt = select(\n GatewayAuthState.refreshTokenExpiresAt,\n );\n readonly twoFactorRequired = select(GatewayAuthState.twoFactorRequired);\n readonly pendingMfa = select(GatewayAuthState.pendingMfa);\n readonly ssoProviders = select(GatewayAuthState.ssoProviders);\n readonly rateLimit = select(GatewayAuthState.rateLimit);\n readonly isAdmin = select(GatewayAuthState.isAdmin);\n readonly userDetails = select(GatewayAuthState.userDetails);\n readonly applications = select(GatewayAuthState.applications);\n readonly applicationsLoading = select(GatewayAuthState.applicationsLoading);\n readonly appSessions = select(GatewayAuthState.appSessions);\n readonly appLaunchLoading = select(GatewayAuthState.appLaunchLoading);\n\n readonly hasError = computed(() => this.error() !== null);\n readonly isReady = computed(() => !this.loading() && this.error() === null);\n readonly userDisplayName = computed(\n () => this.user()?.user?.displayName || '',\n );\n readonly userEmail = computed(() => this.user()?.user?.email || '');\n readonly hasUser = computed(() => this.user() !== null);\n readonly hasPendingMfa = computed(() => this.pendingMfa() !== null);\n\n readonly isAuthenticated = computed(() => {\n const token = this.token();\n const accessExpiresAt = this.accessTokenExpiresAt();\n if (token && !isExpired(accessExpiresAt)) {\n return true;\n }\n const refreshToken = this.refreshToken();\n const refreshExpiresAt = this.refreshTokenExpiresAt();\n return !!refreshToken && !isExpired(refreshExpiresAt);\n });\n\n login(loginRequest: LoginRequest): void {\n this.store.dispatch(new Login(loginRequest));\n }\n\n verifyMfa(code: string): void {\n this.store.dispatch(new VerifyMfa(code));\n }\n\n resendMfa(): void {\n this.store.dispatch(new ResendMfa());\n }\n\n loadSsoProviders(): void {\n this.store.dispatch(new LoadSsoProviders());\n }\n\n startSso(provider: SsoProvider): void {\n this.store.dispatch(new StartSso(provider));\n }\n\n exchangeSsoCode(code: string, state: string): void {\n this.store.dispatch(new ExchangeSsoCode(code, state));\n }\n\n logout(remote: boolean = false): void {\n this.store.dispatch(new Logout(remote));\n }\n\n updateUserData(user: User): void {\n this.store.dispatch(new UpdateUserData(user));\n }\n\n updateTokens(tokens: AuthTokens): void {\n this.store.dispatch(new UpdateTokens(tokens));\n }\n\n loadApplications(): void {\n this.store.dispatch(new LoadApplications());\n }\n\n setApplications(applications: ApplicationListItem[]): void {\n this.store.dispatch(new SetApplications(applications));\n }\n\n launchApplication(\n applicationCode: string,\n returnUrl?: string,\n navigate: boolean = false,\n ): void {\n this.store.dispatch(\n new LaunchApplication(applicationCode, returnUrl, navigate),\n );\n }\n\n setAppSession(session: AppSession): void {\n this.store.dispatch(new SetAppSession(session));\n }\n\n updateAppTokens(applicationCode: string, tokens: AuthTokens): void {\n this.store.dispatch(new UpdateAppTokens(applicationCode, tokens));\n }\n\n clearAppSession(applicationCode: string): void {\n this.store.dispatch(new ClearAppSession(applicationCode));\n }\n\n clearAllAppSessions(): void {\n this.store.dispatch(new ClearAllAppSessions());\n }\n\n getAppSession(applicationCode: string): AppSession | null {\n return this.appSessions()?.[applicationCode] ?? null;\n }\n\n getAppToken(applicationCode: string): string | null {\n const session = this.getAppSession(applicationCode);\n return session?.accessToken ?? null;\n }\n\n clearError(): void {\n this.store.dispatch(new ClearError());\n }\n\n clearPendingMfa(): void {\n this.store.dispatch(new ClearPendingMfa());\n }\n\n clearRateLimit(): void {\n this.store.dispatch(new ClearRateLimit());\n }\n\n hasRole(role: string): boolean {\n const userRoles = this.user()?.user?.roles;\n return Array.isArray(userRoles) ? userRoles.includes(role) : false;\n }\n\n hasGroup(group: string): boolean {\n const userGroups = this.user()?.user?.groups;\n return Array.isArray(userGroups) ? userGroups.includes(group) : false;\n }\n\n isTokenExpired(): boolean {\n const accessExpiresAt = this.accessTokenExpiresAt();\n return accessExpiresAt ? isExpired(accessExpiresAt) : false;\n }\n}\n","import {\n HttpBackend,\n HttpClient,\n HttpContextToken,\n HttpInterceptorFn,\n HttpRequest,\n} from '@angular/common/http';\nimport { inject } from '@angular/core';\nimport {\n catchError,\n finalize,\n firstValueFrom,\n from,\n map,\n Observable,\n shareReplay,\n switchMap,\n tap,\n throwError,\n} from 'rxjs';\nimport { GatewayAuthFacade } from './gateway-auth.facade';\nimport {\n GATEWAY_AUTH_OPTIONS,\n GatewayAuthOptions,\n} from './gateway-auth.options';\nimport { GatewayRefreshData, GatewayResponse } from './gateway-auth.models';\nimport { AppSession, AuthTokens } from './gateway-auth.state.model';\nimport {\n buildGatewayUrl,\n GATEWAY_AUTH_ENDPOINTS,\n isExpired,\n readPersistedGatewayAuthTokens,\n resolveAccessTokenRefreshSkewMs,\n resolveApiDateValue,\n resolveApplicationCodeOption,\n resolveGatewayDeviceToken,\n} from './gateway-auth.utils';\n\nexport const GATEWAY_AUTH_RETRY_CONTEXT = new HttpContextToken<boolean>(\n () => false,\n);\n\nconst GATEWAY_AUTH_ENDPOINT_PATHS = new Set<string>([\n GATEWAY_AUTH_ENDPOINTS.login,\n GATEWAY_AUTH_ENDPOINTS.refresh,\n GATEWAY_AUTH_ENDPOINTS.logout,\n]);\n\nconst GATEWAY_AUTH_ENDPOINT_PREFIXES = ['auth/2fa/', 'auth/sso/'] as const;\n\nconst isAbsoluteUrl = (url: string): boolean => /^https?:\\/\\//i.test(url);\n\nconst isAssetRequest = (url: string): boolean =>\n url.startsWith('/assets') || url.startsWith('assets');\n\nconst normalizeBase = (baseUrl?: string | null): string =>\n baseUrl?.replace(/\\/+$/, '') ?? '';\n\nconst buildAbsoluteUrl = (\n baseUrl: string | null | undefined,\n url: string,\n): string => {\n if (isAbsoluteUrl(url) || !baseUrl) {\n return url;\n }\n\n return `${normalizeBase(baseUrl)}/${url.replace(/^\\/+/, '')}`;\n};\n\nconst normalizePath = (path: string): string => {\n const trimmed = path.replace(/^\\/+/, '');\n const withoutQuery = trimmed.split('?')[0] || '';\n return withoutQuery.startsWith('api/') ? withoutQuery.slice(4) : withoutQuery;\n};\n\nexport function resolveGatewayAuthPath(\n url: string,\n gatewayApiBaseUrl?: string | null,\n): string {\n if (isAbsoluteUrl(url)) {\n try {\n return normalizePath(new URL(url).pathname);\n } catch {\n return normalizePath(url);\n }\n }\n\n if (gatewayApiBaseUrl && url.startsWith(gatewayApiBaseUrl)) {\n return normalizePath(url.slice(gatewayApiBaseUrl.length));\n }\n\n return normalizePath(url);\n}\n\nexport function isGatewayAuthRequestUrl(\n url: string,\n gatewayApiBaseUrl?: string | null,\n): boolean {\n const path = resolveGatewayAuthPath(url, gatewayApiBaseUrl).toLowerCase();\n\n return (\n GATEWAY_AUTH_ENDPOINT_PATHS.has(path) ||\n GATEWAY_AUTH_ENDPOINT_PREFIXES.some((prefix) => path.startsWith(prefix))\n );\n}\n\ninterface WebLockManager {\n request<T>(name: string, callback: () => Promise<T>): Promise<T>;\n}\n\ntype NavigatorWithLocks = Navigator & {\n locks?: WebLockManager;\n};\n\nconst getBrowserRefreshLock = (): WebLockManager | null => {\n if (typeof navigator === 'undefined') {\n return null;\n }\n\n const locks = (navigator as NavigatorWithLocks).locks;\n return typeof locks?.request === 'function' ? locks : null;\n};\n\nconst runWithRefreshLock = <T>(\n scopeKey: string,\n operation: () => Promise<T>,\n): Promise<T> => {\n const locks = getBrowserRefreshLock();\n return locks ? locks.request(scopeKey, operation) : operation();\n};\n\nconst GATEWAY_REFRESH_SCOPE = 'gateway';\n\nconst inflightRefreshByScope = new Map<string, Observable<AuthTokens>>();\n\nconst getCurrentAuthTokens = (auth: GatewayAuthFacade): AuthTokens | null => {\n const accessToken = auth.token();\n const refreshToken = auth.refreshToken();\n\n if (!accessToken || !refreshToken) {\n return null;\n }\n\n return {\n accessToken,\n accessTokenExpiresAt: {\n actualValue: auth.accessTokenExpiresAt() ?? '',\n },\n refreshToken,\n refreshTokenExpiresAt: {\n actualValue: auth.refreshTokenExpiresAt() ?? '',\n },\n };\n};\n\nconst tokenHasUsableAccessToken = (\n tokens: AuthTokens,\n refreshSkewMs: number,\n): boolean =>\n !!tokens.accessToken &&\n !isExpired(resolveApiDateValue(tokens.accessTokenExpiresAt), refreshSkewMs);\n\nconst tokenHasUsableRefreshToken = (tokens: AuthTokens): boolean =>\n !!tokens.refreshToken &&\n !isExpired(resolveApiDateValue(tokens.refreshTokenExpiresAt));\n\nconst getSynchronizedGatewayTokens = (\n auth: GatewayAuthFacade,\n staleRefreshToken: string,\n refreshSkewMs: number,\n): AuthTokens | null => {\n const candidates = [\n getCurrentAuthTokens(auth),\n readPersistedGatewayAuthTokens(),\n ];\n\n return (\n candidates.find(\n (tokens): tokens is AuthTokens =>\n !!tokens &&\n tokens.refreshToken !== staleRefreshToken &&\n tokenHasUsableAccessToken(tokens, refreshSkewMs),\n ) ?? null\n );\n};\n\nconst getLatestGatewayRefreshToken = (\n auth: GatewayAuthFacade,\n fallbackRefreshToken: string,\n): string => {\n const candidates = [\n getCurrentAuthTokens(auth),\n readPersistedGatewayAuthTokens(),\n ];\n const latestTokens = candidates.find(\n (tokens): tokens is AuthTokens =>\n !!tokens &&\n tokens.refreshToken !== fallbackRefreshToken &&\n tokenHasUsableRefreshToken(tokens),\n );\n\n return latestTokens?.refreshToken ?? fallbackRefreshToken;\n};\n\nconst sessionAsTokens = (session: AppSession): AuthTokens => ({\n accessToken: session.accessToken,\n accessTokenExpiresAt: { actualValue: session.accessTokenExpiresAt ?? '' },\n refreshToken: session.refreshToken,\n refreshTokenExpiresAt: { actualValue: session.refreshTokenExpiresAt ?? '' },\n});\n\nconst getSynchronizedAppTokens = (\n auth: GatewayAuthFacade,\n applicationCode: string,\n staleRefreshToken: string,\n refreshSkewMs: number,\n): AuthTokens | null => {\n const session = auth.getAppSession(applicationCode);\n if (!session) {\n return null;\n }\n const tokens = sessionAsTokens(session);\n if (\n tokens.refreshToken !== staleRefreshToken &&\n tokenHasUsableAccessToken(tokens, refreshSkewMs)\n ) {\n return tokens;\n }\n return null;\n};\n\nconst getLatestAppRefreshToken = (\n auth: GatewayAuthFacade,\n applicationCode: string,\n fallbackRefreshToken: string,\n): string => {\n const session = auth.getAppSession(applicationCode);\n if (!session) {\n return fallbackRefreshToken;\n }\n if (\n session.refreshToken &&\n session.refreshToken !== fallbackRefreshToken &&\n !isExpired(session.refreshTokenExpiresAt)\n ) {\n return session.refreshToken;\n }\n return fallbackRefreshToken;\n};\n\ninterface RefreshContext {\n http: HttpClient;\n gatewayApiBaseUrl: string | null | undefined;\n auth: GatewayAuthFacade;\n deviceToken: string;\n refreshSkewMs: number;\n scope: 'gateway' | 'application';\n applicationCode?: string;\n}\n\nconst executeRefresh = (\n context: RefreshContext,\n refreshToken: string,\n): Promise<AuthTokens> => {\n const {\n http,\n gatewayApiBaseUrl,\n auth,\n deviceToken,\n refreshSkewMs,\n scope,\n applicationCode,\n } = context;\n\n const lockKey =\n scope === 'gateway'\n ? 'masterteam-gateway-auth-refresh:gateway'\n : `masterteam-gateway-auth-refresh:app:${applicationCode ?? ''}`;\n\n return runWithRefreshLock(lockKey, async () => {\n if (scope === 'gateway') {\n const synchronizedTokens = getSynchronizedGatewayTokens(\n auth,\n refreshToken,\n refreshSkewMs,\n );\n\n if (synchronizedTokens) {\n auth.updateTokens(synchronizedTokens);\n return synchronizedTokens;\n }\n } else if (applicationCode) {\n const synchronizedTokens = getSynchronizedAppTokens(\n auth,\n applicationCode,\n refreshToken,\n refreshSkewMs,\n );\n if (synchronizedTokens) {\n auth.updateAppTokens(applicationCode, synchronizedTokens);\n return synchronizedTokens;\n }\n }\n\n const latestRefreshToken =\n scope === 'gateway'\n ? getLatestGatewayRefreshToken(auth, refreshToken)\n : applicationCode\n ? getLatestAppRefreshToken(auth, applicationCode, refreshToken)\n : refreshToken;\n const url = buildGatewayUrl(\n gatewayApiBaseUrl,\n GATEWAY_AUTH_ENDPOINTS.refresh,\n );\n\n return firstValueFrom(\n http\n .post<GatewayResponse<GatewayRefreshData>>(url, {\n refreshToken: latestRefreshToken,\n deviceToken,\n })\n .pipe(\n map((response) => response.data),\n map((tokens) => {\n if (!tokens?.accessToken || !tokens.refreshToken) {\n throw new Error('Invalid refresh response');\n }\n return tokens as AuthTokens;\n }),\n tap((tokens) => {\n if (scope === 'gateway') {\n auth.updateTokens(tokens);\n } else if (applicationCode) {\n auth.updateAppTokens(applicationCode, tokens);\n }\n }),\n ),\n );\n });\n};\n\nconst refreshTokens$ = (\n context: RefreshContext,\n refreshToken: string,\n): Observable<AuthTokens> => {\n const scopeKey =\n context.scope === 'gateway'\n ? GATEWAY_REFRESH_SCOPE\n : `application:${context.applicationCode ?? ''}`;\n const existing = inflightRefreshByScope.get(scopeKey);\n if (existing) {\n return existing;\n }\n\n const observable = from(executeRefresh(context, refreshToken)).pipe(\n shareReplay({ bufferSize: 1, refCount: true }),\n finalize(() => {\n inflightRefreshByScope.delete(scopeKey);\n }),\n );\n\n inflightRefreshByScope.set(scopeKey, observable);\n return observable;\n};\n\nconst prepareRequest = (\n req: HttpRequest<unknown>,\n token: string | null,\n markRetried: boolean,\n baseUrl: string | null | undefined,\n) => {\n let modifiedReq = req;\n\n if (token) {\n modifiedReq = modifiedReq.clone({\n setHeaders: {\n Authorization: `Bearer ${token}`,\n },\n });\n }\n\n if (!isAbsoluteUrl(modifiedReq.url) && !isAssetRequest(modifiedReq.url)) {\n modifiedReq = modifiedReq.clone({\n url: buildAbsoluteUrl(baseUrl, modifiedReq.url),\n });\n }\n\n if (markRetried) {\n modifiedReq = modifiedReq.clone({\n context: modifiedReq.context.set(GATEWAY_AUTH_RETRY_CONTEXT, true),\n });\n }\n\n return modifiedReq;\n};\n\ninterface ResolvedScope {\n scope: 'gateway' | 'application';\n applicationCode?: string;\n session?: AppSession | null;\n useGatewayBaseUrl: boolean;\n}\n\nconst resolveRequestScope = (\n req: HttpRequest<unknown>,\n options: GatewayAuthOptions,\n auth: GatewayAuthFacade,\n): ResolvedScope => {\n const useGatewayBaseUrl = options.shouldUseGatewayApiBaseUrl?.(req) ?? false;\n\n const explicitCode = options.resolveApplicationCodeForRequest?.(req);\n if (explicitCode) {\n const session = auth.getAppSession(explicitCode);\n return {\n scope: 'application',\n applicationCode: explicitCode,\n session,\n useGatewayBaseUrl,\n };\n }\n\n if (useGatewayBaseUrl) {\n return { scope: 'gateway', useGatewayBaseUrl: true };\n }\n\n const defaultCode = resolveApplicationCodeOption(options.applicationCode);\n if (defaultCode) {\n const session = auth.getAppSession(defaultCode);\n if (session) {\n return {\n scope: 'application',\n applicationCode: defaultCode,\n session,\n useGatewayBaseUrl,\n };\n }\n }\n\n return { scope: 'gateway', useGatewayBaseUrl };\n};\n\nexport const gatewayAuthInterceptor: HttpInterceptorFn = (req, next) => {\n if (isAssetRequest(req.url)) {\n return next(req);\n }\n\n const auth = inject(GatewayAuthFacade);\n const options = inject(GATEWAY_AUTH_OPTIONS);\n const http = new HttpClient(inject(HttpBackend));\n\n const gatewayApiBaseUrl = options.getGatewayApiBaseUrl();\n const appApiBaseUrl = options.getApplicationApiBaseUrl?.();\n const deviceToken = resolveGatewayDeviceToken(options.deviceToken);\n const refreshSkewMs = resolveAccessTokenRefreshSkewMs(\n options.accessTokenRefreshSkewMs,\n );\n\n const isAuthRequest = isGatewayAuthRequestUrl(req.url, gatewayApiBaseUrl);\n const alreadyRetried = req.context.get(GATEWAY_AUTH_RETRY_CONTEXT);\n const resolved = resolveRequestScope(req, options, auth);\n const baseUrl = resolved.useGatewayBaseUrl\n ? gatewayApiBaseUrl\n : appApiBaseUrl;\n\n const gatewayAccessToken = auth.token();\n const gatewayRefreshToken = auth.refreshToken();\n const gatewayAccessTokenExpiresAt = auth.accessTokenExpiresAt();\n const gatewayRefreshTokenExpiresAt = auth.refreshTokenExpiresAt();\n\n const session = resolved.session ?? null;\n\n const accessToken =\n resolved.scope === 'application' && session\n ? session.accessToken\n : gatewayAccessToken;\n const accessTokenExpiresAt =\n resolved.scope === 'application' && session\n ? session.accessTokenExpiresAt\n : gatewayAccessTokenExpiresAt;\n const refreshToken =\n resolved.scope === 'application' && session\n ? session.refreshToken\n : gatewayRefreshToken;\n const refreshTokenExpiresAt =\n resolved.scope === 'application' && session\n ? session.refreshTokenExpiresAt\n : gatewayRefreshTokenExpiresAt;\n\n const accessTokenValid =\n !!accessToken && !isExpired(accessTokenExpiresAt, refreshSkewMs);\n const canRefresh = !!refreshToken && !isExpired(refreshTokenExpiresAt);\n const tokenToAttach = !isAuthRequest && accessTokenValid ? accessToken : null;\n\n const buildRefreshContext = (\n scopeOverride?: 'gateway' | 'application',\n appCodeOverride?: string,\n ): RefreshContext => ({\n http,\n gatewayApiBaseUrl,\n auth,\n deviceToken,\n refreshSkewMs,\n scope: scopeOverride ?? resolved.scope,\n applicationCode: appCodeOverride ?? resolved.applicationCode,\n });\n\n if (!isAuthRequest && !accessTokenValid && canRefresh && refreshToken) {\n return refreshTokens$(buildRefreshContext(), refreshToken).pipe(\n catchError((refreshError) => {\n if (resolved.scope === 'application' && resolved.applicationCode) {\n auth.clearAppSession(resolved.applicationCode);\n } else {\n auth.logout();\n }\n return throwError(() => refreshError);\n }),\n switchMap((tokens) =>\n next(prepareRequest(req, tokens.accessToken, true, baseUrl)),\n ),\n );\n }\n\n return next(prepareRequest(req, tokenToAttach, false, baseUrl)).pipe(\n catchError((error) => {\n if (error?.status !== 401 || isAuthRequest || alreadyRetried) {\n return throwError(() => error);\n }\n\n const latestAppSession =\n resolved.scope === 'application' && resolved.applicationCode\n ? auth.getAppSession(resolved.applicationCode)\n : null;\n const latestRefreshToken =\n resolved.scope === 'application' && resolved.applicationCode\n ? (latestAppSession?.refreshToken ?? null)\n : auth.refreshToken();\n const latestRefreshTokenExpiresAt =\n resolved.scope === 'application' && resolved.applicationCode\n ? (latestAppSession?.refreshTokenExpiresAt ?? null)\n : auth.refreshTokenExpiresAt();\n const canRefreshNow =\n !!latestRefreshToken && !isExpired(latestRefreshTokenExpiresAt);\n\n if (!canRefreshNow || !latestRefreshToken) {\n if (resolved.scope === 'application' && resolved.applicationCode) {\n auth.clearAppSession(resolved.applicationCode);\n } else {\n auth.logout();\n }\n return throwError(() => error);\n }\n\n return refreshTokens$(buildRefreshContext(), latestRefreshToken).pipe(\n catchError((refreshError) => {\n if (resolved.scope === 'application' && resolved.applicationCode) {\n auth.clearAppSession(resolved.applicationCode);\n } else {\n auth.logout();\n }\n return throwError(() => refreshError);\n }),\n switchMap((tokens) =>\n next(prepareRequest(req, tokens.accessToken, true, baseUrl)),\n ),\n );\n }),\n );\n};\n","import {\n ChangeDetectionStrategy,\n Component,\n OnInit,\n computed,\n inject,\n input,\n} from '@angular/core';\nimport { Button } from '@masterteam/components/button';\nimport { GatewayAuthFacade } from '../../gateway-auth.facade';\nimport { GATEWAY_AUTH_OPTIONS } from '../../gateway-auth.options';\nimport { SsoProvider } from '../../gateway-auth.state.model';\n\n@Component({\n selector: 'mt-gateway-sso-buttons',\n imports: [Button],\n templateUrl: './gateway-sso-buttons.html',\n styleUrl: './gateway-sso-buttons.css',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport default class GatewaySsoButtons implements OnInit {\n private readonly authFacade = inject(GatewayAuthFacade);\n private readonly options = inject(GATEWAY_AUTH_OPTIONS);\n\n readonly dividerLabel = input('or');\n readonly providers = this.authFacade.ssoProviders;\n readonly loading = this.authFacade.ssoLoading;\n readonly providerCount = computed(() => this.providers().length);\n\n ngOnInit(): void {\n this.authFacade.loadSsoProviders();\n }\n\n buttonLabel(provider: SsoProvider): string {\n const label = this.options.loginPage?.ssoButtonLabel;\n if (typeof label === 'function') {\n return label(provider, this.providerCount());\n }\n return label || 'Continue with SSO';\n }\n\n buttonTooltip(): string {\n return 'Sign in using single sign-on';\n }\n\n startSso(provider: SsoProvider): void {\n this.authFacade.startSso(provider);\n }\n}\n","@if (providers().length > 0) {\n <div class=\"gateway-sso-divider\">\n <span></span>\n <span>{{ dividerLabel() }}</span>\n <span></span>\n </div>\n\n <div class=\"gateway-sso-list\">\n @for (provider of providers(); track provider.key) {\n <mt-button\n [label]=\"buttonLabel(provider)\"\n [tooltip]=\"buttonTooltip()\"\n icon=\"security.lock-01\"\n size=\"large\"\n variant=\"outlined\"\n fluid\n type=\"button\"\n [disabled]=\"loading()\"\n (onClick)=\"startSso(provider)\"\n />\n }\n </div>\n}\n","import { NgTemplateOutlet } from '@angular/common';\r\nimport {\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n effect,\r\n inject,\r\n OnInit,\r\n signal,\r\n} from '@angular/core';\r\nimport {\r\n FormsModule,\r\n NonNullableFormBuilder,\r\n ReactiveFormsModule,\r\n Validators,\r\n} from '@angular/forms';\r\nimport { TranslocoDirective, TranslocoService } from '@jsverse/transloco';\r\nimport {\r\n BrandDisplayFacade,\r\n ManageBrndingService,\r\n} from '@masterteam/brand-display';\r\nimport { Button } from '@masterteam/components/button';\r\nimport { SelectField } from '@masterteam/components/select-field';\r\nimport { TextField } from '@masterteam/components/text-field';\r\nimport { SecureImagePipe } from '@masterteam/components/upload-field';\r\nimport { Icon } from '@masterteam/icons';\r\nimport { GatewayAuthFacade } from '../../gateway-auth.facade';\r\nimport {\r\n GATEWAY_AUTH_OPTIONS,\r\n GatewayLoginLanguageOption,\r\n} from '../../gateway-auth.options';\r\nimport {\r\n resolveApplicationCodeOption,\r\n resolveGatewayDeviceToken,\r\n} from '../../gateway-auth.utils';\r\nimport GatewaySsoButtons from '../gateway-sso-buttons/gateway-sso-buttons';\r\n\r\nconst DEFAULT_LANGUAGE_OPTIONS: readonly GatewayLoginLanguageOption[] = [\r\n { key: 'en', label: 'English', dir: 'ltr', icon: 'map.globe-01' },\r\n { key: 'ar', label: 'Arabic', dir: 'rtl', icon: 'custom.saudi-flag' },\r\n];\r\n\r\ninterface GatewayLoginImage {\r\n fileName?: string | null;\r\n}\r\n\r\ninterface GatewayLoginBrandData {\r\n backgroundColor?: string | null;\r\n textColor?: string | null;\r\n repeated?: boolean | null;\r\n backgroundImage?: GatewayLoginImage | null;\r\n loginBrandImage?: GatewayLoginImage | null;\r\n formWizardPosition?: 'start' | 'center' | 'end' | null;\r\n}\r\n\r\ninterface GatewayBrandDisplayData {\r\n login?: GatewayLoginBrandData | null;\r\n loginLogo?: string | null;\r\n}\r\n\r\ninterface GatewayLoginLanguageViewOption extends GatewayLoginLanguageOption {\r\n id: string;\r\n}\r\n\r\n@Component({\r\n selector: 'mt-gateway-login-page',\r\n imports: [\r\n NgTemplateOutlet,\r\n FormsModule,\r\n ReactiveFormsModule,\r\n TranslocoDirective,\r\n TextField,\r\n Button,\r\n SelectField,\r\n SecureImagePipe,\r\n Icon,\r\n GatewaySsoButtons,\r\n ],\r\n templateUrl: './gateway-login-page.html',\r\n styleUrl: './gateway-login-page.css',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport default class GatewayLoginPage implements OnInit {\r\n private readonly authFacade = inject(GatewayAuthFacade);\r\n private readonly fb = inject(NonNullableFormBuilder);\r\n private readonly brandDisplayFacade = inject(BrandDisplayFacade);\r\n private readonly branding = inject(ManageBrndingService);\r\n private readonly transloco = inject(TranslocoService);\r\n private readonly options = inject(GATEWAY_AUTH_OPTIONS);\r\n\r\n readonly loginForm = this.fb.group({\r\n username: ['', [Validators.required]],\r\n password: ['', [Validators.required]],\r\n });\r\n\r\n readonly loading = this.authFacade.loading;\r\n readonly error = this.authFacade.error;\r\n readonly passwordVisible = signal(false);\r\n readonly selectedLanguage = signal('');\r\n\r\n private readonly nowMs = signal(Date.now());\r\n\r\n readonly rateLimit = computed(() => {\r\n const lock = this.authFacade.rateLimit();\r\n return lock && lock.scope === 'login' ? lock : null;\r\n });\r\n readonly rateLimitSecondsLeft = computed(() => {\r\n const lock = this.rateLimit();\r\n if (!lock?.retryUntilMs) return null;\r\n return Math.max(0, Math.ceil((lock.retryUntilMs - this.nowMs()) / 1000));\r\n });\r\n readonly rateLimitProgress = computed(() => {\r\n const lock = this.rateLimit();\r\n const left = this.rateLimitSecondsLeft();\r\n if (!lock?.totalSeconds || left === null) return 0;\r\n return Math.max(0, Math.min(100, (left / lock.totalSeconds) * 100));\r\n });\r\n readonly rateLimitCountdownLabel = computed(() => {\r\n const left = this.rateLimitSecondsLeft();\r\n if (left === null) return '';\r\n const minutes = Math.floor(left / 60);\r\n const seconds = left % 60;\r\n return minutes > 0\r\n ? `${minutes}:${String(seconds).padStart(2, '0')}`\r\n : `${seconds}s`;\r\n });\r\n readonly isRateLimited = computed(() => {\r\n const lock = this.rateLimit();\r\n if (!lock) return false;\r\n if (lock.retryUntilMs === null) return true;\r\n return (this.rateLimitSecondsLeft() ?? 0) > 0;\r\n });\r\n protected get submitDisabled(): boolean {\r\n return this.loginForm.invalid || this.loading() || this.isRateLimited();\r\n }\r\n private readonly loginOptions = computed(() => this.options.loginPage);\r\n private readonly defaultDisplayData = computed(\r\n () =>\r\n this.brandDisplayFacade.defaultBrandDisplayData() as GatewayBrandDisplayData | null,\r\n );\r\n private readonly loginData = computed(\r\n () => this.branding.loginData() as GatewayLoginBrandData | undefined,\r\n );\r\n\r\n readonly translationPrefix = computed(\r\n () => this.loginOptions()?.translationPrefix ?? 'login',\r\n );\r\n readonly imageBasePath = computed(\r\n () => this.loginOptions()?.imageBasePath ?? '/Settings/login-image/',\r\n );\r\n readonly languageOptions = computed<GatewayLoginLanguageViewOption[]>(() => {\r\n const configured = this.loginOptions()?.getLanguages?.();\r\n const languages = configured?.length\r\n ? configured\r\n : DEFAULT_LANGUAGE_OPTIONS;\r\n return languages.map((language) => ({\r\n ...language,\r\n id: language.id || language.key,\r\n }));\r\n });\r\n readonly activeLanguage = computed(\r\n () =>\r\n this.loginOptions()?.getActiveLanguage?.() ||\r\n this.languageOptions()[0]?.id ||\r\n 'en',\r\n );\r\n readonly showLanguageToggle = computed(\r\n () =>\r\n (this.loginOptions()?.showLanguageToggle ?? true) &&\r\n this.languageOptions().length > 1,\r\n );\r\n\r\n readonly productTagline = computed(() => {\r\n const lang = this.activeLanguage() === 'ar' ? 'ar' : 'en';\r\n return this.branding.getProductTagline(lang);\r\n });\r\n\r\n readonly pageStyles = computed(() => {\r\n const login = this.loginData();\r\n const defaultLogin = this.defaultDisplayData()?.login;\r\n const backgroundColor =\r\n login?.backgroundColor || defaultLogin?.backgroundColor;\r\n const repeated = login?.repeated || defaultLogin?.repeated;\r\n\r\n return {\r\n 'background-color': backgroundColor,\r\n 'background-size': repeated ? 'auto' : 'cover',\r\n 'background-position': 'center',\r\n 'background-repeat': repeated ? 'repeat' : 'no-repeat',\r\n 'background-position-y': 'top',\r\n };\r\n });\r\n\r\n readonly textColor = computed(\r\n () =>\r\n this.loginData()?.textColor ||\r\n this.defaultDisplayData()?.login?.textColor,\r\n );\r\n readonly logoUrl = computed(\r\n () => this.loginData()?.loginBrandImage?.fileName || null,\r\n );\r\n readonly defaultLogoUrl = computed(\r\n () => this.defaultDisplayData()?.loginLogo || null,\r\n );\r\n readonly backgroundImage = computed(\r\n () => this.loginData()?.backgroundImage?.fileName || null,\r\n );\r\n readonly formPosition = computed(() => {\r\n const position = this.loginData()?.formWizardPosition || 'start';\r\n return position === 'center' || position === 'end' ? position : 'start';\r\n });\r\n readonly logoAlignment = computed(\r\n () => 'flex items-center gap-4 mb-4 w-full justify-start',\r\n );\r\n readonly formContainerClasses = computed(() => {\r\n const baseClasses = 'flex flex-col justify-center p-8';\r\n const position = this.formPosition();\r\n\r\n if (position === 'center') {\r\n return `${baseClasses} w-full items-center`;\r\n }\r\n if (position === 'start') {\r\n return `${baseClasses} w-full md:w-1/2 items-center`;\r\n }\r\n return `${baseClasses} w-full md:w-1/2 items-start`;\r\n });\r\n\r\n constructor() {\r\n effect(() => {\r\n this.selectedLanguage.set(this.activeLanguage());\r\n });\r\n\r\n effect((onCleanup) => {\r\n const lock = this.rateLimit();\r\n if (!lock?.retryUntilMs) {\r\n return;\r\n }\r\n\r\n if (lock.retryUntilMs <= Date.now()) {\r\n this.authFacade.clearRateLimit();\r\n return;\r\n }\r\n\r\n this.nowMs.set(Date.now());\r\n const id = window.setInterval(() => {\r\n this.nowMs.set(Date.now());\r\n if (lock.retryUntilMs! <= Date.now()) {\r\n this.authFacade.clearRateLimit();\r\n }\r\n }, 1000);\r\n\r\n onCleanup(() => window.clearInterval(id));\r\n });\r\n }\r\n\r\n ngOnInit(): void {\r\n this.brandDisplayFacade.getBrandDisplay();\r\n }\r\n\r\n togglePasswordVisibility(): void {\r\n this.passwordVisible.update((visible) => !visible);\r\n }\r\n\r\n onLanguageChange(): void {\r\n const langKey = this.selectedLanguage();\r\n if (!langKey) return;\r\n\r\n const configuredSetter = this.loginOptions()?.setLanguage;\r\n if (configuredSetter) {\r\n configuredSetter(langKey);\r\n return;\r\n }\r\n\r\n const selected = this.languageOptions().find(\r\n (lang) => lang.key === langKey,\r\n );\r\n this.transloco.setActiveLang(langKey);\r\n document.documentElement.setAttribute('lang', langKey);\r\n if (selected?.dir) {\r\n document.documentElement.setAttribute('dir', selected.dir);\r\n }\r\n }\r\n\r\n onSubmit(): void {\r\n if (this.loginForm.invalid) {\r\n this.loginForm.markAllAsTouched();\r\n return;\r\n }\r\n\r\n if (this.isRateLimited()) {\r\n return;\r\n }\r\n\r\n const { username, password } = this.loginForm.getRawValue();\r\n const applicationCode = resolveApplicationCodeOption(\r\n this.options.applicationCode,\r\n );\r\n this.authFacade.login({\r\n userName: username,\r\n password,\r\n applicationCode: applicationCode ?? undefined,\r\n isEncrypted: false,\r\n deviceToken: resolveGatewayDeviceToken(this.options.deviceToken),\r\n });\r\n }\r\n}\r\n","@if (formPosition()) {\r\n <ng-container *transloco=\"let t; prefix: translationPrefix()\">\r\n <div\r\n class=\"w-screen h-screen flex overflow-hidden\"\r\n [style]=\"pageStyles()\"\r\n [style.backgroundImage]=\"\r\n backgroundImage()\r\n ? (backgroundImage()\r\n | secureImage: false : undefined : imageBasePath())\r\n : null\r\n \"\r\n >\r\n @if (formPosition() === \"end\") {\r\n <ng-container [ngTemplateOutlet]=\"brandPanel\" />\r\n }\r\n\r\n <div [class]=\"formContainerClasses()\">\r\n @if (formPosition() === \"center\") {\r\n <div\r\n class=\"flex flex-col items-center text-center mb-8 space-y-4\"\r\n [style.color]=\"textColor()\"\r\n >\r\n <img\r\n [src]=\"\r\n logoUrl()\r\n ? (logoUrl()\r\n | secureImage: true : undefined : imageBasePath())\r\n : defaultLogoUrl()\r\n \"\r\n alt=\"BrandLogo\"\r\n class=\"h-20 mx-auto\"\r\n />\r\n @if (productTagline(); as tagline) {\r\n <h3 class=\"text-2xl font-medium\">{{ tagline }}</h3>\r\n }\r\n </div>\r\n }\r\n\r\n <div\r\n class=\"glass-card relative w-full max-w-md rounded-xl pb-8 px-10 pt-12 space-y-[4vh]\"\r\n [style.color]=\"textColor()\"\r\n >\r\n <div class=\"text-center space-y-[4vh]\">\r\n <h2 class=\"text-3xl font-bold\">{{ t(\"signin\") }}</h2>\r\n <p>{{ t(\"welcome-subtitle\") }}</p>\r\n </div>\r\n\r\n <form\r\n [formGroup]=\"loginForm\"\r\n (ngSubmit)=\"onSubmit()\"\r\n class=\"space-y-[1rem]\"\r\n >\r\n <mt-text-field [label]=\"t('username')\" formControlName=\"username\" />\r\n\r\n <div class=\"relative\">\r\n <mt-text-field\r\n [label]=\"t('password')\"\r\n [type]=\"passwordVisible() ? 'text' : 'password'\"\r\n formControlName=\"password\"\r\n />\r\n <button\r\n type=\"button\"\r\n class=\"password-toggle-btn cursor-pointer absolute end-3 top-7 h-10 flex items-center justify-center text-lg leading-none z-10\"\r\n [attr.aria-label]=\"\r\n passwordVisible() ? t('hide-password') : t('show-password')\r\n \"\r\n (click)=\"togglePasswordVisibility()\"\r\n ></button>\r\n </div>\r\n\r\n <mt-button\r\n [label]=\"\r\n isRateLimited() && rateLimitSecondsLeft() !== null\r\n ? t('rate-limit-retry-in', {\r\n time: rateLimitCountdownLabel(),\r\n })\r\n : t('signin')\r\n \"\r\n size=\"large\"\r\n severity=\"primary\"\r\n fluid\r\n type=\"submit\"\r\n [loading]=\"loading()\"\r\n [disabled]=\"submitDisabled\"\r\n styleClass=\"mt-2\"\r\n />\r\n\r\n @if (rateLimit(); as lock) {\r\n <div\r\n class=\"rate-limit-banner flex items-start gap-3 rounded-lg border border-red-300/40 bg-red-500/10 p-3 text-sm\"\r\n role=\"alert\"\r\n aria-live=\"polite\"\r\n >\r\n <mt-icon\r\n class=\"text-base text-red-500 mt-0.5 shrink-0\"\r\n icon=\"alert.alert-circle\"\r\n />\r\n <div class=\"flex-1 min-w-0 space-y-1\">\r\n <p class=\"font-medium\">{{ t(\"rate-limit-title\") }}</p>\r\n <p class=\"text-xs opacity-90\">\r\n @if (rateLimitSecondsLeft() !== null) {\r\n {{\r\n t(\"rate-limit-countdown\", {\r\n time: rateLimitCountdownLabel(),\r\n })\r\n }}\r\n } @else {\r\n {{ lock.message || t(\"rate-limit-blocked\") }}\r\n }\r\n </p>\r\n @if (rateLimitSecondsLeft() !== null) {\r\n <div\r\n class=\"rate-limit-progress h-1 w-full overflow-hidden rounded-full bg-red-500/20\"\r\n >\r\n <div\r\n class=\"h-full bg-red-500 transition-[width] duration-1000 ease-linear\"\r\n [style.width.%]=\"rateLimitProgress()\"\r\n ></div>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n } @else if (error(); as errorMessage) {\r\n <p class=\"text-sm text-red-500 text-center\">\r\n {{ errorMessage }}\r\n </p>\r\n }\r\n\r\n <mt-gateway-sso-buttons [dividerLabel]=\"t('or')\" />\r\n\r\n @if (showLanguageToggle()) {\r\n <div class=\"pt-1 w-35 mx-auto\">\r\n <mt-select-field\r\n [(ngModel)]=\"selectedLanguage\"\r\n [ngModelOptions]=\"{ standalone: true }\"\r\n [options]=\"languageOptions()\"\r\n optionLabel=\"label\"\r\n optionValue=\"id\"\r\n (onChange)=\"onLanguageChange()\"\r\n size=\"small\"\r\n />\r\n </div>\r\n }\r\n </form>\r\n\r\n <p\r\n class=\"absolute text-center text-xs text-gray-400 pt-6 bottom-4 left-1/2 -translate-x-1/2 w-full\"\r\n >\r\n {{ t(\"copyright\") }}\r\n </p>\r\n </div>\r\n </div>\r\n\r\n @if (formPosition() === \"start\") {\r\n <ng-container [ngTemplateOutlet]=\"brandPanel\" />\r\n }\r\n </div>\r\n\r\n <ng-template #brandPanel>\r\n <div\r\n class=\"hidden md:flex flex-col justify-center items-start w-1/2 p-12\"\r\n [style.color]=\"textColor()\"\r\n >\r\n <div class=\"w-full max-w-full rounded-xl p-1 space-y-2 h-1/2 ps-24\">\r\n <div [class]=\"logoAlignment()\">\r\n <img\r\n [src]=\"\r\n logoUrl()\r\n ? (logoUrl()\r\n | secureImage: true : undefined : imageBasePath())\r\n : defaultLogoUrl()\r\n \"\r\n alt=\"Logo\"\r\n class=\"h-20\"\r\n />\r\n </div>\r\n @if (productTagline(); as tagline) {\r\n <h3 class=\"text-2xl\">{{ tagline }}</h3>\r\n }\r\n </div>\r\n </div>\r\n </ng-template>\r\n </ng-container>\r\n} @else {\r\n <div class=\"w-screen h-screen flex items-center justify-center\">\r\n <mt-icon\r\n class=\"text-4xl text-primary animate-spin animate-duration-2000\"\r\n icon=\"general.loading-02\"\r\n />\r\n </div>\r\n}\r\n","import { CommonModule } from '@angular/common';\r\nimport {\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n inject,\r\n OnInit,\r\n} from '@angular/core';\r\nimport { FormBuilder, ReactiveFormsModule, Validators } from '@angular/forms';\r\nimport { Router } from '@angular/router';\r\nimport { TranslocoDirective, TranslocoService } from '@jsverse/transloco';\r\nimport { Button } from '@masterteam/components/button';\r\nimport { TextField } from '@masterteam/components/text-field';\r\nimport { Icon } from '@masterteam/icons';\r\nimport { GatewayAuthFacade } from '../../gateway-auth.facade';\r\nimport { GATEWAY_AUTH_OPTIONS } from '../../gateway-auth.options';\r\n\r\n@Component({\r\n selector: 'mt-gateway-mfa',\r\n imports: [\r\n CommonModule,\r\n ReactiveFormsModule,\r\n Button,\r\n TextField,\r\n Icon,\r\n TranslocoDirective,\r\n ],\r\n templateUrl: './gateway-mfa.html',\r\n styleUrls: ['./gateway-mfa.css'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport default class GatewayMfa implements OnInit {\r\n private readonly auth = inject(GatewayAuthFacade);\r\n private readonly fb = inject(FormBuilder);\r\n private readonly router = inject(Router);\r\n private readonly options = inject(GATEWAY_AUTH_OPTIONS);\r\n private readonly transloco = inject(TranslocoService);\r\n\r\n readonly pendingMfa = this.auth.pendingMfa;\r\n readonly loading = this.auth.loading;\r\n readonly resendLoading = this.auth.mfaResendLoading;\r\n readonly error = this.auth.error;\r\n\r\n readonly deliveryChannel = computed(\r\n () =>\r\n this.pendingMfa()?.deliveryChannel ||\r\n this.transloco.translate('gatewayAuth.mfa.configuredChannel'),\r\n );\r\n readonly expiresAt = computed(() => this.pendingMfa()?.expiresAtUtc ?? null);\r\n\r\n readonly form = this.fb.group({\r\n code: ['', [Validators.required, Validators.pattern(/^[0-9]{4,8}$/)]],\r\n });\r\n\r\n ngOnInit(): void {\r\n if (!this.pendingMfa()) {\r\n this.router.navigate([this.options.loginRoute ?? '/auth/login'], {\r\n replaceUrl: true,\r\n });\r\n }\r\n }\r\n\r\n verify(): void {\r\n if (this.form.invalid) {\r\n this.form.markAllAsTouched();\r\n return;\r\n }\r\n\r\n const code = this.form.controls.code.value ?? '';\r\n this.form.reset();\r\n this.auth.verifyMfa(code);\r\n }\r\n\r\n resend(): void {\r\n this.form.reset();\r\n this.auth.resendMfa();\r\n }\r\n\r\n backToLogin(): void {\r\n this.auth.clearPendingMfa();\r\n this.router.navigate([this.options.loginRoute ?? '/auth/login'], {\r\n replaceUrl: true,\r\n });\r\n }\r\n}\r\n","<ng-container *transloco=\"let t; prefix: 'gatewayAuth.mfa'\">\r\n <div\r\n class=\"min-h-screen w-screen flex items-center justify-center p-6 bg-surface-50\"\r\n >\r\n <div\r\n class=\"w-full max-w-md rounded-xl bg-white p-8 shadow-sm border border-surface-200\"\r\n >\r\n <div class=\"flex justify-center mb-6\">\r\n <div\r\n class=\"h-12 w-12 rounded-full bg-primary/10 flex items-center justify-center\"\r\n >\r\n <mt-icon\r\n icon=\"security.lock-01\"\r\n class=\"text-primary text-2xl\"\r\n ></mt-icon>\r\n </div>\r\n </div>\r\n\r\n <div class=\"text-center space-y-2 mb-6\">\r\n <h1 class=\"text-2xl font-semibold text-surface-950\">\r\n {{ t(\"title\") }}\r\n </h1>\r\n <p class=\"text-sm text-surface-600\">\r\n {{ t(\"instruction\", { channel: deliveryChannel() }) }}\r\n </p>\r\n @if (expiresAt(); as expiry) {\r\n <p class=\"text-xs text-surface-500\">\r\n {{ t(\"expiresAt\", { time: expiry | date: \"shortTime\" }) }}\r\n </p>\r\n }\r\n </div>\r\n\r\n <form [formGroup]=\"form\" (ngSubmit)=\"verify()\" class=\"space-y-4\">\r\n <mt-text-field\r\n [label]=\"t('code')\"\r\n formControlName=\"code\"\r\n [pInputs]=\"{ inputMode: 'numeric', autocomplete: 'one-time-code' }\"\r\n />\r\n\r\n @if (error(); as errorMessage) {\r\n <p class=\"text-sm text-red-500 text-center\">{{ errorMessage }}</p>\r\n }\r\n\r\n <mt-button\r\n [label]=\"t('verify')\"\r\n type=\"submit\"\r\n severity=\"primary\"\r\n size=\"large\"\r\n fluid\r\n [loading]=\"loading()\"\r\n [disabled]=\"form.invalid || loading()\"\r\n />\r\n </form>\r\n\r\n <div class=\"flex items-center justify-between gap-3 pt-5\">\r\n <mt-button\r\n [label]=\"t('back')\"\r\n type=\"button\"\r\n text\r\n [disabled]=\"loading()\"\r\n (onClick)=\"backToLogin()\"\r\n />\r\n <mt-button\r\n [label]=\"t('resend')\"\r\n type=\"button\"\r\n variant=\"outlined\"\r\n [loading]=\"resendLoading()\"\r\n [disabled]=\"loading() || resendLoading()\"\r\n (onClick)=\"resend()\"\r\n />\r\n </div>\r\n </div>\r\n </div>\r\n</ng-container>\r\n","import { CommonModule } from '@angular/common';\r\nimport {\r\n ChangeDetectionStrategy,\r\n Component,\r\n inject,\r\n OnInit,\r\n signal,\r\n} from '@angular/core';\r\nimport { ActivatedRoute, Router } from '@angular/router';\r\nimport { TranslocoDirective, TranslocoService } from '@jsverse/transloco';\r\nimport { Button } from '@masterteam/components/button';\r\nimport { Icon } from '@masterteam/icons';\r\nimport { GatewayAuthFacade } from '../../gateway-auth.facade';\r\nimport { GATEWAY_AUTH_OPTIONS } from '../../gateway-auth.options';\r\nimport { GatewaySsoSession } from '../../gateway-sso-session.service';\r\n\r\n@Component({\r\n selector: 'mt-gateway-sso-callback',\r\n imports: [CommonModule, Button, Icon, TranslocoDirective],\r\n templateUrl: './gateway-sso-callback.html',\r\n styleUrls: ['./gateway-sso-callback.css'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport default class GatewaySsoCallback implements OnInit {\r\n private readonly route = inject(ActivatedRoute);\r\n private readonly router = inject(Router);\r\n private readonly auth = inject(GatewayAuthFacade);\r\n private readonly options = inject(GATEWAY_AUTH_OPTIONS);\r\n private readonly transloco = inject(TranslocoService);\r\n private readonly ssoSession = new GatewaySsoSession();\r\n\r\n readonly loading = this.auth.ssoCallbackLoading;\r\n readonly exchangeError = this.auth.error;\r\n readonly callbackError = signal<string | null>(null);\r\n\r\n ngOnInit(): void {\r\n const params = this.route.snapshot.queryParamMap;\r\n const error = params.get('error');\r\n const errorCode = params.get('errorCode');\r\n const code = params.get('code');\r\n const state = params.get('state');\r\n\r\n this.ssoSession.clearCallbackQuery(\r\n this.options.ssoCallbackPath ?? '/auth/sso/callback',\r\n );\r\n\r\n if (!this.ssoSession.consumeExpectedState(state)) {\r\n this.callbackError.set(this.safeSsoMessage('invalid_state'));\r\n return;\r\n }\r\n\r\n if (error) {\r\n this.callbackError.set(this.safeSsoMessage(errorCode ?? 'sso_failed'));\r\n return;\r\n }\r\n\r\n if (!code || !state) {\r\n this.callbackError.set(this.safeSsoMessage('invalid_state'));\r\n return;\r\n }\r\n\r\n this.auth.exchangeSsoCode(code, state);\r\n }\r\n\r\n retry(): void {\r\n this.router.navigate([this.options.loginRoute ?? '/auth/login'], {\r\n replaceUrl: true,\r\n });\r\n }\r\n\r\n private safeSsoMessage(errorCode: string): string {\r\n const t = (key: string) =>\r\n this.transloco.translate(`gatewayAuth.ssoCallback.${key}`);\r\n const messages: Record<string, string> = {\r\n invalid_state: t('sessionExpired'),\r\n sso_exchange_expired: t('sessionExpired'),\r\n sso_exchange_used: t('sessionAlreadyUsed'),\r\n sso_user_not_found: t('notConfigured'),\r\n sso_provisioning_not_allowed: t('notConfigured'),\r\n };\r\n\r\n return messages[errorCode] ?? t('fallbackError');\r\n }\r\n}\r\n","<ng-container *transloco=\"let t; prefix: 'gatewayAuth.ssoCallback'\">\r\n <div\r\n class=\"min-h-screen w-screen flex items-center justify-center p-6 bg-surface-50\"\r\n >\r\n <div\r\n class=\"w-full max-w-md rounded-xl bg-white p-8 shadow-sm border border-surface-200 text-center\"\r\n >\r\n @if (callbackError() || exchangeError(); as errorMessage) {\r\n <div class=\"space-y-5\">\r\n <mt-icon\r\n icon=\"alert.alert-circle\"\r\n class=\"text-red-500 text-4xl\"\r\n ></mt-icon>\r\n <div class=\"space-y-2\">\r\n <h1 class=\"text-xl font-semibold text-surface-950\">\r\n {{ t(\"errorTitle\") }}\r\n </h1>\r\n <p class=\"text-sm text-surface-600\">{{ errorMessage }}</p>\r\n </div>\r\n <mt-button\r\n [label]=\"t('backToSignIn')\"\r\n severity=\"primary\"\r\n (onClick)=\"retry()\"\r\n ></mt-button>\r\n </div>\r\n } @else {\r\n <div class=\"space-y-5\">\r\n <mt-icon\r\n icon=\"general.loading-02\"\r\n class=\"text-primary text-4xl animate-spin animate-duration-2000\"\r\n >\r\n </mt-icon>\r\n <div class=\"space-y-2\">\r\n <h1 class=\"text-xl font-semibold text-surface-950\">\r\n {{ t(\"completing\") }}\r\n </h1>\r\n <p class=\"text-sm text-surface-600\">\r\n {{ t(\"pleaseWait\") }}\r\n </p>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n</ng-container>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["tap","catchError","switchMap"],"mappings":"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"}