mirror of
https://github.com/bitwarden/desktop.git
synced 2024-11-30 12:54:31 +01:00
Merge branch 'master' into soft-delete
This commit is contained in:
commit
151964f6b8
2
jslib
2
jslib
@ -1 +1 @@
|
|||||||
Subproject commit e9db844285e21525f5152e782063f04e02543553
|
Subproject commit 0092aac275e8efca66838a8c266eec1d455883aa
|
6
package-lock.json
generated
6
package-lock.json
generated
@ -846,9 +846,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"@types/lunr": {
|
"@types/lunr": {
|
||||||
"version": "2.1.6",
|
"version": "2.3.3",
|
||||||
"resolved": "https://registry.npmjs.org/@types/lunr/-/lunr-2.1.6.tgz",
|
"resolved": "https://registry.npmjs.org/@types/lunr/-/lunr-2.3.3.tgz",
|
||||||
"integrity": "sha512-Bz6fUhX1llTa7ygQJN3ttoVkkrpW7xxSEP7D7OYFO/FCBKqKqruRUZtJzTtYA0GkQX13lxU5u+8LuCviJlAXkQ==",
|
"integrity": "sha512-09sXZZVsB3Ib41U0fC+O1O+4UOZT1bl/e+/QubPxpqDWHNEchvx/DEb1KJMOwq6K3MTNzZFoNSzVdR++o1DVnw==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"@types/node": {
|
"@types/node": {
|
||||||
|
13
package.json
13
package.json
@ -35,12 +35,14 @@
|
|||||||
"electron": "npm run build:main && concurrently -k -n Main,Rend -c yellow,cyan \"electron --inspect=5858 ./build --watch\" \"npm run build:renderer:watch\"",
|
"electron": "npm run build:main && concurrently -k -n Main,Rend -c yellow,cyan \"electron --inspect=5858 ./build --watch\" \"npm run build:renderer:watch\"",
|
||||||
"clean:dist": "rimraf ./dist/*",
|
"clean:dist": "rimraf ./dist/*",
|
||||||
"clean:l10n": "git push origin --delete l10n_master",
|
"clean:l10n": "git push origin --delete l10n_master",
|
||||||
|
"pack:dir": "npm run clean:dist && electron-builder --dir -p never",
|
||||||
"pack:lin": "npm run clean:dist && electron-builder --linux --x64 -p never",
|
"pack:lin": "npm run clean:dist && electron-builder --linux --x64 -p never",
|
||||||
"pack:mac": "npm run clean:dist && electron-builder --mac -p never",
|
"pack:mac": "npm run clean:dist && electron-builder --mac -p never",
|
||||||
"pack:mac:mas": "npm run clean:dist && electron-builder --mac mas -p never",
|
"pack:mac:mas": "npm run clean:dist && electron-builder --mac mas -p never",
|
||||||
"pack:mac:masdev": "npm run clean:dist && electron-builder --mac mas-dev -p never",
|
"pack:mac:masdev": "npm run clean:dist && electron-builder --mac mas-dev -p never",
|
||||||
"pack:win": "npm run clean:dist && electron-builder --win --x64 --ia32 -p never -c.win.certificateSubjectName=\"8bit Solutions LLC\"",
|
"pack:win": "npm run clean:dist && electron-builder --win --x64 --ia32 -p never -c.win.certificateSubjectName=\"8bit Solutions LLC\"",
|
||||||
"pack:win:ci": "npm run clean:dist && electron-builder --win --x64 --ia32 -p never",
|
"pack:win:ci": "npm run clean:dist && electron-builder --win --x64 --ia32 -p never",
|
||||||
|
"dist:dir": "npm run build && npm run pack:dir",
|
||||||
"dist:lin": "npm run build && npm run pack:lin",
|
"dist:lin": "npm run build && npm run pack:lin",
|
||||||
"dist:mac": "npm run build && npm run pack:mac",
|
"dist:mac": "npm run build && npm run pack:mac",
|
||||||
"dist:mac:mas": "npm run build && npm run pack:mac:mas",
|
"dist:mac:mas": "npm run build && npm run pack:mac:mas",
|
||||||
@ -128,7 +130,12 @@
|
|||||||
"rpm",
|
"rpm",
|
||||||
"AppImage",
|
"AppImage",
|
||||||
"snap"
|
"snap"
|
||||||
]
|
],
|
||||||
|
"desktop": {
|
||||||
|
"Name": "Bitwarden",
|
||||||
|
"Type": "Application",
|
||||||
|
"GenericName": "Password Manager"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"dmg": {
|
"dmg": {
|
||||||
"icon": "dmg.icns",
|
"icon": "dmg.icns",
|
||||||
@ -172,7 +179,7 @@
|
|||||||
},
|
},
|
||||||
"appx": {
|
"appx": {
|
||||||
"artifactName": "${productName}-${version}-${arch}.${ext}",
|
"artifactName": "${productName}-${version}-${arch}.${ext}",
|
||||||
"backgroundColor": "#3c8dbc",
|
"backgroundColor": "#175DDC",
|
||||||
"applicationId": "bitwardendesktop",
|
"applicationId": "bitwardendesktop",
|
||||||
"identityName": "8bitSolutionsLLC.bitwardendesktop",
|
"identityName": "8bitSolutionsLLC.bitwardendesktop",
|
||||||
"publisher": "CN=14D52771-DE3C-4886-B8BF-825BA7690418",
|
"publisher": "CN=14D52771-DE3C-4886-B8BF-825BA7690418",
|
||||||
@ -217,7 +224,7 @@
|
|||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@angular/compiler-cli": "^7.2.11",
|
"@angular/compiler-cli": "^7.2.11",
|
||||||
"@ngtools/webpack": "^7.2.2",
|
"@ngtools/webpack": "^7.2.2",
|
||||||
"@types/lunr": "^2.1.6",
|
"@types/lunr": "^2.3.3",
|
||||||
"@types/node-forge": "^0.7.5",
|
"@types/node-forge": "^0.7.5",
|
||||||
"@types/papaparse": "^4.5.3",
|
"@types/papaparse": "^4.5.3",
|
||||||
"@types/semver": "^5.5.0",
|
"@types/semver": "^5.5.0",
|
||||||
|
@ -59,6 +59,17 @@
|
|||||||
</select>
|
</select>
|
||||||
<small class="help-block">{{'clearClipboardDesc' | i18n}}</small>
|
<small class="help-block">{{'clearClipboardDesc' | i18n}}</small>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<div class="checkbox">
|
||||||
|
<label for="minimizeOnCopyToClipboard">
|
||||||
|
<input id="minimizeOnCopyToClipboard" type="checkbox"
|
||||||
|
name="MinimizeOnCopyToClipboard" [(ngModel)]="minimizeOnCopyToClipboard"
|
||||||
|
(change)="saveMinOnCopyToClipboard()">
|
||||||
|
{{'minimizeOnCopyToClipboard' | i18n}}
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
<small class="help-block">{{'minimizeOnCopyToClipboardDesc' | i18n}}</small>
|
||||||
|
</div>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<div class="checkbox">
|
<div class="checkbox">
|
||||||
<label for="disableFavicons">
|
<label for="disableFavicons">
|
||||||
|
@ -38,6 +38,7 @@ export class SettingsComponent implements OnInit {
|
|||||||
enableTray: boolean = false;
|
enableTray: boolean = false;
|
||||||
showMinToTray: boolean = false;
|
showMinToTray: boolean = false;
|
||||||
startToTray: boolean = false;
|
startToTray: boolean = false;
|
||||||
|
minimizeOnCopyToClipboard: boolean = false;
|
||||||
locale: string;
|
locale: string;
|
||||||
vaultTimeouts: any[];
|
vaultTimeouts: any[];
|
||||||
localeOptions: any[];
|
localeOptions: any[];
|
||||||
@ -122,9 +123,21 @@ export class SettingsComponent implements OnInit {
|
|||||||
this.locale = await this.storageService.get<string>(ConstantsService.localeKey);
|
this.locale = await this.storageService.get<string>(ConstantsService.localeKey);
|
||||||
this.theme = await this.storageService.get<string>(ConstantsService.themeKey);
|
this.theme = await this.storageService.get<string>(ConstantsService.themeKey);
|
||||||
this.clearClipboard = await this.storageService.get<number>(ConstantsService.clearClipboardKey);
|
this.clearClipboard = await this.storageService.get<number>(ConstantsService.clearClipboardKey);
|
||||||
|
this.minimizeOnCopyToClipboard = await this.storageService.get<boolean>(
|
||||||
|
ElectronConstants.minimizeOnCopyToClipboardKey);
|
||||||
}
|
}
|
||||||
|
|
||||||
async saveVaultTimeoutOptions() {
|
async saveVaultTimeoutOptions() {
|
||||||
|
if (this.vaultTimeoutAction === 'logOut') {
|
||||||
|
const confirmed = await this.platformUtilsService.showDialog(
|
||||||
|
this.i18nService.t('vaultTimeoutLogOutConfirmation'),
|
||||||
|
this.i18nService.t('vaultTimeoutLogOutConfirmationTitle'),
|
||||||
|
this.i18nService.t('yes'), this.i18nService.t('cancel'), 'warning');
|
||||||
|
if (!confirmed) {
|
||||||
|
this.vaultTimeoutAction = 'lock';
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
await this.vaultTimeoutService.setVaultTimeoutOptions(this.vaultTimeout != null ? this.vaultTimeout : null,
|
await this.vaultTimeoutService.setVaultTimeoutOptions(this.vaultTimeout != null ? this.vaultTimeout : null,
|
||||||
this.vaultTimeoutAction);
|
this.vaultTimeoutAction);
|
||||||
}
|
}
|
||||||
@ -227,6 +240,11 @@ export class SettingsComponent implements OnInit {
|
|||||||
window.setTimeout(() => window.location.reload(), 200);
|
window.setTimeout(() => window.location.reload(), 200);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async saveMinOnCopyToClipboard() {
|
||||||
|
await this.storageService.save(ElectronConstants.minimizeOnCopyToClipboardKey, this.minimizeOnCopyToClipboard);
|
||||||
|
this.callAnalytics('MinOnCopyToClipboard', this.minimizeOnCopyToClipboard);
|
||||||
|
}
|
||||||
|
|
||||||
async saveClearClipboard() {
|
async saveClearClipboard() {
|
||||||
await this.storageService.save(ConstantsService.clearClipboardKey, this.clearClipboard);
|
await this.storageService.save(ConstantsService.clearClipboardKey, this.clearClipboard);
|
||||||
this.analytics.eventTrack.next({
|
this.analytics.eventTrack.next({
|
||||||
|
@ -684,6 +684,9 @@ export class VaultComponent implements OnInit, OnDestroy {
|
|||||||
this.platformUtilsService.copyToClipboard(value);
|
this.platformUtilsService.copyToClipboard(value);
|
||||||
this.toasterService.popAsync('info', null,
|
this.toasterService.popAsync('info', null,
|
||||||
this.i18nService.t('valueCopied', this.i18nService.t(labelI18nKey)));
|
this.i18nService.t('valueCopied', this.i18nService.t(labelI18nKey)));
|
||||||
|
if (this.action === 'view') {
|
||||||
|
this.messagingService.send('minimizeOnCopy');
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -12,7 +12,9 @@ import { CipherService } from 'jslib/abstractions/cipher.service';
|
|||||||
import { CryptoService } from 'jslib/abstractions/crypto.service';
|
import { CryptoService } from 'jslib/abstractions/crypto.service';
|
||||||
import { EventService } from 'jslib/abstractions/event.service';
|
import { EventService } from 'jslib/abstractions/event.service';
|
||||||
import { I18nService } from 'jslib/abstractions/i18n.service';
|
import { I18nService } from 'jslib/abstractions/i18n.service';
|
||||||
|
import { MessagingService } from 'jslib/abstractions/messaging.service';
|
||||||
import { PlatformUtilsService } from 'jslib/abstractions/platformUtils.service';
|
import { PlatformUtilsService } from 'jslib/abstractions/platformUtils.service';
|
||||||
|
import { StorageService } from 'jslib/abstractions/storage.service';
|
||||||
import { TokenService } from 'jslib/abstractions/token.service';
|
import { TokenService } from 'jslib/abstractions/token.service';
|
||||||
import { TotpService } from 'jslib/abstractions/totp.service';
|
import { TotpService } from 'jslib/abstractions/totp.service';
|
||||||
import { UserService } from 'jslib/abstractions/user.service';
|
import { UserService } from 'jslib/abstractions/user.service';
|
||||||
@ -35,7 +37,8 @@ export class ViewComponent extends BaseViewComponent implements OnChanges {
|
|||||||
cryptoService: CryptoService, platformUtilsService: PlatformUtilsService,
|
cryptoService: CryptoService, platformUtilsService: PlatformUtilsService,
|
||||||
auditService: AuditService, broadcasterService: BroadcasterService,
|
auditService: AuditService, broadcasterService: BroadcasterService,
|
||||||
ngZone: NgZone, changeDetectorRef: ChangeDetectorRef,
|
ngZone: NgZone, changeDetectorRef: ChangeDetectorRef,
|
||||||
userService: UserService, eventService: EventService) {
|
userService: UserService, eventService: EventService,
|
||||||
|
private messagingService: MessagingService, private storageService: StorageService) {
|
||||||
super(cipherService, totpService, tokenService, i18nService, cryptoService, platformUtilsService,
|
super(cipherService, totpService, tokenService, i18nService, cryptoService, platformUtilsService,
|
||||||
auditService, window, broadcasterService, ngZone, changeDetectorRef, userService, eventService);
|
auditService, window, broadcasterService, ngZone, changeDetectorRef, userService, eventService);
|
||||||
}
|
}
|
||||||
@ -48,4 +51,9 @@ export class ViewComponent extends BaseViewComponent implements OnChanges {
|
|||||||
this.platformUtilsService.eventTrack('View Password History');
|
this.platformUtilsService.eventTrack('View Password History');
|
||||||
this.onViewCipherPasswordHistory.emit(this.cipher);
|
this.onViewCipherPasswordHistory.emit(this.cipher);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
copy(value: string, typeI18nKey: string, aType: string) {
|
||||||
|
super.copy(value, typeI18nKey, aType);
|
||||||
|
this.messagingService.send('minimizeOnCopy');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -112,6 +112,12 @@
|
|||||||
"message": "Copy Value",
|
"message": "Copy Value",
|
||||||
"description": "Copy value to clipboard"
|
"description": "Copy value to clipboard"
|
||||||
},
|
},
|
||||||
|
"minimizeOnCopyToClipboard": {
|
||||||
|
"message": "Minimize when copying to clipboard"
|
||||||
|
},
|
||||||
|
"minimizeOnCopyToClipboardDesc": {
|
||||||
|
"message": "Minimize when copying an item's data to the clipboard."
|
||||||
|
},
|
||||||
"toggleVisibility": {
|
"toggleVisibility": {
|
||||||
"message": "Toggle Visibility"
|
"message": "Toggle Visibility"
|
||||||
},
|
},
|
||||||
@ -1320,5 +1326,11 @@
|
|||||||
},
|
},
|
||||||
"permanentlyDelete": {
|
"permanentlyDelete": {
|
||||||
"message": "Permanently Delete"
|
"message": "Permanently Delete"
|
||||||
|
},
|
||||||
|
"vaultTimeoutLogOutConfirmation": {
|
||||||
|
"message": "Logging out will remove all access to your vault and requires online authentication after the timeout period. Are you sure you want to use this setting?"
|
||||||
|
},
|
||||||
|
"vaultTimeoutLogOutConfirmationTitle": {
|
||||||
|
"message": "Timeout Action Confirmation"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -88,7 +88,7 @@ export class Main {
|
|||||||
this.storageService = new ElectronStorageService(app.getPath('userData'), storageDefaults);
|
this.storageService = new ElectronStorageService(app.getPath('userData'), storageDefaults);
|
||||||
|
|
||||||
this.windowMain = new WindowMain(this.storageService, true);
|
this.windowMain = new WindowMain(this.storageService, true);
|
||||||
this.messagingMain = new MessagingMain(this);
|
this.messagingMain = new MessagingMain(this, this.storageService);
|
||||||
this.updaterMain = new UpdaterMain(this.i18nService, this.windowMain, 'desktop', () => {
|
this.updaterMain = new UpdaterMain(this.i18nService, this.windowMain, 'desktop', () => {
|
||||||
this.menuMain.updateMenuItem.enabled = false;
|
this.menuMain.updateMenuItem.enabled = false;
|
||||||
}, () => {
|
}, () => {
|
||||||
|
@ -2,12 +2,16 @@ import { ipcMain } from 'electron';
|
|||||||
|
|
||||||
import { Main } from '../main';
|
import { Main } from '../main';
|
||||||
|
|
||||||
|
import { ElectronConstants } from 'jslib/electron/electronConstants';
|
||||||
|
|
||||||
|
import { StorageService } from 'jslib/abstractions/storage.service';
|
||||||
|
|
||||||
const SyncInterval = 5 * 60 * 1000; // 5 minutes
|
const SyncInterval = 5 * 60 * 1000; // 5 minutes
|
||||||
|
|
||||||
export class MessagingMain {
|
export class MessagingMain {
|
||||||
private syncTimeout: NodeJS.Timer;
|
private syncTimeout: NodeJS.Timer;
|
||||||
|
|
||||||
constructor(private main: Main) { }
|
constructor(private main: Main, private storageService: StorageService) { }
|
||||||
|
|
||||||
init() {
|
init() {
|
||||||
this.scheduleNextSync();
|
this.scheduleNextSync();
|
||||||
@ -23,6 +27,14 @@ export class MessagingMain {
|
|||||||
this.main.menuMain.updateApplicationMenuState(message.isAuthenticated, message.isLocked);
|
this.main.menuMain.updateApplicationMenuState(message.isAuthenticated, message.isLocked);
|
||||||
this.updateTrayMenu(message.isAuthenticated, message.isLocked);
|
this.updateTrayMenu(message.isAuthenticated, message.isLocked);
|
||||||
break;
|
break;
|
||||||
|
case 'minimizeOnCopy':
|
||||||
|
this.storageService.get<boolean>(ElectronConstants.minimizeOnCopyToClipboardKey).then(
|
||||||
|
(shouldMinimize) => {
|
||||||
|
if (shouldMinimize && this.main.windowMain.win != null) {
|
||||||
|
this.main.windowMain.win.minimize();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
break;
|
||||||
case 'showTray':
|
case 'showTray':
|
||||||
this.main.trayMain.showTray();
|
this.main.trayMain.showTray();
|
||||||
break;
|
break;
|
||||||
|
@ -17,16 +17,16 @@ $gray: #555;
|
|||||||
$gray-light: #777;
|
$gray-light: #777;
|
||||||
$text-muted: $gray-light;
|
$text-muted: $gray-light;
|
||||||
|
|
||||||
$brand-primary: #3c8dbc;
|
$brand-primary: #175DDC;
|
||||||
$brand-danger: #dd4b39;
|
$brand-danger: #dd4b39;
|
||||||
$brand-success: #00a65a;
|
$brand-success: #00a65a;
|
||||||
$brand-info: #555555;
|
$brand-info: #555555;
|
||||||
$brand-warning: #bf7e16;
|
$brand-warning: #bf7e16;
|
||||||
$brand-primary-accent: #286090;
|
$brand-primary-accent: #1252A3;
|
||||||
|
|
||||||
$background-color: white;
|
$background-color: white;
|
||||||
$background-color-alt: #f9fafc;
|
$background-color-alt: #f9f9f9;
|
||||||
$background-color-alt2: #ecf0f5;
|
$background-color-alt2: #ededed;
|
||||||
|
|
||||||
$box-background-color: $background-color;
|
$box-background-color: $background-color;
|
||||||
$box-background-hover-color: $list-item-hover;
|
$box-background-hover-color: $list-item-hover;
|
||||||
|
Loading…
Reference in New Issue
Block a user