@masterteam/gateway-auth 0.0.24 → 0.0.26

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/interceptors/correlation-id.interceptor.ts","../../../../packages/masterteam/gateway-auth/src/interceptors/idempotency.interceptor.ts","../../../../packages/masterteam/gateway-auth/src/interceptors/language.interceptor.ts","../../../../packages/masterteam/gateway-auth/src/interceptors/message.interceptor.ts","../../../../packages/masterteam/gateway-auth/src/interceptors/cache-session.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 getApplicationLaunchReturnUrl?: (\n applicationCode: string,\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 activeApplicationCode: string | null;\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 activeApplicationCode: null,\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 activeApplicationCode: obj?.activeApplicationCode ?? null,\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 @Selector()\n static activeApplicationCode(state: AuthStateModel): string | null {\n return state.activeApplicationCode;\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(getGatewayErrorMessage(error, 'Login failed')),\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(\n this.options.applicationCode,\n );\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 activeApplicationCode: null,\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 const returnUrl = this.resolveLaunchReturnUrl(code, action.returnUrl);\n if (returnUrl) {\n params['returnUrl'] = 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 activeApplicationCode: data.applicationCode,\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 const state = ctx.getState();\n ctx.patchState({\n appSessions: sessions,\n activeApplicationCode:\n state.activeApplicationCode === action.applicationCode\n ? null\n : state.activeApplicationCode,\n });\n }\n\n @Action(ClearAllAppSessions)\n clearAllAppSessions(ctx: StateContext<AuthStateModel>) {\n ctx.patchState({\n appSessions: {},\n applications: [],\n activeApplicationCode: null,\n });\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 resolveLaunchReturnUrl(\n applicationCode: string,\n explicitReturnUrl?: string,\n ): string | null {\n const trimmedExplicit = explicitReturnUrl?.trim();\n if (trimmedExplicit) {\n return trimmedExplicit;\n }\n const fromOption = this.options\n .getApplicationLaunchReturnUrl?.(applicationCode)\n ?.trim();\n if (fromOption) {\n return fromOption;\n }\n if (typeof window !== 'undefined' && window.location?.origin) {\n return window.location.origin;\n }\n return null;\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 activeApplicationCode: null,\n });\n\n return this.maybeAutoLaunchApplication(ctx, resolvedApplicationCode).pipe(\n mergeMap(() =>\n this.toObservable(this.options.afterLogin?.(session, ctx)),\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 readonly activeApplicationCode = select(\n GatewayAuthState.activeApplicationCode,\n );\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 firstValueFrom,\n from,\n map,\n Observable,\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, Promise<AuthTokens>>();\n\nconst refreshScopeKey = (\n scope: 'gateway' | 'application',\n applicationCode?: string,\n): string =>\n scope === 'gateway'\n ? GATEWAY_REFRESH_SCOPE\n : `application:${applicationCode ?? ''}`;\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 refreshAccessToken = (\n context: RefreshContext,\n refreshToken: string,\n): Promise<AuthTokens> => {\n const scopeKey = refreshScopeKey(context.scope, context.applicationCode);\n const existing = inflightRefreshByScope.get(scopeKey);\n if (existing) {\n return existing;\n }\n\n const promise = executeRefresh(context, refreshToken);\n inflightRefreshByScope.set(scopeKey, promise);\n\n promise.finally(() => {\n if (inflightRefreshByScope.get(scopeKey) === promise) {\n inflightRefreshByScope.delete(scopeKey);\n }\n });\n\n return promise;\n};\n\nconst refreshTokens$ = (\n context: RefreshContext,\n refreshToken: string,\n): Observable<AuthTokens> => from(refreshAccessToken(context, refreshToken));\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 urlMatchesBase = (\n url: string,\n baseUrl: string | null | undefined,\n): boolean => {\n if (!baseUrl || !isAbsoluteUrl(url)) {\n return false;\n }\n return url.startsWith(normalizeBase(baseUrl));\n};\n\nconst resolveRequestScope = (\n req: HttpRequest<unknown>,\n options: GatewayAuthOptions,\n auth: GatewayAuthFacade,\n gatewayApiBaseUrl: string | null | undefined,\n): ResolvedScope => {\n // 1. Per-request override wins.\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: false,\n };\n }\n\n // 2. Caller hint via request context.\n if (options.shouldUseGatewayApiBaseUrl?.(req)) {\n return { scope: 'gateway', useGatewayBaseUrl: true };\n }\n\n // 3. Absolute URL pointing at the Gateway base must use GatewaySession.\n // Covers /api/auth/*, /api/auth/me/applications, /api/applications/{code}/launch.\n if (urlMatchesBase(req.url, gatewayApiBaseUrl)) {\n return { scope: 'gateway', useGatewayBaseUrl: false };\n }\n\n // 4. Otherwise treat as app scope when a session exists.\n const defaultCode =\n resolveApplicationCodeOption(options.applicationCode) ??\n auth.activeApplicationCode();\n if (defaultCode) {\n const session = auth.getAppSession(defaultCode);\n if (session) {\n return {\n scope: 'application',\n applicationCode: defaultCode,\n session,\n useGatewayBaseUrl: false,\n };\n }\n }\n\n // 5. No app session known yet — fall back to GatewaySession.\n return { scope: 'gateway', useGatewayBaseUrl: false };\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, gatewayApiBaseUrl);\n const baseUrl = resolved.useGatewayBaseUrl\n ? gatewayApiBaseUrl\n : appApiBaseUrl;\n\n const gatewayAccessToken = auth.token();\n\n const session = resolved.session ?? null;\n\n const accessToken =\n resolved.scope === 'application' && session\n ? session.accessToken\n : gatewayAccessToken;\n\n // Reactive-only refresh: we never call /auth/refresh proactively. If the\n // access token is genuinely expired the request goes out with the existing\n // one, the backend will 401, and the catchError below refreshes once and\n // retries. This avoids the post-login refresh cascade caused by short\n // access-token TTLs versus any skew.\n const tokenToAttach = !isAuthRequest && accessToken ? 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 const initialAccessToken = accessToken;\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 // If a concurrent flow already rotated the token while this request was\n // in flight, just retry with the freshest token — do NOT trigger another\n // refresh against the backend.\n const currentAccessToken =\n resolved.scope === 'application' && resolved.applicationCode\n ? (auth.getAppSession(resolved.applicationCode)?.accessToken ?? null)\n : auth.token();\n if (currentAccessToken && currentAccessToken !== initialAccessToken) {\n return next(prepareRequest(req, currentAccessToken, true, baseUrl));\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 { HttpInterceptorFn } from '@angular/common/http';\n\nconst CORRELATION_ID_HEADER = 'X-Correlation-ID';\n\nfunction generateCorrelationId(): string {\n if (typeof crypto !== 'undefined' && crypto.randomUUID) {\n return crypto.randomUUID();\n }\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (char) => {\n const random = (Math.random() * 16) | 0;\n const value = char === 'x' ? random : (random & 0x3) | 0x8;\n return value.toString(16);\n });\n}\n\nexport const correlationIdInterceptor: HttpInterceptorFn = (req, next) => {\n if (req.headers.has(CORRELATION_ID_HEADER)) {\n return next(req);\n }\n return next(\n req.clone({\n setHeaders: {\n [CORRELATION_ID_HEADER]: generateCorrelationId(),\n },\n }),\n );\n};\n","import { HttpInterceptorFn, HttpRequest } from '@angular/common/http';\n\nexport interface IdempotencyInterceptorOptions {\n excludedPaths?: string[];\n methods?: string[];\n headerName?: string;\n}\n\nconst DEFAULT_EXCLUDED_PATHS = [\n '/health',\n '/auth/login',\n '/auth/refresh',\n '/auth/logout',\n '/auth/register',\n '/auth/sso',\n '/swagger',\n];\n\nconst DEFAULT_METHODS = ['POST', 'PUT', 'PATCH', 'DELETE'];\n\nconst DEFAULT_HEADER = 'X-Idempotency-Key';\n\nfunction generateUUID(): string {\n if (typeof crypto !== 'undefined' && crypto.randomUUID) {\n return crypto.randomUUID();\n }\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n const r = (Math.random() * 16) | 0;\n const v = c === 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n}\n\nexport function createIdempotencyInterceptor(\n options?: IdempotencyInterceptorOptions,\n): HttpInterceptorFn {\n const excludedPaths = options?.excludedPaths ?? DEFAULT_EXCLUDED_PATHS;\n const methods = (options?.methods ?? DEFAULT_METHODS).map((m) =>\n m.toUpperCase(),\n );\n const header = options?.headerName ?? DEFAULT_HEADER;\n\n const requiresKey = (req: HttpRequest<unknown>): boolean => {\n if (!methods.includes(req.method.toUpperCase())) return false;\n if (req.url.includes('/assets/')) return false;\n if (excludedPaths.some((path) => req.url.includes(path))) return false;\n return true;\n };\n\n return (req, next) => {\n if (!requiresKey(req) || req.headers.has(header)) {\n return next(req);\n }\n return next(\n req.clone({\n setHeaders: { [header]: generateUUID() },\n }),\n );\n };\n}\n\nexport const idempotencyInterceptor: HttpInterceptorFn =\n createIdempotencyInterceptor();\n","import { HttpInterceptorFn } from '@angular/common/http';\n\nexport interface LanguageInterceptorOptions {\n getLanguage: () => string | null | undefined;\n headerName?: string;\n}\n\nexport function createLanguageInterceptor(\n options: LanguageInterceptorOptions,\n): HttpInterceptorFn {\n const header = options.headerName ?? 'Accept-Language';\n return (req, next) => {\n const lang = options.getLanguage();\n if (!lang) {\n return next(req);\n }\n return next(\n req.clone({\n setHeaders: { [header]: lang },\n }),\n );\n };\n}\n","import { HttpInterceptorFn } from '@angular/common/http';\nimport { inject } from '@angular/core';\nimport { tap } from 'rxjs';\nimport { ToastService } from '@masterteam/components/toast';\nimport { GatewayAuthFacade } from '../gateway-auth.facade';\nimport { isExpired } from '../gateway-auth.utils';\nimport { isGatewayAuthRequestUrl } from '../gateway-auth.interceptor';\n\nexport interface MessageInterceptorOptions {\n silentEndpoints?: string[];\n mutatingMethods?: string[];\n noMessageHeader?: string;\n}\n\nconst DEFAULT_MUTATING_METHODS = ['POST', 'PUT', 'PATCH', 'DELETE'];\n\nconst DEFAULT_SILENT_ENDPOINTS = [\n 'api/dashboards/chart',\n 'api/home/recent/visit',\n 'api/fetch/query',\n 'api/workcenter/runtime',\n 'api/search',\n 'api/process-form-load',\n '/workspace-record-action-states',\n '/schedule/read',\n '/metadata/modules/properties',\n '/auth/logout',\n '/auth/login',\n '/auth/2fa',\n '/auth/sso',\n '/schedule/query',\n '/context/resolve',\n 'read-state',\n 'process-submit/validate',\n 'api/formulas/validate',\n];\n\nconst DEFAULT_NO_MESSAGE_HEADER = 'noMessage';\n\nexport function createMessageInterceptor(\n options?: MessageInterceptorOptions,\n): HttpInterceptorFn {\n const silentEndpoints = options?.silentEndpoints ?? DEFAULT_SILENT_ENDPOINTS;\n const mutating = (options?.mutatingMethods ?? DEFAULT_MUTATING_METHODS).map(\n (m) => m.toUpperCase(),\n );\n const noMessageHeader = options?.noMessageHeader ?? DEFAULT_NO_MESSAGE_HEADER;\n\n return (req, next) => {\n const auth = inject(GatewayAuthFacade);\n const toast = inject(ToastService);\n\n return next(req).pipe(\n tap({\n next: (res) => {\n const body = (res as { body?: { message?: string } } | undefined)\n ?.body;\n if (!body?.message) return;\n if (req.headers.get(noMessageHeader) === 'true') return;\n if (!mutating.includes(req.method.toUpperCase())) return;\n if (silentEndpoints.some((endpoint) => req.url.includes(endpoint)))\n return;\n toast.success(body.message);\n },\n error: (error) => {\n const errorMessage =\n error?.error?.message || error?.error?.Message || '';\n const errorCode =\n error?.status || error?.error?.status || error?.error?.code;\n\n const showError = (message: string) => {\n if (message) toast.error(message);\n };\n\n const canRefreshGateway =\n !!auth.refreshToken() && !isExpired(auth.refreshTokenExpiresAt());\n const activeCode = auth.activeApplicationCode();\n const appSession = activeCode ? auth.getAppSession(activeCode) : null;\n const canRefreshApp =\n !!appSession?.refreshToken &&\n !isExpired(appSession.refreshTokenExpiresAt);\n\n switch (errorCode) {\n case 401:\n if (\n !isGatewayAuthRequestUrl(req.url) &&\n (canRefreshGateway || canRefreshApp)\n ) {\n break;\n }\n auth.logout();\n showError(errorMessage);\n break;\n\n case 404:\n if (req?.responseType !== 'blob') {\n showError(errorMessage);\n }\n break;\n\n case 400: {\n const validationErrors = error?.error?.errors;\n if (validationErrors && typeof validationErrors === 'object') {\n const messages = Object.values(validationErrors)\n .flat()\n .filter((m): m is string => typeof m === 'string');\n messages.forEach(showError);\n } else {\n showError(errorMessage);\n }\n break;\n }\n\n case 402:\n case 403:\n case 422:\n case 500:\n showError(errorMessage);\n break;\n\n default:\n if (req.headers.get(noMessageHeader) !== 'true') {\n showError(errorMessage);\n }\n break;\n }\n },\n }),\n );\n };\n}\n\nexport const messageInterceptor: HttpInterceptorFn = createMessageInterceptor();\n","import { HttpInterceptorFn, HttpResponse } from '@angular/common/http';\nimport { tap } from 'rxjs';\n\nexport interface CacheSessionInterceptorOptions {\n onCacheSession: (cacheSession: string) => void;\n field?: string;\n}\n\nexport function createCacheSessionInterceptor(\n options: CacheSessionInterceptorOptions,\n): HttpInterceptorFn {\n const field = options.field ?? 'cacheSession';\n return (req, next) =>\n next(req).pipe(\n tap((event) => {\n if (!(event instanceof HttpResponse) || !event.body) return;\n const body = event.body as Record<string, unknown>;\n const value = body[field];\n if (typeof value === 'string' && value) {\n options.onCacheSession(value);\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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"}
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/interceptors/correlation-id.interceptor.ts","../../../../packages/masterteam/gateway-auth/src/interceptors/idempotency.interceptor.ts","../../../../packages/masterteam/gateway-auth/src/interceptors/language.interceptor.ts","../../../../packages/masterteam/gateway-auth/src/interceptors/message.interceptor.ts","../../../../packages/masterteam/gateway-auth/src/interceptors/cache-session.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 getApplicationLaunchReturnUrl?: (\n applicationCode: string,\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 activeApplicationCode: string | null;\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 activeApplicationCode: null,\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 activeApplicationCode: obj?.activeApplicationCode ?? null,\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 @Selector()\n static activeApplicationCode(state: AuthStateModel): string | null {\n return state.activeApplicationCode;\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(getGatewayErrorMessage(error, 'Login failed')),\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(\n this.options.applicationCode,\n );\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 activeApplicationCode: null,\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 const returnUrl = this.resolveLaunchReturnUrl(code, action.returnUrl);\n if (returnUrl) {\n params['returnUrl'] = 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 activeApplicationCode: data.applicationCode,\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 activeApplicationCode: action.session.applicationCode,\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 const state = ctx.getState();\n ctx.patchState({\n appSessions: sessions,\n activeApplicationCode:\n state.activeApplicationCode === action.applicationCode\n ? null\n : state.activeApplicationCode,\n });\n }\n\n @Action(ClearAllAppSessions)\n clearAllAppSessions(ctx: StateContext<AuthStateModel>) {\n ctx.patchState({\n appSessions: {},\n applications: [],\n activeApplicationCode: null,\n });\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 resolveLaunchReturnUrl(\n applicationCode: string,\n explicitReturnUrl?: string,\n ): string | null {\n const trimmedExplicit = explicitReturnUrl?.trim();\n if (trimmedExplicit) {\n return trimmedExplicit;\n }\n const fromOption = this.options\n .getApplicationLaunchReturnUrl?.(applicationCode)\n ?.trim();\n if (fromOption) {\n return fromOption;\n }\n if (typeof window !== 'undefined' && window.location?.origin) {\n return window.location.origin;\n }\n return null;\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 activeApplicationCode: null,\n });\n\n return this.maybeAutoLaunchApplication(ctx, resolvedApplicationCode).pipe(\n mergeMap(() =>\n this.toObservable(this.options.afterLogin?.(session, ctx)),\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 readonly activeApplicationCode = select(\n GatewayAuthState.activeApplicationCode,\n );\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 firstValueFrom,\n from,\n map,\n Observable,\n of,\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 {\n GatewayApplicationLaunchData,\n GatewayRefreshData,\n GatewayResponse,\n} from './gateway-auth.models';\nimport { AppSession, AuthTokens } from './gateway-auth.state.model';\nimport {\n buildGatewayUrl,\n GATEWAY_AUTH_ENDPOINTS,\n isExpired,\n mapGatewayTokens,\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\nconst getBasePath = (baseUrl?: string | null): string => {\n if (!baseUrl) {\n return '';\n }\n\n try {\n return new URL(baseUrl).pathname;\n } catch {\n return baseUrl.startsWith('/') ? baseUrl : '';\n }\n};\n\nconst stripBasePath = (path: string, baseUrl?: string | null): string => {\n const basePath = getBasePath(baseUrl).replace(/^\\/+/, '').replace(/\\/+$/, '');\n const normalizedPath = path.replace(/^\\/+/, '');\n\n if (\n basePath &&\n (normalizedPath === basePath || normalizedPath.startsWith(`${basePath}/`))\n ) {\n return normalizedPath.slice(basePath.length).replace(/^\\/+/, '');\n }\n\n return path;\n};\n\nconst resolveRequestPath = (url: string, baseUrl?: string | null): string => {\n let path = url;\n\n if (isAbsoluteUrl(url)) {\n try {\n path = new URL(url).pathname;\n } catch {\n path = url;\n }\n } else if (baseUrl && url.startsWith(baseUrl)) {\n path = url.slice(baseUrl.length);\n }\n\n return normalizePath(stripBasePath(path, baseUrl));\n};\n\nexport function resolveGatewayAuthPath(\n url: string,\n gatewayApiBaseUrl?: string | null,\n): string {\n return resolveRequestPath(url, gatewayApiBaseUrl);\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\nconst GATEWAY_APPLICATION_LAUNCH_PATH_PATTERN =\n /^applications\\/[^/]+\\/launch$/i;\n\nconst isGatewayEndpointRequestUrl = (\n url: string,\n gatewayApiBaseUrl?: string | null,\n): boolean => {\n const path = resolveGatewayAuthPath(url, gatewayApiBaseUrl).toLowerCase();\n return (\n path.startsWith('auth/') ||\n GATEWAY_APPLICATION_LAUNCH_PATH_PATTERN.test(path)\n );\n};\n\nconst isApplicationContextRequestUrl = (\n url: string,\n applicationApiBaseUrl?: string | null,\n): boolean =>\n resolveRequestPath(url, applicationApiBaseUrl).toLowerCase() ===\n GATEWAY_AUTH_ENDPOINTS.applicationContext;\n\nclass GatewaySessionDeadError extends Error {\n constructor() {\n super('GATEWAY_SESSION_DEAD');\n }\n}\n\nconst isGatewaySessionDeadError = (error: unknown): boolean =>\n error instanceof GatewaySessionDeadError;\n\nconst isUnauthorizedError = (error: unknown): boolean =>\n (error as { status?: unknown } | null)?.status === 401;\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, Promise<AuthTokens>>();\n\nconst refreshScopeKey = (\n scope: 'gateway' | 'application',\n applicationCode?: string,\n): string =>\n scope === 'gateway'\n ? GATEWAY_REFRESH_SCOPE\n : `application:${applicationCode ?? ''}`;\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 refreshAccessToken = (\n context: RefreshContext,\n refreshToken: string,\n): Promise<AuthTokens> => {\n const scopeKey = refreshScopeKey(context.scope, context.applicationCode);\n const existing = inflightRefreshByScope.get(scopeKey);\n if (existing) {\n return existing;\n }\n\n const promise = executeRefresh(context, refreshToken);\n inflightRefreshByScope.set(scopeKey, promise);\n\n promise.finally(() => {\n if (inflightRefreshByScope.get(scopeKey) === promise) {\n inflightRefreshByScope.delete(scopeKey);\n }\n });\n\n return promise;\n};\n\nconst refreshTokens$ = (\n context: RefreshContext,\n refreshToken: string,\n): Observable<AuthTokens> => from(refreshAccessToken(context, refreshToken));\n\nconst inflightRelaunchByCode = new Map<string, Promise<AuthTokens>>();\n\nconst resolveRelaunchReturnUrl = (\n options: GatewayAuthOptions,\n applicationCode: string,\n): string | null => {\n const fromOption = options.getApplicationLaunchReturnUrl?.(applicationCode);\n const trimmed = fromOption?.trim();\n if (trimmed) {\n return trimmed;\n }\n if (typeof window !== 'undefined' && window.location?.origin) {\n return window.location.origin;\n }\n return null;\n};\n\nconst executeRelaunch = (\n context: RefreshContext,\n options: GatewayAuthOptions,\n): Promise<AuthTokens> => {\n const code = context.applicationCode;\n if (!code) {\n return Promise.reject(\n new Error('Cannot re-launch without applicationCode'),\n );\n }\n const lockKey = `masterteam-gateway-auth-relaunch:${code}`;\n\n return runWithRefreshLock(lockKey, async () => {\n // If another flow/tab already refreshed the app session, use it.\n const existingSession = context.auth.getAppSession(code);\n if (\n existingSession &&\n existingSession.accessToken &&\n !isExpired(existingSession.accessTokenExpiresAt, context.refreshSkewMs)\n ) {\n return {\n accessToken: existingSession.accessToken,\n accessTokenExpiresAt: {\n actualValue: existingSession.accessTokenExpiresAt ?? '',\n },\n refreshToken: existingSession.refreshToken,\n refreshTokenExpiresAt: {\n actualValue: existingSession.refreshTokenExpiresAt ?? '',\n },\n };\n }\n\n const ensureGatewayAccessToken = async (\n forceRefresh = false,\n ): Promise<string> => {\n const gatewayAccessToken = context.auth.token();\n const gatewayAccessTokenExpiresAt = context.auth.accessTokenExpiresAt();\n const gatewayAccessExpired =\n !gatewayAccessToken ||\n isExpired(gatewayAccessTokenExpiresAt, context.refreshSkewMs);\n\n if (!forceRefresh && !gatewayAccessExpired && gatewayAccessToken) {\n return gatewayAccessToken;\n }\n\n const gatewayRefreshToken = context.auth.refreshToken();\n if (\n !gatewayRefreshToken ||\n isExpired(context.auth.refreshTokenExpiresAt())\n ) {\n throw new GatewaySessionDeadError();\n }\n\n try {\n await refreshAccessToken(\n { ...context, scope: 'gateway', applicationCode: undefined },\n gatewayRefreshToken,\n );\n } catch {\n throw new GatewaySessionDeadError();\n }\n\n const refreshedGatewayAccessToken = context.auth.token();\n if (!refreshedGatewayAccessToken) {\n throw new GatewaySessionDeadError();\n }\n return refreshedGatewayAccessToken;\n };\n\n const url = buildGatewayUrl(\n context.gatewayApiBaseUrl,\n GATEWAY_AUTH_ENDPOINTS.applicationLaunch(code),\n );\n const params: Record<string, string> = {};\n const returnUrl = resolveRelaunchReturnUrl(options, code);\n if (returnUrl) {\n params['returnUrl'] = returnUrl;\n }\n if (context.deviceToken) {\n params['deviceToken'] = context.deviceToken;\n }\n\n const requestLaunch = (gatewayAccessToken: string): Promise<AuthTokens> =>\n firstValueFrom(\n context.http\n .get<GatewayResponse<GatewayApplicationLaunchData>>(url, {\n params,\n headers: {\n Authorization: `Bearer ${gatewayAccessToken}`,\n },\n })\n .pipe(\n map((response) => response.data),\n map((data) => {\n if (!data?.tokens?.accessToken || !data.tokens.refreshToken) {\n throw new Error('Invalid launch response');\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 context.auth.setAppSession(session);\n return data.tokens as AuthTokens;\n }),\n ),\n );\n\n const gatewayAccessToken = await ensureGatewayAccessToken();\n\n try {\n return await requestLaunch(gatewayAccessToken);\n } catch (error) {\n if (!isUnauthorizedError(error)) {\n throw error;\n }\n const refreshedGatewayAccessToken = await ensureGatewayAccessToken(true);\n try {\n return await requestLaunch(refreshedGatewayAccessToken);\n } catch (retryError) {\n if (isUnauthorizedError(retryError)) {\n throw new GatewaySessionDeadError();\n }\n throw retryError;\n }\n }\n });\n};\n\nconst relaunchApplication = (\n context: RefreshContext,\n options: GatewayAuthOptions,\n): Promise<AuthTokens> => {\n const code = context.applicationCode;\n if (!code) {\n return Promise.reject(\n new Error('Cannot re-launch without applicationCode'),\n );\n }\n const existing = inflightRelaunchByCode.get(code);\n if (existing) {\n return existing;\n }\n const promise = executeRelaunch(context, options);\n inflightRelaunchByCode.set(code, promise);\n promise.finally(() => {\n if (inflightRelaunchByCode.get(code) === promise) {\n inflightRelaunchByCode.delete(code);\n }\n });\n return promise;\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 urlMatchesBase = (\n url: string,\n baseUrl: string | null | undefined,\n): boolean => {\n if (!baseUrl) {\n return false;\n }\n\n const normalizedBase = normalizeBase(baseUrl);\n if (isAbsoluteUrl(url) && isAbsoluteUrl(normalizedBase)) {\n return url.startsWith(normalizedBase);\n }\n\n const basePath = getBasePath(baseUrl).replace(/^\\/+/, '').replace(/\\/+$/, '');\n if (!basePath) {\n return !isAbsoluteUrl(url) && url.startsWith(normalizedBase);\n }\n\n let path = url;\n if (isAbsoluteUrl(url)) {\n try {\n path = new URL(url).pathname;\n } catch {\n path = url;\n }\n }\n path = path.split('?')[0].replace(/^\\/+/, '');\n return path === basePath || path.startsWith(`${basePath}/`);\n};\n\nconst resolveRequestScope = (\n req: HttpRequest<unknown>,\n options: GatewayAuthOptions,\n auth: GatewayAuthFacade,\n gatewayApiBaseUrl: string | null | undefined,\n applicationApiBaseUrl: string | null | undefined,\n): ResolvedScope => {\n // 1. Public app context is deliberately unauthenticated app scope.\n if (isApplicationContextRequestUrl(req.url, applicationApiBaseUrl)) {\n return { scope: 'application', useGatewayBaseUrl: false };\n }\n\n // 2. Known Gateway endpoints must always use GatewaySession.\n if (isGatewayEndpointRequestUrl(req.url, gatewayApiBaseUrl)) {\n return {\n scope: 'gateway',\n useGatewayBaseUrl: !urlMatchesBase(req.url, gatewayApiBaseUrl),\n };\n }\n\n // 3. Caller hint via request context.\n if (options.shouldUseGatewayApiBaseUrl?.(req)) {\n return { scope: 'gateway', useGatewayBaseUrl: true };\n }\n\n // 4. Per-request app override.\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: false,\n };\n }\n\n const defaultCode =\n resolveApplicationCodeOption(options.applicationCode) ??\n auth.activeApplicationCode();\n\n // 5. Requests targeting the configured app API use ApplicationAccess.\n if (urlMatchesBase(req.url, applicationApiBaseUrl) && defaultCode) {\n return {\n scope: 'application',\n applicationCode: defaultCode,\n session: auth.getAppSession(defaultCode),\n useGatewayBaseUrl: false,\n };\n }\n\n // 6. Absolute URL pointing at the Gateway base must use GatewaySession.\n if (urlMatchesBase(req.url, gatewayApiBaseUrl)) {\n return { scope: 'gateway', useGatewayBaseUrl: false };\n }\n\n // 7. App shells with a configured/active app code should not send the\n // GatewaySession to direct app APIs. The interceptor will launch the app\n // if the ApplicationAccess pair is not available yet.\n if (defaultCode) {\n const session = auth.getAppSession(defaultCode);\n return {\n scope: 'application',\n applicationCode: defaultCode,\n session,\n useGatewayBaseUrl: false,\n };\n }\n\n // 8. No app context known yet - fall back to GatewaySession.\n return { scope: 'gateway', useGatewayBaseUrl: false };\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(\n req,\n options,\n auth,\n gatewayApiBaseUrl,\n appApiBaseUrl,\n );\n const baseUrl = resolved.useGatewayBaseUrl\n ? gatewayApiBaseUrl\n : appApiBaseUrl;\n\n const gatewayAccessToken = auth.token();\n\n const session = resolved.session ?? null;\n\n const accessToken =\n resolved.scope === 'application'\n ? (session?.accessToken ?? null)\n : gatewayAccessToken;\n\n const isApplicationContextRequest = isApplicationContextRequestUrl(\n req.url,\n appApiBaseUrl,\n );\n const shouldAttachAuth = !isAuthRequest && !isApplicationContextRequest;\n const tokenToAttach = shouldAttachAuth && accessToken ? 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 const handleRelaunchError = (relaunchError: unknown) => {\n if (isGatewaySessionDeadError(relaunchError)) {\n auth.logout();\n } else if (resolved.applicationCode) {\n auth.clearAppSession(resolved.applicationCode);\n }\n return throwError(() => relaunchError);\n };\n\n const relaunch$ = (\n clearAppSessionBeforeLaunch = true,\n ): Observable<AuthTokens> => {\n if (clearAppSessionBeforeLaunch && resolved.applicationCode) {\n auth.clearAppSession(resolved.applicationCode);\n }\n\n return from(\n relaunchApplication(\n buildRefreshContext('application', resolved.applicationCode),\n options,\n ),\n ).pipe(catchError(handleRelaunchError));\n };\n\n const resolveGatewayTokenBeforeRequest$ = (): Observable<string | null> => {\n const currentAccessToken = auth.token();\n const currentAccessTokenExpiresAt = auth.accessTokenExpiresAt();\n if (\n currentAccessToken &&\n !isExpired(currentAccessTokenExpiresAt, refreshSkewMs)\n ) {\n return of(currentAccessToken);\n }\n\n const gatewayRefreshToken = auth.refreshToken();\n if (!currentAccessToken && !gatewayRefreshToken) {\n return of(null);\n }\n\n if (!gatewayRefreshToken || isExpired(auth.refreshTokenExpiresAt())) {\n auth.logout();\n return throwError(() => new GatewaySessionDeadError());\n }\n\n return refreshTokens$(\n buildRefreshContext('gateway', undefined),\n gatewayRefreshToken,\n ).pipe(\n map((tokens) => tokens.accessToken),\n catchError((refreshError) => {\n auth.logout();\n return throwError(() => refreshError);\n }),\n );\n };\n\n const resolveAppTokenBeforeRequest$ = (): Observable<string | null> => {\n const code = resolved.applicationCode;\n if (!code) {\n return of(tokenToAttach);\n }\n\n const latestSession = auth.getAppSession(code);\n if (\n latestSession?.accessToken &&\n !isExpired(latestSession.accessTokenExpiresAt, refreshSkewMs)\n ) {\n return of(latestSession.accessToken);\n }\n\n if (\n !latestSession?.refreshToken ||\n isExpired(latestSession.refreshTokenExpiresAt)\n ) {\n return relaunch$().pipe(map((tokens) => tokens.accessToken));\n }\n\n return refreshTokens$(\n buildRefreshContext('application', code),\n latestSession.refreshToken,\n ).pipe(\n map((tokens) => tokens.accessToken),\n catchError(() => relaunch$().pipe(map((tokens) => tokens.accessToken))),\n );\n };\n\n const initialToken$ = !shouldAttachAuth\n ? of(null)\n : resolved.scope === 'application'\n ? resolveAppTokenBeforeRequest$()\n : resolveGatewayTokenBeforeRequest$();\n\n return initialToken$.pipe(\n switchMap((requestAccessToken) =>\n next(prepareRequest(req, requestAccessToken, false, baseUrl)).pipe(\n catchError((error) => {\n if (error?.status !== 401 || !shouldAttachAuth || alreadyRetried) {\n return throwError(() => error);\n }\n\n // If a concurrent flow already rotated the token while this request was\n // in flight, just retry with the freshest token - do NOT trigger another\n // refresh against the backend.\n const currentAccessToken =\n resolved.scope === 'application' && resolved.applicationCode\n ? (auth.getAppSession(resolved.applicationCode)?.accessToken ??\n null)\n : auth.token();\n if (currentAccessToken && currentAccessToken !== requestAccessToken) {\n return next(prepareRequest(req, currentAccessToken, true, baseUrl));\n }\n\n const isApp =\n resolved.scope === 'application' && !!resolved.applicationCode;\n const latestAppSession = isApp\n ? auth.getAppSession(resolved.applicationCode!)\n : null;\n const latestRefreshToken = isApp\n ? (latestAppSession?.refreshToken ?? null)\n : auth.refreshToken();\n const latestRefreshTokenExpiresAt = isApp\n ? (latestAppSession?.refreshTokenExpiresAt ?? null)\n : auth.refreshTokenExpiresAt();\n const canRefreshNow =\n !!latestRefreshToken && !isExpired(latestRefreshTokenExpiresAt);\n\n const tokens$: Observable<AuthTokens> =\n !canRefreshNow || !latestRefreshToken\n ? isApp\n ? relaunch$()\n : (auth.logout(), throwError(() => error))\n : refreshTokens$(buildRefreshContext(), latestRefreshToken).pipe(\n catchError((refreshError) => {\n if (isApp) {\n return relaunch$();\n }\n auth.logout();\n return throwError(() => refreshError);\n }),\n );\n\n return tokens$.pipe(\n switchMap((tokens) =>\n next(prepareRequest(req, tokens.accessToken, true, baseUrl)),\n ),\n );\n }),\n ),\n ),\n );\n};\n","import { HttpInterceptorFn } from '@angular/common/http';\n\nconst CORRELATION_ID_HEADER = 'X-Correlation-ID';\n\nfunction generateCorrelationId(): string {\n if (typeof crypto !== 'undefined' && crypto.randomUUID) {\n return crypto.randomUUID();\n }\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (char) => {\n const random = (Math.random() * 16) | 0;\n const value = char === 'x' ? random : (random & 0x3) | 0x8;\n return value.toString(16);\n });\n}\n\nexport const correlationIdInterceptor: HttpInterceptorFn = (req, next) => {\n if (req.headers.has(CORRELATION_ID_HEADER)) {\n return next(req);\n }\n return next(\n req.clone({\n setHeaders: {\n [CORRELATION_ID_HEADER]: generateCorrelationId(),\n },\n }),\n );\n};\n","import { HttpInterceptorFn, HttpRequest } from '@angular/common/http';\n\nexport interface IdempotencyInterceptorOptions {\n excludedPaths?: string[];\n methods?: string[];\n headerName?: string;\n}\n\nconst DEFAULT_EXCLUDED_PATHS = [\n '/health',\n '/auth/login',\n '/auth/refresh',\n '/auth/logout',\n '/auth/register',\n '/auth/sso',\n '/swagger',\n];\n\nconst DEFAULT_METHODS = ['POST', 'PUT', 'PATCH', 'DELETE'];\n\nconst DEFAULT_HEADER = 'X-Idempotency-Key';\n\nfunction generateUUID(): string {\n if (typeof crypto !== 'undefined' && crypto.randomUUID) {\n return crypto.randomUUID();\n }\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n const r = (Math.random() * 16) | 0;\n const v = c === 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n}\n\nexport function createIdempotencyInterceptor(\n options?: IdempotencyInterceptorOptions,\n): HttpInterceptorFn {\n const excludedPaths = options?.excludedPaths ?? DEFAULT_EXCLUDED_PATHS;\n const methods = (options?.methods ?? DEFAULT_METHODS).map((m) =>\n m.toUpperCase(),\n );\n const header = options?.headerName ?? DEFAULT_HEADER;\n\n const requiresKey = (req: HttpRequest<unknown>): boolean => {\n if (!methods.includes(req.method.toUpperCase())) return false;\n if (req.url.includes('/assets/')) return false;\n if (excludedPaths.some((path) => req.url.includes(path))) return false;\n return true;\n };\n\n return (req, next) => {\n if (!requiresKey(req) || req.headers.has(header)) {\n return next(req);\n }\n return next(\n req.clone({\n setHeaders: { [header]: generateUUID() },\n }),\n );\n };\n}\n\nexport const idempotencyInterceptor: HttpInterceptorFn =\n createIdempotencyInterceptor();\n","import { HttpInterceptorFn } from '@angular/common/http';\n\nexport interface LanguageInterceptorOptions {\n getLanguage: () => string | null | undefined;\n headerName?: string;\n}\n\nexport function createLanguageInterceptor(\n options: LanguageInterceptorOptions,\n): HttpInterceptorFn {\n const header = options.headerName ?? 'Accept-Language';\n return (req, next) => {\n const lang = options.getLanguage();\n if (!lang) {\n return next(req);\n }\n return next(\n req.clone({\n setHeaders: { [header]: lang },\n }),\n );\n };\n}\n","import { HttpInterceptorFn } from '@angular/common/http';\nimport { inject } from '@angular/core';\nimport { tap } from 'rxjs';\nimport { ToastService } from '@masterteam/components/toast';\nimport { GatewayAuthFacade } from '../gateway-auth.facade';\nimport { isExpired } from '../gateway-auth.utils';\nimport { isGatewayAuthRequestUrl } from '../gateway-auth.interceptor';\n\nexport interface MessageInterceptorOptions {\n silentEndpoints?: string[];\n mutatingMethods?: string[];\n noMessageHeader?: string;\n}\n\nconst DEFAULT_MUTATING_METHODS = ['POST', 'PUT', 'PATCH', 'DELETE'];\n\nconst DEFAULT_SILENT_ENDPOINTS = [\n 'api/dashboards/chart',\n 'api/home/recent/visit',\n 'api/fetch/query',\n 'api/workcenter/runtime',\n 'api/search',\n 'api/process-form-load',\n '/workspace-record-action-states',\n '/schedule/read',\n '/metadata/modules/properties',\n '/auth/logout',\n '/auth/login',\n '/auth/2fa',\n '/auth/sso',\n '/schedule/query',\n '/context/resolve',\n 'read-state',\n 'process-submit/validate',\n 'api/formulas/validate',\n];\n\nconst DEFAULT_NO_MESSAGE_HEADER = 'noMessage';\n\nexport function createMessageInterceptor(\n options?: MessageInterceptorOptions,\n): HttpInterceptorFn {\n const silentEndpoints = options?.silentEndpoints ?? DEFAULT_SILENT_ENDPOINTS;\n const mutating = (options?.mutatingMethods ?? DEFAULT_MUTATING_METHODS).map(\n (m) => m.toUpperCase(),\n );\n const noMessageHeader = options?.noMessageHeader ?? DEFAULT_NO_MESSAGE_HEADER;\n\n return (req, next) => {\n const auth = inject(GatewayAuthFacade);\n const toast = inject(ToastService);\n\n return next(req).pipe(\n tap({\n next: (res) => {\n const body = (res as { body?: { message?: string } } | undefined)\n ?.body;\n if (!body?.message) return;\n if (req.headers.get(noMessageHeader) === 'true') return;\n if (!mutating.includes(req.method.toUpperCase())) return;\n if (silentEndpoints.some((endpoint) => req.url.includes(endpoint)))\n return;\n toast.success(body.message);\n },\n error: (error) => {\n const errorMessage =\n error?.error?.message || error?.error?.Message || '';\n const errorCode =\n error?.status || error?.error?.status || error?.error?.code;\n\n const showError = (message: string) => {\n if (message) toast.error(message);\n };\n\n const canRefreshGateway =\n !!auth.refreshToken() && !isExpired(auth.refreshTokenExpiresAt());\n const activeCode = auth.activeApplicationCode();\n const appSession = activeCode ? auth.getAppSession(activeCode) : null;\n const canRefreshApp =\n !!appSession?.refreshToken &&\n !isExpired(appSession.refreshTokenExpiresAt);\n\n switch (errorCode) {\n case 401:\n if (\n !isGatewayAuthRequestUrl(req.url) &&\n (canRefreshGateway || canRefreshApp)\n ) {\n break;\n }\n auth.logout();\n showError(errorMessage);\n break;\n\n case 404:\n if (req?.responseType !== 'blob') {\n showError(errorMessage);\n }\n break;\n\n case 400: {\n const validationErrors = error?.error?.errors;\n if (validationErrors && typeof validationErrors === 'object') {\n const messages = Object.values(validationErrors)\n .flat()\n .filter((m): m is string => typeof m === 'string');\n messages.forEach(showError);\n } else {\n showError(errorMessage);\n }\n break;\n }\n\n case 402:\n case 403:\n case 422:\n case 500:\n showError(errorMessage);\n break;\n\n default:\n if (req.headers.get(noMessageHeader) !== 'true') {\n showError(errorMessage);\n }\n break;\n }\n },\n }),\n );\n };\n}\n\nexport const messageInterceptor: HttpInterceptorFn = createMessageInterceptor();\n","import { HttpInterceptorFn, HttpResponse } from '@angular/common/http';\nimport { tap } from 'rxjs';\n\nexport interface CacheSessionInterceptorOptions {\n onCacheSession: (cacheSession: string) => void;\n field?: string;\n}\n\nexport function createCacheSessionInterceptor(\n options: CacheSessionInterceptorOptions,\n): HttpInterceptorFn {\n const field = options.field ?? 'cacheSession';\n return (req, next) =>\n next(req).pipe(\n tap((event) => {\n if (!(event instanceof HttpResponse) || !event.body) return;\n const body = event.body as Record<string, unknown>;\n const value = body[field];\n if (typeof value === 'string' && value) {\n options.onCacheSession(value);\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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"}