Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
// @ts-strict-ignore
import { Injectable } from "@angular/core";
import { Router } from "@angular/router";
import { firstValueFrom } from "rxjs";

import {
DefaultLoginComponentService,
Expand All @@ -16,10 +17,21 @@ import { SsoLoginServiceAbstraction } from "@bitwarden/common/auth/abstractions/
import { OrganizationInviteService } from "@bitwarden/common/auth/services/organization-invite/organization-invite.service";
import { CryptoFunctionService } from "@bitwarden/common/key-management/crypto/abstractions/crypto-function.service";
import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service";
import { EnvironmentService } from "@bitwarden/common/platform/abstractions/environment.service";
import {
Environment,
EnvironmentService,
} from "@bitwarden/common/platform/abstractions/environment.service";
import { LogService } from "@bitwarden/common/platform/abstractions/log.service";
import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service";
import { SdkService, toSdkDevice } from "@bitwarden/common/platform/abstractions/sdk/sdk.service";
import { PasswordGenerationServiceAbstraction } from "@bitwarden/generator-legacy";
import {
ClientSettings,
PasswordManagerClient,
PasswordPreloginResponse,
PasswordLoginRequest,
LoginResponse,
} from "@bitwarden/sdk-internal";

import { RouterService } from "../../../../core/router.service";

Expand All @@ -42,6 +54,7 @@ export class WebLoginComponentService
private router: Router,
private accountService: AccountService,
private configService: ConfigService,
private sdkService: SdkService,
) {
super(
cryptoFunctionService,
Expand Down Expand Up @@ -125,4 +138,33 @@ export class WebLoginComponentService
};
}
}

async sdkPasswordPrelogin(email: string): Promise<PasswordPreloginResponse> {
const anonSdkClient: PasswordManagerClient = await firstValueFrom(this.sdkService.client$);

const env = await firstValueFrom(this.environmentService.environment$);

const settings = this.toSettings(env);

return await anonSdkClient.auth().login(settings).get_password_prelogin(email);
}

async sdkLoginWithPassword(request: PasswordLoginRequest): Promise<LoginResponse> {
const anonSdkClient: PasswordManagerClient = await firstValueFrom(this.sdkService.client$);

const env = await firstValueFrom(this.environmentService.environment$);

const settings = this.toSettings(env);

return await anonSdkClient.auth().login(settings).login_via_password(request);
}

private toSettings(env: Environment): ClientSettings {
return {
apiUrl: env.getApiUrl(),
identityUrl: env.getIdentityUrl(),
deviceType: toSdkDevice(this.platformUtilsService.getDevice()),
userAgent: navigator.userAgent,
};
}
}
2 changes: 2 additions & 0 deletions apps/web/src/app/core/core.module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,7 @@ import { MessagingService } from "@bitwarden/common/platform/abstractions/messag
import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service";
import { SdkClientFactory } from "@bitwarden/common/platform/abstractions/sdk/sdk-client-factory";
import { SdkLoadService } from "@bitwarden/common/platform/abstractions/sdk/sdk-load.service";
import { SdkService } from "@bitwarden/common/platform/abstractions/sdk/sdk.service";
import { AbstractStorageService } from "@bitwarden/common/platform/abstractions/storage.service";
import { SystemService } from "@bitwarden/common/platform/abstractions/system.service";
import { IpcService } from "@bitwarden/common/platform/ipc";
Expand Down Expand Up @@ -340,6 +341,7 @@ const safeProviders: SafeProvider[] = [
Router,
AccountService,
ConfigService,
SdkService,
],
}),
safeProvider({
Expand Down
18 changes: 18 additions & 0 deletions libs/auth/src/angular/login/login-component.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,11 @@
// @ts-strict-ignore
import { MasterPasswordPolicyOptions } from "@bitwarden/common/admin-console/models/domain/master-password-policy-options";
import { Policy } from "@bitwarden/common/admin-console/models/domain/policy";
import {
PasswordLoginRequest,
PasswordPreloginResponse,
LoginResponse,
} from "@bitwarden/sdk-internal";

export interface PasswordPolicies {
policies: Policy[];
Expand Down Expand Up @@ -47,4 +52,17 @@ export abstract class LoginComponentService {
* Shows the back button.
*/
showBackButton: (showBackButton: boolean) => void;

/**
* Retrieves the password prelogin data required for authentication.
* This includes the user's KDF configuration needed to properly derive the master key.
* - Demo method for testing SDK login functionality
*/
sdkPasswordPrelogin?: (email: string) => Promise<PasswordPreloginResponse>;

/**
* Authenticates a user via email and master password using the SDK.
* - Demo method for testing SDK login functionality
*/
sdkLoginWithPassword?: (request: PasswordLoginRequest) => Promise<LoginResponse>;
}
32 changes: 18 additions & 14 deletions libs/auth/src/angular/login/login.component.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ import { DevicesApiServiceAbstraction } from "@bitwarden/common/auth/abstraction
import { SsoLoginServiceAbstraction } from "@bitwarden/common/auth/abstractions/sso-login.service.abstraction";
import { AuthResult } from "@bitwarden/common/auth/models/domain/auth-result";
import { ClientType, HttpStatusCode } from "@bitwarden/common/enums";
import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum";
// import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum";
import { ErrorResponse } from "@bitwarden/common/models/response/error.response";
import { AppIdService } from "@bitwarden/common/platform/abstractions/app-id.service";
import { BroadcasterService } from "@bitwarden/common/platform/abstractions/broadcaster.service";
Expand Down Expand Up @@ -668,20 +668,24 @@ export class LoginComponent implements OnInit, OnDestroy {
}

private async makePasswordPreloginCall() {
// Prefetch prelogin KDF config when enabled
try {
const flagEnabled = await this.configService.getFeatureFlag(
FeatureFlag.PM23801_PrefetchPasswordPrelogin,
);
if (flagEnabled) {
const email = this.formGroup.value.email;
if (email) {
void this.loginStrategyService.getPasswordPrelogin(email);
}
}
} catch (error) {
this.logService.error("Failed to prefetch prelogin data.", error);
if (this.formGroup.value.email) {
await this.loginComponentService.sdkPasswordPrelogin?.(this.formGroup.value.email);
}

// // Prefetch prelogin KDF config when enabled
// try {
// const flagEnabled = await this.configService.getFeatureFlag(
// FeatureFlag.PM23801_PrefetchPasswordPrelogin,
// );
// if (flagEnabled) {
// const email = this.formGroup.value.email;
// if (email) {
// void this.loginStrategyService.getPasswordPrelogin(email);
// }
// }
// } catch (error) {
// this.logService.error("Failed to prefetch prelogin data.", error);
// }
}

/**
Expand Down
Loading