{"version":3,"file":"login-CSe5ANA_.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';\nimport { useStore } from 'vuex';\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<string, string | number | null | undefined>;\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<string> => {\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<boolean>(true); // false);\n  const hasCriticalLoginFailure = ref<boolean>(false);\n  const { cookies: vueCookies } = useCookies();\n  const { sendEvent } = useEventHub();\n  const store = useStore();\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<string | null>(() => {\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<string> => {\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 isSpecialPage = (url: string): boolean =>\n    [\n      fischer.pages.registration()?.url,\n      fischer.pages.registrationSuccess()?.url,\n      fischer.pages.logout()?.url,\n      fischer.pages.logoutSuccess()?.url,\n      fischer.pages.login()?.url,\n      fischer.pages.loginSuccessPage()?.url,\n      fischer.pages.activation()?.url,\n      fischer.pages.passwordForgotten()?.url,\n      fischer.pages.assistedService()?.url,\n    ].includes(url);\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<string, { validUntil: number }>) => {\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, data?: 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: {\n      redirect: string;\n      cartId: string;\n      validUntil: number;\n      data?: string;\n    } = { redirect, cartId, validUntil };\n    if (data) {\n      state.data = data;\n    }\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, dataParam?: string) => {\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 =\n      fischer.settings()?.shop?.clientIdOverwrite || fischer.baseSiteId().toLowerCase();\n\n    let pathname = window.location.pathname;\n    if (store.getters['navigation/triggerLoginForceStart'] || isSpecialPage(pathname)) {\n      pathname = `/${fischer.siteLanguage().toLowerCase()}`;\n    }\n\n    let data = dataParam;\n    if (!data) {\n      const brand = fischer.query('brand');\n      if (brand) {\n        data = /@(.*)/.exec(brand)?.[1];\n      }\n    }\n\n    const brand = customFormPage\n      ? `dialog:${pathname}${data ? '@' + data : ''}`\n      : clientId.split('-')[0];\n    const { tokenStateId: state, tokenNonce: nonce } = await createTokenState(\n      customFormPage ? brand : undefined,\n      data,\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, data?: string) => {\n    if (fischer.app.isEditMode()) {\n      console.debug('not logging in because of edit mode');\n      return;\n    }\n    const { queryParams, hashParams, brand } = await getAuthParams(customFormPage, data);\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    isSpecialPage,\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","store","useStore","fields","inject","args","getAuthorizeRedirect","query","computed","setCookies","postAccessTokenInSession","isSpecialPage","url","_b","_c","_d","_e","_f","_g","_h","_i","getClientId","goToLoginPage","clearOldStates","maxTime","keys","allLoginKeysWithTimes","maxKeys","validUntil","a","b","item","createTokenState","formPage","data","tokenStateId","tokenNonce","redirect","cartId","getAuthParams","customFormPage","dataParam","loginPage","pathname","brand","siteLanguage","newLocation","callback","bc","event","type"],"mappings":"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"}