mirror of
https://github.com/bitwarden/browser
synced 2025-12-06 00:13:28 +00:00
* feat(newdeviceVerificaiton) : adding component and request model * feat(newDeviceverification) : adding state structure to track verify devices for active user; added API call to server. * feat(newDeviceVerification) : added visual elements for opting out of new device verification. * Fixing tests for account service. fixed DI for account service * Fixing strict lint issues * debt(deauthorizeSessionsModal) : changed modal to dialog. fixed strict typing for the new dialog for deviceVerification. * fixing tests * fixing desktop build DI * changed dialog to standalone fixed names and comments. * Adding tests for AccountService * fix linting * PM-15605 - AccountComp - fix ngOnDestroy erroring as it was incorrectly decorated with removed property. * PM-15605 - SetAccountVerifyDevicesDialogComponent - only show warning about turning off new device verification if user doensn't have 2FA configured per task description --------- Co-authored-by: Jared Snider <116684653+JaredSnider-Bitwarden@users.noreply.github.com> Co-authored-by: Jared Snider <jsnider@bitwarden.com>
124 lines
3.7 KiB
TypeScript
124 lines
3.7 KiB
TypeScript
import { firstValueFrom } from "rxjs";
|
|
|
|
import { ApiService } from "../../abstractions/api.service";
|
|
import { ErrorResponse } from "../../models/response/error.response";
|
|
import { EnvironmentService } from "../../platform/abstractions/environment.service";
|
|
import { LogService } from "../../platform/abstractions/log.service";
|
|
import { AccountApiService } from "../abstractions/account-api.service";
|
|
import { InternalAccountService } from "../abstractions/account.service";
|
|
import { UserVerificationService } from "../abstractions/user-verification/user-verification.service.abstraction";
|
|
import { RegisterFinishRequest } from "../models/request/registration/register-finish.request";
|
|
import { RegisterSendVerificationEmailRequest } from "../models/request/registration/register-send-verification-email.request";
|
|
import { RegisterVerificationEmailClickedRequest } from "../models/request/registration/register-verification-email-clicked.request";
|
|
import { SetVerifyDevicesRequest } from "../models/request/set-verify-devices.request";
|
|
import { Verification } from "../types/verification";
|
|
|
|
export class AccountApiServiceImplementation implements AccountApiService {
|
|
constructor(
|
|
private apiService: ApiService,
|
|
private userVerificationService: UserVerificationService,
|
|
private logService: LogService,
|
|
private accountService: InternalAccountService,
|
|
private environmentService: EnvironmentService,
|
|
) {}
|
|
|
|
async deleteAccount(verification: Verification): Promise<void> {
|
|
try {
|
|
const verificationRequest = await this.userVerificationService.buildRequest(verification);
|
|
await this.apiService.send("DELETE", "/accounts", verificationRequest, true, false);
|
|
this.accountService.delete();
|
|
} catch (e) {
|
|
this.logService.error(e);
|
|
throw e;
|
|
}
|
|
}
|
|
|
|
async registerSendVerificationEmail(
|
|
request: RegisterSendVerificationEmailRequest,
|
|
): Promise<null | string> {
|
|
const env = await firstValueFrom(this.environmentService.environment$);
|
|
|
|
try {
|
|
const response = await this.apiService.send(
|
|
"POST",
|
|
"/accounts/register/send-verification-email",
|
|
request,
|
|
false,
|
|
true,
|
|
env.getIdentityUrl(),
|
|
);
|
|
|
|
return response;
|
|
} catch (e: unknown) {
|
|
if (e instanceof ErrorResponse) {
|
|
if (e.statusCode === 204) {
|
|
// No content is a success response.
|
|
return null;
|
|
}
|
|
}
|
|
|
|
this.logService.error(e);
|
|
throw e;
|
|
}
|
|
}
|
|
|
|
async registerVerificationEmailClicked(
|
|
request: RegisterVerificationEmailClickedRequest,
|
|
): Promise<void> {
|
|
const env = await firstValueFrom(this.environmentService.environment$);
|
|
|
|
try {
|
|
const response = await this.apiService.send(
|
|
"POST",
|
|
"/accounts/register/verification-email-clicked",
|
|
request,
|
|
false,
|
|
false,
|
|
env.getIdentityUrl(),
|
|
);
|
|
|
|
return response;
|
|
} catch (e: unknown) {
|
|
this.logService.error(e);
|
|
throw e;
|
|
}
|
|
}
|
|
|
|
async registerFinish(request: RegisterFinishRequest): Promise<string> {
|
|
const env = await firstValueFrom(this.environmentService.environment$);
|
|
|
|
try {
|
|
const response = await this.apiService.send(
|
|
"POST",
|
|
"/accounts/register/finish",
|
|
request,
|
|
false,
|
|
true,
|
|
env.getIdentityUrl(),
|
|
);
|
|
|
|
return response;
|
|
} catch (e: unknown) {
|
|
this.logService.error(e);
|
|
throw e;
|
|
}
|
|
}
|
|
|
|
async setVerifyDevices(request: SetVerifyDevicesRequest): Promise<string> {
|
|
try {
|
|
const response = await this.apiService.send(
|
|
"POST",
|
|
"/accounts/verify-devices",
|
|
request,
|
|
true,
|
|
true,
|
|
);
|
|
|
|
return response;
|
|
} catch (e: unknown) {
|
|
this.logService.error(e);
|
|
throw e;
|
|
}
|
|
}
|
|
}
|