{"version":3,"file":"ebondu-angular2-keycloak.mjs","sources":["../../../../projects/ebondu/angular-keycloak/src/lib/angular-keycloak.service.ts","../../../../projects/ebondu/angular-keycloak/src/lib/angular-keycloak.module.ts","../../../../projects/ebondu/angular-keycloak/src/lib/model/keycloak-config.model.ts","../../../../projects/ebondu/angular-keycloak/src/lib/adapter/keycloak.adapter.default.ts","../../../../projects/ebondu/angular-keycloak/src/lib/storage/keycloak.storage.local.ts","../../../../projects/ebondu/angular-keycloak/src/lib/util/keycloak.utils.URIParser.ts","../../../../projects/ebondu/angular-keycloak/src/lib/util/keycloak.utils.token.ts","../../../../projects/ebondu/angular-keycloak/src/lib/adapter/keycloak.adapter.cordova.ts","../../../../projects/ebondu/angular-keycloak/src/lib/storage/keycloak.storage.cookie.ts","../../../../projects/ebondu/angular-keycloak/src/lib/util/keycloak.utils.silent-check-login-iframe.ts","../../../../projects/ebondu/angular-keycloak/src/lib/util/keycloak.utils.check-3pCookies-iframe.ts","../../../../projects/ebondu/angular-keycloak/src/lib/service/keycloak.service.ts","../../../../projects/ebondu/angular-keycloak/src/lib/interceptor/keycloak.interceptor.ts","../../../../projects/ebondu/angular-keycloak/src/lib/util/keycloak.utils.check-login-iframe.ts","../../../../projects/ebondu/angular-keycloak/src/public_api.ts","../../../../projects/ebondu/angular-keycloak/src/ebondu-angular2-keycloak.ts"],"sourcesContent":["/*\n * Copyright 2018 ebondu and/or its affiliates\n * and other contributors as indicated by the @author tags.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Injectable } from '@angular/core';\n\n@Injectable({\n  providedIn: 'root'\n})\nexport class AngularKeycloakService {\n\n  constructor() {\n  }\n}\n","/*\n * Copyright 2018 ebondu and/or its affiliates\n * and other contributors as indicated by the @author tags.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { NgModule } from '@angular/core';\n\n@NgModule({\n  imports: []\n})\nexport class AngularKeycloakModule {\n}\n","/*\n * Copyright 2022 ebondu and/or its affiliates\n * and other contributors as indicated by the @author tags.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { InjectionToken } from '@angular/core';\n\nexport const KEYCLOAK_JSON_PATH = new InjectionToken<string>('keycloakJsonPath');\nexport const KEYCLOAK_INIT_OPTIONS = new InjectionToken<KeycloakInitOptions>('keycloakOptions');\nexport const KEYCLOAK_CONF = new InjectionToken<KeycloakConfiguration>('keycloakConfiguration');\n\nexport enum KeycloakAdapterName {CORDOVA = 'cordova', DEFAULT = 'default', ANY = 'any'}\n\nexport enum KeycloakOnLoad {LOGIN_REQUIRED = 'login-required', CHECK_SSO = 'check-sso'}\n\nexport enum KeycloakResponseMode {QUERY = 'query', FRAGMENT = 'fragment'}\n\nexport enum KeycloakResponseType {CODE = 'code', ID_TOKEN = 'id_token token', CODE_ID_TOKEN = 'code id_token token'}\n\nexport enum KeycloakFlow {STANDARD = 'standard', IMPLICIT = 'implicit', HYBRID = 'hybrid'}\n\nexport enum LogoutMethod {POST = 'post', GET = 'get'}\n\n\nexport interface KeycloakInitOptions {\n\n  useNonce?: boolean;\n\n  /**\n   * Allows to use different adapter:\n   *\n   * - {string} default - using browser api for redirects\n   * - {string} cordova - using cordova plugins\n   * - {function} - allows to provide custom function as adapter.\n   */\n  adapter?: KeycloakAdapterName;\n\n  /**\n   * Specifies an action to do on load.\n   */\n  onLoad?: KeycloakOnLoad;\n\n  /**\n   * Set an initial value for the token.\n   */\n  token?: string;\n\n  /**\n   * Set an initial value for the refresh token.\n   */\n  refreshToken?: string;\n\n  /**\n   * Set an initial value for the id token (only together with `token` or\n   * `refreshToken`).\n   */\n  idToken?: string;\n\n  /**\n   * Set an initial value for skew between local time and Keycloak server in\n   * seconds (only together with `token` or `refreshToken`).\n   */\n  timeSkew?: number;\n\n  /**\n   * Set to enable/disable monitoring login state.\n   * @default true\n   */\n  checkLoginIframe?: boolean;\n\n  /**\n   * Set the interval to check login state (in seconds).\n   * @default 5\n   */\n  checkLoginIframeInterval?: number;\n\n  /**\n   * Set the redirect uri to silent check login state.\n   */\n  silentCheckSsoRedirectUri?: string;\n\n  silentCheckSsoFallback?: boolean;\n\n  /**\n   * Set the OpenID Connect response mode to send to Keycloak upon login.\n   * @default fragment After successful authentication Keycloak will redirect\n   *                   to JavaScript application with OpenID Connect parameters\n   *                   added in URL fragment. This is generally safer and\n   *                   recommended over query.\n   */\n  responseMode?: KeycloakResponseMode;\n\n  /**\n   * Set the OpenID Connect flow.\n   * @default standard\n   */\n  flow?: KeycloakFlow;\n\n  pkceMethod?: string;\n\n  logoutMethod?: LogoutMethod;\n\n  scope?: string;\n}\n\nexport interface KeycloakLoginOptions {\n  /**\n   * Undocumented.\n   */\n  scope?: string;\n\n  /**\n   * Specifies the uri to redirect to after login.\n   */\n  redirectUri?: string;\n\n  /**\n   * By default the login screen is displayed if the user is not logged into\n   * Keycloak. To only authenticate to the application if the user is already\n   * logged in and not display the login page if the user is not logged in, set\n   * this option to `'none'`. To always require re-authentication and ignore\n   * SSO, set this option to `'login'`.\n   */\n  prompt?: 'none' | 'login';\n\n  /**\n   * If value is `'register'` then user is redirected to registration page,\n   * otherwise to login page.\n   */\n  action?: 'register';\n\n  /**\n   * Used just if user is already authenticated. Specifies maximum time since\n   * the authentication of user happened. If user is already authenticated for\n   * longer time than `'maxAge'`, the SSO is ignored and he will need to\n   * authenticate again.\n   */\n  maxAge?: number;\n\n  /**\n   * Used to pre-fill the username/email field on the login form.\n   */\n  loginHint?: string;\n\n  /**\n   * Used to tell Keycloak which IDP the user wants to authenticate with.\n   */\n  idpHint?: string;\n\n  /**\n   * Sets the 'ui_locales' query param in compliance with section 3.1.2.1\n   * of the OIDC 1.0 specification.\n   */\n  locale?: string;\n\n  /**\n   * Specifies the desired Keycloak locale for the UI.  This differs from\n   * the locale param in that it tells the Keycloak server to set a cookie and update\n   * the user's profile to a new preferred locale.\n   */\n  kcLocale?: string;\n}\n\nexport interface KeycloakConfiguration {\n  realm: string;\n  authServerUrl: string;\n  clientId: string;\n  clientSecret?: string;\n}\n","/*\n * Copyright 2018 ebondu and/or its affiliates\n * and other contributors as indicated by the @author tags.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n\nimport { KeycloakService } from '../service/keycloak.service';\n\n/**\n * Default adapter for web browsers\n */\nexport class DefaultAdapter {\n\n  constructor(private keycloak: KeycloakService) {\n  }\n\n  public login(options: any) {\n    window.location.href = this.keycloak.createLoginUrl(options);\n  }\n\n  public logout(options: any) {\n    window.location.href = this.keycloak.createLogoutUrl(options);\n  }\n\n  public register(options: any) {\n    window.location.href = this.keycloak.createRegisterUrl(options);\n  }\n\n  public accountManagement() {\n    window.location.href = this.keycloak.createAccountUrl({});\n  }\n\n  public passwordManagement() {\n    window.location.href = this.keycloak.createChangePasswordUrl({});\n  }\n\n  public redirectUri(options: any, encodeHash: boolean): string {\n\n    if (arguments.length === 1) {\n      encodeHash = true;\n    }\n\n    if (options && options.redirectUri) {\n      return options.redirectUri;\n    } else {\n      let redirectUri = location.href;\n      if (location.hash && encodeHash) {\n        redirectUri = redirectUri.substring(0, location.href.indexOf('#'));\n        redirectUri += (redirectUri.indexOf('?') === -1 ? '?' : '&') + 'redirect_fragment=' +\n          encodeURIComponent(location.hash.substring(1));\n      }\n      return redirectUri;\n    }\n  }\n}\n","/*\n * Copyright 2018 ebondu and/or its affiliates\n * and other contributors as indicated by the @author tags.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * To store Keycloak objects like tokens using a localStorage.\n */\nexport class LocalStorage {\n\n  public clearExpired() {\n    const time = new Date().getTime();\n    for (let i = 1; i <= localStorage.length; i++) {\n      const key = localStorage.key(i);\n      if (key && key.indexOf('kc-callback-') === 0) {\n        const value = localStorage.getItem(key);\n        if (value) {\n          try {\n            const expires = JSON.parse(value).expires;\n            if (!expires || expires < time) {\n              localStorage.removeItem(key);\n            }\n          } catch (err) {\n            localStorage.removeItem(key);\n          }\n        }\n      }\n    }\n  }\n\n  public get(state: string) {\n    if (!state) {\n      return;\n    }\n\n    const key = 'kc-callback-' + state;\n    let value = localStorage.getItem(key);\n    if (value) {\n      localStorage.removeItem(key);\n      value = JSON.parse(value);\n    }\n\n    this.clearExpired();\n    return value;\n  }\n\n  public add(state: any) {\n    this.clearExpired();\n\n    const key = 'kc-callback-' + state.state;\n    state.expires = new Date().getTime() + (60 * 60 * 1000);\n    localStorage.setItem(key, JSON.stringify(state));\n  }\n}\n","/*\n * Copyright 2018 ebondu and/or its affiliates\n * and other contributors as indicated by the @author tags.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * URI parser.\n */\nexport class URIParser {\n\n  static initialParse(uriToParse: string, responseMode: string) {\n    let baseUri: string;\n    let queryString: string;\n    let fragmentString: string;\n\n    const questionMarkIndex = uriToParse.indexOf('?');\n    let fragmentIndex = uriToParse.indexOf('#', questionMarkIndex + 1);\n    if (questionMarkIndex === -1 && fragmentIndex === -1) {\n      baseUri = uriToParse;\n    } else if (questionMarkIndex !== -1) {\n      baseUri = uriToParse.substring(0, questionMarkIndex);\n      queryString = uriToParse.substring(questionMarkIndex + 1);\n      if (fragmentIndex !== -1) {\n        fragmentIndex = queryString.indexOf('#');\n        fragmentString = queryString.substring(fragmentIndex + 1);\n        queryString = queryString.substring(0, fragmentIndex);\n      }\n    } else {\n      baseUri = uriToParse.substring(0, fragmentIndex);\n      fragmentString = uriToParse.substring(fragmentIndex + 1);\n    }\n\n    return {baseUri: baseUri, queryString: queryString, fragmentString: fragmentString};\n  }\n\n  static parseParams(paramString: string) {\n    const result: any = {};\n    const params = paramString.split('&');\n    for (let i = 0; i < params.length; i++) {\n      const p = params[i].split('=');\n      const paramName = decodeURIComponent(p[0]);\n      const paramValue = decodeURIComponent(p[1]);\n      result[paramName] = paramValue;\n    }\n    return result;\n  }\n\n  static handleQueryParam(paramName: string, paramValue: string, oauth: any): boolean {\n    const supportedOAuthParams = ['code', 'state', 'error', 'session_state', 'error_description'];\n\n    for (let i = 0; i < supportedOAuthParams.length; i++) {\n      if (paramName === supportedOAuthParams[i]) {\n        oauth[paramName] = paramValue;\n        return true;\n      }\n    }\n    return false;\n  }\n\n\n  static parseUri(uriToParse: string, responseMode: string) {\n    const parsedUri = this.initialParse(decodeURIComponent(uriToParse), responseMode);\n\n    let queryParams: any = {};\n    if (parsedUri.queryString) {\n      queryParams = this.parseParams(parsedUri.queryString);\n    }\n\n    const oauth: any = {newUrl: parsedUri.baseUri};\n\n    Object.keys(queryParams).forEach(param => {\n      switch (param) {\n        case 'redirect_fragment':\n          oauth.fragment = queryParams[param];\n          break;\n        case 'prompt':\n          oauth.prompt = queryParams[param];\n          break;\n        default:\n          if (responseMode !== 'query' || !this.handleQueryParam(param, queryParams[param], oauth)) {\n            oauth.newUrl += (oauth.newUrl.indexOf('?') === -1 ? '?' : '&') + param + '=' + queryParams[param];\n          }\n          break;\n      }\n    });\n\n    if (responseMode === 'fragment') {\n      let fragmentParams: any = {};\n      if (parsedUri.fragmentString) {\n        fragmentParams = this.parseParams(parsedUri.fragmentString);\n      }\n      Object.keys(fragmentParams).forEach(param => {\n        oauth[param] = fragmentParams[param];\n      });\n    }\n    return oauth;\n  }\n}\n","/*\n * Copyright 2018 ebondu and/or its affiliates\n * and other contributors as indicated by the @author tags.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * Token utility\n */\n\nimport { fromByteArray } from 'base64-js';\nimport { sha256 } from 'js-sha256';\n\nexport class Token {\n\n  static decodeToken(str: string): string {\n    str = str.split('.')[1];\n\n    str = str.replace('/-/g', '+');\n    str = str.replace('/_/g', '/');\n    switch (str.length % 4) {\n      case 0:\n        break;\n      case 2:\n        str += '==';\n        break;\n      case 3:\n        str += '=';\n        break;\n      default:\n        throw new Error('Invalid token');\n    }\n\n    str = (str + '===').slice(0, str.length + (str.length % 4));\n    str = str.replace(/-/g, '+').replace(/_/g, '/');\n\n    str = decodeURIComponent(escape(atob(str)));\n\n    str = JSON.parse(str);\n    return str;\n  }\n\n  static generateRandomData(len) {\n    // use web crypto APIs if possible\n    let array = null;\n    const crypto = window.crypto;\n    if (crypto && crypto.getRandomValues && window.Uint8Array) {\n      array = new Uint8Array(len);\n      crypto.getRandomValues(array);\n      return array;\n    }\n\n    // fallback to Math random\n    array = new Array(len);\n    for (let j = 0; j < array.length; j++) {\n      array[j] = Math.floor(256 * Math.random());\n    }\n    return array;\n  }\n\n  static generateCodeVerifier(len) {\n    return Token.generateRandomString(len, 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789');\n  }\n\n  static generateRandomString(len, alphabet) {\n    const randomData = this.generateRandomData(len);\n    const chars = new Array(len);\n    for (let i = 0; i < len; i++) {\n      chars[i] = alphabet.charCodeAt(randomData[i] % alphabet.length);\n    }\n    return String.fromCharCode.apply(null, chars);\n  }\n\n  static generatePkceChallenge(pkceMethod, codeVerifier) {\n    switch (pkceMethod) {\n      // The use of the \"plain\" method is considered insecure and therefore not supported.\n      case 'S256':\n        // hash codeVerifier, then encode as url-safe base64 without padding\n        const hashBytes = new Uint8Array(sha256.arrayBuffer(codeVerifier));\n        const encodedHash = fromByteArray(hashBytes)\n          .replace(/\\+/g, '-')\n          .replace(/\\//g, '_')\n          .replace(/\\=/g, '');\n        return encodedHash;\n      default:\n        throw new Error('Invalid value for pkceMethod');\n    }\n  }\n}\n","/*\n * Copyright 2018 ebondu and/or its affiliates\n * and other contributors as indicated by the @author tags.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { KeycloakService } from '../service/keycloak.service';\n\ndeclare var window: any;\n\n/**\n * Cordova adapter for hybrid apps.\n */\nexport class CordovaAdapter {\n\n  constructor(private keycloak: KeycloakService) {\n\n  }\n\n  public login(options: any) {\n    // let promise = Keycloak.createPromise();\n    let o = 'location=no';\n    if (options && options.prompt === 'none') {\n      o += ',hidden=yes';\n    }\n    const loginUrl = this.keycloak.createLoginUrl(options);\n\n    // console.log('opening login frame from cordova: ' + loginUrl);\n    if (!window.cordova) {\n      throw new Error('Cannot authenticate via a web browser');\n    }\n\n    if (!window.cordova.InAppBrowser || !window.cordova.plugins.browsertab) {\n      throw new Error('The Apache Cordova InAppBrowser/BrowserTab plugins was not found and are required');\n    }\n\n    let ref: any;\n    // let ref = window.cordova.InAppBrowser.open(loginUrl, '_blank', o);\n    // let ref = window.cordova.InAppBrowser.open(loginUrl, '_system', o);\n    let completed = false;\n\n    window.cordova.plugins.browsertab.themeable.isAvailable(\n      function (result: any) {\n        if (!result) {\n          ref = window.cordova.InAppBrowser.open(loginUrl, '_system');\n          ref.addEventListener('loadstart', function (event: any) {\n            if (event.url.indexOf('http://localhost') === 0) {\n              const callback = this.keycloak.parseCallback(event.url);\n              this.keycloak.processCallback(callback).subscribe(processed => {\n                ref.close();\n                completed = true;\n              });\n            }\n          });\n\n          ref.addEventListener('loaderror', function (event: any) {\n            if (!completed) {\n              if (event.url.indexOf('http://localhost') === 0) {\n\n                const callback = this.keycloak.parseCallback(event.url);\n                this.keycloak.processCallback(callback).subscribe(processed => {\n                  this.closeBrowserTab();\n                  // ref.close();\n                  // completed = true;\n                });\n              } else {\n                this.closeBrowserTab();\n                // ref.close();\n              }\n            }\n          });\n        } else {\n          this.openBrowserTab(loginUrl, options);\n        }\n      },\n      function (isAvailableError: any) {\n        console.error('failed to query availability of in-app browser tab');\n      }\n    );\n  }\n\n  public closeBrowserTab() {\n    const cordova = window.cordova;\n    cordova.plugins.browsertab.themeable.close();\n    // completed = true;\n  }\n\n  public logout(options: any) {\n    const cordova = window.cordova;\n    const logoutUrl = this.keycloak.createLogoutUrl(options);\n    let ref: any;\n    let error: any;\n\n    cordova.plugins.browsertab.themeable.isAvailable(\n      function (result: any) {\n        if (!result) {\n          ref = cordova.InAppBrowser.open(logoutUrl, '_system');\n          ref.addEventListener('loadstart', function (event: any) {\n            if (event.url.indexOf('http://localhost') === 0) {\n              this.ref.close();\n              this.closeBrowserTab();\n            }\n          });\n\n          ref.addEventListener('loaderror', function (event: any) {\n            if (event.url.indexOf('http://localhost') === 0) {\n              this.ref.close();\n              this.closeBrowserTab();\n            } else {\n              error = true;\n              this.ref.close();\n              this.closeBrowserTab();\n            }\n          });\n\n          ref.addEventListener('exit', function (event: any) {\n            if (error) {\n              console.error('listener of in-app browser tab exited due to error', error);\n            } else {\n              this.keycloak.clearToken({});\n            }\n          });\n        } else {\n          this.openBrowserTab(logoutUrl, options);\n        }\n      },\n      function (isAvailableError: any) {\n        console.error('failed to query availability of in-app browser tab', isAvailableError);\n      }\n    );\n  }\n\n  public register(options: any) {\n    const registerUrl = this.keycloak.createRegisterUrl({});\n    window.cordova.plugins.browsertab.themeable.isAvailable(\n      function (result: any) {\n        if (!result) {\n          window.cordova.InAppBrowser.open(registerUrl, '_system');\n        } else {\n          this.openBrowserTab(registerUrl, options);\n        }\n      },\n      function (isAvailableError: any) {\n        console.error('failed to query availability of in-app browser tab', isAvailableError);\n      }\n    );\n  }\n\n  public accountManagement(options: any) {\n    const accountUrl = this.keycloak.createAccountUrl({});\n    window.cordova.plugins.browsertab.themeable.isAvailable(\n      function (result: any) {\n        if (!result) {\n          window.cordova.InAppBrowser.open(accountUrl, '_system');\n        } else {\n          this.openBrowserTab(accountUrl, options);\n        }\n      },\n      function (isAvailableError: any) {\n        console.error('failed to query availability of in-app browser tab', isAvailableError);\n      }\n    );\n  }\n\n\n  public passwordManagement(options: any) {\n    const accountUrl = this.keycloak.createChangePasswordUrl({});\n    window.cordova.plugins.browsertab.themeable.isAvailable(\n      function (result: any) {\n        if (!result) {\n          window.cordova.InAppBrowser.open(accountUrl, '_system');\n        } else {\n          this.openBrowserTab(accountUrl, options);\n        }\n      },\n      function (isAvailableError: any) {\n        console.error('failed to query availability of in-app browser tab', isAvailableError);\n      }\n    );\n  }\n\n  public redirectUri(options: any): any {\n    if (options.redirectUri) {\n      return options.redirectUri;\n    } else {\n      return 'http://localhost';\n    }\n  }\n\n  private openBrowserTab(url: String, options: any) {\n    const cordova = window.cordova;\n    if (options.toolbarColor) {\n      cordova.plugins.browsertab.themeable.openUrl(url, options);\n    } else {\n      cordova.plugins.browsertab.themeable.openUrl(url);\n    }\n  }\n}\n","/*\n * Copyright 2018 ebondu and/or its affiliates\n * and other contributors as indicated by the @author tags.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * To store Keycloak objects like tokens using a cookie.\n */\nexport class CookieStorage {\n\n  public getCookie = function (key: any) {\n    const name = key + '=';\n    const ca = document.cookie.split(';');\n    for (let i = 0; i < ca.length; i++) {\n      let c = ca[i];\n      while (c.charAt(0) === ' ') {\n        c = c.substring(1);\n      }\n      if (c.indexOf(name) === 0) {\n        return c.substring(name.length, c.length);\n      }\n    }\n    return '';\n  };\n\n  public get(state: string) {\n    if (!state) {\n      return;\n    }\n\n    const value = this.getCookie('kc-callback-' + state);\n    this.setCookie('kc-callback-' + state, '', this.cookieExpiration(-100));\n    if (value) {\n      return JSON.parse(value);\n    }\n  }\n\n  public add(state: any) {\n    this.setCookie('kc-callback-' + state.state, JSON.stringify(state), this.cookieExpiration(60));\n  }\n\n  public removeItem(key: any) {\n    this.setCookie(key, '', this.cookieExpiration(-100));\n  }\n\n  public cookieExpiration(minutes: number) {\n    const exp = new Date();\n    exp.setTime(exp.getTime() + (minutes * 60 * 1000));\n    return exp;\n  }\n\n  public setCookie(key: string, value: string, expirationDate: Date) {\n    const cookie = key + '=' + value + '; '\n      + 'expires=' + expirationDate.toUTCString() + '; ';\n    document.cookie = cookie;\n  }\n}\n","/*\n * Copyright 2022 ebondu and/or its affiliates\n * and other contributors as indicated by the @author tags.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { KeycloakService } from '../service/keycloak.service';\nimport { BehaviorSubject, Observable } from 'rxjs';\n\n/**\n * Silent login check Iframe utility\n */\nexport class KeycloakSilentCheckLoginIframe {\n  private iframe: any;\n  private iframeSrc: string;\n\n  constructor(private keycloak: KeycloakService, silentRedirectUri: string) {\n    this.iframeSrc = this.keycloak.createLoginUrl({\n      prompt: 'none',\n      redirectUri: silentRedirectUri\n    });\n    this.initIframe();\n  }\n\n  initIframe() {\n    this.iframe = document.createElement('iframe');\n    this.iframe.setAttribute('src', this.iframeSrc);\n    this.iframe.style.display = 'none';\n    this.iframe.setAttribute('title', 'keycloak-silent-check-sso');\n    document.body.appendChild(this.iframe);\n    window.addEventListener('message', () => this.processSilentLoginCallbackMessage(event), false);\n  }\n\n  private processSilentLoginCallbackMessage(event: any) {\n    const origin = this.iframeSrc.substring(0, this.iframeSrc.indexOf('/', 8));\n    // console.log('checking iframe message callback..' + event.data + ' ' + event.origin);\n    if ((event.origin !== window.location.origin) || (this.iframe.contentWindow !== event.source)) {\n      // console.log('event is not coming from the iframe, ignoring it');\n      return;\n    }\n    const oauth = this.keycloak.parseCallback(event.data);\n    if (!!oauth) {\n      this.keycloak.processCallback(oauth).subscribe(() => console.log('Silent login ended'));\n    }\n    document.body.removeChild(this.iframe);\n    window.removeEventListener('message', () => this.processSilentLoginCallbackMessage(event), false);\n  }\n}\n","/*\n * Copyright 2022 ebondu and/or its affiliates\n * and other contributors as indicated by the @author tags.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { KeycloakService } from '../service/keycloak.service';\nimport { BehaviorSubject, Observable } from 'rxjs';\n\n/**\n * 3Party cookie Iframe utility\n */\nexport class KeycloakCheck3pCookiesIframe {\n  private iframe: any;\n  private interval: number;\n  private iframeSrc: string;\n  private supportedBS: BehaviorSubject<boolean>;\n  public supportedObs: Observable<boolean>;\n\n  constructor(private keycloak: KeycloakService) {\n    this.iframeSrc = this.keycloak.getRealmUrl() + '/protocol/openid-connect/3p-cookies/step1.html';\n    this.supportedBS = new BehaviorSubject<any>(null);\n    this.supportedObs = this.supportedBS.asObservable();\n    this.initIframe();\n  }\n\n  initIframe() {\n    this.iframe = document.createElement('iframe');\n    this.iframe.setAttribute('src', this.iframeSrc);\n    this.iframe.setAttribute('title', 'keycloak-3p-check-iframe' );\n    this.iframe.style.display = 'none';\n    document.body.appendChild(this.iframe);\n    window.addEventListener('message', () => this.process3pCookieCallbackMessage(event), false);\n  }\n\n  private process3pCookieCallbackMessage(event: any) {\n    // console.log('checking iframe message callback..' + event.data + ' ' + event.origin);\n    if (this.iframe.contentWindow !== event.source) {\n      // console.log('event is not coming from the iframe, ignoring it');\n      return;\n    }\n    // console.log('Checking iframe message ' + event.data);\n    if (event.data !== 'supported' && event.data !== 'unsupported') {\n      return;\n    }\n    if (event.data === 'unsupported') {\n      console.warn('[KEYCLOAK] 3rd party cookies aren\\'t supported by this browser.' +\n        ' checkLoginIframe and silent check-sso are not available.'\n      );\n      this.supportedBS.next(false);\n    } else {\n      this.supportedBS.next(true);\n    }\n    document.body.removeChild(this.iframe);\n    window.removeEventListener('message', () => this.process3pCookieCallbackMessage(event));\n  }\n}\n","/*\n * Copyright 2024 ebondu and/or its affiliates\n * and other contributors as indicated by the @author tags.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { inject, Injectable, Injector, NgZone, PLATFORM_ID } from '@angular/core';\nimport { HttpClient, HttpHeaders, HttpParams } from '@angular/common/http';\nimport { BehaviorSubject, EMPTY, Observable, of } from 'rxjs';\n\nimport { v4 as uuidv4 } from 'uuid';\nimport { DefaultAdapter } from '../adapter/keycloak.adapter.default';\nimport { LocalStorage } from '../storage/keycloak.storage.local';\nimport { URIParser } from '../util/keycloak.utils.URIParser';\nimport { Token } from '../util/keycloak.utils.token';\nimport {\n  KEYCLOAK_CONF,\n  KEYCLOAK_INIT_OPTIONS,\n  KEYCLOAK_JSON_PATH,\n  KeycloakAdapterName,\n  KeycloakFlow,\n  KeycloakOnLoad,\n  KeycloakResponseMode,\n  KeycloakResponseType\n} from '../model/keycloak-config.model';\nimport { filter, map, mergeMap, switchMap, tap } from 'rxjs/operators';\nimport { CordovaAdapter } from '../adapter/keycloak.adapter.cordova';\nimport { CookieStorage } from '../storage/keycloak.storage.cookie';\nimport { KeycloakCheckLoginIframe } from '../util/keycloak.utils.check-login-iframe';\nimport { KeycloakSilentCheckLoginIframe } from '../util/keycloak.utils.silent-check-login-iframe';\nimport { KeycloakCheck3pCookiesIframe } from '../util/keycloak.utils.check-3pCookies-iframe';\nimport { isPlatformBrowser } from '@angular/common';\n\n/**\n * Keycloak core classes to manage tokens with a keycloak server.\n *\n * Used for login, logout, register, account management, profile.\n * Provide Angular Observable objects for initialization, authentication, token expiration.\n *\n */\n\n@Injectable({\n  providedIn: 'root'\n})\nexport class KeycloakService {\n\n  public initializedObs: Observable<boolean>;\n  public initializedAuthzObs: Observable<boolean>;\n  public authenticationObs: Observable<boolean>;\n  public tokenExpiredObs: Observable<boolean>;\n  public authenticationErrorObs: Observable<any>;\n  // tokens\n  public accessToken: string;\n  public tokenParsed: any;\n  public sessionId: any;\n  // Observables\n  private initBS: BehaviorSubject<boolean>;\n  private initAuthzBS: BehaviorSubject<boolean>;\n  private authenticationsBS: BehaviorSubject<boolean>;\n  private tokenExpiredBS: BehaviorSubject<boolean>;\n  private authenticationErrorBS: BehaviorSubject<any>;\n  private refreshToken: string;\n  private refreshTokenParsed: any;\n  private rpt: string;\n  private idToken: string;\n  private idTokenParsed: any;\n  // keycloak conf\n  private umaConfig: any;\n  private adapter;\n  private callbackStorage;\n  private responseType;\n  private timeSkew;\n  private tokenTimeoutHandle;\n  private subject: any;\n  private realmAccess;\n  private resourceAccess;\n  private loginIframe: KeycloakCheckLoginIframe;\n\n  readonly #injector = inject(Injector);\n  readonly #platformId = inject(PLATFORM_ID);\n  readonly #ngZone = inject(NgZone);\n  readonly #configUrl = inject(KEYCLOAK_JSON_PATH, {optional: true});\n  public keycloakConfig = inject(KEYCLOAK_CONF, {optional: true});\n  public readonly initOptions = inject(KEYCLOAK_INIT_OPTIONS);\n\n  get http(): HttpClient {\n    return this.#injector.get(HttpClient);\n  }\n\n  constructor() {\n\n    this.initBS = new BehaviorSubject(false);\n    this.initializedObs = this.initBS.asObservable();\n\n    this.initAuthzBS = new BehaviorSubject(false);\n    this.initializedAuthzObs = this.initAuthzBS.asObservable();\n\n    this.authenticationsBS = new BehaviorSubject(false);\n    this.authenticationObs = this.authenticationsBS.asObservable();\n\n    this.tokenExpiredBS = new BehaviorSubject<boolean>(false);\n    this.tokenExpiredObs = this.tokenExpiredBS.asObservable();\n\n    this.authenticationErrorBS = new BehaviorSubject<any>(null);\n    this.authenticationErrorObs = this.authenticationErrorBS.asObservable();\n    // console.log('Keycloak service created with init options and configuration file', initOptions, configUrl);\n\n    if (!isPlatformBrowser(this.#platformId)) {\n      // console.log('Keycloak service init only available on browser platform');\n      this.initBS.next(false);\n    } else {\n      if (!globalThis.isSecureContext) {\n        console.warn('Keycloak JS must be used in a \\'secure context\\' to function properly as it relies on browser APIs that are otherwise not available');\n      }\n      if (this.#configUrl) {\n        this.http.get(this.#configUrl).subscribe({\n          next: (config) => {\n            this.keycloakConfig = {\n              authServerUrl: config['auth-server-url'],\n              realm: config['realm'],\n              clientId: config['resource'],\n              clientSecret: (config['credentials'] || {})['secret']\n            };\n            // console.log('Conf loaded', this.keycloakConfig);\n            this.initService();\n          },\n          error: () => {\n            // console.log('Unable to load keycloak.json', error);\n            this.initBS.next(false);\n          }\n        });\n      } else if (this.keycloakConfig) {\n        this.initService();\n      } else {\n        // console.log('Keycloak service init fails : no keycloak.json or configuration provided');\n        this.initBS.next(false);\n      }\n\n      this.initializedObs.pipe(filter(initialized => !!initialized)).subscribe(next => {\n        // console.log('Keycloak initialized, initializing authz service', this);\n        if (next) {\n          const url = this.keycloakConfig.authServerUrl + '/realms/' + this.keycloakConfig.realm + '/.well-known/uma2-configuration';\n          this.http.get(url).subscribe({\n            next: (authz) => {\n              // console.log('Authz configuration file loaded, continuing authz');\n              this.umaConfig = authz;\n              this.initAuthzBS.next(true);\n            },\n            error: () => {\n              // console.log('unable to get uma file', error);\n              this.initAuthzBS.next(false);\n            }\n          });\n        }\n      });\n    }\n  }\n\n  public parseCallback(url: string): any {\n    const oauth: any = URIParser.parseUri(url, this.initOptions.responseMode);\n    const state: string = oauth.state;\n    const oauthState = this.callbackStorage.get(state);\n\n    if (oauthState && (oauth.code || oauth.error || oauth.access_token || oauth.id_token)) {\n      oauth.valid = true;\n      oauth.redirectUri = oauthState.redirectUri;\n      oauth.storedNonce = oauthState.nonce;\n      oauth.prompt = oauthState.prompt;\n      oauth.pkceCodeVerifier = oauthState.pkceCodeVerifier;\n      if (oauth.fragment) {\n        oauth.newUrl += '#' + oauth.fragment;\n      }\n      return oauth;\n    }\n  }\n\n  public processCallback(oauth: any): Observable<boolean> {\n    return new Observable<boolean>((observer: any) => {\n      const code = oauth.code;\n      const error = oauth.error;\n      const prompt = oauth.prompt;\n      const timeLocal = new Date().getTime();\n\n      if (error) {\n        const errorData = {error: error, error_description: oauth.error_description};\n        this.authenticationErrorBS.next(errorData);\n        if (prompt !== 'none') {\n          // console.log('error while processing callback');\n          observer.next(false);\n        }\n        return;\n      } else if ((this.initOptions.flow !== KeycloakFlow.STANDARD) && (oauth.access_token || oauth.id_token)) {\n        this.authSuccess(oauth.access_token, null, oauth.id_token, true, timeLocal, oauth);\n        observer.next(true);\n      }\n\n      if ((this.initOptions.flow !== KeycloakFlow.IMPLICIT) && code) {\n\n        let withCredentials = false;\n        const url = this.getRealmUrl() + '/protocol/openid-connect/token';\n        let params: HttpParams = new HttpParams();\n        params = params.set('code', code);\n        params = params.set('grant_type', 'authorization_code');\n\n        let headers = new HttpHeaders();\n        headers = headers.set('Content-type', 'application/x-www-form-urlencoded');\n\n        if (this.keycloakConfig.clientId && this.keycloakConfig.clientSecret) {\n          headers = headers.set('Authorization', 'Basic ' + btoa(this.keycloakConfig.clientId + ':' + this.keycloakConfig.clientSecret));\n          withCredentials = true;\n        } else {\n          params = params.set('client_id', this.keycloakConfig.clientId);\n        }\n        params = params.set('redirect_uri', oauth.redirectUri);\n\n        if (oauth.pkceCodeVerifier) {\n          params = params.set('code_verifier', oauth.pkceCodeVerifier);\n        }\n\n        const options = {headers: headers, withCredentials: withCredentials};\n        this.http.post(url, params, options).subscribe({\n          next: (token) => {\n            this.authSuccess(\n              token['access_token'],\n              token['refresh_token'],\n              token['id_token'],\n              this.initOptions.flow === KeycloakFlow.STANDARD,\n              timeLocal,\n              oauth);\n            this.authenticationsBS.next(true);\n            observer.next(true);\n          },\n          error: (errorToken) => {\n            this.authenticationErrorBS.next({error: errorToken, error_description: 'unable to get token from server'});\n            // console.log('Unable to get token', errorToken);\n            observer.next(false);\n          }\n        });\n      }\n    });\n  }\n\n  login(options: any) {\n    return this.adapter.login(options);\n  }\n\n\n  // ###################################\n  // #######   Keycloak methods   ######\n  // ###################################\n\n  logout(options: any) {\n    return this.adapter.logout(options);\n  }\n\n  updateToken(minValidity: number): Observable<string> {\n\n    minValidity = minValidity || 5;\n\n    if (!this.isTokenExpired(minValidity)) {\n      // console.log('token still valid');\n      return of(this.accessToken);\n    } else {\n      if (this.isRefreshTokenExpired(5)) {\n        this.login(this.keycloakConfig);\n        return EMPTY;\n      } else {\n        // console.log('refreshing token');\n        let params: HttpParams = new HttpParams();\n        params = params.set('grant_type', 'refresh_token');\n        params = params.set('refresh_token', this.refreshToken);\n\n        const url = this.getRealmUrl() + '/protocol/openid-connect/token';\n        let headers = new HttpHeaders({'Content-type': 'application/x-www-form-urlencoded'});\n\n        let withCredentials = false;\n        if (this.keycloakConfig.clientId && this.keycloakConfig.clientSecret) {\n          headers = headers.append(\n            'Authorization',\n            'Basic ' + btoa(this.keycloakConfig.clientId + ': ' + this.keycloakConfig.clientSecret));\n          withCredentials = true;\n        } else {\n          params = params.set('client_id', this.keycloakConfig.clientId);\n        }\n\n        let timeLocal = new Date().getTime();\n        return this.http.post(url, params, {headers: headers, withCredentials: withCredentials}).pipe(\n          map((token: any) => {\n            timeLocal = (timeLocal + new Date().getTime()) / 2;\n            this.setToken(token['access_token'], token['refresh_token'], token['id_token'], true);\n            this.timeSkew = Math.floor(timeLocal / 1000) - this.tokenParsed.iat;\n            return token['access_token'];\n          })\n        );\n      }\n    }\n  }\n\n  register(options: any) {\n    return this.adapter.register(options);\n  }\n\n  accountManagement(options: any) {\n    return this.adapter.accountManagement(options);\n  }\n\n  loadChangePassword(options: any) {\n    return this.adapter.passwordManagement(options);\n  }\n\n  loadUserProfile(): Observable<any> {\n    // need to refresh token to get account-console as aud\n    let paramsToSend: HttpParams = new HttpParams();\n    let headersToSend = new HttpHeaders();\n    headersToSend = headersToSend.set('Content-type', 'application/x-www-form-urlencoded');\n    paramsToSend = paramsToSend.set('client_id', this.keycloakConfig.clientId);\n    paramsToSend = paramsToSend.set('grant_type', 'refresh_token');\n    paramsToSend = paramsToSend.set('refresh_token', this.refreshToken);\n    headersToSend = headersToSend.set('Authorization', 'bearer ' + this.accessToken);\n    const url = this.getRealmUrl() + '/account/';\n    return this.http.post(this.umaConfig?.token_endpoint, paramsToSend, {withCredentials: false, headers: headersToSend})\n      .pipe(mergeMap((token: any) => {\n        const headers = new HttpHeaders({'Authorization': 'bearer ' + token.access_token});\n        return this.http.get(url, {headers: headers, withCredentials: false});\n      }));\n  }\n\n  updateUserProfile(profile: any): Observable<any> {\n    // need to refresh token to get account-console as aud\n    let paramsToSend: HttpParams = new HttpParams();\n    let headersToSend = new HttpHeaders();\n    headersToSend = headersToSend.set('Content-type', 'application/x-www-form-urlencoded');\n    paramsToSend = paramsToSend.set('client_id', this.keycloakConfig.clientId);\n    paramsToSend = paramsToSend.set('grant_type', 'refresh_token');\n    paramsToSend = paramsToSend.set('refresh_token', this.refreshToken);\n    headersToSend = headersToSend.set('Authorization', 'bearer ' + this.accessToken);\n    const url = this.getRealmUrl() + '/account/';\n    return this.http.post(this.umaConfig?.token_endpoint, paramsToSend, {withCredentials: true, headers: headersToSend})\n      .pipe(mergeMap((token: any) => {\n        const headers = new HttpHeaders({'Authorization': 'bearer ' + token.access_token});\n        return this.http.post(url, profile, {headers: headers, withCredentials: false});\n      }));\n  }\n\n  createDeleteAccountUrl(options?: any): string {\n      const state = uuidv4();\n      const nonce = this.initOptions.useNonce ? uuidv4() : null;\n      // const redirectUri = this.getRealmUrl() + '/account/#/personal-info';\n      const redirectUri = this.adapter.redirectUri({});\n      const callback: {state, nonce, redirectUri, pkceCodeVerifier? } = {\n        state: state,\n        nonce: nonce,\n        redirectUri: redirectUri\n      };\n\n      const action = 'auth';\n\n      let url = this.getRealmUrl()\n        + '/protocol/openid-connect/' + action\n        + '?client_id=' + encodeURIComponent(this.keycloakConfig.clientId)\n        + '&redirect_uri=' + encodeURIComponent(redirectUri)\n        + '&state=' + encodeURIComponent(state)\n        + '&response_mode=' + encodeURIComponent(this.initOptions.responseMode)\n        + '&response_type=' + encodeURIComponent(this.responseType)\n        + '&scope=' + encodeURIComponent('openid')\n        + '&kc_action=' + encodeURIComponent('delete_account');\n\n      if (options.useNonce) {\n        url += '&nonce=' + encodeURIComponent(nonce);\n      }\n\n      let codeVerifier;\n      const pkceMethod = this.initOptions.pkceMethod;\n      codeVerifier = Token.generateCodeVerifier(96);\n      callback.pkceCodeVerifier = codeVerifier;\n      const pkceChallenge = Token.generatePkceChallenge(pkceMethod, codeVerifier);\n      url += '&code_challenge=' + pkceChallenge;\n      url += '&code_challenge_method=' + pkceMethod;\n\n      this.callbackStorage.add(callback);\n      return url;\n  }\n\n  createUpdateProfileUrl(options?: any): string {\n    const state = uuidv4();\n    const nonce = this.initOptions.useNonce ? uuidv4() : null;\n    const redirectUri = this.adapter.redirectUri({});\n    const callback: {state, nonce, redirectUri, pkceCodeVerifier? } = {\n      state: state,\n      nonce: nonce,\n      redirectUri: redirectUri\n    };\n\n    const action = 'auth';\n\n    let url = this.getRealmUrl()\n      + '/protocol/openid-connect/' + action\n      + '?client_id=' + encodeURIComponent(this.keycloakConfig.clientId)\n      + '&redirect_uri=' + encodeURIComponent(redirectUri)\n      + '&state=' + encodeURIComponent(state)\n      + '&response_mode=' + encodeURIComponent(this.initOptions.responseMode)\n      + '&response_type=' + encodeURIComponent(this.responseType)\n      + '&scope=' + encodeURIComponent('openid')\n      + '&kc_action=' + encodeURIComponent('UPDATE_PROFILE');\n\n    if (options.useNonce) {\n      url += '&nonce=' + encodeURIComponent(nonce);\n    }\n\n    let codeVerifier;\n    const pkceMethod = this.initOptions.pkceMethod;\n    codeVerifier = Token.generateCodeVerifier(96);\n    callback.pkceCodeVerifier = codeVerifier;\n    const pkceChallenge = Token.generatePkceChallenge(pkceMethod, codeVerifier);\n    url += '&code_challenge=' + pkceChallenge;\n    url += '&code_challenge_method=' + pkceMethod;\n\n    this.callbackStorage.add(callback);\n    return url;\n  }\n\n  changePassword(): string {\n    const state = uuidv4();\n    const nonce = this.initOptions.useNonce ? uuidv4() : null;\n    const redirectUri = this.adapter.redirectUri({});\n    const callback: {state, nonce, redirectUri, pkceCodeVerifier? } = {\n      state: state,\n      nonce: nonce,\n      redirectUri: redirectUri\n    };\n\n    const action = 'auth';\n\n    let url = this.getRealmUrl()\n      + '/protocol/openid-connect/' + action\n      + '?client_id=' + encodeURIComponent(this.keycloakConfig.clientId)\n      + '&redirect_uri=' + encodeURIComponent(redirectUri)\n      + '&state=' + encodeURIComponent(state)\n      + '&response_mode=' + encodeURIComponent(this.initOptions.responseMode)\n      + '&response_type=' + encodeURIComponent(this.responseType)\n      + '&scope=' + encodeURIComponent('openid')\n      + '&kc_action=' + encodeURIComponent('UPDATE_PASSWORD');\n\n    if (this.initOptions.useNonce) {\n      url += '&nonce=' + encodeURIComponent(nonce);\n    }\n\n    let codeVerifier;\n    const pkceMethod = this.initOptions.pkceMethod;\n    codeVerifier = Token.generateCodeVerifier(96);\n    callback.pkceCodeVerifier = codeVerifier;\n    const pkceChallenge = Token.generatePkceChallenge(pkceMethod, codeVerifier);\n    url += '&code_challenge=' + pkceChallenge;\n    url += '&code_challenge_method=' + pkceMethod;\n\n    this.callbackStorage.add(callback);\n    return url;\n  }\n\n  loadUserInfo(): Observable<any> {\n    const url = this.getRealmUrl() + '/protocol/openid-connect/userinfo';\n    const headers = new HttpHeaders({'Accept': 'application/json', 'Authorization': 'bearer ' + this.accessToken});\n    return this.http.get(url, {headers: headers});\n  }\n\n  hasRealmRole(role: string): boolean {\n    const access = this.realmAccess;\n    return !!access && access.roles.indexOf(role) >= 0;\n  }\n\n  hasResourceRole(role: string, resource: string): boolean {\n    if (!this.resourceAccess) {\n      return false;\n    }\n    const access: any = this.resourceAccess[resource || this.keycloakConfig.clientId];\n    return !!access && access.roles.indexOf(role) >= 0;\n  }\n\n  isTokenExpired(minValidity: number): boolean {\n    if (!this.tokenParsed || (!this.refreshToken && this.initOptions.flow !== KeycloakFlow.IMPLICIT)) {\n      throw new Error('Not authenticated');\n    }\n\n    let expiresIn = this.tokenParsed['exp'] - (new Date().getTime() / 1000) + this.timeSkew;\n    if (minValidity) {\n      expiresIn -= minValidity;\n    }\n\n    return expiresIn < 0;\n  }\n\n  isRefreshTokenExpired(minValidity: number): boolean {\n    if (!this.tokenParsed || (!this.refreshToken && this.initOptions.flow !== KeycloakFlow.IMPLICIT)) {\n      throw new Error('Not authenticated');\n    }\n\n    let expiresIn = this.refreshTokenParsed['exp'] - (new Date().getTime() / 1000) + this.timeSkew;\n    if (minValidity) {\n      expiresIn -= minValidity;\n    }\n    return expiresIn < 0;\n  }\n\n  /**\n   * This method enables client applications to better integrate with resource servers protected by a Keycloak\n   * policy enforcer.\n   *\n   * In this case, the resource server will respond with a 401 status code and a WWW-Authenticate header holding the\n   * necessary information to ask a Keycloak server for authorization data using both UMA and Entitlement protocol,\n   * depending on how the policy enforcer at the resource server was configured.\n   */\n  authorize(wwwAuthenticateHeader: string): Observable<string> {\n    return this.initializedAuthzObs.pipe(\n      filter(initialized => !!initialized),\n      switchMap(() => {\n        return this.processAuthz(wwwAuthenticateHeader);\n      })\n    );\n  }\n\n  /**\n   * Obtains all entitlements from a Keycloak Server based on a give resourceServerId.\n   */\n  entitlement(resourceServerId: string): Observable<boolean> {\n    const url = this.keycloakConfig.authServerUrl + '/realms/' + this.keycloakConfig.realm + '/authz/entitlement/' + resourceServerId;\n    const headers = new HttpHeaders({'Authorization': 'Bearer ' + this.accessToken});\n    return this.http.get(url, {headers: headers, withCredentials: false})\n      .pipe(\n        tap((token: any) => {\n          this.rpt = token.rpt;\n        })\n      );\n  }\n\n  public clearToken(initOptions: any) {\n    if (this.accessToken) {\n      this.setToken(null, null, null, true);\n      this.authenticationsBS.next(false);\n      if (this.initOptions.onLoad === KeycloakOnLoad.LOGIN_REQUIRED) {\n        this.login(initOptions);\n      }\n    }\n  }\n\n  // ###################################\n  // #######    Token methods     ######\n  // ###################################\n\n  createLoginUrl(options: any): string {\n    const state = uuidv4();\n    const nonce = this.initOptions.useNonce ? uuidv4() : null;\n\n    let redirectUri = this.adapter.redirectUri(options);\n    if (options && options.prompt) {\n      redirectUri += (redirectUri.indexOf('?') === -1 ? '?' : '&') + 'prompt=' + options.prompt;\n    }\n\n    const callback: {state, nonce, redirectUri, pkceCodeVerifier? } = {\n      state: state,\n      nonce: nonce,\n      redirectUri: redirectUri,\n    };\n\n    let action = 'auth';\n    if (options && options.action === 'register') {\n      action = 'registrations';\n    }\n\n    const scope = (options && options.scope) ? 'openid ' + options.scope : 'openid';\n\n    let url = this.getRealmUrl()\n      + '/protocol/openid-connect/' + action\n      + '?client_id=' + encodeURIComponent(this.keycloakConfig.clientId)\n      + '&redirect_uri=' + encodeURIComponent(redirectUri)\n      + '&state=' + encodeURIComponent(state)\n      + '&response_mode=' + encodeURIComponent(this.initOptions.responseMode)\n      + '&response_type=' + encodeURIComponent(this.responseType)\n      + '&scope=' + encodeURIComponent(scope);\n\n    if (options.useNonce) {\n      url += '&nonce=' + encodeURIComponent(nonce);\n    }\n\n    if (options && options.prompt) {\n      url += '&prompt=' + encodeURIComponent(options.prompt);\n    }\n\n    if (options && options.maxAge) {\n      url += '&max_age=' + encodeURIComponent(options.maxAge);\n    }\n\n    if (options && options.loginHint) {\n      url += '&login_hint=' + encodeURIComponent(options.loginHint);\n    }\n\n    if (options && options.idpHint) {\n      url += '&kc_idp_hint=' + encodeURIComponent(options.idpHint);\n    }\n\n    if (options && options.locale) {\n      url += '&ui_locales=' + encodeURIComponent(options.locale);\n    }\n\n    if (options && options.acr) {\n      url += '&claims=' + encodeURIComponent(JSON.stringify({\n        id_token: {\n          acr: options.acr\n        }\n      }));\n    }\n\n    let codeVerifier;\n    if ((options && options.pkceMethod) || !!this.initOptions.pkceMethod) {\n      const pkceMethod = !!options.pkceMethod ? options.pkceMethod : this.initOptions.pkceMethod;\n      codeVerifier = Token.generateCodeVerifier(96);\n      callback.pkceCodeVerifier = codeVerifier;\n      const pkceChallenge = Token.generatePkceChallenge(pkceMethod, codeVerifier);\n      url += '&code_challenge=' + pkceChallenge;\n      url += '&code_challenge_method=' + pkceMethod;\n    }\n\n    this.callbackStorage.add(callback);\n    return url;\n  }\n\n  createLogoutUrl(options: any): string {\n    const url = this.getRealmUrl()\n      + '/protocol/openid-connect/logout'\n      + '?post_logout_redirect_uri=' + encodeURIComponent(this.adapter.redirectUri(options, false))\n      + '&id_token_hint=' + encodeURIComponent(this.idToken)\n    ;\n\n    return url;\n  }\n\n  createRegisterUrl(options: any): string {\n    if (!options) {\n      options = {};\n    }\n    options.action = 'register';\n    return this.createLoginUrl(options);\n  }\n\n  createAccountUrl(options: any): string {\n    const url = this.getRealmUrl()\n      + '/account'\n      + '?referrer=' + encodeURIComponent(this.keycloakConfig.clientId)\n      + '&referrer_uri=' + encodeURIComponent(this.adapter.redirectUri(options));\n\n    return url;\n  }\n\n  // ###################################\n  // #######     URLs methods     ######\n  // ###################################\n\n  createChangePasswordUrl(options: any): string {\n    const url = this.getRealmUrl()\n      + '/account/password'\n      + '?referrer=' + encodeURIComponent(this.keycloakConfig.clientId)\n      + '&referrer_uri=' + encodeURIComponent(this.adapter.redirectUri(options));\n\n    return url;\n  }\n\n  getRealmUrl(): string {\n    if (this.keycloakConfig.authServerUrl.charAt(this.keycloakConfig.authServerUrl.length - 1) === '/') {\n      return this.keycloakConfig.authServerUrl + 'realms/' + encodeURIComponent(this.keycloakConfig.realm);\n    } else {\n      return this.keycloakConfig.authServerUrl + '/realms/' + encodeURIComponent(this.keycloakConfig.realm);\n    }\n  }\n\n  private initService() {\n\n    // Adapter\n    if (this.initOptions.adapter === KeycloakAdapterName.CORDOVA) {\n      this.adapter = new CordovaAdapter(this);\n    } else if (this.initOptions.adapter === KeycloakAdapterName.DEFAULT) {\n      this.adapter = new DefaultAdapter(this);\n    } else {\n      if (window[<any>'cordova']) {\n        this.adapter = new CordovaAdapter(this);\n      } else {\n        this.adapter = new DefaultAdapter(this);\n      }\n    }\n\n    // Storage\n    try {\n      this.callbackStorage = new LocalStorage();\n    } catch (e) {\n      // console.log('Unable to create a local storage, using cookie storage');\n      this.callbackStorage = new CookieStorage();\n    }\n\n    // default values;\n    if (!this.initOptions.flow) {\n      this.initOptions.flow = KeycloakFlow.STANDARD;\n    }\n\n    if (!this.initOptions.responseMode) {\n      this.initOptions.responseMode = KeycloakResponseMode.FRAGMENT;\n    }\n    switch (this.initOptions.flow) {\n      case KeycloakFlow.STANDARD:\n        this.responseType = KeycloakResponseType.CODE;\n        break;\n      case KeycloakFlow.IMPLICIT:\n        this.responseType = KeycloakResponseType.ID_TOKEN;\n        break;\n      case KeycloakFlow.HYBRID:\n        this.responseType = KeycloakResponseType.CODE_ID_TOKEN;\n        break;\n      default:\n        // console.log('Invalid value for flow');\n    }\n\n    if (this.initOptions.pkceMethod) {\n      if (this.initOptions.pkceMethod !== 'S256') {\n        throw new Error('Invalid value for pkceMethod');\n      }\n    }\n\n    // Callback\n    // console.log('processing callback ', window.location.href);\n    const callback = this.parseCallback(window.location.href);\n    if (callback) {\n      window.history.replaceState({}, null, callback.newUrl);\n      this.processCallback(callback).subscribe(callbackProcessed => {\n        this.initBS.next(true);\n      });\n    } else if (this.initOptions) {\n      if (this.initOptions.token || this.initOptions.refreshToken) {\n        this.setToken(this.initOptions.token, this.initOptions.refreshToken, this.initOptions.idToken, false);\n        this.timeSkew = this.initOptions.timeSkew || 0;\n        this.initBS.next(true);\n      } else if (this.initOptions.onLoad) {\n        switch (this.initOptions.onLoad) {\n          case KeycloakOnLoad.CHECK_SSO:\n            if (this.initOptions.silentCheckSsoRedirectUri) {\n              new KeycloakCheck3pCookiesIframe(this).supportedObs.subscribe(supported => {\n                if (supported) {\n                  const silentCheckIframe = new KeycloakSilentCheckLoginIframe(\n                    this,\n                    this.initOptions.silentCheckSsoRedirectUri\n                  );\n                  // console.log('silent check Iframe', silentCheckIframe);\n                } else if (supported != null && !supported && this.initOptions.silentCheckSsoFallback) {\n                  // console.log('Falling back to check-sso with redirect');\n                  this.login({\n                    prompt: 'none',\n                    redirectUri: window.location.href\n                  });\n                }\n              });\n            }\n            this.initBS.next(true);\n            break;\n          case KeycloakOnLoad.LOGIN_REQUIRED:\n            this.login({});\n            break;\n          default:\n            // console.log('Invalid value for onLoad');\n        }\n      } else {\n        this.initBS.next(true);\n      }\n    } else {\n      this.initBS.next(true);\n    }\n  }\n\n  private processAuthz(wwwAuthenticateHeader: string): Observable<string> {\n    return new Observable<string>((observer: any) => {\n      if (wwwAuthenticateHeader.indexOf('UMA') !== -1) {\n        const params = wwwAuthenticateHeader.split(',');\n\n        let paramsToSend: HttpParams = new HttpParams();\n        let headers = new HttpHeaders();\n        headers = headers.set('Content-type', 'application/x-www-form-urlencoded');\n\n        const formData: FormData = new FormData();\n        for (let i = 0; i < params.length; i++) {\n          const param = params[i].split('=');\n\n          if (param[0] === 'ticket') {\n            const ticket = param[1].substring(1, param[1].length - 1).trim();\n\n            headers = headers.set('Authorization', 'Bearer ' + this.accessToken);\n            paramsToSend = paramsToSend.set('ticket', ticket);\n            paramsToSend = paramsToSend.set('grant_type', 'urn:ietf:params:oauth:grant-type:uma-ticket');\n            paramsToSend = paramsToSend.set('rpt', this.accessToken);\n            paramsToSend = paramsToSend.set('client_id', this.keycloakConfig.clientId);\n          }\n        }\n        this.http.post(this.umaConfig?.token_endpoint, paramsToSend, {withCredentials: false, headers: headers}).subscribe(\n          (token: any) => {\n\n            // console.log('Authorization granted by the server.');\n            // Token retrieved\n            // this.accessToken = token.access_token;\n            // this.refreshToken = token.refresh_token;\n            observer.next(token.access_token);\n\n          }, error => {\n\n            if (error.status === 403) {\n              // console.error('Authorization request was denied by the server.');\n              observer.next(null);\n            } else {\n              // console.error('Could not obtain authorization data from server.');\n              observer.next(null);\n            }\n          }\n        );\n\n      } else if (wwwAuthenticateHeader.indexOf('KC_ETT') !== -1) {\n        const params = wwwAuthenticateHeader.substring('KC_ETT'.length).trim().split(',');\n        let clientId: string = null;\n\n        for (let i = 0; i < params.length; i++) {\n          const param = params[i].split('=');\n\n          if (param[0] === 'realm') {\n            clientId = param[1].substring(1, param[1].length - 1).trim();\n          }\n        }\n        this.entitlement(clientId).subscribe(entitlement => {\n          observer.next(null);\n        });\n      }\n    });\n  }\n\n  private authSuccess(accessToken: string, refreshToken: string, idToken: string, fulfillPromise: any, timeLocal: any, oauth: any) {\n    const passedTimeLocal = (timeLocal + new Date().getTime()) / 2;\n    this.setToken(accessToken, refreshToken, idToken, true);\n\n    if (this.initOptions.useNonce && ((this.tokenParsed && this.tokenParsed.nonce !== oauth.storedNonce) ||\n      (this.refreshTokenParsed && this.refreshTokenParsed.nonce !== oauth.storedNonce) ||\n      (this.idTokenParsed && this.idTokenParsed.nonce !== oauth.storedNonce))) {\n      this.authenticationErrorBS.next({error: 'invalid_nonce', error_description: 'the provided nonce does not match stored nonce'});\n      this.clearToken({});\n    } else {\n      this.timeSkew = Math.floor(passedTimeLocal / 1000) - this.tokenParsed.iat;\n      if (fulfillPromise) {\n        this.authenticationsBS.next(true);\n      }\n    }\n  }\n\n  private setToken(accessToken: string, refreshToken: string, idToken: string, useTokenTime: boolean) {\n    if (this.tokenTimeoutHandle) {\n      clearTimeout(this.tokenTimeoutHandle);\n      this.tokenTimeoutHandle = null;\n    }\n\n    if (accessToken) {\n      this.accessToken = accessToken;\n      this.refreshToken = refreshToken;\n      this.tokenParsed = Token.decodeToken(accessToken);\n      this.refreshTokenParsed = Token.decodeToken(refreshToken);\n      this.sessionId = this.tokenParsed.session_state;\n      this.authenticationsBS.next(true);\n      this.subject = this.tokenParsed.sub;\n      this.realmAccess = this.tokenParsed.realm_access;\n      this.resourceAccess = this.tokenParsed.resource_access;\n      const start = useTokenTime ? this.tokenParsed.iat : (new Date().getTime() / 1000);\n      const expiresIn = this.tokenParsed.exp - start;\n      this.tokenExpiredBS.next(false);\n      // Run the timeout outside Angular Zone. (To prevent unstable application issue NG0506).\n      // Then update the observable inside Angular Zone (otherwise observable change is not detected)\n      this.#ngZone.runOutsideAngular(() => {\n        this.tokenTimeoutHandle = setTimeout(() => this.#ngZone.run(() => this.tokenExpiredBS.next(true)), expiresIn * 1000);\n      });\n    } else {\n      delete this.accessToken;\n      delete this.tokenParsed;\n      delete this.subject;\n      delete this.realmAccess;\n      delete this.resourceAccess;\n    }\n\n    if (refreshToken) {\n      this.refreshToken = refreshToken;\n      this.refreshTokenParsed = Token.decodeToken(refreshToken);\n    } else {\n      delete this.refreshToken;\n      delete this.refreshTokenParsed;\n    }\n\n    if (idToken) {\n      this.idToken = idToken;\n      this.idTokenParsed = Token.decodeToken(idToken);\n    } else {\n      delete this.idToken;\n      delete this.idTokenParsed;\n    }\n  }\n}\n","/*\n * Copyright 2024 ebondu and/or its affiliates\n * and other contributors as indicated by the @author tags.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { inject } from '@angular/core';\nimport {\n  HttpErrorResponse,\n  HttpEvent,\n  HttpEventType,\n  HttpHandlerFn,\n  HttpInterceptorFn,\n  HttpRequest\n} from '@angular/common/http';\n\nimport { Observable, throwError } from 'rxjs';\nimport { KeycloakService } from '../service/keycloak.service';\nimport { catchError, filter, finalize, first, switchMap, tap } from 'rxjs/operators';\n\nexport const keycloakInterceptor: HttpInterceptorFn = (req: HttpRequest<unknown>, next: HttpHandlerFn): Observable<HttpEvent<unknown>> => {\n  if (req.withCredentials && !req.headers.has('Authorization')) {\n    const keycloak = inject(KeycloakService);\n    keycloak.initializedObs.pipe(filter(initialized => initialized)).subscribe(initialized => {\n      keycloak.initializedAuthzObs.pipe(filter(authzInit => authzInit)).subscribe(authzInit => {\n        if (!keycloak.accessToken) {\n          // console.log('Login required...');\n          keycloak.login({});\n        }\n      });\n    });\n    let lastResponseWithToken;\n    let errorWithToken;\n    let lastResponseWithRptToken;\n    let errorWithRptToken;\n    return keycloak.authenticationObs.pipe(\n      first(auth => auth),\n      switchMap(initialized =>\n        // console.log('Using authz service...');\n        keycloak.updateToken(5).pipe(\n          switchMap(token => {\n            const authToken = 'Bearer ' + token;\n            const authReq = req.clone({\n              headers: req.headers\n                .set('Authorization', authToken)\n                .set('Accept', 'application/json')\n            });\n\n            // const authReq = req.clone();\n            // send cloned request with header to the next handler.\n            // console.log('calling with auth token');\n            return next(authReq).pipe(\n              tap(response => {\n                lastResponseWithToken = response;\n                // console.log('success with token response', response);\n              }),\n              catchError((error: any) => {\n                errorWithToken = error;\n                if (error instanceof HttpErrorResponse) {\n                  if (error.status === 401) {\n                    // console.log('Need UMA authorization');\n                    if (error.headers.has('WWW-Authenticate')) {\n                      // console.log('using www-authenticate hearder');\n                      return keycloak.authorize(error.headers.get('WWW-Authenticate'))\n                        .pipe(\n                          filter(authorizedToken => !!authorizedToken),\n                          switchMap((authorizedToken: string) => {\n                          // console.log('Using token from service after authz');\n                          const authReqWithRpt = req.clone({\n                            headers: req.headers\n                              .set('Authorization', 'Bearer ' + authorizedToken)\n                              .set('Accept', 'application/json')\n                          });\n                          return next(authReqWithRpt).pipe(\n                            tap((response: HttpEvent<any>) => {\n                              lastResponseWithRptToken = response;\n                              if (response.type === HttpEventType.Response) {\n                                // console.log('success with rpt response', response);\n                              }\n                            }),\n                            catchError((err: any) => {\n                              errorWithRptToken = err;\n                              // console.log('error response', err);\n                              return throwError(() => err);\n                            }),\n                            finalize(() => {\n                              if (lastResponseWithRptToken.type === HttpEventType.Sent && !errorWithRptToken) {\n                                // last response type was 0, and we haven't received an error\n                                // console.log('aborted with rpt request');\n                              }\n                            })\n                          );\n                        }));\n                    } else {\n                      return throwError(() => error);\n                    }\n                  } else {\n                    // console.log('Error while calling endpoint', error);\n                    return throwError(() => error);\n                  }\n                } else {\n                  return throwError(() => error);\n                }\n              }),\n              finalize(() => {\n                if (lastResponseWithToken.type === HttpEventType.Sent && !errorWithToken) {\n                  // last response type was 0, and we haven't received an error\n                  // console.log('aborted with token request');\n                }\n              }));\n          }))\n      )\n    );\n  } else {\n    let lastResponse;\n    let error;\n    // console.log('calling without auth token');\n    return next(req).pipe(\n      tap((response: HttpEvent<any>) => {\n        lastResponse = response;\n        if (response.type === HttpEventType.Response) {\n          // console.log('success response', response);\n        }\n      }),\n      catchError((err: any) => {\n        error = err;\n        // console.log('error response', err);\n        // TODO: error handling if required\n        return throwError(() => error);\n      }),\n      finalize(() => {\n        if (lastResponse.type === HttpEventType.Sent && !error) {\n          // last response type was 0, and we haven't received an error\n          // console.log('aborted request');\n        }\n      })\n    );\n  }\n};\n","/*\n * Copyright 2022 ebondu and/or its affiliates\n * and other contributors as indicated by the @author tags.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { KeycloakService } from '../service/keycloak.service';\nimport { BehaviorSubject, Observable } from 'rxjs';\n\n/**\n * Check login Iframe utility\n */\nexport class KeycloakCheckLoginIframe {\n  private iframe: any;\n  private interval: number;\n  private iframeSrc: string;\n\n  constructor(private keycloak: KeycloakService, checkInterval: number) {\n    this.interval = checkInterval;\n    this.iframeSrc = this.keycloak.getRealmUrl() + '/protocol/openid-connect/login-status-iframe.html';\n    this.initIframe();\n  }\n\n  initIframe() {\n    this.iframe = document.createElement('iframe');\n    this.iframe.setAttribute('src', this.iframeSrc);\n    this.iframe.style.display = 'none';\n    this.iframe.setAttribute('title', 'keycloak-session-iframe');\n    document.body.appendChild(this.iframe);\n\n    if (this.interval > 0) {\n      this.iframe.onload = (() => {\n        setTimeout(() => this.checkIframe(), this.interval);\n      });\n    }\n    window.addEventListener('message', () => this.processCallbackMessage(event), false);\n  }\n\n  private checkIframe() {\n    const msg = this.keycloak.keycloakConfig.clientId + ' ' + (!!this.keycloak.sessionId ? this.keycloak.sessionId : '');\n    const origin = this.iframeSrc.substring(0, this.iframeSrc.indexOf('/', 8));\n\n    // console.log('sending message to iframe ' + msg + ' origin :' + origin);\n    this.iframe.contentWindow.postMessage(msg, origin);\n\n    if (this.interval > 0) {\n      setTimeout(() => this.checkIframe(), this.interval);\n    }\n  }\n\n  private processCallbackMessage(event: any) {\n    const origin = this.iframeSrc.substring(0, this.iframeSrc.indexOf('/', 8));\n    // console.log('checking iframe message callback..' + event.data + ' ' + event.origin);\n    if ((event.origin !== origin) || (this.iframe.contentWindow !== event.source)) {\n      // console.log('event is not coming from the iframe, ignoring it');\n      return;\n    }\n    if (!(event.data === 'unchanged' || event.data === 'changed' || event.data === 'error')) {\n      // console.log('unknown event data, ignoring it');\n      return;\n    }\n\n    if (event.data !== 'unchanged') {\n      // console.log('event from the iframe, and data changed, clearing tokens');\n      this.keycloak.clearToken({});\n    }\n  }\n}\n","/*\n * Copyright 2022 ebondu and/or its affiliates\n * and other contributors as indicated by the @author tags.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/*\n * Public API Surface of angular-keycloak\n */\n\nexport * from './lib/angular-keycloak.service';\nexport * from './lib/angular-keycloak.module';\nexport * from './lib/model/keycloak-config.model';\nexport * from './lib/service/keycloak.service';\nexport * from './lib/interceptor/keycloak.interceptor';\nexport * from './lib/adapter/keycloak.adapter.cordova';\nexport * from './lib/adapter/keycloak.adapter.default';\nexport * from './lib/storage/keycloak.storage.cookie';\nexport * from './lib/storage/keycloak.storage.local';\nexport * from './lib/util/keycloak.utils.check-login-iframe';\nexport * from './lib/util/keycloak.utils.silent-check-login-iframe';\nexport * from './lib/util/keycloak.utils.check-3pCookies-iframe';\nexport * from './lib/util/keycloak.utils.token';\nexport * from './lib/util/keycloak.utils.URIParser';\n\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":["uuidv4"],"mappings":"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"}