{"version":3,"file":"laserfiche-lf-ui-components-lf-login.mjs","sources":["../../../projects/ui-components/lf-login/login-utils/lf-login.service.ts","../../../projects/ui-components/lf-login/lf-login.component.ts","../../../projects/ui-components/lf-login/lf-login.component.html","../../../projects/ui-components/lf-login/login-utils/lf-login-types.ts","../../../projects/ui-components/lf-login/lf-login.module.ts","../../../projects/ui-components/lf-login/lf-login-public-api.ts","../../../projects/ui-components/lf-login/laserfiche-lf-ui-components-lf-login.ts"],"sourcesContent":["// Copyright (c) Laserfiche.\r\n// Licensed under the MIT License. See LICENSE in the project root for license information.\r\n\r\nimport { EventEmitter, Injectable, Output } from '@angular/core';\r\nimport { AccountInfo, RedirectUriQueryParams } from './lf-login-internal-types';\r\nimport { AbortedLoginError, AuthorizationCredentials, AccountEndpoints } from './lf-login-types';\r\nimport { LoginState, RedirectBehavior } from '@laserfiche/lf-ui-components/shared';\r\nimport { DomainUtils, GetAccessTokenResponse, ApiException, JwtUtils, TokenClient  } from '@laserfiche/lf-api-client-core';\r\nconst CONTENT_TYPE_WWW_FORM_URLENCODED = 'application/x-www-form-urlencoded';\r\n\r\n@Injectable({\r\n  providedIn: 'root'\r\n})\r\nexport class LfLoginService {\r\n  /** @internal */\r\n  _accessToken?: AuthorizationCredentials;\r\n  /** @internal */\r\n  _accountInfo?: AccountInfo;\r\n  /** @internal */\r\n  _accountEndpoints?: AccountEndpoints;\r\n  /** @internal */\r\n  _state?: LoginState;\r\n\r\n  /** @internal */\r\n  client_id!: string;\r\n  /** @internal */\r\n  redirect_uri!: string;\r\n  /** @internal */\r\n  scope!: string;\r\n  /** @internal */\r\n  redirect_behavior: RedirectBehavior = RedirectBehavior.Replace;\r\n  /** @internal */\r\n  authorize_url_host_name: string = 'laserfiche.com';\r\n  /** @internal */\r\n  code_verifier?: string;\r\n\r\n  /** @internal */\r\n  @Output() logoutCompletedInService: EventEmitter<AbortedLoginError | undefined> = new EventEmitter<AbortedLoginError | undefined>();\r\n  /** @internal */\r\n  @Output() loginCompletedInService: EventEmitter<void> = new EventEmitter<void>();\r\n\r\n  /** @internal */\r\n  private get base64EncodedClientId(): string {\r\n    return btoa(this.client_id);\r\n  }\r\n\r\n  /** @internal */\r\n  get accountIdStorageKey() {\r\n    return `lf-login.${this.base64EncodedClientId}.account-id`;\r\n  }\r\n\r\n  /** @internal */\r\n  get accountEndpointsStorageKey() {\r\n    return `lf-login.${this.base64EncodedClientId}.account-endpoints`;\r\n  }\r\n\r\n  /** @internal */\r\n  get accessTokenStorageKey() {\r\n    return `lf-login.${this.base64EncodedClientId}.access-token`;\r\n  }\r\n\r\n  /** @internal */\r\n  get codeVerifierStorageKey() {\r\n    return `lf-login.${this.base64EncodedClientId}.code-verifier`;\r\n  }\r\n\r\n  /** @internal */\r\n  private exchangeCodeForToken_lock: boolean = false;\r\n\r\n  /** @internal */\r\n  async exchangeCodeForTokenAsync(callBackURIParams: RedirectUriQueryParams) {\r\n    let concurrentCallsDetected: boolean = false;\r\n    try {\r\n      if (this.exchangeCodeForToken_lock) {\r\n        concurrentCallsDetected = true;\r\n        console.warn('exchangeCodeForTokenAsync is already running. Will not try again.');\r\n        return;\r\n      }\r\n      this.exchangeCodeForToken_lock = true;\r\n      this.code_verifier = localStorage.getItem(this.codeVerifierStorageKey)!;\r\n      if (callBackURIParams.authorizationCode && this.code_verifier) {\r\n        try {\r\n          const tokenClient = new TokenClient(callBackURIParams.cloudSubDomain!);\r\n          const response = await tokenClient.getAccessTokenFromCode(callBackURIParams.authorizationCode, this.redirect_uri, this.client_id, undefined, this.code_verifier);\r\n          const accessToken = await this.parseTokenResponseAsync(response);\r\n          this.storeInLocalStorage(accessToken!, callBackURIParams.customerId!, callBackURIParams.cloudSubDomain!);\r\n          this._state = LoginState.LoggedIn;\r\n          console.info('state changed to LoggedIn');\r\n          this.loginCompletedInService.emit();\r\n        }\r\n        catch (e) {\r\n          const status = (<ApiException>e).status ?? 0;\r\n          const message = (<ApiException>e).message;\r\n          this.removeFromLocalStorage();\r\n          this._state = LoginState.LoggedOut;\r\n          console.error('Login Error (state changed to LoggedOut): ' + message);\r\n          this.logoutCompletedInService.emit(\r\n            {\r\n              ErrorType: status.toString(),\r\n              ErrorMessage: message\r\n            });\r\n        }\r\n      }\r\n      else if (callBackURIParams.error) {\r\n        this._state = LoginState.LoggedOut;\r\n        this.removeFromLocalStorage();\r\n        this.logoutCompletedInService.emit({\r\n          ErrorType: callBackURIParams.error.name,\r\n          ErrorMessage: callBackURIParams.error.description!\r\n        });\r\n        console.error('Login Error (state changed to Logged Out): ' + callBackURIParams.error.name + ', ' + callBackURIParams.error.description);\r\n      }\r\n      else if (callBackURIParams.authorizationCode && !this.code_verifier) {\r\n        this._state = LoginState.LoggedOut;\r\n        this.removeFromLocalStorage();\r\n        this.logoutCompletedInService.emit({\r\n          ErrorType: 'no code verifier',\r\n          ErrorMessage: 'code verifier not found'\r\n        });\r\n        console.error('Login Error (state changed to Logged Out): unable to find code verifier');\r\n      }\r\n      else {\r\n        throw new Error('Unexpected callBackURIParams');\r\n      }\r\n    }\r\n    finally {\r\n      if (!concurrentCallsDetected) {\r\n        this.exchangeCodeForToken_lock = false;\r\n      }\r\n    }\r\n  }\r\n\r\n  /** @internal */\r\n  async parseTokenResponseAsync(response: GetAccessTokenResponse): Promise<AuthorizationCredentials | undefined> {\r\n    try {\r\n      const authorizationCredentials: AuthorizationCredentials = this.getExchangeCodeSuccessResponse(response);\r\n      return authorizationCredentials;\r\n    }\r\n    catch {\r\n      throw Error('Parse token response error.');\r\n    }\r\n  }\r\n\r\n  /** @internal */\r\n  removeFromLocalStorage() {\r\n    this.removeCodeVerifierFromLocalStorage();\r\n    localStorage.removeItem(this.accessTokenStorageKey!);\r\n    localStorage.removeItem(this.accountIdStorageKey!);\r\n    this.removeFromCache();\r\n  }\r\n\r\n  removeFromCache() {\r\n    this._accessToken = undefined;\r\n    this._accountInfo = undefined;\r\n  }\r\n\r\n  /** @internal */\r\n  removeCodeVerifierFromLocalStorage() {\r\n    localStorage.removeItem(this.codeVerifierStorageKey!);\r\n    this.code_verifier = undefined;\r\n  }\r\n\r\n  /** @internal */\r\n  createPostTokenRequest(code: string): RequestInit {\r\n    const request: RequestInit = { method: 'POST' };\r\n    const headers = this.getPostRequestHeaders();\r\n    const body = {\r\n      grant_type: 'authorization_code',\r\n      code: code,\r\n      redirect_uri: this.redirect_uri,\r\n      client_id: this.client_id,\r\n      code_verifier: this.code_verifier\r\n    };\r\n    const requestBody = this.objToWWWFormUrlEncodedBody(body);\r\n    request.headers = headers;\r\n    request.body = requestBody;\r\n    return request;\r\n  }\r\n\r\n  /** @internal */\r\n  getExchangeCodeSuccessResponse(jsonResponse: any) {\r\n    const accessToken = jsonResponse['access_token'];\r\n    const refreshToken = jsonResponse['refresh_token'];\r\n    const expiresIn = jsonResponse['expires_in'];\r\n    const tokenType = jsonResponse['token_type'];\r\n    if (!accessToken) throw new Error('access_token undefined');\r\n    if (!refreshToken) throw new Error('refresh_token undefined');\r\n    if (!expiresIn) throw new Error('expires_in undefined');\r\n    if (!tokenType) throw new Error('token_type undefined');\r\n\r\n    const accessTokenResponse: AuthorizationCredentials = {\r\n      accessToken,\r\n      refreshToken,\r\n      expiresIn,\r\n      tokenType\r\n    };\r\n    return accessTokenResponse;\r\n  }\r\n\r\n  /** @internal */\r\n  storeAccessToken(responseBody: AuthorizationCredentials) {\r\n    localStorage.setItem(this.accessTokenStorageKey!, JSON.stringify(responseBody));\r\n    this._accessToken = responseBody;\r\n  }\r\n\r\n  /** @internal */\r\n  storeCodeVerifier(code_verifier: string) {\r\n    localStorage.setItem(this.codeVerifierStorageKey!, code_verifier);\r\n  }\r\n\r\n  /** @internal */\r\n  storeInLocalStorage(accessTokenCredentials: AuthorizationCredentials, accountId: string, regionalDomain: string) {\r\n    const trusteeId: string = this.parseAccessToken(accessTokenCredentials.accessToken);\r\n    const endpoints = DomainUtils.getLfEndpoints(regionalDomain);\r\n    this.storeAccountInfo(accountId, trusteeId);\r\n    this.storeAccountEndpoints(endpoints);\r\n    this.storeAccessToken(accessTokenCredentials);\r\n  }\r\n\r\n  /** @internal */\r\n  getPostRequestHeaders() {\r\n    const headers: Record<string, string> = {\r\n      'Content-Type': CONTENT_TYPE_WWW_FORM_URLENCODED\r\n    };\r\n\r\n    return headers;\r\n  }\r\n\r\n  /** @internal */\r\n  objToWWWFormUrlEncodedBody(obj: any): string {\r\n    const urlSearchParams = new URLSearchParams();\r\n    for (const i in obj) {\r\n      urlSearchParams.set(i, obj[i]);\r\n    }\r\n    return urlSearchParams.toString();\r\n  }\r\n\r\n  /** @internal */\r\n  parseAccessToken(accessToken: string): string {\r\n    const decodedAccessToken = JwtUtils.parseAccessToken(accessToken);\r\n    const trusteeId = JwtUtils.getTrusteeIdFromLfJWT(decodedAccessToken);\r\n    return trusteeId;\r\n  }\r\n\r\n  /** @internal */\r\n  private storeAccountEndpoints(accountEndpoints: AccountEndpoints) {\r\n    localStorage.setItem(this.accountEndpointsStorageKey!, JSON.stringify(accountEndpoints));\r\n    this._accountEndpoints = accountEndpoints;\r\n  }\r\n\r\n  /** @internal */\r\n  private storeAccountInfo(accountId: string, trusteeId: string) {\r\n    const accountInfo: AccountInfo = {\r\n      accountId,\r\n      trusteeId\r\n    };\r\n    localStorage.setItem(this.accountIdStorageKey!, JSON.stringify(accountInfo));\r\n    this._accountInfo = accountInfo;\r\n  }\r\n\r\n  refreshServiceAccountProperties() {\r\n    const accountInfo = localStorage.getItem(this.accountIdStorageKey);\r\n    const accountEndpoints = localStorage.getItem(this.accountEndpointsStorageKey);\r\n    this._accountInfo = JSON.parse(accountInfo!);\r\n    this._accountEndpoints = JSON.parse(accountEndpoints!);\r\n  }\r\n}\r\n","// Copyright (c) Laserfiche.\r\n// Licensed under the MIT License. See LICENSE in the project root for license information.\r\n\r\nimport {\r\n  ChangeDetectorRef,\r\n  Component,\r\n  EventEmitter,\r\n  Input,\r\n  OnChanges,\r\n  OnDestroy,\r\n  Output,\r\n  SimpleChanges,\r\n  AfterViewInit,\r\n} from '@angular/core';\r\nimport { Observable, of, Subscription } from 'rxjs';\r\nimport { AccountInfo, RedirectUriQueryParams } from './login-utils/lf-login-internal-types';\r\nimport {\r\n  AbortedLoginError,\r\n  AccountEndpoints,\r\n  AuthorizationCredentials,\r\n  LfBeforeFetchResult,\r\n  LfHttpRequestHandler,\r\n} from './login-utils/lf-login-types';\r\nimport { LoginMode, LoginState, RedirectBehavior } from '@laserfiche/lf-ui-components/shared';\r\nimport { AppLocalizationService } from '@laserfiche/lf-ui-components/internal-shared';\r\nimport { LfLoginService } from './login-utils/lf-login.service';\r\nimport { ApiException, PKCEUtils, TokenClient } from '@laserfiche/lf-api-client-core';\r\n\r\nconst LOGIN_REDIRECT_STATE = 'lf-login-redirect';\r\nconst CODE_CHALLENGE_METHOD = 'S256';\r\n@Component({\r\n  selector: 'lf-login-component',\r\n  templateUrl: './lf-login.component.html',\r\n  styleUrls: ['./lf-login.component.css'],\r\n})\r\nexport class LfLoginComponent implements OnChanges, OnDestroy, AfterViewInit {\r\n  /** @internal */\r\n  private readonly CLOUDDEV = 'clouddev';\r\n  /** @internal */\r\n  private readonly CLOUDTEST = 'cloudtest';\r\n\r\n  @Input() mode: LoginMode = LoginMode.Button;\r\n\r\n  /**\r\n   * @return {LfHttpRequestHandler}\r\n   * Returns the LfHttpRequestHandler that can be used\r\n   * to instantiate a repository API client.\r\n   */\r\n  @Input()\r\n  get authorizationRequestHandler(): LfHttpRequestHandler {\r\n    return {\r\n      beforeFetchRequestAsync: this.beforeFetchRequestAsync.bind(this),\r\n      afterFetchResponseAsync: this.afterFetchResponseAsync.bind(this),\r\n    };\r\n  }\r\n\r\n  /** @internal */\r\n  get isMenuMode(): boolean {\r\n    return this.mode === LoginMode.Menu;\r\n  }\r\n\r\n  /** @internal */\r\n  _sign_in_text: Observable<string> = this.localizationService.getStringLaserficheObservable('SIGN_IN');\r\n  /** @internal */\r\n  _sign_out_text: Observable<string> = this.localizationService.getStringLaserficheObservable('SIGN_OUT');\r\n  /** @internal */\r\n  _signing_in_text: Observable<string> = this.localizationService.getStringLaserficheObservable('SIGNING_IN');\r\n  /** @internal */\r\n  _signing_out_text: Observable<string> = this.localizationService.getStringLaserficheObservable('SIGNING_OUT');\r\n\r\n  @Input() set sign_in_text(text: string) {\r\n    this._sign_in_text = of(text);\r\n  }\r\n  @Input() set sign_out_text(text: string) {\r\n    this._sign_out_text = of(text);\r\n  }\r\n  @Input() set signing_in_text(text: string) {\r\n    this._signing_in_text = of(text);\r\n  }\r\n  @Input() set signing_out_text(text: string) {\r\n    this._signing_out_text = of(text);\r\n  }\r\n\r\n  /** @internal */\r\n  buttonText: Observable<string> = this._sign_in_text;\r\n\r\n  @Input() set client_id(val: string) {\r\n    this.loginService.client_id = val;\r\n  }\r\n  get client_id(): string {\r\n    return this.loginService.client_id;\r\n  }\r\n\r\n  @Input() set redirect_uri(val: string) {\r\n    this.loginService.redirect_uri = val;\r\n  }\r\n  get redirect_uri(): string {\r\n    return this.loginService.redirect_uri;\r\n  }\r\n\r\n  @Input() set scope(val: string) {\r\n    this.loginService.scope = val;\r\n  }\r\n  get scope(): string {\r\n    return this.loginService.scope;\r\n  }\r\n\r\n  @Input() set redirect_behavior(val: RedirectBehavior) {\r\n    this.loginService.redirect_behavior = val;\r\n  }\r\n  get redirect_behavior(): RedirectBehavior {\r\n    return this.loginService.redirect_behavior;\r\n  }\r\n\r\n  @Input() set authorize_url_host_name(val: string) {\r\n    this.loginService.authorize_url_host_name = val;\r\n  }\r\n\r\n  get authorize_url_host_name(): string {\r\n    return this.loginService.authorize_url_host_name;\r\n  }\r\n\r\n  @Input()\r\n  get authorization_credentials(): AuthorizationCredentials | undefined {\r\n    try {\r\n      if (this.loginService._accessToken) {\r\n        return this.loginService._accessToken;\r\n      } else {\r\n        const accessTokenFromStorage = localStorage.getItem(this.loginService.accessTokenStorageKey);\r\n        if (accessTokenFromStorage) {\r\n          const accessTokenCredentials: AuthorizationCredentials = JSON.parse(accessTokenFromStorage);\r\n          return accessTokenCredentials;\r\n        } else {\r\n          return undefined;\r\n        }\r\n      }\r\n    } catch (err: any) {\r\n      console.warn('Unable to retrieve accessToken: ' + err.message);\r\n      return undefined;\r\n    }\r\n  }\r\n\r\n  @Input()\r\n  get account_endpoints(): AccountEndpoints | undefined {\r\n    try {\r\n      if (this.loginService._accountEndpoints) {\r\n        return this.loginService._accountEndpoints;\r\n      } else {\r\n        const accountEndpointsFromStorage = localStorage.getItem(this.loginService.accountEndpointsStorageKey);\r\n        if (accountEndpointsFromStorage) {\r\n          const accountEndpoints: AccountEndpoints = JSON.parse(accountEndpointsFromStorage);\r\n          return accountEndpoints;\r\n        } else {\r\n          return undefined;\r\n        }\r\n      }\r\n    } catch (err: any) {\r\n      console.warn('Unable to retrieve accountEndpoints: ' + err.message);\r\n      return undefined;\r\n    }\r\n  }\r\n\r\n  @Input()\r\n  get account_id(): string | undefined {\r\n    try {\r\n      if (this.loginService._accountInfo) {\r\n        return this.loginService._accountInfo.accountId;\r\n      } else {\r\n        const accountInfoFromStorage = localStorage.getItem(this.loginService.accountIdStorageKey);\r\n        if (accountInfoFromStorage) {\r\n          const accountInfo: AccountInfo = JSON.parse(accountInfoFromStorage);\r\n          return accountInfo.accountId;\r\n        } else {\r\n          return undefined;\r\n        }\r\n      }\r\n    } catch (err: any) {\r\n      console.warn('Unable to retrieve accountId: ' + err.message);\r\n      return undefined;\r\n    }\r\n  }\r\n\r\n  @Input()\r\n  get trustee_id(): string | undefined {\r\n    try {\r\n      if (this.loginService._accountInfo) {\r\n        return this.loginService._accountInfo.trusteeId;\r\n      } else {\r\n        const accountInfoFromStorage = localStorage.getItem(this.loginService.accountIdStorageKey);\r\n        if (accountInfoFromStorage) {\r\n          const accountInfo: AccountInfo = JSON.parse(accountInfoFromStorage);\r\n          return accountInfo.trusteeId;\r\n        } else {\r\n          return undefined;\r\n        }\r\n      }\r\n    } catch (err: any) {\r\n      console.warn('Unable to retrieve trusteeId: ' + err.message);\r\n      return undefined;\r\n    }\r\n  }\r\n\r\n  @Input()\r\n  get state(): LoginState {\r\n    return this.loginService._state ?? LoginState.LoggedOut;\r\n  }\r\n\r\n  private set _state(state: LoginState) {\r\n    this.loginService._state = state;\r\n    this.setButtonText();\r\n  }\r\n\r\n  @Output() loginInitiated = new EventEmitter<string>();\r\n  @Output() logoutInitiated = new EventEmitter<string>();\r\n\r\n  @Output() loginCompleted = new EventEmitter<void>();\r\n  @Output() logoutCompleted = new EventEmitter<AbortedLoginError | void>();\r\n\r\n  /**\r\n   * Refreshes and returns the access token\r\n   * @param initiateLoginFlowOnRefreshFailure\r\n   * Indicates whether an attempt should be made to login using OAuth flow upon encountering an inability to refresh the access token.\r\n   * @returns  {Promise<string | undefined>}\r\n   */\r\n  @Input()\r\n  refreshTokenAsync: (initiateLoginFlowOnRefreshFailure: boolean) => Promise<string | undefined> = async (\r\n    initiateLoginFlowOnRefreshFailure: boolean = true\r\n  ) => {\r\n    try {\r\n      const refreshToken: string | undefined = this.authorization_credentials?.refreshToken;\r\n      if (!refreshToken) {\r\n        if (initiateLoginFlowOnRefreshFailure && !this.hasLoginError && this.state === LoginState.LoggedOut) {\r\n          console.warn('Unable to refresh, refreshToken is not defined. Will attempt to start the OAuth login flow');\r\n          await this.startOAuthLoginFlowAsync();\r\n        } else if (this.state === LoginState.LoggingIn) {\r\n          console.log('Logging in. Will not attempt to refresh');\r\n        } else {\r\n          console.warn(\r\n            'Unable to refresh, refreshToken is not defined, initiateLoginFlowOnRefreshFailure set to false'\r\n          );\r\n          this._state = LoginState.LoggedOut;\r\n          this.logoutCompleted.emit({\r\n            ErrorType: 'Refresh Token Error',\r\n            ErrorMessage: 'refreshToken is not defined',\r\n          });\r\n          this.ref.detectChanges();\r\n          this.loginService.removeFromLocalStorage();\r\n        }\r\n        return undefined;\r\n      } else {\r\n        try {\r\n          const oauthRegion = this.account_endpoints?.regionalDomain;\r\n          if (!oauthRegion) {\r\n            throw new Error('Unable to refresh. Cannot construct tokenClient.');\r\n          }\r\n          const tokenClient = new TokenClient(oauthRegion);\r\n          const response = await tokenClient.refreshAccessToken(refreshToken, this.client_id);\r\n          const newAccessToken = await this.loginService.parseTokenResponseAsync(response);\r\n          this.loginService.storeAccessToken(newAccessToken!);\r\n          this._state = LoginState.LoggedIn;\r\n          console.info('state changed to LoggedIn');\r\n          this.loginCompleted.emit();\r\n          return newAccessToken?.accessToken;\r\n        } catch (e) {\r\n          const status = (<ApiException>e).status ?? 0;\r\n          if (status === 401 || status === 403) {\r\n            if (initiateLoginFlowOnRefreshFailure && !this.hasLoginError && this.state === LoginState.LoggedOut) {\r\n              console.warn('Unable to refresh. Will attempt to start the OAuth login flow');\r\n              await this.startOAuthLoginFlowAsync();\r\n            } else {\r\n              console.warn(\r\n                `Unable to refresh, initiateLoginFlowOnRefreshFailure set to ${initiateLoginFlowOnRefreshFailure}, state is ${this.state}`\r\n              );\r\n              this._state = LoginState.LoggedOut;\r\n              this.ref.detectChanges();\r\n              this.loginService.removeFromLocalStorage();\r\n            }\r\n          }\r\n          throw e;\r\n        }\r\n      }\r\n    } catch (err: any) {\r\n      this._state = LoginState.LoggedOut;\r\n      this.ref.detectChanges();\r\n      this.loginService.removeFromLocalStorage();\r\n      this.logoutCompleted.emit({\r\n        ErrorType: 'Refresh Token Error',\r\n        ErrorMessage: err.message,\r\n      });\r\n      console.error('Unable to refresh, logged out: ' + err.message);\r\n      return undefined;\r\n    }\r\n  };\r\n\r\n  @Input()\r\n  initLoginFlowAsync: () => Promise<string | undefined> = async () => {\r\n    try {\r\n      const accessToken: string | undefined = this.authorization_credentials?.accessToken;\r\n      if (this.state === LoginState.LoggedOut && !this.hasLoginError) {\r\n        await this.startOAuthLoginFlowAsync();\r\n        return undefined;\r\n      } else {\r\n        return accessToken;\r\n      }\r\n    } catch (err: any) {\r\n      this._state = LoginState.LoggedOut;\r\n      this.ref.detectChanges();\r\n      this.loginService.removeFromLocalStorage();\r\n      this.logoutCompleted.emit({\r\n        ErrorType: 'Login Error',\r\n        ErrorMessage: err.message,\r\n      });\r\n      console.error('Unable to login, logged out: ' + err.message);\r\n      return undefined;\r\n    }\r\n  };\r\n\r\n  @Input() handleRedirectURICallbackAsync = async (url: string) => {\r\n    try {\r\n      const callbackURIParams = this.parseCallbackURI(url);\r\n      if (callbackURIParams) {\r\n        await this.loginService.exchangeCodeForTokenAsync(callbackURIParams);\r\n      }\r\n    } catch (err: any) {\r\n      console.error('handleRedirectURICallbackAsync error, unable to exchange token: ', err.message);\r\n      throw err;\r\n    }\r\n  };\r\n\r\n  /** @internal */\r\n  private logoutCompleteSub?: Subscription;\r\n  /** @internal */\r\n  private loginCompleteSub?: Subscription;\r\n  /** @internal */\r\n  private code_challenge?: string;\r\n  /** @internal */\r\n  private hasLoginError: boolean = false;\r\n  /** @internal */\r\n  private initialized: boolean = false;\r\n\r\n  /** @internal */\r\n  constructor(\r\n    /** @internal */\r\n    private ref: ChangeDetectorRef,\r\n    /** @internal */\r\n    private loginService: LfLoginService,\r\n    /** @internal */\r\n    private localizationService: AppLocalizationService\r\n  ) {\r\n    window.addEventListener('storage', (ev) => {\r\n      this.onStorageChanged(ev);\r\n    });\r\n  }\r\n\r\n  private setButtonText() {\r\n    if (this.state === LoginState.LoggedIn) {\r\n      this.buttonText = this._sign_out_text;\r\n    } else if (this.state === LoginState.LoggingIn) {\r\n      this.buttonText = this._signing_in_text;\r\n    } else if (this.state === LoginState.LoggingOut) {\r\n      this.buttonText = this._signing_out_text;\r\n    } else {\r\n      this.buttonText = this._sign_in_text;\r\n    }\r\n  }\r\n\r\n  private onStorageChanged(ev: StorageEvent) {\r\n    const keyName = ev.key;\r\n    const oldValue = ev.oldValue;\r\n    const newValue = ev.newValue;\r\n    if (keyName === this.loginService.accessTokenStorageKey) {\r\n      this.onAccessTokenLocalStorageChange(oldValue, newValue);\r\n    }\r\n  }\r\n\r\n  private onAccessTokenLocalStorageChange(oldValue: string | null, newValue: string | null) {\r\n    if (oldValue && !newValue) {\r\n      // newly logged out\r\n      this.loginService.removeFromCache();\r\n      this._state = LoginState.LoggedOut;\r\n      this.ref.detectChanges();\r\n      this.logoutCompleted.emit();\r\n    } else if (!oldValue && newValue) {\r\n      // newly logged in\r\n      this._state = LoginState.LoggingIn;\r\n      this.ref.detectChanges();\r\n\r\n      this.loginService.storeAccessToken(JSON.parse(newValue));\r\n      this.loginService.refreshServiceAccountProperties();\r\n      this._state = LoginState.LoggedIn;\r\n      this.ref.detectChanges();\r\n      this.loginCompleted.emit();\r\n    } else if (newValue && oldValue && oldValue !== newValue) {\r\n      // refreshed\r\n      const newAccessToken: AuthorizationCredentials = JSON.parse(newValue);\r\n      this.loginService.storeAccessToken(newAccessToken);\r\n      this.loginService.refreshServiceAccountProperties();\r\n      this._state = LoginState.LoggedIn;\r\n      this.ref.detectChanges();\r\n      this.loginCompleted.emit();\r\n    } else {\r\n      // accessToken didn't change\r\n      // do nothing\r\n    }\r\n  }\r\n\r\n  /** @internal */\r\n  get isLoggedIn() {\r\n    return this.loginService._state === LoginState.LoggedIn;\r\n  }\r\n\r\n  /** @internal */\r\n  get isIntermediateState() {\r\n    const loggingIn = this.loginService._state === LoginState.LoggingIn;\r\n    const loggingOut = this.loginService._state === LoginState.LoggingOut;\r\n    return loggingIn || loggingOut;\r\n  }\r\n\r\n  /** @internal */\r\n  async ngAfterViewInit() {\r\n    // duplicate of ngOnChanges code to support angular elements and components\r\n    await this.initializeLoginAsync();\r\n  }\r\n\r\n  /** @internal */\r\n  async ngOnChanges(changes: SimpleChanges) {\r\n    const currentClientId = changes['client_id'];\r\n    if (\r\n      (currentClientId?.currentValue && currentClientId?.isFirstChange()) ||\r\n      currentClientId?.previousValue !== currentClientId?.currentValue\r\n    ) {\r\n      await this.initializeLoginAsync();\r\n    }\r\n  }\r\n\r\n  /** @internal */\r\n  ngOnDestroy() {\r\n    this.loginCompleteSub?.unsubscribe();\r\n    this.logoutCompleteSub?.unsubscribe();\r\n  }\r\n\r\n  /** @internal */\r\n  private async initializeLoginAsync() {\r\n    try {\r\n      if (!this.initialized && this.client_id) {\r\n        this.logoutCompleteSub = this.loginService.logoutCompletedInService.subscribe((error) => {\r\n          this.hasLoginError = true;\r\n          this.setButtonText();\r\n          this.logoutCompleted.emit(error);\r\n        });\r\n        this.loginCompleteSub = this.loginService.loginCompletedInService.subscribe(() => {\r\n          this.setButtonText();\r\n          this.loginCompleted.emit();\r\n        });\r\n        const callBackURIParams = this.parseCallbackURI(window.location.href);\r\n        this._state = this.determineCurrentState(callBackURIParams);\r\n        this.ref.detectChanges();\r\n        if (this.loginService._state === LoginState.LoggingIn) {\r\n          await this.loginService.exchangeCodeForTokenAsync(callBackURIParams!);\r\n        }\r\n        this.initialized = true;\r\n      }\r\n    } catch (err: any) {\r\n      this.logoutCompleted.emit({\r\n        ErrorType: 'Login Error',\r\n        ErrorMessage: err.message,\r\n      });\r\n      this.loginService.removeFromLocalStorage();\r\n      this._state = LoginState.LoggedOut;\r\n      console.warn('Login Error: ' + err.message);\r\n      this.ref.detectChanges();\r\n    }\r\n  }\r\n\r\n  /** @internal */\r\n  parseCallbackURI(urlString: string): RedirectUriQueryParams | undefined {\r\n    const url = new URL(urlString);\r\n\r\n    const state = url.searchParams.get('state');\r\n    if (state === LOGIN_REDIRECT_STATE) {\r\n      const authorizationCode = this.extractCodeFromUrl(url);\r\n      const domain = this.extractDomainFromUrl(url);\r\n      const customerId = this.extractCustomerIdFromUrl(url);\r\n      const error = this.extractErrorFromUrl(url);\r\n      if (authorizationCode && domain && customerId) {\r\n        return {\r\n          authorizationCode,\r\n          cloudSubDomain: domain,\r\n          customerId,\r\n        };\r\n      } else if (error) {\r\n        return { error };\r\n      } else {\r\n        throw new Error('Unable to parse callback');\r\n      }\r\n    } else {\r\n      return undefined;\r\n    }\r\n  }\r\n\r\n  /** @internal */\r\n  extractErrorFromUrl(url: URL): { name: string; description: string } | undefined {\r\n    const error = url.searchParams.get('error');\r\n    if (error) {\r\n      const description = url.searchParams.get('description') ?? 'unknown';\r\n      return { name: error, description };\r\n    } else {\r\n      return undefined;\r\n    }\r\n  }\r\n\r\n  /** @internal */\r\n  extractCodeFromUrl(url: URL): string | undefined {\r\n    return url.searchParams.get('code') ?? undefined;\r\n  }\r\n\r\n  /** @internal */\r\n  extractDomainFromUrl(url: URL): string | undefined {\r\n    return url.searchParams.get('domain') ?? undefined;\r\n  }\r\n\r\n  /** @internal */\r\n  extractCustomerIdFromUrl(url: URL): string | undefined {\r\n    return url.searchParams.get('customerId') ?? undefined;\r\n  }\r\n\r\n  /** @internal */\r\n  determineCurrentState(callBackURIParams: RedirectUriQueryParams | undefined): LoginState {\r\n    const storedAccessToken = localStorage.getItem(this.loginService.accessTokenStorageKey!);\r\n    const storedAccountEndpoints = localStorage.getItem(this.loginService.accountEndpointsStorageKey);\r\n    const storedAccountId = localStorage.getItem(this.loginService.accountIdStorageKey);\r\n    if (storedAccessToken && storedAccountEndpoints && storedAccountId) {\r\n      this.loginService._accessToken = JSON.parse(storedAccessToken);\r\n      this.loginService._accountEndpoints = JSON.parse(storedAccountEndpoints);\r\n      const accountInfo = JSON.parse(storedAccountId);\r\n      this.loginService._accountInfo = accountInfo;\r\n      this.loginCompleted.emit();\r\n      return LoginState.LoggedIn;\r\n    } else if (callBackURIParams?.authorizationCode || callBackURIParams?.error) {\r\n      return LoginState.LoggingIn;\r\n    } else {\r\n      this.logoutCompleted.emit();\r\n      return LoginState.LoggedOut;\r\n    }\r\n  }\r\n\r\n  /** @internal */\r\n  createRefreshTokenRequest(): RequestInit {\r\n    const refreshToken: string | undefined = this.loginService._accessToken?.refreshToken;\r\n    if (refreshToken) {\r\n      const request: RequestInit = { method: 'POST' };\r\n      const headers = this.loginService.getPostRequestHeaders();\r\n      const body = {\r\n        grant_type: 'refresh_token',\r\n        refresh_token: refreshToken,\r\n        client_id: this.client_id,\r\n      };\r\n      const requestBody = this.loginService.objToWWWFormUrlEncodedBody(body);\r\n      request.headers = headers;\r\n      request.body = requestBody;\r\n      return request;\r\n    } else {\r\n      throw new Error('RefreshToken is not defined');\r\n    }\r\n  }\r\n\r\n  /** @internal */\r\n  async onLoginButtonClickAsync() {\r\n    if (this.state === LoginState.LoggedIn) {\r\n      this.startLogout();\r\n    } else if (this.state === LoginState.LoggedOut) {\r\n      await this.startLoginAsync();\r\n    } else {\r\n      // Do not expect to get here as the button should be disabled.\r\n      console.warn('Intermediate state. Should not attempt to login.');\r\n    }\r\n  }\r\n\r\n  /** @internal */\r\n  async startLoginAsync() {\r\n    try {\r\n      await this.startOAuthLoginFlowAsync();\r\n    } catch (err: any) {\r\n      if (this.loginService._state !== LoginState.LoggedOut) {\r\n        this._state = LoginState.LoggedOut;\r\n        this.ref.detectChanges();\r\n        this.loginService.removeFromLocalStorage();\r\n        this.logoutCompleted.emit({\r\n          ErrorType: 'Login Error',\r\n          ErrorMessage: err.message,\r\n        });\r\n        console.error('Login Error: ' + err.message);\r\n      }\r\n    }\r\n  }\r\n\r\n  /** @internal */\r\n  private async startOAuthLoginFlowAsync() {\r\n    const code_verifier = PKCEUtils.generateCodeVerifier();\r\n    this.loginService.storeCodeVerifier(code_verifier);\r\n\r\n    this.code_challenge = await PKCEUtils.generateCodeChallengeAsync(code_verifier);\r\n\r\n    const fullAuthorizeUrl = this.getAuthorizeUrl();\r\n    this.loginInitiated.emit(fullAuthorizeUrl);\r\n    this._state = LoginState.LoggingIn;\r\n    this.ref.detectChanges();\r\n    console.info('state changed to LoggingIn');\r\n    this.handleRedirectBehavior(fullAuthorizeUrl, 'Log in button clicked.');\r\n  }\r\n\r\n  /** @internal */\r\n  getAuthorizeUrl(): string {\r\n    const lastOAuthAuthorizeUrl = this.account_endpoints?.oauthAuthorizeUrl;\r\n    const configuredHostName = this.loginService.authorize_url_host_name;\r\n\r\n    const bothClouddev = configuredHostName.includes(this.CLOUDDEV) && lastOAuthAuthorizeUrl?.includes(this.CLOUDDEV);\r\n    const bothCloudtest =\r\n      configuredHostName.includes(this.CLOUDTEST) && lastOAuthAuthorizeUrl?.includes(this.CLOUDTEST);\r\n    const bothCloudprod =\r\n      lastOAuthAuthorizeUrl &&\r\n      !configuredHostName.includes(this.CLOUDDEV) &&\r\n      !configuredHostName.includes(this.CLOUDTEST) &&\r\n      !lastOAuthAuthorizeUrl?.includes(this.CLOUDDEV) &&\r\n      !lastOAuthAuthorizeUrl?.includes(this.CLOUDTEST);\r\n\r\n    const sameEnvironment = bothClouddev || bothCloudtest || bothCloudprod;\r\n\r\n    let currentAuthorizeUrl: string;\r\n    if (sameEnvironment && lastOAuthAuthorizeUrl) {\r\n      currentAuthorizeUrl = lastOAuthAuthorizeUrl;\r\n    } else {\r\n      currentAuthorizeUrl = this.getAuthorizeUrlWithConfiguredHostName();\r\n    }\r\n\r\n    const baseUrl: URL = new URL(currentAuthorizeUrl);\r\n    baseUrl.searchParams.set('client_id', this.client_id);\r\n    baseUrl.searchParams.set('redirect_uri', this.redirect_uri);\r\n    baseUrl.searchParams.set('scope', this.scope);\r\n    baseUrl.searchParams.set('response_type', 'code');\r\n    baseUrl.searchParams.set('response_mode', 'query');\r\n    baseUrl.searchParams.set('state', LOGIN_REDIRECT_STATE);\r\n    baseUrl.searchParams.set('code_challenge', this.code_challenge!);\r\n    baseUrl.searchParams.set('code_challenge_method', CODE_CHALLENGE_METHOD);\r\n    return baseUrl.toString();\r\n  }\r\n\r\n  /** @internal */\r\n  private getAuthorizeUrlWithConfiguredHostName(): string {\r\n    return `https://signin.${this.loginService.authorize_url_host_name}/oauth/Authorize`;\r\n  }\r\n\r\n  /** @internal */\r\n  startLogout() {\r\n    try {\r\n      this._state = LoginState.LoggingOut;\r\n      this.ref.detectChanges();\r\n      console.info('state changed to LoggingOut');\r\n\r\n      const logoutUrl = this.getFullLogoutUrl();\r\n      this.logoutInitiated.emit(logoutUrl);\r\n\r\n      this.loginService.removeFromLocalStorage();\r\n      this._state = LoginState.LoggedOut;\r\n      this.ref.detectChanges();\r\n      console.info('state changed to LoggedOut');\r\n\r\n      this.logoutCompleted.emit();\r\n      if (logoutUrl) {\r\n        this.handleRedirectBehavior(logoutUrl, 'Logout button clicked.');\r\n      }\r\n    } catch (err: any) {\r\n      if (this.loginService._state !== LoginState.LoggedOut) {\r\n        this.loginService.removeFromLocalStorage();\r\n        this._state = LoginState.LoggedOut;\r\n        this.ref.detectChanges();\r\n\r\n        console.error('Logout error (state changed to LoggedOut): ' + err.message);\r\n        this.logoutCompleted.emit({\r\n          ErrorType: 'Logout Error',\r\n          ErrorMessage: err.message,\r\n        });\r\n      }\r\n    }\r\n  }\r\n\r\n  /** @internal */\r\n  getFullLogoutUrl(): string | undefined {\r\n    if (this.loginService._accountEndpoints?.wsignoutUrl) {\r\n      const acsToLfLogout = new URL(this.loginService._accountEndpoints?.wsignoutUrl);\r\n      // Warning: if we are already logged out this will behave strangely\r\n      // won't redirect back to redirect Url\r\n      acsToLfLogout.searchParams.set('wreply', this.redirect_uri);\r\n      const stringUrl = acsToLfLogout.toString();\r\n      return stringUrl;\r\n    } else {\r\n      console.warn('No account endpoint available. Did not redirect');\r\n      return undefined;\r\n    }\r\n  }\r\n\r\n  /** @internal */\r\n  private handleRedirectBehavior(stringUrl: string, additionalContext?: string) {\r\n    if (this.redirect_behavior === RedirectBehavior.Replace) {\r\n      window.location.replace(stringUrl);\r\n    } else if (this.redirect_behavior === RedirectBehavior.Popup) {\r\n      throw new Error('Not implemented');\r\n    } else {\r\n      const concatStrings = this.concatStrings(\r\n        additionalContext,\r\n        'Redirect behavior none. Redirect must be implemented by container in event initiated handler'\r\n      );\r\n      console.log(concatStrings);\r\n    }\r\n  }\r\n\r\n  /** @internal */\r\n  concatStrings(firstString: string | undefined, secondString: string) {\r\n    const firstStringExists = firstString && firstString.length > 0;\r\n    if (firstStringExists) {\r\n      const lastCharOfFirstString = firstString?.charAt(firstString.length - 1);\r\n      const firstCharOfSecondString = secondString.charAt(0);\r\n      if (lastCharOfFirstString !== ' ' && firstCharOfSecondString !== ' ') {\r\n        return firstString + ' ' + secondString;\r\n      } else if (lastCharOfFirstString === ' ' && firstCharOfSecondString === ' ') {\r\n        return firstString + secondString.substring(1);\r\n      }\r\n      return firstString + secondString;\r\n    } else {\r\n      return secondString;\r\n    }\r\n  }\r\n\r\n  /** @internal */\r\n  private async beforeFetchRequestAsync(url: string, request: RequestInit): Promise<LfBeforeFetchResult> {\r\n    // must get accessToken each time\r\n    const accessToken = this.authorization_credentials?.accessToken;\r\n    if (accessToken) {\r\n      const headers = request.headers as Record<string, string>;\r\n      headers['Authorization'] = 'Bearer ' + accessToken;\r\n      const regionalDomain: string = this.account_endpoints?.regionalDomain ?? '';\r\n      return { regionalDomain };\r\n    } else {\r\n      throw new Error('Access Token undefined.');\r\n    }\r\n  }\r\n\r\n  /** @internal */\r\n  private async afterFetchResponseAsync(url: string, response: Response, request: RequestInit): Promise<boolean> {\r\n    if (response.status === 401) {\r\n      // this will initialize the login flow if refresh is unsuccessful\r\n      const accessToken = await this.refreshTokenAsync(true);\r\n      const retry = accessToken !== undefined;\r\n      return retry;\r\n    }\r\n    return false;\r\n  }\r\n}\r\n","<!--Copyright (c) Laserfiche.\r\nLicensed under the MIT License. See LICENSE in the project root for license information.-->\r\n\r\n<div class=\"lf-login-button\" *ngIf=\"!isMenuMode\">\r\n  <button [disabled]=\"isIntermediateState\"\r\n    [ngClass]=\"{'primary-button': !isLoggedIn,'sec-button': isLoggedIn, 'lf-button': true, 'login-button': true}\"\r\n    (click)=\"onLoginButtonClickAsync()\">\r\n    {{buttonText | async}}\r\n  </button>\r\n</div>\r\n\r\n<div class=\"lf-login-menu\" *ngIf=\"isMenuMode\">\r\n  <button [disabled]=\"isIntermediateState\" [matMenuTriggerFor]=\"menu\" class=\"lf-login-menu-trigger\"\r\n    [ngClass]=\"{'lf-trigger-logged-in': isLoggedIn}\">\r\n    <div [ngClass]=\"{'lf-logged-in': isLoggedIn, 'lf-login-trigger-button': true}\">\r\n      <span class=\"material-icons-outlined\">\r\n        person\r\n      </span>\r\n    </div>\r\n  </button>\r\n  <mat-menu #menu=\"matMenu\" class=\"lf-login-mat-menu\">\r\n    <div mat-menu-item>\r\n      <div class=\"lf-login-menu-button\" (click)=\"onLoginButtonClickAsync()\">\r\n        <button [disabled]=\"isIntermediateState\" class=\"lf-login-menu-internal-button\">\r\n          {{buttonText | async}}\r\n        </button>\r\n      </div>\r\n    </div>\r\n  </mat-menu>\r\n</div>\r\n","// Copyright (c) Laserfiche.\r\n// Licensed under the MIT License. See LICENSE in the project root for license information.\r\n\r\nexport interface AuthorizationCredentials {\r\n    accessToken: string;\r\n    refreshToken: string;\r\n    expiresIn: string;\r\n    tokenType: string;\r\n}\r\n\r\nexport interface AccountEndpoints {\r\n    webClientUrl: string;\r\n    wsignoutUrl: string;\r\n    regionalDomain: string;\r\n    oauthAuthorizeUrl: string;\r\n}\r\n\r\nexport interface AbortedLoginError {\r\n    ErrorType: string;\r\n    ErrorMessage: string;\r\n}\r\n\r\n/**\r\n * Interface defined by Laserfiche API providing\r\n * return type of beforeFetchRequestAsync\r\n */\r\nexport interface LfBeforeFetchResult {\r\n  regionalDomain: string;\r\n}\r\n\r\n/**\r\n * This object handles obtaining the accessToken and\r\n * setting the authorization header\r\n */\r\nexport interface LfHttpRequestHandler {\r\n  /**\r\n   * Called to prepare the request to the API service.\r\n   * @param url The HTTP url\r\n   * @param request The HTTP request\r\n   */\r\n  beforeFetchRequestAsync: (url: string, request: RequestInit) => Promise<LfBeforeFetchResult>;\r\n  /**\r\n   * Called to handle the response from the API service.\r\n   * @param url The HTTP url\r\n   * @param response The HTTP response\r\n   * @param request The HTTP request\r\n   * @returns true if the request should be retried.\r\n   */\r\n  afterFetchResponseAsync: (url: string, response: Response, request: RequestInit) => Promise<boolean>;\r\n}\r\n","// Copyright (c) Laserfiche.\r\n// Licensed under the MIT License. See LICENSE in the project root for license information.\r\n\r\nimport { Injector, NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { LfLoginComponent } from './lf-login.component';\r\nimport { MatMenuModule } from '@angular/material/menu';\r\nimport { createCustomElement } from '@angular/elements';\r\n\r\n\r\n@NgModule({\r\n  declarations: [\r\n    LfLoginComponent\r\n  ],\r\n  imports: [\r\n    CommonModule,\r\n    MatMenuModule\r\n  ],\r\n  bootstrap: [\r\n    LfLoginComponent\r\n  ],\r\n  exports: [\r\n    LfLoginComponent\r\n  ]\r\n})\r\nexport class LfLoginModule {\r\n  /** @internal */\r\n  constructor(\r\n    /** @internal */ injector: Injector\r\n  ) {\r\n    const elementName: string = 'lf-login';\r\n    if (window.customElements && !customElements.get(elementName)) {\r\n      const newElement = createCustomElement(LfLoginComponent, { injector });\r\n      customElements.define(elementName, newElement);\r\n    }\r\n  }\r\n}\r\n","// Copyright (c) Laserfiche.\r\n// Licensed under the MIT License. See LICENSE in the project root for license information.\r\n\r\nexport * from './lf-login.component';\r\nexport * from './login-utils/lf-login-types';\r\n\r\nexport * from './lf-login.module';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './lf-login-public-api';\n"],"names":["i1.LfLoginService"],"mappings":"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"}