mirror of
https://github.com/bitwarden/browser
synced 2025-12-11 13:53:34 +00:00
* set pin validation to min length of 4 * use reactive forms * PM-8951 - SetPin - remove dialog close logic if pin is invalid so validation errors can be shown to the user. --------- Co-authored-by: Jared Snider <116684653+JaredSnider-Bitwarden@users.noreply.github.com> Co-authored-by: Jared Snider <jsnider@bitwarden.com>
72 lines
2.5 KiB
TypeScript
72 lines
2.5 KiB
TypeScript
// FIXME: Update this file to be type safe and remove this and next line
|
|
// @ts-strict-ignore
|
|
import { Directive, OnInit } from "@angular/core";
|
|
import { FormBuilder, Validators } from "@angular/forms";
|
|
import { firstValueFrom } from "rxjs";
|
|
|
|
import { PinServiceAbstraction } from "@bitwarden/auth/common";
|
|
import { AccountService } from "@bitwarden/common/auth/abstractions/account.service";
|
|
import { UserVerificationService } from "@bitwarden/common/auth/abstractions/user-verification/user-verification.service.abstraction";
|
|
import { Utils } from "@bitwarden/common/platform/misc/utils";
|
|
import { DialogRef } from "@bitwarden/components";
|
|
import { KeyService } from "@bitwarden/key-management";
|
|
|
|
@Directive()
|
|
export class SetPinComponent implements OnInit {
|
|
showMasterPasswordOnClientRestartOption = true;
|
|
|
|
setPinForm = this.formBuilder.group({
|
|
pin: ["", [Validators.required, Validators.minLength(4)]],
|
|
requireMasterPasswordOnClientRestart: true,
|
|
});
|
|
|
|
constructor(
|
|
private accountService: AccountService,
|
|
private keyService: KeyService,
|
|
private dialogRef: DialogRef,
|
|
private formBuilder: FormBuilder,
|
|
private pinService: PinServiceAbstraction,
|
|
private userVerificationService: UserVerificationService,
|
|
) {}
|
|
|
|
async ngOnInit() {
|
|
const hasMasterPassword = await this.userVerificationService.hasMasterPassword();
|
|
|
|
this.setPinForm.controls.requireMasterPasswordOnClientRestart.setValue(hasMasterPassword);
|
|
this.showMasterPasswordOnClientRestartOption = hasMasterPassword;
|
|
}
|
|
|
|
submit = async () => {
|
|
const pinFormControl = this.setPinForm.controls.pin;
|
|
const requireMasterPasswordOnClientRestart = this.setPinForm.get(
|
|
"requireMasterPasswordOnClientRestart",
|
|
).value;
|
|
|
|
if (Utils.isNullOrWhitespace(pinFormControl.value) || pinFormControl.invalid) {
|
|
return;
|
|
}
|
|
|
|
const userId = (await firstValueFrom(this.accountService.activeAccount$))?.id;
|
|
const userKey = await this.keyService.getUserKey();
|
|
|
|
const userKeyEncryptedPin = await this.pinService.createUserKeyEncryptedPin(
|
|
pinFormControl.value,
|
|
userKey,
|
|
);
|
|
await this.pinService.setUserKeyEncryptedPin(userKeyEncryptedPin, userId);
|
|
|
|
const pinKeyEncryptedUserKey = await this.pinService.createPinKeyEncryptedUserKey(
|
|
pinFormControl.value,
|
|
userKey,
|
|
userId,
|
|
);
|
|
await this.pinService.storePinKeyEncryptedUserKey(
|
|
pinKeyEncryptedUserKey,
|
|
requireMasterPasswordOnClientRestart,
|
|
userId,
|
|
);
|
|
|
|
this.dialogRef.close(true);
|
|
};
|
|
}
|