{"version":3,"file":"login-CLVuxqpM.js","sources":["../../src/composables/login.ts"],"sourcesContent":["import axios from 'axios';\nimport { type SendEvent, useEventHub } from 'composables/eventHub';\nimport { getIsIds } from 'utils/idsTools';\nimport { computed, inject, ref } from 'vue';\nimport type { VueCookies } from 'vue-cookies';\n\nimport type { FischerPlugin, SsrCookiesObject } from '@/lib/fischerPlugin';\nimport parseTokenData from '@/utils/parseTokenData';\n\nimport { useCookies } from './cookies';\nimport { useFischer } from './fischerPlugin';\n\nconst cookieName = 'site-login-init';\nexport const usernameCookie = 'login-dialog-user';\nexport const loginDialogCookies = 'login-dialog';\nexport const loggedInMessage = 'logged-in';\nexport const allowedStateChars =\n 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_.-'; // NOTE: leave the minus in last place, so this can be used as a character class\n\nexport const siteLoginDebugKey = 'site-login-debug';\nexport const loginChannel = 'site-login';\n\nexport const createId = () => {\n const stateIdValues = new Uint32Array(16);\n // @ts-ignore\n const crypto = window.crypto || window.msCrypto;\n crypto.getRandomValues(stateIdValues);\n return Array.from(stateIdValues)\n .map((uint) => allowedStateChars.charAt(uint % allowedStateChars.length))\n .join('');\n};\n\nconst base64urlToBase64 = (base64url: string) => base64url.replace(/-/g, '+').replace(/_/g, '/');\n\nexport const isNonceError = (idToken: string, originalNonce: string) => {\n try {\n const [, dataBase64] = idToken.split('.');\n const dataJson = atob(base64urlToBase64(dataBase64));\n const { nonce } = JSON.parse(dataJson);\n return nonce !== originalNonce;\n } catch (error) {\n return true;\n }\n};\n\nexport type KeyedContents = Record;\n\ntype LogDebug = (...args: any[]) => void;\ntype GetCookies = () => KeyedContents;\n\nexport const getAuthorizationUrl = (\n queryParams: KeyedContents = {},\n hashParams: KeyedContents = {},\n baseUrl: string = `${import.meta.env.VITE_OPENID_SERVICES}authorizationserver/oauth/authorize`,\n) => {\n const merged = new URLSearchParams();\n [queryParams, hashParams].forEach((params) =>\n Object.entries(params).forEach(([key, value]) => merged.set(key, String(value))),\n );\n const separator = Object.keys(queryParams).length ? '?' : '#';\n return `${baseUrl.split('?')[0]}${separator}${merged}`;\n};\n\nexport const logDebugFunction: LogDebug = (isDebug: boolean, ...params: any[]) => {\n if (isDebug) {\n console.info(...params);\n }\n};\n\nexport const getCookiesFunction = (vueCookies: VueCookies, logDebug: LogDebug) => {\n const cookies = vueCookies.get(cookieName) || {};\n logDebug('get cookies', cookies?.time);\n return cookies;\n};\n\nexport const setCookiesFunction = async (\n fischer: FischerPlugin,\n logDebug: LogDebug,\n vueCookies: VueCookies,\n getCookies: GetCookies,\n criticalLoginFailure: (reason: string) => void,\n cookies: KeyedContents,\n) => {\n const time = Date.now();\n logDebug('setting cookies', cookieName, time);\n\n cookies.time = time;\n\n vueCookies.set(\n cookieName,\n cookies,\n '1h',\n '/',\n IS_SHOWROOM ? undefined : fischer.hostname(),\n fischer.isSecureConnection(),\n 'Lax',\n );\n\n if (getCookies().time !== time) {\n console.info('cookie was not stored, waiting a moment');\n await new Promise((resolve) => setTimeout(resolve, 500));\n\n if (getCookies().time !== time) {\n criticalLoginFailure('Failed to set cookies');\n return false;\n }\n }\n\n logDebug('cookies set');\n return true;\n};\n\nexport const handleDebugFlagFunction = (fischer: FischerPlugin): boolean => {\n if (\n fischer.query(siteLoginDebugKey) ||\n new RegExp(`(?:#|&)${siteLoginDebugKey}=true(?:&|$)`).test(window.location.hash)\n ) {\n // @ts-ignore\n window.activateLoginDebug?.(true);\n return true;\n }\n return false;\n};\n\nexport const postAccessTokeninSessionFunction = async (\n logDebug: LogDebug,\n sendEvent: SendEvent,\n accessToken: string,\n idToken: string,\n): Promise => {\n try {\n logDebug('posting token to sitecore...');\n const result = await axios.post('/webapi/shop/userapi/Login', {\n User: {\n AccessToken: accessToken,\n IdToken: idToken,\n IsIdsSession: getIsIds(),\n },\n });\n const successPage = result.data?.LoginSuccessPage;\n logDebug('posted token to sitecore', successPage);\n\n // send eventHub tracking\n await sendEvent('login', {\n userId: parseTokenData(idToken).email,\n });\n\n return successPage;\n } catch (error) {\n throw new Error();\n }\n};\n\nexport const goToLoginFunction = (\n logDebug: LogDebug,\n clientId: string,\n authorizeRedirect: string | null,\n redirectUri: string | undefined,\n state: string,\n nonce: string,\n scope: string,\n responseType: string,\n) => {\n logDebug('initializing authorization');\n try {\n const params: SsrCookiesObject = {\n response_type: responseType,\n client_id: clientId,\n redirect_uri: redirectUri || String(window.location).split('#')[0],\n scope,\n state,\n nonce,\n };\n\n if (authorizeRedirect) {\n const searchParams = new URLSearchParams(authorizeRedirect.replace(/^.*\\?/, ''));\n searchParams.forEach((key, value) => {\n if (!params[key]) {\n params[key] = value;\n }\n });\n }\n\n window.location.href = getAuthorizationUrl(params);\n } catch (error) {\n console.error('SSO login failed', error);\n }\n};\n\nexport const setDevTokenFunction = (\n vueCookies: VueCookies,\n fischer: FischerPlugin,\n accessToken: string,\n idToken: string,\n) => {\n if (!IS_SHOWROOM) {\n return;\n }\n const { exp }: { exp: number } = parseTokenData(idToken);\n const ttl = exp - Date.now() / 1000;\n vueCookies.set('IdToken', idToken, ttl, undefined, undefined, undefined, 'Strict');\n fischer.user.setAccessToken(accessToken, String(ttl));\n};\n\nexport const useLogin = () => {\n const fischer = useFischer();\n const isDebug = ref(true); // false);\n const hasCriticalLoginFailure = ref(false);\n const { cookies: vueCookies } = useCookies();\n const { sendEvent } = useEventHub();\n\n const fields = inject<{\n apiKey?: {\n value?: string;\n };\n }>('fields');\n\n const criticalLoginFailure = (...args: any[]): void => {\n console.error(...args);\n hasCriticalLoginFailure.value = true;\n };\n\n const getAuthorizeRedirect = (query?: string) => {\n if (!query) {\n return null;\n }\n const withoutStateAndNonce = query\n .replace(/(\\?|&)state=[^&]*/, '')\n .replace(/(\\?|&)nonce=[^&]*/, '');\n return `${withoutStateAndNonce}&state=retry`;\n };\n\n const authorizeRedirect = computed(() => {\n const query = fischer.query('authorize_redirect');\n return getAuthorizeRedirect(query);\n });\n\n const logDebug: LogDebug = (...args: any[]): void => {\n if (isDebug.value) {\n console.info(...args);\n }\n };\n\n const getCookies = () => getCookiesFunction(vueCookies, logDebug);\n\n const setCookies = async (cookies: KeyedContents) =>\n setCookiesFunction(fischer, logDebug, vueCookies, getCookies, criticalLoginFailure, cookies);\n\n const postAccessTokenInSession = async (\n accessToken: string,\n idToken: string,\n ): Promise => {\n try {\n return await postAccessTokeninSessionFunction(logDebug, sendEvent, accessToken, idToken);\n } catch (error) {\n criticalLoginFailure('Could not post access token', error);\n throw error;\n }\n };\n\n const getClientId = () => fischer.baseSiteId().toLowerCase();\n\n const goToLoginPage = (\n redirectUri: string | undefined,\n state: string,\n nonce: string,\n scope: string,\n responseType: string,\n ) =>\n goToLoginFunction(\n logDebug,\n getClientId(),\n authorizeRedirect.value,\n redirectUri,\n state,\n nonce,\n scope,\n responseType,\n );\n\n const clearOldStates = (cookies: Record) => {\n const maxTime = new Date().getTime();\n const keys = Object.keys(cookies);\n const allLoginKeysWithTimes: [validUntil: number, key: string][] = [];\n const maxKeys = 10; // cookies are limited to 4k in size, limit to 5 attempts (states + nonce)\n keys.forEach((key) => {\n if (/^(?:state|nonce)-/.test(key)) {\n const { validUntil } = cookies[key];\n if (!(validUntil > maxTime)) {\n console.info('Removing outdated cookie', validUntil);\n\n delete cookies[key];\n } else {\n allLoginKeysWithTimes.push([validUntil, key]);\n }\n }\n });\n if (allLoginKeysWithTimes.length > maxKeys) {\n console.info('Max login cookies exceeded');\n allLoginKeysWithTimes.sort((a, b) => b[0] - a[0]);\n\n allLoginKeysWithTimes.slice(maxKeys).forEach((item) => delete cookies[item[1]]);\n }\n };\n\n const createTokenState = async (formPage?: string) => {\n const tokenStateId = createId();\n const tokenNonce = createId();\n const redirect = formPage || fischer.query('redirect') || fischer.uri();\n const cartId = fischer.cartId();\n const validUntil = new Date().getTime() + 60 * 60 * 5 * 10000;\n const state = { redirect, cartId, validUntil };\n\n const cookies = getCookies();\n clearOldStates(cookies);\n cookies[`state-${tokenStateId}`] = state;\n cookies[`nonce-${tokenStateId}`] = { value: tokenNonce, validUntil };\n if (!(await setCookies(cookies))) {\n throw new Error('Could not create token state');\n }\n\n return { tokenStateId, tokenNonce };\n };\n\n const getAuthParams = async (customFormPage?: boolean) => {\n const loginPage = fischer.pages.login().url;\n const redirectUri = loginPage\n ? `${fischer.hostUrlBase()}${loginPage}`\n : String(window.location).split('#')[0];\n logDebug('redirecting to loginFormPage');\n const clientId = fischer.baseSiteId().toLowerCase();\n const brand = customFormPage ? `dialog:${window.location.pathname}` : clientId.split('-')[0];\n const { tokenStateId: state, tokenNonce: nonce } = await createTokenState(\n customFormPage ? brand : undefined,\n );\n const siteLanguage = fischer.siteLanguage();\n const queryParams = {\n brand,\n ui_locales: siteLanguage,\n api_key: fields?.apiKey?.value || '',\n };\n const hashParams = {\n response_type: 'id_token token',\n scope: 'openid',\n redirect_uri: redirectUri,\n state,\n nonce,\n brand,\n client_id: clientId,\n ui_hint: siteLanguage,\n };\n if (isDebug.value) {\n // @ts-ignore\n hashParams[siteLoginDebugKey] = true;\n }\n\n return { queryParams, hashParams, brand };\n };\n\n const initializeAuthorization = async (customFormPage?: boolean) => {\n const { queryParams, hashParams, brand } = await getAuthParams(customFormPage);\n const newLocation = getAuthorizationUrl(queryParams, hashParams);\n logDebug('new location', newLocation);\n if (customFormPage) {\n logDebug('setting login-dialog', brand);\n vueCookies.set(loginDialogCookies, brand);\n }\n if (fischer.query('debug-no-redirect')) {\n console.info('debug-no-redirect');\n return;\n }\n window.location.href = newLocation;\n };\n\n const setDevToken = (accessToken: string, idToken: string) =>\n setDevTokenFunction(vueCookies, fischer, accessToken, idToken);\n\n const watchTabLogins = (callback: () => void): BroadcastChannel | null => {\n try {\n const bc = new BroadcastChannel(loginChannel);\n bc.onmessage = (event) => {\n const [type] = event?.data || [];\n if (type === loggedInMessage) {\n callback();\n } else {\n console.error('unknown login bc event');\n }\n };\n logDebug('created login bc');\n return bc;\n } catch (error) {\n console.error('Could not create login bc', error);\n return null;\n }\n };\n\n const notifyLogin = () => {\n try {\n const bc = new BroadcastChannel(loginChannel);\n bc?.postMessage([loggedInMessage]);\n logDebug('notified login');\n } catch (error) {\n console.error('Could not notify login', error);\n }\n };\n\n return {\n isDebug,\n hasCriticalLoginFailure,\n logDebug,\n postAccessTokenInSession,\n initializeAuthorization,\n authorizeRedirect,\n getAuthorizeRedirect,\n getCookies,\n setCookies,\n setDevToken,\n criticalLoginFailure,\n goToLoginPage,\n watchTabLogins,\n notifyLogin,\n getAuthParams,\n getAuthorizationUrl,\n };\n};\n"],"names":["cookieName","usernameCookie","loginDialogCookies","loggedInMessage","allowedStateChars","siteLoginDebugKey","loginChannel","createId","stateIdValues","uint","base64urlToBase64","base64url","isNonceError","idToken","originalNonce","dataBase64","dataJson","nonce","getAuthorizationUrl","queryParams","hashParams","baseUrl","merged","params","key","value","separator","getCookiesFunction","vueCookies","logDebug","cookies","setCookiesFunction","fischer","getCookies","criticalLoginFailure","time","resolve","handleDebugFlagFunction","_a","postAccessTokeninSessionFunction","sendEvent","accessToken","successPage","axios","getIsIds","parseTokenData","goToLoginFunction","clientId","authorizeRedirect","redirectUri","state","scope","responseType","error","setDevTokenFunction","useLogin","useFischer","isDebug","ref","hasCriticalLoginFailure","useCookies","useEventHub","fields","inject","args","getAuthorizeRedirect","query","computed","setCookies","postAccessTokenInSession","getClientId","goToLoginPage","clearOldStates","maxTime","keys","allLoginKeysWithTimes","maxKeys","validUntil","a","b","item","createTokenState","formPage","tokenStateId","tokenNonce","redirect","cartId","getAuthParams","customFormPage","loginPage","brand","siteLanguage","newLocation","callback","bc","event","type"],"mappings":"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"}