mirror of
https://github.com/bitwarden/browser
synced 2025-12-18 01:03:35 +00:00
* [PM-2135] feat: create new user-verification module
* [PM-2136] feat: add ability to remove form field bottom margin
(cherry picked from commit 05925ff77ed47f3865c2aecade8271390d9e2fa6)
* [PM-2135] feat: refactor user-verification component
* [PM-2135] feat: refactor user-verification-prompt
* [PM-2135] feat: use form validation in prompt
* [PM-2135] feat: change autofocus target
* [PM-2135] chore: clean up old code
* [PM-2135] feat: allow user verification to show invalid password error
* [PM-2135] feat: hack mark as touched to get error to display
* [PM-2135] chore: move to auth
* [PM-2135] fix: hardcoded dialog buttons
* [PM-2135] feat: add onDestroy handler
* [PM-2135] fix: remove unecessary directive input
* [PM-2135] feat: add password toggle
* [PM-2135] chore: add hack comment
* [PM-2135] chore: move services to auth folder and rename
* [PM-2135] fix: show correct error messages
* [PM-2135] fix: re-add non-existant files to whitelist
I honestly don't know why the linter is complaining about this
* Fix capital letters whitelist
* [PM-2135] chore: remove rows that were mistakenly added during merge from master
* [PM-2135] chore: remove rows that were mistakenly added during merge from master
* [PM-2135] feat: disable built-in browser validations
* Revert "[PM-2135] feat: disable built-in browser validations"
This reverts commit 969f75822a.
---------
Co-authored-by: Thomas Rittson <trittson@bitwarden.com>
121 lines
4.3 KiB
TypeScript
121 lines
4.3 KiB
TypeScript
import { Component } from "@angular/core";
|
|
|
|
import { ModalConfig } from "@bitwarden/angular/services/modal.service";
|
|
import { ApiService } from "@bitwarden/common/abstractions/api.service";
|
|
import { OrganizationApiServiceAbstraction } from "@bitwarden/common/admin-console/abstractions/organization/organization-api.service.abstraction";
|
|
import { OrganizationApiKeyType } from "@bitwarden/common/admin-console/enums";
|
|
import { OrganizationApiKeyRequest } from "@bitwarden/common/admin-console/models/request/organization-api-key.request";
|
|
import { UserVerificationService } from "@bitwarden/common/auth/abstractions/user-verification/user-verification.service.abstraction";
|
|
import { ApiKeyResponse } from "@bitwarden/common/auth/models/response/api-key.response";
|
|
import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service";
|
|
import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service";
|
|
import { Verification } from "@bitwarden/common/types/verification";
|
|
|
|
export interface BillingSyncApiModalData {
|
|
organizationId: string;
|
|
hasBillingToken: boolean;
|
|
}
|
|
|
|
@Component({
|
|
selector: "app-billing-sync-api-key",
|
|
templateUrl: "billing-sync-api-key.component.html",
|
|
})
|
|
export class BillingSyncApiKeyComponent {
|
|
organizationId: string;
|
|
hasBillingToken: boolean;
|
|
|
|
showRotateScreen: boolean;
|
|
masterPassword: Verification;
|
|
formPromise: Promise<ApiKeyResponse>;
|
|
clientSecret?: string;
|
|
keyRevisionDate?: Date;
|
|
lastSyncDate?: Date = null;
|
|
|
|
constructor(
|
|
private userVerificationService: UserVerificationService,
|
|
private apiService: ApiService,
|
|
private platformUtilsService: PlatformUtilsService,
|
|
private i18nService: I18nService,
|
|
private organizationApiService: OrganizationApiServiceAbstraction,
|
|
modalConfig: ModalConfig<BillingSyncApiModalData>
|
|
) {
|
|
this.organizationId = modalConfig.data.organizationId;
|
|
this.hasBillingToken = modalConfig.data.hasBillingToken;
|
|
}
|
|
|
|
copy() {
|
|
this.platformUtilsService.copyToClipboard(this.clientSecret);
|
|
}
|
|
|
|
async submit() {
|
|
if (this.showRotateScreen) {
|
|
this.formPromise = this.userVerificationService
|
|
.buildRequest(this.masterPassword, OrganizationApiKeyRequest)
|
|
.then((request) => {
|
|
request.type = OrganizationApiKeyType.BillingSync;
|
|
return this.organizationApiService.rotateApiKey(this.organizationId, request);
|
|
});
|
|
const response = await this.formPromise;
|
|
await this.load(response);
|
|
this.showRotateScreen = false;
|
|
this.platformUtilsService.showToast(
|
|
"success",
|
|
null,
|
|
this.i18nService.t("billingSyncApiKeyRotated")
|
|
);
|
|
} else {
|
|
this.formPromise = this.userVerificationService
|
|
.buildRequest(this.masterPassword, OrganizationApiKeyRequest)
|
|
.then((request) => {
|
|
request.type = OrganizationApiKeyType.BillingSync;
|
|
return this.organizationApiService.getOrCreateApiKey(this.organizationId, request);
|
|
});
|
|
const response = await this.formPromise;
|
|
await this.load(response);
|
|
}
|
|
}
|
|
|
|
async load(response: ApiKeyResponse) {
|
|
this.clientSecret = response.apiKey;
|
|
this.keyRevisionDate = response.revisionDate;
|
|
this.hasBillingToken = true;
|
|
const syncStatus = await this.apiService.getSponsorshipSyncStatus(this.organizationId);
|
|
this.lastSyncDate = syncStatus.lastSyncDate;
|
|
}
|
|
|
|
cancelRotate() {
|
|
this.showRotateScreen = false;
|
|
}
|
|
|
|
rotateToken() {
|
|
this.showRotateScreen = true;
|
|
}
|
|
|
|
private dayDiff(date1: Date, date2: Date): number {
|
|
const diffTime = Math.abs(date2.getTime() - date1.getTime());
|
|
return Math.round(diffTime / (1000 * 60 * 60 * 24));
|
|
}
|
|
|
|
get submitButtonText(): string {
|
|
if (this.showRotateScreen) {
|
|
return this.i18nService.t("rotateToken");
|
|
}
|
|
|
|
return this.i18nService.t(this.hasBillingToken ? "continue" : "generateToken");
|
|
}
|
|
|
|
get showLastSyncText(): boolean {
|
|
// If the keyRevisionDate is later than the lastSyncDate we need to show
|
|
// a warning that they need to put the billing sync key in their self hosted install
|
|
return this.lastSyncDate && this.lastSyncDate > this.keyRevisionDate;
|
|
}
|
|
|
|
get showAwaitingSyncText(): boolean {
|
|
return this.lastSyncDate && this.lastSyncDate <= this.keyRevisionDate;
|
|
}
|
|
|
|
get daysBetween(): number {
|
|
return this.dayDiff(this.keyRevisionDate, new Date());
|
|
}
|
|
}
|