mirror of
https://github.com/bitwarden/browser
synced 2025-12-27 05:33:59 +00:00
This PR creates a new ChangePasswordComponent. The first use-case of the ChangePasswordComponent is to place it inside a new PasswordSettingsComponent, which is accessed by going to Account Settings > Security. The ChangePasswordComponent will be updated in future PRs to handle more change password scenarios. Feature Flags: PM16117_ChangeExistingPasswordRefactor
133 lines
4.7 KiB
TypeScript
133 lines
4.7 KiB
TypeScript
// FIXME: Update this file to be type safe and remove this and next line
|
|
// @ts-strict-ignore
|
|
import { CommonModule } from "@angular/common";
|
|
import { Component, OnInit } from "@angular/core";
|
|
import { ActivatedRoute, Router } from "@angular/router";
|
|
import { firstValueFrom } from "rxjs";
|
|
|
|
import { JslibModule } from "@bitwarden/angular/jslib.module";
|
|
import { OrganizationApiServiceAbstraction } from "@bitwarden/common/admin-console/abstractions/organization/organization-api.service.abstraction";
|
|
import { PolicyApiServiceAbstraction } from "@bitwarden/common/admin-console/abstractions/policy/policy-api.service.abstraction";
|
|
import { MasterPasswordPolicyOptions } from "@bitwarden/common/admin-console/models/domain/master-password-policy-options";
|
|
import { AccountService } from "@bitwarden/common/auth/abstractions/account.service";
|
|
import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service";
|
|
import { ValidationService } from "@bitwarden/common/platform/abstractions/validation.service";
|
|
import { UserId } from "@bitwarden/common/types/guid";
|
|
import { SyncService } from "@bitwarden/common/vault/abstractions/sync/sync.service.abstraction";
|
|
|
|
// FIXME: remove `src` and fix import
|
|
// eslint-disable-next-line no-restricted-imports
|
|
import { ToastService } from "../../../../components/src/toast";
|
|
import {
|
|
InputPasswordComponent,
|
|
InputPasswordFlow,
|
|
} from "../input-password/input-password.component";
|
|
import { PasswordInputResult } from "../input-password/password-input-result";
|
|
|
|
import {
|
|
SetPasswordCredentials,
|
|
SetPasswordJitService,
|
|
} from "./set-password-jit.service.abstraction";
|
|
|
|
@Component({
|
|
standalone: true,
|
|
selector: "auth-set-password-jit",
|
|
templateUrl: "set-password-jit.component.html",
|
|
imports: [CommonModule, InputPasswordComponent, JslibModule],
|
|
})
|
|
export class SetPasswordJitComponent implements OnInit {
|
|
protected inputPasswordFlow = InputPasswordFlow.SetInitialPasswordAuthedUser;
|
|
protected email: string;
|
|
protected masterPasswordPolicyOptions: MasterPasswordPolicyOptions;
|
|
protected orgId: string;
|
|
protected orgSsoIdentifier: string;
|
|
protected resetPasswordAutoEnroll: boolean;
|
|
protected submitting = false;
|
|
protected syncLoading = true;
|
|
protected userId: UserId;
|
|
|
|
constructor(
|
|
private accountService: AccountService,
|
|
private activatedRoute: ActivatedRoute,
|
|
private i18nService: I18nService,
|
|
private organizationApiService: OrganizationApiServiceAbstraction,
|
|
private policyApiService: PolicyApiServiceAbstraction,
|
|
private router: Router,
|
|
private setPasswordJitService: SetPasswordJitService,
|
|
private syncService: SyncService,
|
|
private toastService: ToastService,
|
|
private validationService: ValidationService,
|
|
) {}
|
|
|
|
async ngOnInit() {
|
|
const activeAccount = await firstValueFrom(this.accountService.activeAccount$);
|
|
this.userId = activeAccount?.id;
|
|
this.email = activeAccount?.email;
|
|
|
|
await this.syncService.fullSync(true);
|
|
this.syncLoading = false;
|
|
|
|
await this.handleQueryParams();
|
|
}
|
|
|
|
private async handleQueryParams() {
|
|
const qParams = await firstValueFrom(this.activatedRoute.queryParams);
|
|
|
|
if (qParams.identifier != null) {
|
|
try {
|
|
this.orgSsoIdentifier = qParams.identifier;
|
|
|
|
const autoEnrollStatus = await this.organizationApiService.getAutoEnrollStatus(
|
|
this.orgSsoIdentifier,
|
|
);
|
|
this.orgId = autoEnrollStatus.id;
|
|
this.resetPasswordAutoEnroll = autoEnrollStatus.resetPasswordEnabled;
|
|
this.masterPasswordPolicyOptions =
|
|
await this.policyApiService.getMasterPasswordPolicyOptsForOrgUser(autoEnrollStatus.id);
|
|
} catch {
|
|
this.toastService.showToast({
|
|
variant: "error",
|
|
title: null,
|
|
message: this.i18nService.t("errorOccurred"),
|
|
});
|
|
}
|
|
}
|
|
}
|
|
|
|
protected async handlePasswordFormSubmit(passwordInputResult: PasswordInputResult) {
|
|
this.submitting = true;
|
|
|
|
const credentials: SetPasswordCredentials = {
|
|
...passwordInputResult,
|
|
orgSsoIdentifier: this.orgSsoIdentifier,
|
|
orgId: this.orgId,
|
|
resetPasswordAutoEnroll: this.resetPasswordAutoEnroll,
|
|
userId: this.userId,
|
|
};
|
|
|
|
try {
|
|
await this.setPasswordJitService.setPassword(credentials);
|
|
} catch (e) {
|
|
this.validationService.showError(e);
|
|
this.submitting = false;
|
|
return;
|
|
}
|
|
|
|
this.toastService.showToast({
|
|
variant: "success",
|
|
title: null,
|
|
message: this.i18nService.t("accountSuccessfullyCreated"),
|
|
});
|
|
|
|
this.toastService.showToast({
|
|
variant: "success",
|
|
title: null,
|
|
message: this.i18nService.t("inviteAccepted"),
|
|
});
|
|
|
|
this.submitting = false;
|
|
|
|
await this.router.navigate(["vault"]);
|
|
}
|
|
}
|