import { Component } from "@angular/core"; import { CryptoFunctionService } from "@bitwarden/common/abstractions/cryptoFunction.service"; import { EnvironmentService } from "@bitwarden/common/abstractions/environment.service"; import { PasswordGenerationService } from "@bitwarden/common/abstractions/passwordGeneration.service"; import { PlatformUtilsService } from "@bitwarden/common/abstractions/platformUtils.service"; import { StateService } from "@bitwarden/common/abstractions/state.service"; import { Utils } from "@bitwarden/common/misc/utils"; @Component({ selector: "app-home", templateUrl: "home.component.html", }) export class HomeComponent { constructor( protected platformUtilsService: PlatformUtilsService, private passwordGenerationService: PasswordGenerationService, private stateService: StateService, private cryptoFunctionService: CryptoFunctionService, private environmentService: EnvironmentService ) {} async launchSsoBrowser() { // Generate necessary sso params const passwordOptions: any = { type: "password", length: 64, uppercase: true, lowercase: true, numbers: true, special: false, }; const state = (await this.passwordGenerationService.generatePassword(passwordOptions)) + ":clientId=browser"; const codeVerifier = await this.passwordGenerationService.generatePassword(passwordOptions); const codeVerifierHash = await this.cryptoFunctionService.hash(codeVerifier, "sha256"); const codeChallenge = Utils.fromBufferToUrlB64(codeVerifierHash); await this.stateService.setSsoCodeVerifier(codeVerifier); await this.stateService.setSsoState(state); let url = this.environmentService.getWebVaultUrl(); if (url == null) { url = "https://vault.bitwarden.com"; } const redirectUri = url + "/sso-connector.html"; // Launch browser this.platformUtilsService.launchUri( url + "/#/sso?clientId=browser" + "&redirectUri=" + encodeURIComponent(redirectUri) + "&state=" + state + "&codeChallenge=" + codeChallenge ); } }