diff --git a/apps/desktop/src/app/app.component.ts b/apps/desktop/src/app/app.component.ts index ea2798ff2d0..fcba1c73019 100644 --- a/apps/desktop/src/app/app.component.ts +++ b/apps/desktop/src/app/app.component.ts @@ -331,20 +331,6 @@ export class AppComponent implements OnInit, OnDestroy { } break; } - case "upgradeOrganization": { - const upgradeConfirmed = await this.dialogService.openSimpleDialog({ - title: { key: "upgradeOrganization" }, - content: { key: "upgradeOrganizationDesc" }, - acceptButtonText: { key: "learnMore" }, - type: "info", - }); - if (upgradeConfirmed) { - this.platformUtilsService.launchUri( - "https://bitwarden.com/help/upgrade-from-individual-to-org/", - ); - } - break; - } case "emailVerificationRequired": { const emailVerificationConfirmed = await this.dialogService.openSimpleDialog({ title: { key: "emailVerificationRequired" }, diff --git a/apps/desktop/src/locales/en/messages.json b/apps/desktop/src/locales/en/messages.json index 3577c295c6f..901b8de8aa9 100644 --- a/apps/desktop/src/locales/en/messages.json +++ b/apps/desktop/src/locales/en/messages.json @@ -3487,14 +3487,17 @@ "changeAcctEmail": { "message": "Change account email" }, - "organizationUpgradeRequired": { - "message": "Organization upgrade required" + "allowScreenshots": { + "message": "Allow screen capture" }, - "upgradeOrganization": { - "message": "Upgrade organization" + "allowScreenshotsDesc": { + "message": "Allow the Bitwarden desktop application to be captured in screenshots and viewed in remote desktop sessions. Disabling this will prevent access on some external displays." }, - "upgradeOrganizationDesc": { - "message": "This feature is not available for free organizations. Switch to a paid plan to unlock more features." + "confirmWindowStillVisibleTitle": { + "message": "Confirm window still visible" + }, + "confirmWindowStillVisibleContent": { + "message": "Please confirm that the window is still visible." }, "updateBrowserOrDisableFingerprintDialogTitle": { "message": "Extension update required" diff --git a/apps/desktop/src/vault/app/vault/view.component.html b/apps/desktop/src/vault/app/vault/view.component.html index f589ba53046..59e609312d7 100644 --- a/apps/desktop/src/vault/app/vault/view.component.html +++ b/apps/desktop/src/vault/app/vault/view.component.html @@ -186,16 +186,6 @@ -
-
- {{ "verificationCodeTotp" | i18n }} - - {{ "organizationUpgradeRequired" | i18n }} - - -
-
diff --git a/apps/desktop/src/vault/app/vault/view.component.ts b/apps/desktop/src/vault/app/vault/view.component.ts index ce9d3af8276..40a64ac296f 100644 --- a/apps/desktop/src/vault/app/vault/view.component.ts +++ b/apps/desktop/src/vault/app/vault/view.component.ts @@ -159,10 +159,4 @@ export class ViewComponent extends BaseViewComponent implements OnInit, OnDestro this.messagingService.send("premiumRequired"); } } - - upgradeOrganization() { - this.messagingService.send("upgradeOrganization", { - organizationId: this.cipher.organizationId, - }); - } } diff --git a/apps/web/src/app/vault/individual-vault/add-edit.component.ts b/apps/web/src/app/vault/individual-vault/add-edit.component.ts index 62ce55848f5..aa89ed9feec 100644 --- a/apps/web/src/app/vault/individual-vault/add-edit.component.ts +++ b/apps/web/src/app/vault/individual-vault/add-edit.component.ts @@ -66,7 +66,7 @@ export class AddEditComponent extends BaseAddEditComponent implements OnInit, On protected messagingService: MessagingService, eventCollectionService: EventCollectionService, protected policyService: PolicyService, - protected organizationService: OrganizationService, + organizationService: OrganizationService, logService: LogService, passwordRepromptService: PasswordRepromptService, dialogService: DialogService, @@ -307,8 +307,7 @@ export class AddEditComponent extends BaseAddEditComponent implements OnInit, On this.cipher.type === CipherType.Login && this.cipher.login.totp && this.organization?.productTierType != ProductTierType.Free && - ((this.canAccessPremium && this.cipher.organizationId == null) || - this.cipher.organizationUseTotp) + (this.cipher.organizationUseTotp || this.canAccessPremium) ); } diff --git a/libs/angular/src/vault/components/add-edit.component.ts b/libs/angular/src/vault/components/add-edit.component.ts index 26f645d89ef..7a0c8ae2669 100644 --- a/libs/angular/src/vault/components/add-edit.component.ts +++ b/libs/angular/src/vault/components/add-edit.component.ts @@ -125,7 +125,7 @@ export class AddEditComponent implements OnInit, OnDestroy { protected policyService: PolicyService, protected logService: LogService, protected passwordRepromptService: PasswordRepromptService, - protected organizationService: OrganizationService, + private organizationService: OrganizationService, protected dialogService: DialogService, protected win: Window, protected datePipe: DatePipe, diff --git a/libs/angular/src/vault/components/view.component.ts b/libs/angular/src/vault/components/view.component.ts index 18caa875e03..a1ba2fa0cb0 100644 --- a/libs/angular/src/vault/components/view.component.ts +++ b/libs/angular/src/vault/components/view.component.ts @@ -33,7 +33,7 @@ import { CollectionId } from "@bitwarden/common/types/guid"; import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; import { FolderService } from "@bitwarden/common/vault/abstractions/folder/folder.service.abstraction"; import { TotpService } from "@bitwarden/common/vault/abstractions/totp.service"; -import { FieldType, CipherType } from "@bitwarden/common/vault/enums"; +import { CipherType, FieldType } from "@bitwarden/common/vault/enums"; import { CipherRepromptType } from "@bitwarden/common/vault/enums/cipher-reprompt-type"; import { Launchable } from "@bitwarden/common/vault/interfaces/launchable"; import { AttachmentView } from "@bitwarden/common/vault/models/view/attachment.view"; @@ -65,7 +65,6 @@ export class ViewComponent implements OnDestroy, OnInit { showPrivateKey: boolean; canAccessPremium: boolean; showPremiumRequiredTotp: boolean; - showUpgradeRequiredTotp: boolean; totpCode: string; totpCodeFormatted: string; totpDash: number; @@ -153,25 +152,22 @@ export class ViewComponent implements OnDestroy, OnInit { this.billingAccountProfileStateService.hasPremiumFromAnySource$(activeUserId), ); this.showPremiumRequiredTotp = - this.cipher.login.totp && !this.canAccessPremium && !this.cipher.organizationId; + this.cipher.login.totp && !this.canAccessPremium && !this.cipher.organizationUseTotp; this.canDeleteCipher$ = this.cipherAuthorizationService.canDeleteCipher$(this.cipher, [ this.collectionId as CollectionId, ]); - this.showUpgradeRequiredTotp = - this.cipher.login.totp && this.cipher.organizationId && !this.cipher.organizationUseTotp; - if (this.cipher.folderId) { this.folder = await ( await firstValueFrom(this.folderService.folderViews$(activeUserId)) ).find((f) => f.id == this.cipher.folderId); } - const canGenerateTotp = this.cipher.organizationId - ? this.cipher.organizationUseTotp - : this.canAccessPremium; - - if (this.cipher.type === CipherType.Login && this.cipher.login.totp && canGenerateTotp) { + if ( + this.cipher.type === CipherType.Login && + this.cipher.login.totp && + (this.cipher.organizationUseTotp || this.canAccessPremium) + ) { await this.totpUpdateCode(); const interval = this.totpService.getTimeInterval(this.cipher.login.totp); await this.totpTick(interval); diff --git a/libs/vault/src/cipher-view/login-credentials/login-credentials-view.component.html b/libs/vault/src/cipher-view/login-credentials/login-credentials-view.component.html index b4a0d4841f8..8503604bf7c 100644 --- a/libs/vault/src/cipher-view/login-credentials/login-credentials-view.component.html +++ b/libs/vault/src/cipher-view/login-credentials/login-credentials-view.component.html @@ -116,7 +116,7 @@ {{ "verificationCodeTotp" | i18n }}
diff --git a/libs/vault/src/cipher-view/login-credentials/login-credentials-view.component.ts b/libs/vault/src/cipher-view/login-credentials/login-credentials-view.component.ts index 281e187f78b..7533ac26471 100644 --- a/libs/vault/src/cipher-view/login-credentials/login-credentials-view.component.ts +++ b/libs/vault/src/cipher-view/login-credentials/login-credentials-view.component.ts @@ -2,15 +2,7 @@ // @ts-strict-ignore import { CommonModule, DatePipe } from "@angular/common"; import { Component, inject, Input } from "@angular/core"; -import { - BehaviorSubject, - combineLatest, - filter, - map, - Observable, - shareReplay, - switchMap, -} from "rxjs"; +import { Observable, switchMap } from "rxjs"; import { JslibModule } from "@bitwarden/angular/jslib.module"; import { EventCollectionService } from "@bitwarden/common/abstractions/event/event-collection.service"; @@ -20,13 +12,13 @@ import { EventType } from "@bitwarden/common/enums"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; import { - BadgeModule, - ColorPasswordModule, FormFieldModule, - IconButtonModule, SectionComponent, SectionHeaderComponent, TypographyModule, + IconButtonModule, + BadgeModule, + ColorPasswordModule, } from "@bitwarden/components"; // FIXME: remove `src` and fix import @@ -59,31 +51,13 @@ type TotpCodeValues = { ], }) export class LoginCredentialsViewComponent { - @Input() - get cipher(): CipherView { - return this._cipher$.value; - } - set cipher(value: CipherView) { - this._cipher$.next(value); - } - private _cipher$ = new BehaviorSubject(null); + @Input() cipher: CipherView; - private _userHasPremium$: Observable = this.accountService.activeAccount$.pipe( + isPremium$: Observable = this.accountService.activeAccount$.pipe( switchMap((account) => this.billingAccountProfileStateService.hasPremiumFromAnySource$(account.id), ), ); - - allowTotpGeneration$: Observable = combineLatest([ - this._userHasPremium$, - this._cipher$.pipe(filter((c) => c != null)), - ]).pipe( - map(([userHasPremium, cipher]) => { - // User premium status only applies to personal ciphers, organizationUseTotp applies to organization ciphers - return (userHasPremium && cipher.organizationId == null) || cipher.organizationUseTotp; - }), - shareReplay({ refCount: true, bufferSize: 1 }), - ); showPasswordCount: boolean = false; passwordRevealed: boolean = false; totpCodeCopyObj: TotpCodeValues;