1
0
mirror of https://github.com/bitwarden/browser.git synced 2024-10-19 07:35:48 +02:00
bitwarden-browser/src/services/lockService.js

149 lines
4.6 KiB
JavaScript
Raw Normal View History

2017-10-17 05:11:32 +02:00
function LockService(constantsService, cryptoService, folderService, cipherService, utilsService, setIcon, refreshBadgeAndMenu) {
2017-06-05 20:27:24 +02:00
this.lastLockCheck = null;
this.constantsService = constantsService;
this.cryptoService = cryptoService;
this.folderService = folderService;
2017-10-17 05:11:32 +02:00
this.cipherService = cipherService;
2017-09-28 16:39:31 +02:00
this.utilsService = utilsService;
2017-06-05 20:27:24 +02:00
this.setIcon = setIcon;
this.refreshBadgeAndMenu = refreshBadgeAndMenu;
initLockService(this);
2017-07-14 21:34:05 +02:00
}
2017-06-05 20:27:24 +02:00
function initLockService(self) {
checkLock();
setInterval(checkLock, 10 * 1000); // check every 10 seconds
function checkLock() {
var now = new Date();
if (self.lastLockCheck && (now - self.lastLockCheck) < 5000) {
// can only check lock every 5 seconds
return;
}
self.lastLockCheck = now;
2017-09-28 16:39:31 +02:00
var popupOpen = chrome.extension.getViews({ type: 'popup' }).length > 0;
2017-10-06 06:05:08 +02:00
var tabOpen = chrome.extension.getViews({ type: 'tab' }).length > 0;
var sidebarView = sidebarViewName(self.utilsService);
var sidebarOpen = sidebarView && chrome.extension.getViews({ type: sidebarView }).length > 0;
2017-09-28 16:39:31 +02:00
2017-10-06 06:05:08 +02:00
if (popupOpen || tabOpen || sidebarOpen) {
2017-09-28 16:39:31 +02:00
// Do not lock
2017-06-05 20:27:24 +02:00
return;
}
var lockOptionSeconds = null;
self.cryptoService.getKey().then(function (key) {
if (!key) {
// no key so no need to lock
return false;
}
return getLockOption();
}).then(function (lockOption) {
if (lockOption === false || lockOption < 0) {
return;
}
lockOptionSeconds = lockOption * 60;
return getLastActive();
}).then(function (lastActive) {
if (lockOptionSeconds === null) {
return;
}
var diffSeconds = ((new Date()).getTime() - lastActive) / 1000;
if (diffSeconds >= lockOptionSeconds) {
// need to lock now
2017-06-13 17:53:08 +02:00
return self.lock();
2017-06-05 20:27:24 +02:00
}
});
}
if (chrome.idle && chrome.idle.onStateChanged) {
chrome.idle.onStateChanged.addListener(function (newState) {
if (newState === 'locked') {
getLockOption().then(function (lockOption) {
2017-06-13 17:53:08 +02:00
if (lockOption !== -2) {
return;
2017-06-05 20:27:24 +02:00
}
2017-06-13 17:53:08 +02:00
return self.lock();
2017-06-05 20:27:24 +02:00
});
}
});
}
LockService.prototype.lock = function () {
2017-06-13 17:53:08 +02:00
return Q.all([
self.cryptoService.clearKey(),
self.cryptoService.clearOrgKeys(true),
self.cryptoService.clearPrivateKey(true),
self.cryptoService.clearEncKey(true)
]).then(function () {
2017-06-05 20:27:24 +02:00
self.setIcon();
self.folderService.clearCache();
2017-10-17 05:11:32 +02:00
self.cipherService.clearCache();
2017-06-05 20:27:24 +02:00
self.refreshBadgeAndMenu();
});
};
function getLockOption() {
var deferred = Q.defer();
chrome.storage.local.get(self.constantsService.lockOptionKey, function (obj) {
2017-06-27 05:55:51 +02:00
if (obj && obj[self.constantsService.lockOptionKey] === 0 || obj[self.constantsService.lockOptionKey]) {
2017-06-05 20:27:24 +02:00
deferred.resolve(parseInt(obj[self.constantsService.lockOptionKey]));
}
else {
deferred.reject();
}
});
return deferred.promise;
}
function getLastActive() {
var deferred = Q.defer();
chrome.storage.local.get(self.constantsService.lastActiveKey, function (obj) {
2017-06-27 05:55:51 +02:00
if (obj && obj[self.constantsService.lastActiveKey]) {
deferred.resolve(obj[self.constantsService.lastActiveKey]);
2017-06-05 20:27:24 +02:00
}
else {
deferred.reject();
}
});
return deferred.promise;
}
function getIdleState(detectionInterval) {
detectionInterval = detectionInterval || (60 * 5);
var deferred = Q.defer();
if (chrome.idle && chrome.idle.queryState) {
chrome.idle.queryState(detectionInterval, function (state) {
deferred.resolve(state);
});
}
else {
deferred.resolve('active');
}
return deferred.promise;
}
function sidebarViewName(utilsService) {
if (chrome.sidebarAction && utilsService.isFirefox()) {
return 'sidebar';
}
else if (utilsService.isOpera() && (typeof opr !== 'undefined') && opr.sidebarAction) {
return 'sidebar_panel';
}
return null;
2017-10-06 16:36:45 +02:00
}
2017-07-14 21:34:05 +02:00
}