1
0
mirror of https://github.com/bitwarden/browser synced 2026-01-06 02:23:44 +00:00

Merge master into merge/feature/org-admin-refresh (using imerge)

This commit is contained in:
Shane Melton
2022-12-13 07:31:22 -08:00
721 changed files with 18307 additions and 5660 deletions

View File

@@ -7,7 +7,8 @@ import { EnvironmentService } from "@bitwarden/common/abstractions/environment.s
import { I18nService } from "@bitwarden/common/abstractions/i18n.service";
import { PlatformUtilsService } from "@bitwarden/common/abstractions/platformUtils.service";
import { Utils } from "@bitwarden/common/misc/utils";
import { getCookie } from "@bitwarden/electron/utils";
import { getCookie } from "../../utils";
const BroadcasterSubscriptionId = "AccessibilityCookieComponent";

View File

@@ -5,8 +5,7 @@ import { AccountApiService } from "@bitwarden/common/abstractions/account/accoun
import { I18nService } from "@bitwarden/common/abstractions/i18n.service";
import { LogService } from "@bitwarden/common/abstractions/log.service";
import { PlatformUtilsService } from "@bitwarden/common/abstractions/platformUtils.service";
import { Verification } from "../../../../../libs/common/src/types/verification";
import { Verification } from "@bitwarden/common/types/verification";
@Component({
selector: "app-delete-account",

View File

@@ -57,7 +57,7 @@
class="primary"
(click)="purchase()"
*ngIf="!isPremium"
[disabled]="purchaseBtn.loading"
[disabled]="$any(purchaseBtn).loading"
>
<b>{{ "premiumPurchase" | i18n }}</b>
</button>
@@ -67,18 +67,18 @@
#refreshBtn
type="button"
(click)="refresh()"
[disabled]="refreshBtn.loading"
[disabled]="$any(refreshBtn).loading"
appA11yTitle="{{ 'premiumRefresh' | i18n }}"
[appApiAction]="refreshPromise"
>
<i
class="bwi bwi-refresh bwi-lg bwi-fw"
[hidden]="refreshBtn.loading"
[hidden]="$any(refreshBtn).loading"
aria-hidden="true"
></i>
<i
class="bwi bwi-spinner bwi-spin bwi-lg bwi-fw"
[hidden]="!refreshBtn.loading"
[hidden]="!$any(refreshBtn).loading"
aria-hidden="true"
></i>
</button>

View File

@@ -14,9 +14,9 @@ import { DeviceType } from "@bitwarden/common/enums/deviceType";
import { StorageLocation } from "@bitwarden/common/enums/storageLocation";
import { ThemeType } from "@bitwarden/common/enums/themeType";
import { Utils } from "@bitwarden/common/misc/utils";
import { isWindowsStore } from "@bitwarden/electron/utils";
import { flagEnabled } from "../../flags";
import { isWindowsStore } from "../../utils";
import { SetPinComponent } from "../components/set-pin.component";
@Component({

View File

@@ -65,7 +65,7 @@
</ng-container>
<ng-container *ngIf="selectedProviderType === providerType.WebAuthn">
<div id="web-authn-frame">
<iframe id="webauthn_iframe" [allow]="webAuthnAllow"></iframe>
<iframe id="webauthn_iframe" [attr.allow]="webAuthnAllow"></iframe>
</div>
<div class="box first">
<div class="box-content">

View File

@@ -20,7 +20,7 @@ import { BroadcasterService } from "@bitwarden/common/abstractions/broadcaster.s
import { CipherService } from "@bitwarden/common/abstractions/cipher.service";
import { CollectionService } from "@bitwarden/common/abstractions/collection.service";
import { CryptoService } from "@bitwarden/common/abstractions/crypto.service";
import { EventService } from "@bitwarden/common/abstractions/event.service";
import { EventUploadService } from "@bitwarden/common/abstractions/event/event-upload.service";
import { InternalFolderService } from "@bitwarden/common/abstractions/folder/folder.service.abstraction";
import { I18nService } from "@bitwarden/common/abstractions/i18n.service";
import { KeyConnectorService } from "@bitwarden/common/abstractions/keyConnector.service";
@@ -125,7 +125,7 @@ export class AppComponent implements OnInit, OnDestroy {
private platformUtilsService: PlatformUtilsService,
private systemService: SystemService,
private stateService: StateService,
private eventService: EventService,
private eventUploadService: EventUploadService,
private policyService: InternalPolicyService,
private modalService: ModalService,
private keyConnectorService: KeyConnectorService
@@ -465,7 +465,7 @@ export class AppComponent implements OnInit, OnDestroy {
private async logOut(expired: boolean, userId?: string) {
const userBeingLoggedOut = await this.stateService.getUserId({ userId: userId });
await Promise.all([
this.eventService.uploadEvents(userBeingLoggedOut),
this.eventUploadService.uploadEvents(userBeingLoggedOut),
this.syncService.setLastSync(new Date(0), userBeingLoggedOut),
this.cryptoService.clearKeys(userBeingLoggedOut),
this.settingsService.clear(userBeingLoggedOut),

View File

@@ -90,7 +90,6 @@ import { SharedModule } from "./shared/shared.module";
import { AddEditCustomFieldsComponent } from "./vault/add-edit-custom-fields.component";
import { AddEditComponent } from "./vault/add-edit.component";
import { AttachmentsComponent } from "./vault/attachments.component";
import { CiphersComponent } from "./vault/ciphers.component";
import { CollectionsComponent } from "./vault/collections.component";
import { ExportComponent } from "./vault/export.component";
import { FolderAddEditComponent } from "./vault/folder-add-edit.component";
@@ -99,6 +98,7 @@ import { PasswordGeneratorHistoryComponent } from "./vault/password-generator-hi
import { PasswordHistoryComponent } from "./vault/password-history.component";
import { ShareComponent } from "./vault/share.component";
import { VaultFilterModule } from "./vault/vault-filter/vault-filter.module";
import { VaultItemsComponent } from "./vault/vault-items.component";
import { VaultComponent } from "./vault/vault.component";
import { ViewCustomFieldsComponent } from "./vault/view-custom-fields.component";
import { ViewComponent } from "./vault/view.component";
@@ -168,7 +168,7 @@ registerLocaleData(localeZhTw, "zh-TW");
AddEditCustomFieldsComponent,
AppComponent,
AttachmentsComponent,
CiphersComponent,
VaultItemsComponent,
CollectionsComponent,
DeleteAccountComponent,
EnvironmentComponent,

View File

@@ -5,12 +5,7 @@ import { Utils } from "@bitwarden/common/misc/utils";
@Component({
selector: "app-avatar",
template: `<img
*ngIf="src"
[src]="src"
title="{{ data }}"
[ngClass]="{ 'rounded-circle': circle }"
/>`,
template: `<img *ngIf="src" [src]="src" [ngClass]="{ 'rounded-circle': circle }" />`,
})
export class AvatarComponent implements OnChanges, OnInit {
@Input() size = 45;
@@ -20,7 +15,7 @@ export class AvatarComponent implements OnChanges, OnInit {
@Input() circle = false;
@Input() color?: string;
@Input() id?: number;
@Input() id?: string;
@Input() text?: string;
private svgCharCount = 2;

View File

@@ -12,7 +12,7 @@
<app-avatar
[text]="activeAccount.name"
[id]="activeAccount.id"
size="25"
[size]="25"
[circle]="true"
[fontSize]="14"
[dynamic]="true"
@@ -61,7 +61,7 @@
<app-avatar
[text]="a.value.profile.name ?? a.value.profile.email"
[id]="a.value.profile.userId"
size="25"
[size]="25"
[circle]="true"
[fontSize]="14"
[dynamic]="true"

View File

@@ -1,7 +1,7 @@
import { enableProdMode } from "@angular/core";
import { platformBrowserDynamic } from "@angular/platform-browser-dynamic";
import { isDev } from "@bitwarden/electron/utils";
import { isDev } from "../utils";
// tslint:disable-next-line
require("../scss/styles.scss");

View File

@@ -35,7 +35,7 @@
name="Type_{{ o.value }}"
id="type_{{ o.value }}"
[value]="o.value"
(change)="typeChanged(o)"
(change)="typeChanged()"
[checked]="send.type === o.value"
[disabled]="disableSend"
/>
@@ -280,10 +280,14 @@
appA11yTitle="{{ 'delete' | i18n }}"
*ngIf="editMode"
>
<i class="bwi bwi-trash bwi-lg bwi-fw" [hidden]="deleteBtn.loading" aria-hidden="true"></i>
<i
class="bwi bwi-trash bwi-lg bwi-fw"
[hidden]="$any(deleteBtn).loading"
aria-hidden="true"
></i>
<i
class="bwi bwi-spinner bwi-spin bwi-lg bwi-fw"
[hidden]="!deleteBtn.loading"
[hidden]="!$any(deleteBtn).loading"
aria-hidden="true"
></i>
</button>

View File

@@ -46,7 +46,6 @@
formControlName="defaultExpirationDateTime"
required
placeholder="MM/DD/YYYY HH:MM AM/PM"
[readOnly]="disableSend"
/>
<small *ngIf="editMode" class="help-block">{{ "expirationDateDesc" | i18n }}</small>
</div>

View File

@@ -10,8 +10,8 @@ import { PolicyService } from "@bitwarden/common/abstractions/policy/policy.serv
import { SearchService } from "@bitwarden/common/abstractions/search.service";
import { SendService } from "@bitwarden/common/abstractions/send.service";
import { SendView } from "@bitwarden/common/models/view/send.view";
import { invokeMenu, RendererMenuItem } from "@bitwarden/electron/utils";
import { invokeMenu, RendererMenuItem } from "../../utils";
import { SearchBarService } from "../layout/search/search-bar.service";
import { AddEditComponent } from "./add-edit.component";
@@ -132,6 +132,18 @@ export class SendComponent extends BaseSendComponent implements OnInit, OnDestro
label: this.i18nService.t("copyLink"),
click: () => this.copy(send),
});
if (send.password && !send.disabled) {
menu.push({
label: this.i18nService.t("removePassword"),
click: async () => {
await this.removePassword(send);
if (this.sendId === send.id) {
this.sendId = null;
this.selectSend(send.id);
}
},
});
}
menu.push({
label: this.i18nService.t("delete"),
click: async () => {

View File

@@ -5,7 +5,7 @@ import { AbstractThemingService } from "@bitwarden/angular/services/theming/them
import { CryptoService as CryptoServiceAbstraction } from "@bitwarden/common/abstractions/crypto.service";
import { EncryptService } from "@bitwarden/common/abstractions/encrypt.service";
import { EnvironmentService as EnvironmentServiceAbstraction } from "@bitwarden/common/abstractions/environment.service";
import { EventService as EventServiceAbstraction } from "@bitwarden/common/abstractions/event.service";
import { EventUploadService as EventUploadServiceAbstraction } from "@bitwarden/common/abstractions/event/event-upload.service";
import { I18nService as I18nServiceAbstraction } from "@bitwarden/common/abstractions/i18n.service";
import { NotificationsService as NotificationsServiceAbstraction } from "@bitwarden/common/abstractions/notifications.service";
import { PlatformUtilsService as PlatformUtilsServiceAbstraction } from "@bitwarden/common/abstractions/platformUtils.service";
@@ -14,11 +14,11 @@ import { SyncService as SyncServiceAbstraction } from "@bitwarden/common/abstrac
import { TwoFactorService as TwoFactorServiceAbstraction } from "@bitwarden/common/abstractions/twoFactor.service";
import { VaultTimeoutService as VaultTimeoutServiceAbstraction } from "@bitwarden/common/abstractions/vaultTimeout/vaultTimeout.service";
import { ContainerService } from "@bitwarden/common/services/container.service";
import { EventService } from "@bitwarden/common/services/event.service";
import { EventUploadService } from "@bitwarden/common/services/event/event-upload.service";
import { VaultTimeoutService } from "@bitwarden/common/services/vaultTimeout/vaultTimeout.service";
import { I18nService } from "../../services/i18n.service";
import { NativeMessagingService } from "../../services/nativeMessaging.service";
import { NativeMessagingService } from "../../services/native-messaging.service";
@Injectable()
export class InitService {
@@ -28,7 +28,7 @@ export class InitService {
private syncService: SyncServiceAbstraction,
private vaultTimeoutService: VaultTimeoutServiceAbstraction,
private i18nService: I18nServiceAbstraction,
private eventService: EventServiceAbstraction,
private eventUploadService: EventUploadServiceAbstraction,
private twoFactorService: TwoFactorServiceAbstraction,
private notificationsService: NotificationsServiceAbstraction,
private platformUtilsService: PlatformUtilsServiceAbstraction,
@@ -48,7 +48,7 @@ export class InitService {
(this.vaultTimeoutService as VaultTimeoutService).init(true);
const locale = await this.stateService.getLocale();
await (this.i18nService as I18nService).init(locale);
(this.eventService as EventService).init(true);
(this.eventUploadService as EventUploadService).init(true);
this.twoFactorService.init();
setTimeout(() => this.notificationsService.init(), 3000);
const htmlEl = this.win.document.documentElement;

View File

@@ -39,25 +39,25 @@ import { GlobalState } from "@bitwarden/common/models/domain/global-state";
import { LoginService } from "@bitwarden/common/services/login.service";
import { MemoryStorageService } from "@bitwarden/common/services/memoryStorage.service";
import { SystemService } from "@bitwarden/common/services/system.service";
import { ElectronCryptoService } from "@bitwarden/electron/services/electronCrypto.service";
import { ElectronLogService } from "@bitwarden/electron/services/electronLog.service";
import { ElectronPlatformUtilsService } from "@bitwarden/electron/services/electronPlatformUtils.service";
import { ElectronRendererMessagingService } from "@bitwarden/electron/services/electronRendererMessaging.service";
import { ElectronRendererSecureStorageService } from "@bitwarden/electron/services/electronRendererSecureStorage.service";
import { ElectronRendererStorageService } from "@bitwarden/electron/services/electronRendererStorage.service";
import { Account } from "../../models/account";
import { EncryptedMessageHandlerService } from "../../services/encryptedMessageHandlerService";
import { ElectronCryptoService } from "../../services/electron-crypto.service";
import { ElectronLogService } from "../../services/electron-log.service";
import { ElectronPlatformUtilsService } from "../../services/electron-platform-utils.service";
import { ElectronRendererMessagingService } from "../../services/electron-renderer-messaging.service";
import { ElectronRendererSecureStorageService } from "../../services/electron-renderer-secure-storage.service";
import { ElectronRendererStorageService } from "../../services/electron-renderer-storage.service";
import { EncryptedMessageHandlerService } from "../../services/encrypted-message-handler.service";
import { I18nService } from "../../services/i18n.service";
import { NativeMessageHandlerService } from "../../services/nativeMessageHandler.service";
import { NativeMessagingService } from "../../services/nativeMessaging.service";
import { PasswordRepromptService } from "../../services/passwordReprompt.service";
import { NativeMessageHandlerService } from "../../services/native-message-handler.service";
import { NativeMessagingService } from "../../services/native-messaging.service";
import { PasswordRepromptService } from "../../services/password-reprompt.service";
import { StateService } from "../../services/state.service";
import { LoginGuard } from "../guards/login.guard";
import { SearchBarService } from "../layout/search/search-bar.service";
import { DesktopFileDownloadService } from "./desktop-file-download.service";
import { DesktopThemingService } from "./desktop-theming.service";
import { DesktopFileDownloadService } from "./desktopFileDownloadService";
import { InitService } from "./init.service";
const RELOAD_CALLBACK = new InjectionToken<() => any>("RELOAD_CALLBACK");

View File

@@ -79,8 +79,8 @@
[(ngModel)]="f.value"
*ngIf="f.type === fieldType.Boolean"
appTrueFalseValue
trueValue="true"
falseValue="false"
[trueValue]="true"
[falseValue]="false"
attr.aria-describedby="fieldName{{ i }}"
[readonly]="!cipher.edit && editMode"
/>

View File

@@ -1,7 +1,7 @@
import { Component } from "@angular/core";
import { AddEditCustomFieldsComponent as BaseAddEditCustomFieldsComponent } from "@bitwarden/angular/components/add-edit-custom-fields.component";
import { EventService } from "@bitwarden/common/abstractions/event.service";
import { EventCollectionService } from "@bitwarden/common/abstractions/event/event-collection.service";
import { I18nService } from "@bitwarden/common/abstractions/i18n.service";
@Component({
@@ -9,7 +9,7 @@ import { I18nService } from "@bitwarden/common/abstractions/i18n.service";
templateUrl: "add-edit-custom-fields.component.html",
})
export class AddEditCustomFieldsComponent extends BaseAddEditCustomFieldsComponent {
constructor(i18nService: I18nService, eventService: EventService) {
super(i18nService, eventService);
constructor(i18nService: I18nService, eventCollectionService: EventCollectionService) {
super(i18nService, eventCollectionService);
}
}

View File

@@ -75,16 +75,16 @@
appA11yTitle="{{ 'checkPassword' | i18n }}"
(click)="checkPassword()"
[appApiAction]="checkPasswordPromise"
[disabled]="checkPasswordBtn.loading"
[disabled]="$any(checkPasswordBtn).loading"
>
<i
class="bwi bwi-lg bwi-check-circle"
[hidden]="checkPasswordBtn.loading"
[hidden]="$any(checkPasswordBtn).loading"
aria-hidden="true"
></i>
<i
class="bwi bwi-lg bwi-spinner bwi-spin"
[hidden]="!checkPasswordBtn.loading"
[hidden]="!$any(checkPasswordBtn).loading"
aria-hidden="true"
></i>
</button>
@@ -485,7 +485,10 @@
id="loginUriMatch{{ i }}"
name="Login.Uris[{{ i }}].Match"
[(ngModel)]="u.match"
[hidden]="u.showOptions === false || (u.showOptions == null && u.match == null)"
[hidden]="
$any(u).showOptions === false ||
($any(u).showOptions == null && u.match == null)
"
(change)="loginUriMatchChanged(u)"
>
<option *ngFor="let o of uriMatchOptions" [ngValue]="o.value">
@@ -501,7 +504,10 @@
appA11yTitle="{{ 'toggleOptions' | i18n }}"
(click)="toggleUriOptions(u)"
[attr.aria-expanded]="
!(u.showOptions === false || (u.showOptions == null && u.match == null))
!(
$any(u).showOptions === false ||
($any(u).showOptions == null && u.match == null)
)
"
>
<i class="bwi bwi-lg bwi-cog" aria-hidden="true"></i>
@@ -634,7 +640,7 @@
<input
id="collection_{{ i }}"
type="checkbox"
[(ngModel)]="c.checked"
[(ngModel)]="$any(c).checked"
name="Collection[{{ i }}].Checked"
/>
</div>
@@ -647,12 +653,16 @@
type="submit"
class="primary"
appA11yTitle="{{ 'save' | i18n }}"
[disabled]="form.loading"
[disabled]="$any(form).loading"
>
<i class="bwi bwi-save-changes bwi-lg bwi-fw" [hidden]="form.loading" aria-hidden="true"></i>
<i
class="bwi bwi-save-changes bwi-lg bwi-fw"
[hidden]="$any(form).loading"
aria-hidden="true"
></i>
<i
class="bwi bwi-spinner bwi-spin bwi-lg bwi-fw"
[hidden]="!form.loading"
[hidden]="!$any(form).loading"
aria-hidden="true"
></i>
</button>
@@ -675,13 +685,17 @@
class="danger"
appA11yTitle="{{ 'delete' | i18n }}"
*ngIf="editMode && !cloneMode"
[disabled]="deleteBtn.loading"
[disabled]="$any(deleteBtn).loading"
[appApiAction]="deletePromise"
>
<i class="bwi bwi-trash bwi-lg bwi-fw" [hidden]="deleteBtn.loading" aria-hidden="true"></i>
<i
class="bwi bwi-trash bwi-lg bwi-fw"
[hidden]="$any(deleteBtn).loading"
aria-hidden="true"
></i>
<i
class="bwi bwi-spinner bwi-spin bwi-lg bwi-fw"
[hidden]="!deleteBtn.loading"
[hidden]="!$any(deleteBtn).loading"
aria-hidden="true"
></i>
</button>

View File

@@ -6,7 +6,7 @@ import { AuditService } from "@bitwarden/common/abstractions/audit.service";
import { BroadcasterService } from "@bitwarden/common/abstractions/broadcaster.service";
import { CipherService } from "@bitwarden/common/abstractions/cipher.service";
import { CollectionService } from "@bitwarden/common/abstractions/collection.service";
import { EventService } from "@bitwarden/common/abstractions/event.service";
import { EventCollectionService } from "@bitwarden/common/abstractions/event/event-collection.service";
import { FolderService } from "@bitwarden/common/abstractions/folder/folder.service.abstraction";
import { I18nService } from "@bitwarden/common/abstractions/i18n.service";
import { LogService } from "@bitwarden/common/abstractions/log.service";
@@ -35,7 +35,7 @@ export class AddEditComponent extends BaseAddEditComponent implements OnChanges,
stateService: StateService,
collectionService: CollectionService,
messagingService: MessagingService,
eventService: EventService,
eventCollectionService: EventCollectionService,
policyService: PolicyService,
passwordRepromptService: PasswordRepromptService,
private broadcasterService: BroadcasterService,
@@ -52,7 +52,7 @@ export class AddEditComponent extends BaseAddEditComponent implements OnChanges,
stateService,
collectionService,
messagingService,
eventService,
eventCollectionService,
policyService,
logService,
passwordRepromptService,

View File

@@ -21,16 +21,16 @@
(click)="delete(a)"
#deleteBtn
[appApiAction]="deletePromises[a.id]"
[disabled]="deleteBtn.loading"
[disabled]="$any(deleteBtn).loading"
>
<i
class="bwi bwi-trash bwi-lg bwi-fw"
[hidden]="deleteBtn.loading"
[hidden]="$any(deleteBtn).loading"
aria-hidden="true"
></i>
<i
class="bwi bwi-spinner bwi-spin bwi-lg bwi-fw"
[hidden]="!deleteBtn.loading"
[hidden]="!$any(deleteBtn).loading"
aria-hidden="true"
></i>
</button>

View File

@@ -19,7 +19,7 @@
<input
id="collection_{{ i }}"
type="checkbox"
[(ngModel)]="c.checked"
[(ngModel)]="$any(c).checked"
name="Collection[{{ i }}].Checked"
/>
</div>

View File

@@ -6,7 +6,7 @@ import { UntypedFormBuilder } from "@angular/forms";
import { ExportComponent as BaseExportComponent } from "@bitwarden/angular/components/export.component";
import { BroadcasterService } from "@bitwarden/common/abstractions/broadcaster.service";
import { CryptoService } from "@bitwarden/common/abstractions/crypto.service";
import { EventService } from "@bitwarden/common/abstractions/event.service";
import { EventCollectionService } from "@bitwarden/common/abstractions/event/event-collection.service";
import { ExportService } from "@bitwarden/common/abstractions/export.service";
import { FileDownloadService } from "@bitwarden/common/abstractions/fileDownload/fileDownload.service";
import { I18nService } from "@bitwarden/common/abstractions/i18n.service";
@@ -27,7 +27,7 @@ export class ExportComponent extends BaseExportComponent implements OnInit {
i18nService: I18nService,
platformUtilsService: PlatformUtilsService,
exportService: ExportService,
eventService: EventService,
eventCollectionService: EventCollectionService,
policyService: PolicyService,
userVerificationService: UserVerificationService,
formBuilder: UntypedFormBuilder,
@@ -40,7 +40,7 @@ export class ExportComponent extends BaseExportComponent implements OnInit {
i18nService,
platformUtilsService,
exportService,
eventService,
eventCollectionService,
policyService,
window,
logService,

View File

@@ -47,17 +47,17 @@
class="danger"
appA11yTitle="{{ 'delete' | i18n }}"
*ngIf="editMode"
[disabled]="deleteBtn.loading"
[disabled]="$any(deleteBtn).loading"
[appApiAction]="deletePromise"
>
<i
class="bwi bwi-trash bwi-lg bwi-fw"
[hidden]="deleteBtn.loading"
[hidden]="$any(deleteBtn).loading"
aria-hidden="true"
></i>
<i
class="bwi bwi-spinner bwi-spin bwi-lg bwi-fw"
[hidden]="!deleteBtn.loading"
[hidden]="!$any(deleteBtn).loading"
aria-hidden="true"
></i>
</button>

View File

@@ -52,11 +52,11 @@
appStopClick
appA11yTitle="{{ 'regenerateUsername' | i18n }}"
(click)="regenerate()"
[disabled]="form.loading"
[disabled]="$any(form).loading"
>
<i
class="bwi bwi-lg bwi-generate"
[ngClass]="form.loading ? 'bwi-spin' : ''"
[ngClass]="$any(form).loading ? 'bwi-spin' : ''"
aria-hidden="true"
></i>
</button>
@@ -353,22 +353,18 @@
</div>
<div class="box" *ngIf="usernameOptions.type === 'forwarded'" [hidden]="!showOptions">
<div class="box-content condensed">
<div class="box-content-row" role="radiogroup" aria-labelledby="forwardTypeHeading">
<label id="forwardTypeHeading" class="radio-header">{{ "service" | i18n }}</label>
<div class="radio-group text-default" appBoxRow *ngFor="let o of forwardOptions">
<input
type="radio"
[(ngModel)]="usernameOptions.forwardedService"
name="ForwardType"
id="forwardtype_{{ o.value }}"
[value]="o.value"
(change)="saveUsernameOptions()"
[checked]="usernameOptions.forwardedService === o.value"
/>
<label for="forwardtype_{{ o.value }}">
<div class="box-content-row" role="listbox" aria-labelledby="forwardTypeHeading">
<label id="forwardTypeHeading">{{ "service" | i18n }}</label>
<select
id="ForwardTypeDropdown"
name="ForwardType"
[(ngModel)]="usernameOptions.forwardedService"
(change)="saveUsernameOptions()"
>
<option *ngFor="let o of forwardOptions" [ngValue]="o.value" role="option">
{{ o.name }}
</label>
</div>
</option>
</select>
</div>
<ng-container *ngIf="usernameOptions.forwardedService === 'simplelogin'">
<div class="box-content-row" appBoxRow>
@@ -388,7 +384,7 @@
<input
id="duckduckgo-apikey"
type="password"
name="DuckDudkGoApiKey"
name="DuckDuckGoApiKey"
[(ngModel)]="usernameOptions.forwardedDuckDuckGoToken"
(blur)="saveUsernameOptions()"
/>

View File

@@ -63,7 +63,7 @@
class="edit-button"
*ngIf="f.node.id"
(click)="editFolder(f.node)"
appA11yTitle="{{ 'editFolder' | i18n }}"
appA11yTitle="{{ 'editFolder' | i18n }}: {{ f.node.name }}"
>
<i class="bwi bwi-pencil bwi-fw" aria-hidden="true"></i>
</button>

View File

@@ -24,7 +24,7 @@
class="filter-button"
(click)="clearFilter()"
[attr.aria-pressed]="!hasActiveFilter"
appA11yTitle="{{ 'vault' | i18n }}: {{ organizationGrouping.name }}"
appA11yTitle="{{ 'vault' | i18n }}: {{ organizationGrouping.name | i18n }}"
>
{{ organizationGrouping.name | i18n }}
</button>
@@ -73,7 +73,7 @@
class="filter-button"
(click)="clearFilter()"
[attr.aria-pressed]="!hasActiveFilter"
appA11yTitle="{{ 'vault' | i18n }}: {{ organizationGrouping.name }}"
appA11yTitle="{{ 'vault' | i18n }}: {{ organizationGrouping.name | i18n }}"
>
{{ organizationGrouping.name | i18n }}
</button>
@@ -102,18 +102,18 @@
<button
class="filter-button"
(click)="applyOrganizationFilter(organization)"
appA11yTitle="{{ 'vault' | i18n }}: {{ organization.name }}"
appA11yTitle="{{ 'vault' | i18n }}: {{ organization.name }} {{
organization.enabled ? '' : '(' + ('organizationIsDisabled' | i18n) + ')'
}}"
[attr.aria-pressed]="activeFilter.selectedOrganizationId === organization.id"
>
<i class="bwi bwi-fw bwi-business" aria-hidden="true"></i>
&nbsp;{{ organization.name }}
</button>
<span class="ml-auto">
<span *ngIf="!organization.enabled" class="ml-auto">
<i
*ngIf="!organization.enabled"
class="bwi bwi-fw bwi-exclamation-triangle text-danger mr-auto"
aria-label="{{ 'organizationIsDisabled' | i18n }}"
appA11yTitle="{{ 'organizationIsDisabled' | i18n }}"
aria-hidden="true"
></i>
</span>
</span>

View File

@@ -1,17 +1,17 @@
import { Component } from "@angular/core";
import { CiphersComponent as BaseCiphersComponent } from "@bitwarden/angular/components/ciphers.component";
import { VaultItemsComponent as BaseVaultItemsComponent } from "@bitwarden/angular/components/vault-items.component";
import { SearchService } from "@bitwarden/common/abstractions/search.service";
import { CipherView } from "@bitwarden/common/models/view/cipher.view";
import { SearchBarService } from "../layout/search/search-bar.service";
@Component({
selector: "app-vault-ciphers",
templateUrl: "ciphers.component.html",
selector: "app-vault-items",
templateUrl: "vault-items.component.html",
})
// eslint-disable-next-line rxjs-angular/prefer-takeuntil
export class CiphersComponent extends BaseCiphersComponent {
export class VaultItemsComponent extends BaseVaultItemsComponent {
constructor(searchService: SearchService, searchBarService: SearchBarService) {
super(searchService);

View File

@@ -1,5 +1,5 @@
<div id="vault" class="vault" attr.aria-hidden="{{ showingModal }}">
<app-vault-ciphers
<app-vault-items
id="items"
class="items"
[activeCipherId]="cipherId"
@@ -8,7 +8,7 @@
(onAddCipher)="addCipher($event)"
(onAddCipherOptions)="addCipherOptions()"
>
</app-vault-ciphers>
</app-vault-items>
<app-vault-view
id="details"
class="details"

View File

@@ -14,7 +14,7 @@ import { ModalRef } from "@bitwarden/angular/components/modal/modal.ref";
import { ModalService } from "@bitwarden/angular/services/modal.service";
import { VaultFilter } from "@bitwarden/angular/vault/vault-filter/models/vault-filter.model";
import { BroadcasterService } from "@bitwarden/common/abstractions/broadcaster.service";
import { EventService } from "@bitwarden/common/abstractions/event.service";
import { EventCollectionService } from "@bitwarden/common/abstractions/event/event-collection.service";
import { I18nService } from "@bitwarden/common/abstractions/i18n.service";
import { MessagingService } from "@bitwarden/common/abstractions/messaging.service";
import { PasswordRepromptService } from "@bitwarden/common/abstractions/passwordReprompt.service";
@@ -27,19 +27,19 @@ import { CipherType } from "@bitwarden/common/enums/cipherType";
import { EventType } from "@bitwarden/common/enums/eventType";
import { CipherView } from "@bitwarden/common/models/view/cipher.view";
import { FolderView } from "@bitwarden/common/models/view/folder.view";
import { invokeMenu, RendererMenuItem } from "@bitwarden/electron/utils";
import { invokeMenu, RendererMenuItem } from "../../utils";
import { SearchBarService } from "../layout/search/search-bar.service";
import { AddEditComponent } from "./add-edit.component";
import { AttachmentsComponent } from "./attachments.component";
import { CiphersComponent } from "./ciphers.component";
import { CollectionsComponent } from "./collections.component";
import { FolderAddEditComponent } from "./folder-add-edit.component";
import { GeneratorComponent } from "./generator.component";
import { PasswordHistoryComponent } from "./password-history.component";
import { ShareComponent } from "./share.component";
import { VaultFilterComponent } from "./vault-filter/vault-filter.component";
import { VaultItemsComponent } from "./vault-items.component";
import { ViewComponent } from "./view.component";
const BroadcasterSubscriptionId = "VaultComponent";
@@ -51,7 +51,7 @@ const BroadcasterSubscriptionId = "VaultComponent";
export class VaultComponent implements OnInit, OnDestroy {
@ViewChild(ViewComponent) viewComponent: ViewComponent;
@ViewChild(AddEditComponent) addEditComponent: AddEditComponent;
@ViewChild(CiphersComponent, { static: true }) ciphersComponent: CiphersComponent;
@ViewChild(VaultItemsComponent, { static: true }) vaultItemsComponent: VaultItemsComponent;
@ViewChild("generator", { read: ViewContainerRef, static: true })
generatorModalRef: ViewContainerRef;
@ViewChild(VaultFilterComponent, { static: true }) vaultFilterComponent: VaultFilterComponent;
@@ -94,7 +94,7 @@ export class VaultComponent implements OnInit, OnDestroy {
private syncService: SyncService,
private messagingService: MessagingService,
private platformUtilsService: PlatformUtilsService,
private eventService: EventService,
private eventCollectionService: EventCollectionService,
private totpService: TotpService,
private passwordRepromptService: PasswordRepromptService,
private stateService: StateService,
@@ -128,12 +128,12 @@ export class VaultComponent implements OnInit, OnDestroy {
await this.openGenerator(false);
break;
case "syncCompleted":
await this.ciphersComponent.reload(this.activeFilter.buildFilter());
await this.vaultItemsComponent.reload(this.activeFilter.buildFilter());
await this.vaultFilterComponent.reloadCollectionsAndFolders(this.activeFilter);
await this.vaultFilterComponent.reloadOrganizations();
break;
case "refreshCiphers":
this.ciphersComponent.refresh();
this.vaultItemsComponent.refresh();
break;
case "modalShown":
this.showingModal = true;
@@ -242,7 +242,7 @@ export class VaultComponent implements OnInit, OnDestroy {
selectedOrganizationId: params.selectedOrganizationId,
myVaultOnly: params.myVaultOnly ?? false,
});
await this.ciphersComponent.reload(this.activeFilter.buildFilter());
await this.vaultItemsComponent.reload(this.activeFilter.buildFilter());
});
}
@@ -309,7 +309,7 @@ export class VaultComponent implements OnInit, OnDestroy {
label: this.i18nService.t("copyPassword"),
click: () => {
this.copyValue(cipher, cipher.login.password, "password", "Password");
this.eventService.collect(EventType.Cipher_ClientCopiedPassword, cipher.id);
this.eventCollectionService.collect(EventType.Cipher_ClientCopiedPassword, cipher.id);
},
});
}
@@ -338,7 +338,7 @@ export class VaultComponent implements OnInit, OnDestroy {
label: this.i18nService.t("copySecurityCode"),
click: () => {
this.copyValue(cipher, cipher.card.code, "securityCode", "Security Code");
this.eventService.collect(EventType.Cipher_ClientCopiedCardCode, cipher.id);
this.eventCollectionService.collect(EventType.Cipher_ClientCopiedCardCode, cipher.id);
},
});
}
@@ -429,21 +429,21 @@ export class VaultComponent implements OnInit, OnDestroy {
this.cipherId = cipher.id;
this.action = "view";
this.go();
await this.ciphersComponent.refresh();
await this.vaultItemsComponent.refresh();
}
async deletedCipher(cipher: CipherView) {
this.cipherId = null;
this.action = null;
this.go();
await this.ciphersComponent.refresh();
await this.vaultItemsComponent.refresh();
}
async restoredCipher(cipher: CipherView) {
this.cipherId = null;
this.action = null;
this.go();
await this.ciphersComponent.refresh();
await this.vaultItemsComponent.refresh();
}
async editCipherAttachments(cipher: CipherView) {
@@ -468,7 +468,7 @@ export class VaultComponent implements OnInit, OnDestroy {
this.modal.onClosed.subscribe(async () => {
this.modal = null;
if (madeAttachmentChanges) {
await this.ciphersComponent.refresh();
await this.vaultItemsComponent.refresh();
}
madeAttachmentChanges = false;
});
@@ -490,7 +490,7 @@ export class VaultComponent implements OnInit, OnDestroy {
childComponent.onSharedCipher.subscribe(async () => {
this.modal.close();
this.viewCipher(cipher);
await this.ciphersComponent.refresh();
await this.vaultItemsComponent.refresh();
});
// eslint-disable-next-line rxjs-angular/prefer-takeuntil, rxjs/no-async-subscribe
this.modal.onClosed.subscribe(async () => {
@@ -549,7 +549,7 @@ export class VaultComponent implements OnInit, OnDestroy {
this.i18nService.t(this.calculateSearchBarLocalizationString(vaultFilter))
);
this.activeFilter = vaultFilter;
await this.ciphersComponent.reload(
await this.vaultItemsComponent.reload(
this.activeFilter.buildFilter(),
vaultFilter.status === "trash"
);

View File

@@ -1,14 +1,14 @@
import { Component } from "@angular/core";
import { ViewCustomFieldsComponent as BaseViewCustomFieldsComponent } from "@bitwarden/angular/components/view-custom-fields.component";
import { EventService } from "@bitwarden/common/abstractions/event.service";
import { EventCollectionService } from "@bitwarden/common/abstractions/event/event-collection.service";
@Component({
selector: "app-vault-view-custom-fields",
templateUrl: "view-custom-fields.component.html",
})
export class ViewCustomFieldsComponent extends BaseViewCustomFieldsComponent {
constructor(eventService: EventService) {
super(eventService);
constructor(eventCollectionService: EventCollectionService) {
super(eventCollectionService);
}
}

View File

@@ -64,16 +64,16 @@
appA11yTitle="{{ 'checkPassword' | i18n }}"
(click)="checkPassword()"
[appApiAction]="checkPasswordPromise"
[disabled]="checkPasswordBtn.loading"
[disabled]="$any(checkPasswordBtn).loading"
>
<i
class="bwi bwi-lg bwi-check-circle"
[hidden]="checkPasswordBtn.loading"
[hidden]="$any(checkPasswordBtn).loading"
aria-hidden="true"
></i>
<i
class="bwi bwi-lg bwi-spinner bwi-spin"
[hidden]="!checkPasswordBtn.loading"
[hidden]="!$any(checkPasswordBtn).loading"
aria-hidden="true"
></i>
</button>
@@ -472,12 +472,12 @@
<small class="row-sub-label">{{ attachment.sizeName }}</small>
<i
class="bwi bwi-download bwi-fw row-sub-icon"
*ngIf="!attachment.downloading"
*ngIf="!$any(attachment).downloading"
aria-hidden="true"
></i>
<i
class="bwi bwi-spinner bwi-fw bwi-spin row-sub-icon"
*ngIf="attachment.downloading"
*ngIf="$any(attachment).downloading"
aria-hidden="true"
></i>
</button>

View File

@@ -13,7 +13,7 @@ import { AuditService } from "@bitwarden/common/abstractions/audit.service";
import { BroadcasterService } from "@bitwarden/common/abstractions/broadcaster.service";
import { CipherService } from "@bitwarden/common/abstractions/cipher.service";
import { CryptoService } from "@bitwarden/common/abstractions/crypto.service";
import { EventService } from "@bitwarden/common/abstractions/event.service";
import { EventCollectionService } from "@bitwarden/common/abstractions/event/event-collection.service";
import { FileDownloadService } from "@bitwarden/common/abstractions/fileDownload/fileDownload.service";
import { FolderService } from "@bitwarden/common/abstractions/folder/folder.service.abstraction";
import { I18nService } from "@bitwarden/common/abstractions/i18n.service";
@@ -47,7 +47,7 @@ export class ViewComponent extends BaseViewComponent implements OnChanges {
broadcasterService: BroadcasterService,
ngZone: NgZone,
changeDetectorRef: ChangeDetectorRef,
eventService: EventService,
eventCollectionService: EventCollectionService,
apiService: ApiService,
private messagingService: MessagingService,
passwordRepromptService: PasswordRepromptService,
@@ -68,7 +68,7 @@ export class ViewComponent extends BaseViewComponent implements OnChanges {
broadcasterService,
ngZone,
changeDetectorRef,
eventService,
eventCollectionService,
apiService,
passwordRepromptService,
logService,

View File

@@ -1779,6 +1779,15 @@
"disabled": {
"message": "Gedeaktiveer"
},
"removePassword": {
"message": "Remove password"
},
"removedPassword": {
"message": "Password removed"
},
"removePasswordConfirmation": {
"message": "Are you sure you want to remove the password?"
},
"maxAccessCountReached": {
"message": "Maks toegangsaantal bereik"
},

View File

@@ -1779,6 +1779,15 @@
"disabled": {
"message": "معطّل"
},
"removePassword": {
"message": "إزالة كلمة المرور"
},
"removedPassword": {
"message": "تمت إزالة كلمة المرور"
},
"removePasswordConfirmation": {
"message": "هل أنت متأكد من أنك تريد إزالة كلمة المرور؟"
},
"maxAccessCountReached": {
"message": "تم بلوغ الحد الأقصى لعدد الدخول"
},

View File

@@ -1779,6 +1779,15 @@
"disabled": {
"message": "Sıradan çıxarıldı"
},
"removePassword": {
"message": "Parolu çıxart"
},
"removedPassword": {
"message": "Parol çıxarıldı"
},
"removePasswordConfirmation": {
"message": "Parolu çıxartmaq istədiyinizə əminsiniz?"
},
"maxAccessCountReached": {
"message": "Maksimal müraciət sayına çatıldı"
},

View File

@@ -1779,6 +1779,15 @@
"disabled": {
"message": "Адключана"
},
"removePassword": {
"message": "Выдаліць пароль"
},
"removedPassword": {
"message": "Пароль выдалены"
},
"removePasswordConfirmation": {
"message": "Вы сапраўды хочаце выдаліць пароль?"
},
"maxAccessCountReached": {
"message": "Дасягнута максімальная колькасць доступаў"
},

View File

@@ -1779,6 +1779,15 @@
"disabled": {
"message": "Изключено"
},
"removePassword": {
"message": "Премахване на паролата"
},
"removedPassword": {
"message": "Паролата е премахната"
},
"removePasswordConfirmation": {
"message": "Наистина ли искате да премахнете паролата?"
},
"maxAccessCountReached": {
"message": "Достигнат е максималният брой достъпвания"
},

View File

@@ -1779,6 +1779,15 @@
"disabled": {
"message": "Disabled"
},
"removePassword": {
"message": "Remove password"
},
"removedPassword": {
"message": "Password removed"
},
"removePasswordConfirmation": {
"message": "Are you sure you want to remove the password?"
},
"maxAccessCountReached": {
"message": "Max access count reached"
},

View File

@@ -1779,6 +1779,15 @@
"disabled": {
"message": "Disabled"
},
"removePassword": {
"message": "Remove password"
},
"removedPassword": {
"message": "Password removed"
},
"removePasswordConfirmation": {
"message": "Are you sure you want to remove the password?"
},
"maxAccessCountReached": {
"message": "Max access count reached"
},

View File

@@ -1779,6 +1779,15 @@
"disabled": {
"message": "Deshabilitat"
},
"removePassword": {
"message": "Suprimeix la contrasenya"
},
"removedPassword": {
"message": "Contrasenya suprimida"
},
"removePasswordConfirmation": {
"message": "Esteu segur que voleu suprimir la contrasenya?"
},
"maxAccessCountReached": {
"message": "S'ha assolit el recompte màxim d'accesos"
},

View File

@@ -782,11 +782,11 @@
"message": "Hlavní heslo si můžete změnit na webové stránce bitwarden.com. Chcete tuto stránku nyní otevřít?"
},
"fingerprintPhrase": {
"message": "Fráze otisku prstu",
"message": "Fráze otisku účtu",
"description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing."
},
"yourAccountsFingerprint": {
"message": "Fráze otisku prstu vašeho účtu",
"message": "Fráze otisku vašeho účtu",
"description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing."
},
"goToWebVault": {
@@ -1779,6 +1779,15 @@
"disabled": {
"message": "Zakázáno"
},
"removePassword": {
"message": "Remove password"
},
"removedPassword": {
"message": "Password removed"
},
"removePasswordConfirmation": {
"message": "Are you sure you want to remove the password?"
},
"maxAccessCountReached": {
"message": "Dosažen maximální počet přístupů"
},

File diff suppressed because it is too large Load Diff

View File

@@ -1779,6 +1779,15 @@
"disabled": {
"message": "Deaktiviert"
},
"removePassword": {
"message": "Passwort entfernen"
},
"removedPassword": {
"message": "Passwort entfernt"
},
"removePasswordConfirmation": {
"message": "Bist du sicher, dass du das Passwort entfernen möchtest?"
},
"maxAccessCountReached": {
"message": "Maximale Zugriffsanzahl erreicht"
},

View File

@@ -1779,6 +1779,15 @@
"disabled": {
"message": "Απενεργοποιημένο"
},
"removePassword": {
"message": "Remove password"
},
"removedPassword": {
"message": "Password removed"
},
"removePasswordConfirmation": {
"message": "Are you sure you want to remove the password?"
},
"maxAccessCountReached": {
"message": "Φτάσατε στον μέγιστο αριθμό πρόσβασης"
},

View File

@@ -1779,6 +1779,15 @@
"disabled": {
"message": "Disabled"
},
"removePassword": {
"message": "Remove password"
},
"removedPassword": {
"message": "Password removed"
},
"removePasswordConfirmation": {
"message": "Are you sure you want to remove the password?"
},
"maxAccessCountReached": {
"message": "Max access count reached"
},

View File

@@ -45,7 +45,7 @@
"message": "Share"
},
"moveToOrganization": {
"message": "Move to Organisation"
"message": "Move to organisation"
},
"movedItemToOrg": {
"message": "$ITEMNAME$ moved to $ORGNAME$",
@@ -1779,6 +1779,15 @@
"disabled": {
"message": "Disabled"
},
"removePassword": {
"message": "Remove password"
},
"removedPassword": {
"message": "Password removed"
},
"removePasswordConfirmation": {
"message": "Are you sure you want to remove the password?"
},
"maxAccessCountReached": {
"message": "Max access count reached"
},

View File

@@ -1779,6 +1779,15 @@
"disabled": {
"message": "Disabled"
},
"removePassword": {
"message": "Remove password"
},
"removedPassword": {
"message": "Password removed"
},
"removePasswordConfirmation": {
"message": "Are you sure you want to remove the password?"
},
"maxAccessCountReached": {
"message": "Max access count reached"
},

View File

@@ -1779,6 +1779,15 @@
"disabled": {
"message": "Disabled"
},
"removePassword": {
"message": "Remove password"
},
"removedPassword": {
"message": "Password removed"
},
"removePasswordConfirmation": {
"message": "Are you sure you want to remove the password?"
},
"maxAccessCountReached": {
"message": "Max access count reached"
},

View File

@@ -1779,6 +1779,15 @@
"disabled": {
"message": "Deshabilitado"
},
"removePassword": {
"message": "Eliminar contraseña"
},
"removedPassword": {
"message": "Contraseña eliminada"
},
"removePasswordConfirmation": {
"message": "¿Está seguro que desea eliminar la contraseña?"
},
"maxAccessCountReached": {
"message": "Se ha alcanzado el número máximo de accesos"
},

View File

@@ -1779,6 +1779,15 @@
"disabled": {
"message": "Keelatud"
},
"removePassword": {
"message": "Eemalda parool"
},
"removedPassword": {
"message": "Parool on eemaldatud"
},
"removePasswordConfirmation": {
"message": "Oled kindel, et soovid selle parooli eemaldada?"
},
"maxAccessCountReached": {
"message": "Maksimaalne ligipääsude arv on saavutatud"
},

View File

@@ -1779,6 +1779,15 @@
"disabled": {
"message": "Desgaitua"
},
"removePassword": {
"message": "Remove password"
},
"removedPassword": {
"message": "Password removed"
},
"removePasswordConfirmation": {
"message": "Are you sure you want to remove the password?"
},
"maxAccessCountReached": {
"message": "Sarbide kopuru maximoa gaindituta"
},

View File

@@ -1779,6 +1779,15 @@
"disabled": {
"message": "غیرفعال شد"
},
"removePassword": {
"message": "Remove password"
},
"removedPassword": {
"message": "Password removed"
},
"removePasswordConfirmation": {
"message": "Are you sure you want to remove the password?"
},
"maxAccessCountReached": {
"message": "به حداکثر تعداد دسترسی رسیده است"
},

View File

@@ -1563,7 +1563,7 @@
"message": "Uusi pääsalasanasi ei täytä käytännön määrittämiä vaatimuksia."
},
"acceptPolicies": {
"message": "Valitsemalla tämän ruudun hyväksyt seuraavat:"
"message": "Valitsemalla tämän hyväksyt seuraavat:"
},
"acceptPoliciesRequired": {
"message": "Palveluehtoja ja tietosuojakäytäntöä ei ole vahvistettu."
@@ -1779,6 +1779,15 @@
"disabled": {
"message": "Poistettu käytöstä"
},
"removePassword": {
"message": "Poista salasana"
},
"removedPassword": {
"message": "Salasana poistettiin"
},
"removePasswordConfirmation": {
"message": "Haluatko varmasti poistaa salasanan?"
},
"maxAccessCountReached": {
"message": "Käyttökertojen enimmäismäärä on saavutettu"
},

View File

@@ -1779,6 +1779,15 @@
"disabled": {
"message": "Disabled"
},
"removePassword": {
"message": "Remove password"
},
"removedPassword": {
"message": "Password removed"
},
"removePasswordConfirmation": {
"message": "Are you sure you want to remove the password?"
},
"maxAccessCountReached": {
"message": "Max access count reached"
},

View File

@@ -1779,6 +1779,15 @@
"disabled": {
"message": "Désactivé"
},
"removePassword": {
"message": "Remove password"
},
"removedPassword": {
"message": "Password removed"
},
"removePasswordConfirmation": {
"message": "Are you sure you want to remove the password?"
},
"maxAccessCountReached": {
"message": "Nombre maximum d'accès atteint"
},

View File

@@ -1779,6 +1779,15 @@
"disabled": {
"message": "מושבת"
},
"removePassword": {
"message": "Remove password"
},
"removedPassword": {
"message": "Password removed"
},
"removePasswordConfirmation": {
"message": "Are you sure you want to remove the password?"
},
"maxAccessCountReached": {
"message": "מספר הגישות המרבי הושג"
},

View File

@@ -1779,6 +1779,15 @@
"disabled": {
"message": "Disabled"
},
"removePassword": {
"message": "Remove password"
},
"removedPassword": {
"message": "Password removed"
},
"removePasswordConfirmation": {
"message": "Are you sure you want to remove the password?"
},
"maxAccessCountReached": {
"message": "Max access count reached"
},

View File

@@ -1779,6 +1779,15 @@
"disabled": {
"message": "Onemogućeno"
},
"removePassword": {
"message": "Ukloni lozinku"
},
"removedPassword": {
"message": "Lozinka uklonjena"
},
"removePasswordConfirmation": {
"message": "Sigurno želiš ukloniti lozinku?"
},
"maxAccessCountReached": {
"message": "Dostignut najveći broj pristupanja"
},

View File

@@ -1779,6 +1779,15 @@
"disabled": {
"message": "Letiltva"
},
"removePassword": {
"message": "Jelszó eltávolítása"
},
"removedPassword": {
"message": "A jelszó eltávolításra került."
},
"removePasswordConfirmation": {
"message": "Biztosan eltávolításra kerüljön ez a jelszó?"
},
"maxAccessCountReached": {
"message": "A maximális hozzáférések száma elérésre került."
},

View File

@@ -1779,6 +1779,15 @@
"disabled": {
"message": "Dinonaktifkan"
},
"removePassword": {
"message": "Remove password"
},
"removedPassword": {
"message": "Password removed"
},
"removePasswordConfirmation": {
"message": "Are you sure you want to remove the password?"
},
"maxAccessCountReached": {
"message": "Jumlah akses maksimum tercapai"
},

View File

@@ -1779,6 +1779,15 @@
"disabled": {
"message": "Disabilitato"
},
"removePassword": {
"message": "Rimuovi la password"
},
"removedPassword": {
"message": "Password rimossa"
},
"removePasswordConfirmation": {
"message": "Sei sicuro di voler rimuovere la password?"
},
"maxAccessCountReached": {
"message": "Numero massimo di accessi raggiunto"
},

View File

@@ -1779,6 +1779,15 @@
"disabled": {
"message": "無効"
},
"removePassword": {
"message": "パスワードを削除"
},
"removedPassword": {
"message": "パスワードを削除しました"
},
"removePasswordConfirmation": {
"message": "パスワードを削除してもよろしいですか?"
},
"maxAccessCountReached": {
"message": "最大アクセス数に達しました"
},

View File

@@ -1779,6 +1779,15 @@
"disabled": {
"message": "Disabled"
},
"removePassword": {
"message": "Remove password"
},
"removedPassword": {
"message": "Password removed"
},
"removePasswordConfirmation": {
"message": "Are you sure you want to remove the password?"
},
"maxAccessCountReached": {
"message": "Max access count reached"
},

View File

@@ -1779,6 +1779,15 @@
"disabled": {
"message": "Disabled"
},
"removePassword": {
"message": "Remove password"
},
"removedPassword": {
"message": "Password removed"
},
"removePasswordConfirmation": {
"message": "Are you sure you want to remove the password?"
},
"maxAccessCountReached": {
"message": "Max access count reached"
},

View File

@@ -1779,6 +1779,15 @@
"disabled": {
"message": "ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ"
},
"removePassword": {
"message": "Remove password"
},
"removedPassword": {
"message": "Password removed"
},
"removePasswordConfirmation": {
"message": "Are you sure you want to remove the password?"
},
"maxAccessCountReached": {
"message": "ಗರಿಷ್ಠ ಪ್ರವೇಶ ಎಣಿಕೆ ತಲುಪಿದೆ"
},

View File

@@ -1779,6 +1779,15 @@
"disabled": {
"message": "비활성화됨"
},
"removePassword": {
"message": "Remove password"
},
"removedPassword": {
"message": "Password removed"
},
"removePasswordConfirmation": {
"message": "Are you sure you want to remove the password?"
},
"maxAccessCountReached": {
"message": "최대 접근 횟수 도달"
},

View File

@@ -1779,6 +1779,15 @@
"disabled": {
"message": "Atspējots"
},
"removePassword": {
"message": "Noņemt paroli"
},
"removedPassword": {
"message": "Parole noņemta"
},
"removePasswordConfirmation": {
"message": "Vai tiešām noņemt paroli?"
},
"maxAccessCountReached": {
"message": "Sasniegts lielākais pieļaujamais piekļuvju skaits"
},

View File

@@ -1779,6 +1779,15 @@
"disabled": {
"message": "Disabled"
},
"removePassword": {
"message": "Remove password"
},
"removedPassword": {
"message": "Password removed"
},
"removePasswordConfirmation": {
"message": "Are you sure you want to remove the password?"
},
"maxAccessCountReached": {
"message": "Max access count reached"
},

View File

@@ -1779,6 +1779,15 @@
"disabled": {
"message": "Disabled"
},
"removePassword": {
"message": "Remove password"
},
"removedPassword": {
"message": "Password removed"
},
"removePasswordConfirmation": {
"message": "Are you sure you want to remove the password?"
},
"maxAccessCountReached": {
"message": "Max access count reached"
},

View File

@@ -1779,6 +1779,15 @@
"disabled": {
"message": "Deaktivert"
},
"removePassword": {
"message": "Remove password"
},
"removedPassword": {
"message": "Password removed"
},
"removePasswordConfirmation": {
"message": "Are you sure you want to remove the password?"
},
"maxAccessCountReached": {
"message": "Maksimalt antall tilganger nådd"
},

View File

@@ -1779,6 +1779,15 @@
"disabled": {
"message": "Uitgeschakeld"
},
"removePassword": {
"message": "Wachtwoord verwijderen"
},
"removedPassword": {
"message": "Wachtwoord verwijderd"
},
"removePasswordConfirmation": {
"message": "Weet je zeker dat je het wachtwoord wilt verwijderen?"
},
"maxAccessCountReached": {
"message": "Maximum aantal keren benaderd"
},

View File

@@ -1779,6 +1779,15 @@
"disabled": {
"message": "Disabled"
},
"removePassword": {
"message": "Remove password"
},
"removedPassword": {
"message": "Password removed"
},
"removePasswordConfirmation": {
"message": "Are you sure you want to remove the password?"
},
"maxAccessCountReached": {
"message": "Max access count reached"
},

View File

@@ -1779,6 +1779,15 @@
"disabled": {
"message": "Wyłączona"
},
"removePassword": {
"message": "Usuń hasło"
},
"removedPassword": {
"message": "Hasło zostało usunięte"
},
"removePasswordConfirmation": {
"message": "Czy na pewno chcesz usunąć hasło?"
},
"maxAccessCountReached": {
"message": "Maksymalna liczba dostępów została osiągnięta"
},
@@ -1844,7 +1853,7 @@
"message": "Czas blokowania sejfu przekracza limit określony przez organizację."
},
"resetPasswordPolicyAutoEnroll": {
"message": "Automatyczne rejestrowanie użytkowników do resetowania hasła"
"message": "Automatyczne rejestrowanie użytkowników"
},
"resetPasswordAutoEnrollInviteWarning": {
"message": "Ta organizacja posługuje się zasadą, która automatycznie rejestruje użytkowników do resetowania hasła. Rejestracja umożliwia administratorom organizacji zmianę Twojego hasła głównego."
@@ -2029,7 +2038,7 @@
"message": "Logowanie jako"
},
"rememberEmail": {
"message": "Zapamiętaj e-mail"
"message": "Zapamiętaj adres e-mail"
},
"notYou": {
"message": "To nie Ty?"

View File

@@ -1779,6 +1779,15 @@
"disabled": {
"message": "Desativado"
},
"removePassword": {
"message": "Remove password"
},
"removedPassword": {
"message": "Password removed"
},
"removePasswordConfirmation": {
"message": "Are you sure you want to remove the password?"
},
"maxAccessCountReached": {
"message": "Número máximo de acessos atingido"
},

View File

@@ -1779,6 +1779,15 @@
"disabled": {
"message": "Desativado"
},
"removePassword": {
"message": "Remover palavra-passe"
},
"removedPassword": {
"message": "Palavra-passe removida"
},
"removePasswordConfirmation": {
"message": "Tem a certeza de que deseja remover a palavra-passe?"
},
"maxAccessCountReached": {
"message": "Max access count reached"
},

View File

@@ -1779,6 +1779,15 @@
"disabled": {
"message": "Dezactivat"
},
"removePassword": {
"message": "Remove password"
},
"removedPassword": {
"message": "Password removed"
},
"removePasswordConfirmation": {
"message": "Are you sure you want to remove the password?"
},
"maxAccessCountReached": {
"message": "S-a atins numărul maxim de accesări"
},

View File

@@ -671,7 +671,7 @@
"message": "Настройки двухэтапной аутентификации"
},
"selfHostedEnvironment": {
"message": "Окружение собственного хостинга"
"message": "Окружение пользовательского хостинга"
},
"selfHostedEnvironmentFooter": {
"message": "Укажите URL Bitwarden на вашем сервере."
@@ -1468,7 +1468,7 @@
"message": "Чтобы получить доступ к хранилищу после выхода из него требуется повторная авторизация."
},
"lock": {
"message": "Заблокировать",
"message": "Блокировка",
"description": "Verb form: to make secure or inaccesible by"
},
"trash": {
@@ -1766,7 +1766,7 @@
"message": "Скопировать ссылку в буфер обмена после сохранения, чтобы поделиться этой Send."
},
"sendDisabled": {
"message": "Send отключена",
"message": "Send удалена",
"description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
},
"sendDisabledWarning": {
@@ -1779,6 +1779,15 @@
"disabled": {
"message": "Отключено"
},
"removePassword": {
"message": "Удалить пароль"
},
"removedPassword": {
"message": "Пароль удален"
},
"removePasswordConfirmation": {
"message": "Вы уверены, что хотите удалить пароль?"
},
"maxAccessCountReached": {
"message": "Достигнут максимум обращений"
},

View File

@@ -1779,6 +1779,15 @@
"disabled": {
"message": "Disabled"
},
"removePassword": {
"message": "Remove password"
},
"removedPassword": {
"message": "Password removed"
},
"removePasswordConfirmation": {
"message": "Are you sure you want to remove the password?"
},
"maxAccessCountReached": {
"message": "Max access count reached"
},

View File

@@ -1779,6 +1779,15 @@
"disabled": {
"message": "Zakázané"
},
"removePassword": {
"message": "Odstrániť heslo"
},
"removedPassword": {
"message": "Heslo bolo odstránené"
},
"removePasswordConfirmation": {
"message": "Naozaj chcete odstrániť heslo?"
},
"maxAccessCountReached": {
"message": "Bol dosiahnutý maximálny počet prístupov"
},

View File

@@ -1779,6 +1779,15 @@
"disabled": {
"message": "Disabled"
},
"removePassword": {
"message": "Remove password"
},
"removedPassword": {
"message": "Password removed"
},
"removePasswordConfirmation": {
"message": "Are you sure you want to remove the password?"
},
"maxAccessCountReached": {
"message": "Max access count reached"
},

View File

@@ -1779,6 +1779,15 @@
"disabled": {
"message": "Онемогућено"
},
"removePassword": {
"message": "Remove password"
},
"removedPassword": {
"message": "Password removed"
},
"removePasswordConfirmation": {
"message": "Are you sure you want to remove the password?"
},
"maxAccessCountReached": {
"message": "Достигнут максималан број приступа"
},

View File

@@ -1779,6 +1779,15 @@
"disabled": {
"message": "Inaktiverad"
},
"removePassword": {
"message": "Ta bort lösenord"
},
"removedPassword": {
"message": "Tog bort lösenord"
},
"removePasswordConfirmation": {
"message": "Är du säker på att du vill ta bort lösenordet?"
},
"maxAccessCountReached": {
"message": "Det maximala antalet åtkomster har uppnåtts"
},

View File

@@ -1779,6 +1779,15 @@
"disabled": {
"message": "Disabled"
},
"removePassword": {
"message": "Remove password"
},
"removedPassword": {
"message": "Password removed"
},
"removePasswordConfirmation": {
"message": "Are you sure you want to remove the password?"
},
"maxAccessCountReached": {
"message": "Max access count reached"
},

View File

@@ -1779,6 +1779,15 @@
"disabled": {
"message": "Devre dışı"
},
"removePassword": {
"message": "Parolayı kaldır"
},
"removedPassword": {
"message": "Parola kaldırıldı"
},
"removePasswordConfirmation": {
"message": "Parolayı kaldırmak istediğinizden emin misiniz?"
},
"maxAccessCountReached": {
"message": "Maksimum erişim sayısına ulaşıldı"
},

View File

@@ -1779,6 +1779,15 @@
"disabled": {
"message": "Вимкнено"
},
"removePassword": {
"message": "Вилучити пароль"
},
"removedPassword": {
"message": "Пароль вилучено"
},
"removePasswordConfirmation": {
"message": "Ви дійсно хочете вилучити пароль?"
},
"maxAccessCountReached": {
"message": "Досягнуто максимальну кількість доступів"
},

View File

@@ -48,7 +48,7 @@
"message": "Chuyển tới Tổ chức"
},
"movedItemToOrg": {
"message": "$ITEMNAME$ moved to $ORGNAME$",
"message": "$ITEMNAME$ đã di chuyển tới $ORGNAME$",
"placeholders": {
"itemname": {
"content": "$1",
@@ -805,7 +805,7 @@
"message": "Đồng bộ thất bại"
},
"yourVaultIsLocked": {
"message": "Kho mật khẩu đã bị khóa. Xác minh mật khẩu chinhs của bạn để mở."
"message": "Kho mật khẩu đã bị khóa. Xác minh mật khẩu chính của bạn để mở."
},
"unlock": {
"message": "Mở khóa"
@@ -1213,7 +1213,7 @@
"description": "Domain name. Ex. website.com"
},
"domainName": {
"message": "Domain name",
"message": "Tên miền",
"description": "Domain name. Ex. website.com"
},
"host": {
@@ -1662,7 +1662,7 @@
"message": "Văn bản"
},
"deletionDate": {
"message": "Deletion date"
"message": "Ngày xóa"
},
"deletionDateDesc": {
"message": "Send sẽ được xóa vĩnh viễn vào ngày và giờ được chỉ định.",
@@ -1703,7 +1703,7 @@
"description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
},
"sendLinkLabel": {
"message": "Send link",
"message": "Gửi liên kết",
"description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
},
"textHiddenByDefault": {
@@ -1752,14 +1752,14 @@
"message": "1 ngày"
},
"custom": {
"message": "Custom"
"message": "Tùy chỉnh"
},
"deleteSendConfirmation": {
"message": "Bạn có chắc chắn muốn xóa Send này?",
"description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
},
"copySendLinkToClipboard": {
"message": "Copy Send link to clipboard",
"message": "Sao chép liên kết tới Khay nhớ tạm",
"description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
},
"copySendLinkOnSave": {
@@ -1777,58 +1777,67 @@
"message": "Sao chép liên kết"
},
"disabled": {
"message": "Disabled"
"message": "Đã tắt"
},
"removePassword": {
"message": "Remove password"
},
"removedPassword": {
"message": "Password removed"
},
"removePasswordConfirmation": {
"message": "Are you sure you want to remove the password?"
},
"maxAccessCountReached": {
"message": "Max access count reached"
"message": "Đã đạt đến số lượng truy cập tối đa"
},
"expired": {
"message": "Expired"
"message": "Đã hết hạn"
},
"pendingDeletion": {
"message": "Đang chờ xóa"
},
"webAuthnAuthenticate": {
"message": "Authenticate WebAuthn"
"message": "Xác thực WebAuthn"
},
"hideEmail": {
"message": "Hide my email address from recipients."
"message": "Ẩn địa chỉ email của tôi khỏi người nhận."
},
"sendOptionsPolicyInEffect": {
"message": "One or more organization policies are affecting your Send options."
"message": "Có một hoặc vài chính sách của tổ chức đang làm ảnh hưởng đến cài đặt tạo mật khẩu của bạn."
},
"emailVerificationRequired": {
"message": "Email verification required"
"message": "Yêu cầu xác nhận danh tính qua Email"
},
"emailVerificationRequiredDesc": {
"message": "You must verify your email to use this feature."
"message": "Bạn phải xác minh email của mình để sử dụng tính năng này."
},
"passwordPrompt": {
"message": "Master password re-prompt"
"message": "Nhắc lại mật khẩu chính"
},
"passwordConfirmation": {
"message": "Master password confirmation"
"message": "Xác nhận mật khẩu chính"
},
"passwordConfirmationDesc": {
"message": "This action is protected. To continue, please re-enter your master password to verify your identity."
"message": "Hành động này được bảo vệ. Để tiếp tục, vui lòng nhập lại mật khẩu chính của bạn để xác minh danh tính của bạn."
},
"updatedMasterPassword": {
"message": "Updated master password"
"message": "Mật khẩu chính đã được cập nhật"
},
"updateMasterPassword": {
"message": "Update master password"
"message": "Cập nhật Mật khẩu chính"
},
"updateMasterPasswordWarning": {
"message": "Your master password was recently changed by an administrator in your organization. In order to access the vault, you must update it now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour."
"message": "Mật khẩu chính của bạn gần đây đã được thay đổi bởi một quản trị viên trong tổ chức của bạn. Để truy cập Kho, bạn phải cập nhật nó ngay bây giờ. Tiếp tục sẽ đăng xuất bạn khỏi phiên hiện tại của bạn, yêu cầu bạn đăng nhập lại. Các phiên hoạt động trên các thiết bị khác có thể tiếp tục hoạt động trong tối đa một giờ."
},
"hours": {
"message": "Hours"
"message": "Giờ"
},
"minutes": {
"message": "Minutes"
"message": "Phút"
},
"vaultTimeoutPolicyInEffect": {
"message": "Your organization policies are affecting your vault timeout. Maximum allowed vault timeout is $HOURS$ hour(s) and $MINUTES$ minute(s)",
"message": "Chính sách tổ chức của bạn đang ảnh hưởng đến thời gian chờ Kho của bạn. Thời gian chờ kho tối đa được phép là $HOURS$ giờ và $MINUTES$ phút",
"placeholders": {
"hours": {
"content": "$1",
@@ -1841,10 +1850,10 @@
}
},
"vaultTimeoutTooLarge": {
"message": "Your vault timeout exceeds the restrictions set by your organization."
"message": "Thời gian chờ Kho của bạn vượt quá các hạn chế do tổ chức của bạn đặt ra."
},
"resetPasswordPolicyAutoEnroll": {
"message": "Automatic enrollment"
"message": "Đăng ký tự động"
},
"resetPasswordAutoEnrollInviteWarning": {
"message": "This organization has an enterprise policy that will automatically enroll you in password reset. Enrollment will allow organization administrators to change your master password."
@@ -1856,13 +1865,13 @@
"message": "One or more organization policies prevents you from exporting your personal vault."
},
"addAccount": {
"message": "Add account"
"message": "Thêm tài khoản"
},
"removeMasterPassword": {
"message": "Remove master password"
"message": "Xóa mật khẩu chính"
},
"removedMasterPassword": {
"message": "Master password removed"
"message": "Đã xóa mật khẩu chính"
},
"convertOrganizationEncryptionDesc": {
"message": "$ORGANIZATION$ is using SSO with a self-hosted key server. A master password is no longer required to log in for members of this organization.",
@@ -1874,7 +1883,7 @@
}
},
"leaveOrganization": {
"message": "Leave organization"
"message": "Rời khỏi tổ chức"
},
"leaveOrganizationConfirmation": {
"message": "Are you sure you want to leave this organization?"
@@ -1892,7 +1901,7 @@
"message": "No more than 5 accounts may be logged in at the same time."
},
"accountPreferences": {
"message": "Preferences"
"message": "Tuỳ chỉnh"
},
"appPreferences": {
"message": "App settings (all accounts)"
@@ -1910,10 +1919,10 @@
}
},
"switchAccount": {
"message": "Switch account"
"message": "Chuyển tài khoản"
},
"options": {
"message": "Options"
"message": "Tùy chọn"
},
"sessionTimeout": {
"message": "Your session has timed out. Please go back and try logging in again."
@@ -1937,19 +1946,19 @@
"message": "Đã mở khóa"
},
"generator": {
"message": "Generator"
"message": "Tạo"
},
"whatWouldYouLikeToGenerate": {
"message": "What would you like to generate?"
"message": "Bạn muốn to gì?"
},
"passwordType": {
"message": "Password type"
"message": "Loại mật khẩu"
},
"regenerateUsername": {
"message": "Regenerate username"
},
"generateUsername": {
"message": "Generate username"
"message": "Tạo tên tài khoản"
},
"usernameType": {
"message": "Username type"
@@ -1968,22 +1977,22 @@
"message": "Use your domain's configured catch-all inbox."
},
"random": {
"message": "Random"
"message": "Ngẫu nhiên"
},
"randomWord": {
"message": "Random word"
"message": "Từ ngẫu nhiên"
},
"websiteName": {
"message": "Website name"
"message": "Tên website"
},
"service": {
"message": "Service"
"message": "Dịch vụ"
},
"allVaults": {
"message": "All vaults"
"message": "Tất cả kho"
},
"searchOrganization": {
"message": "Search organization"
"message": "Tìm tổ chức"
},
"searchMyVault": {
"message": "Search my vault"

View File

@@ -1779,6 +1779,15 @@
"disabled": {
"message": "已禁用"
},
"removePassword": {
"message": "移除密码"
},
"removedPassword": {
"message": "密码已移除"
},
"removePasswordConfirmation": {
"message": "确定要移除此密码吗?"
},
"maxAccessCountReached": {
"message": "已达最大访问次数"
},
@@ -2035,7 +2044,7 @@
"message": "不是你?"
},
"newAroundHere": {
"message": "新建在这里"
"message": "初来乍到吗"
},
"loggingInTo": {
"message": "正在登录到 $DOMAIN$",

View File

@@ -958,7 +958,7 @@
"message": "即使最小化到選單列,也在 Docker 中顯示 Bitwarden 圖示。"
},
"confirmTrayTitle": {
"message": "確認禁用系統匣"
"message": "確認隱藏到系統匣"
},
"confirmTrayDesc": {
"message": "禁用此設定也將禁用所有其他系統匣相關設定。"
@@ -1779,6 +1779,15 @@
"disabled": {
"message": "已停用"
},
"removePassword": {
"message": "移除密碼"
},
"removedPassword": {
"message": "已移除密碼"
},
"removePasswordConfirmation": {
"message": "您確定要移除密碼嗎?"
},
"maxAccessCountReached": {
"message": "已達最大存取次數"
},

View File

@@ -6,20 +6,20 @@ import { StateFactory } from "@bitwarden/common/factories/stateFactory";
import { GlobalState } from "@bitwarden/common/models/domain/global-state";
import { MemoryStorageService } from "@bitwarden/common/services/memoryStorage.service";
import { StateService } from "@bitwarden/common/services/state.service";
import { ElectronLogService } from "@bitwarden/electron/services/electronLog.service";
import { ElectronMainMessagingService } from "@bitwarden/electron/services/electronMainMessaging.service";
import { ElectronStorageService } from "@bitwarden/electron/services/electronStorage.service";
import { TrayMain } from "@bitwarden/electron/tray.main";
import { UpdaterMain } from "@bitwarden/electron/updater.main";
import { WindowMain } from "@bitwarden/electron/window.main";
import { BiometricMain } from "./main/biometric/biometric.main";
import { DesktopCredentialStorageListener } from "./main/desktopCredentialStorageListener";
import { DesktopCredentialStorageListener } from "./main/desktop-credential-storage-listener";
import { MenuMain } from "./main/menu/menu.main";
import { MessagingMain } from "./main/messaging.main";
import { NativeMessagingMain } from "./main/nativeMessaging.main";
import { PowerMonitorMain } from "./main/powerMonitor.main";
import { NativeMessagingMain } from "./main/native-messaging.main";
import { PowerMonitorMain } from "./main/power-monitor.main";
import { TrayMain } from "./main/tray.main";
import { UpdaterMain } from "./main/updater.main";
import { WindowMain } from "./main/window.main";
import { Account } from "./models/account";
import { ElectronLogService } from "./services/electron-log.service";
import { ElectronMainMessagingService } from "./services/electron-main-messaging.service";
import { ElectronStorageService } from "./services/electron-storage.service";
import { I18nService } from "./services/i18n.service";
export class Main {
@@ -105,15 +105,7 @@ export class Main {
(win) => this.trayMain.setupWindowListeners(win)
);
this.messagingMain = new MessagingMain(this, this.stateService);
this.updaterMain = new UpdaterMain(
this.i18nService,
this.windowMain,
"clients",
null,
null,
null,
"bitwarden"
);
this.updaterMain = new UpdaterMain(this.i18nService, this.windowMain, "bitwarden");
this.menuMain = new MenuMain(this);
this.powerMonitorMain = new PowerMonitorMain(this);
this.trayMain = new TrayMain(this.windowMain, this.i18nService, this.stateService);

View File

@@ -4,7 +4,8 @@ import { I18nService } from "@bitwarden/common/abstractions/i18n.service";
import { LogService } from "@bitwarden/common/abstractions/log.service";
import { StateService } from "@bitwarden/common/abstractions/state.service";
import { biometrics } from "@bitwarden/desktop-native";
import { WindowMain } from "@bitwarden/electron/window.main";
import { WindowMain } from "../window.main";
import { BiometricMain } from "./biometric.main";

View File

@@ -1,8 +1,9 @@
import { BrowserWindow, clipboard, dialog, MenuItemConstructorOptions } from "electron";
import { I18nService } from "@bitwarden/common/abstractions/i18n.service";
import { UpdaterMain } from "@bitwarden/electron/updater.main";
import { isMacAppStore, isSnapStore, isWindowsStore } from "@bitwarden/electron/utils";
import { isMacAppStore, isSnapStore, isWindowsStore } from "../../utils";
import { UpdaterMain } from "../updater.main";
import { IMenubarMenu } from "./menubar";

View File

@@ -2,7 +2,8 @@ import { BrowserWindow, dialog, MenuItemConstructorOptions, shell } from "electr
import { I18nService } from "@bitwarden/common/abstractions/i18n.service";
import { MessagingService } from "@bitwarden/common/abstractions/messaging.service";
import { isMacAppStore, isWindowsStore } from "@bitwarden/electron/utils";
import { isMacAppStore, isWindowsStore } from "../../utils";
import { IMenubarMenu } from "./menubar";

View File

@@ -2,8 +2,9 @@ import { BrowserWindow, MenuItemConstructorOptions } from "electron";
import { I18nService } from "@bitwarden/common/abstractions/i18n.service";
import { MessagingService } from "@bitwarden/common/abstractions/messaging.service";
import { UpdaterMain } from "@bitwarden/electron/updater.main";
import { isMac } from "@bitwarden/electron/utils";
import { isMac } from "../../utils";
import { UpdaterMain } from "../updater.main";
import { FirstMenu } from "./menu.first";
import { MenuAccount } from "./menu.updater";

View File

@@ -2,8 +2,9 @@ import { BrowserWindow, MenuItemConstructorOptions } from "electron";
import { I18nService } from "@bitwarden/common/abstractions/i18n.service";
import { MessagingService } from "@bitwarden/common/abstractions/messaging.service";
import { UpdaterMain } from "@bitwarden/electron/updater.main";
import { isMac, isMacAppStore } from "@bitwarden/electron/utils";
import { isMac, isMacAppStore } from "../../utils";
import { UpdaterMain } from "../updater.main";
import { FirstMenu } from "./menu.first";
import { MenuAccount } from "./menu.updater";

View File

@@ -2,8 +2,9 @@ import { BrowserWindow, dialog, MenuItem, MenuItemConstructorOptions } from "ele
import { I18nService } from "@bitwarden/common/abstractions/i18n.service";
import { MessagingService } from "@bitwarden/common/abstractions/messaging.service";
import { UpdaterMain } from "@bitwarden/electron/updater.main";
import { isMacAppStore, isSnapStore, isWindowsStore } from "@bitwarden/electron/utils";
import { isMacAppStore, isSnapStore, isWindowsStore } from "../../utils";
import { UpdaterMain } from "../updater.main";
import { MenuAccount } from "./menu.updater";

View File

@@ -1,7 +1,8 @@
import { shell, MenuItemConstructorOptions } from "electron";
import { I18nService } from "@bitwarden/common/abstractions/i18n.service";
import { isMacAppStore, isWindowsStore } from "@bitwarden/electron/utils";
import { isMacAppStore, isWindowsStore } from "../../utils";
import { AboutMenu } from "./menu.about";
import { IMenubarMenu } from "./menubar";

View File

@@ -1,17 +1,22 @@
import { app, Menu } from "electron";
import { BaseMenu } from "@bitwarden/electron/baseMenu";
import { I18nService } from "@bitwarden/common/abstractions/i18n.service";
import { Main } from "../../main";
import { WindowMain } from "../window.main";
import { MenuUpdateRequest } from "./menu.updater";
import { Menubar } from "./menubar";
const cloudWebVaultUrl = "https://vault.bitwarden.com";
export class MenuMain extends BaseMenu {
export class MenuMain {
private i18nService: I18nService;
private windowMain: WindowMain;
constructor(private main: Main) {
super(main.i18nService, main.windowMain);
this.i18nService = main.i18nService;
this.windowMain = main.windowMain;
}
async init() {
@@ -49,4 +54,84 @@ export class MenuMain extends BaseMenu {
}
return webVaultUrl;
}
private initContextMenu() {
if (this.windowMain.win == null) {
return;
}
const selectionMenu = Menu.buildFromTemplate([
{
label: this.i18nService.t("copy"),
role: "copy",
},
{ type: "separator" },
{
label: this.i18nService.t("selectAll"),
role: "selectAll",
},
]);
const inputMenu = Menu.buildFromTemplate([
{
label: this.i18nService.t("undo"),
role: "undo",
},
{
label: this.i18nService.t("redo"),
role: "redo",
},
{ type: "separator" },
{
label: this.i18nService.t("cut"),
role: "cut",
enabled: false,
},
{
label: this.i18nService.t("copy"),
role: "copy",
enabled: false,
},
{
label: this.i18nService.t("paste"),
role: "paste",
},
{ type: "separator" },
{
label: this.i18nService.t("selectAll"),
role: "selectAll",
},
]);
const inputSelectionMenu = Menu.buildFromTemplate([
{
label: this.i18nService.t("cut"),
role: "cut",
},
{
label: this.i18nService.t("copy"),
role: "copy",
},
{
label: this.i18nService.t("paste"),
role: "paste",
},
{ type: "separator" },
{
label: this.i18nService.t("selectAll"),
role: "selectAll",
},
]);
this.windowMain.win.webContents.on("context-menu", (e, props) => {
const selected = props.selectionText && props.selectionText.trim() !== "";
if (props.isEditable && selected) {
inputSelectionMenu.popup({ window: this.windowMain.win });
} else if (props.isEditable) {
inputMenu.popup({ window: this.windowMain.win });
} else if (selected) {
selectionMenu.popup({ window: this.windowMain.win });
}
});
}
}

Some files were not shown because too many files have changed in this diff Show More