mirror of
https://github.com/bitwarden/browser
synced 2025-12-18 01:03:35 +00:00
idle locking and lock service refactor
This commit is contained in:
125
src/services/lockService.js
Normal file
125
src/services/lockService.js
Normal file
@@ -0,0 +1,125 @@
|
||||
function LockService(constantsService, cryptoService, folderService, loginService, setIcon, refreshBadgeAndMenu) {
|
||||
this.lastLockCheck = null;
|
||||
this.constantsService = constantsService;
|
||||
this.cryptoService = cryptoService;
|
||||
this.folderService = folderService;
|
||||
this.loginService = loginService;
|
||||
this.setIcon = setIcon;
|
||||
this.refreshBadgeAndMenu = refreshBadgeAndMenu;
|
||||
|
||||
initLockService(this);
|
||||
};
|
||||
|
||||
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;
|
||||
|
||||
if (chrome.extension.getViews({ type: 'popup' }).length > 0) {
|
||||
// popup is open, do not lock
|
||||
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
|
||||
self.lock();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
if (chrome.idle && chrome.idle.onStateChanged) {
|
||||
chrome.idle.onStateChanged.addListener(function (newState) {
|
||||
if (newState === 'locked') {
|
||||
getLockOption().then(function (lockOption) {
|
||||
if (lockOption === -2) {
|
||||
self.lock();
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
LockService.prototype.lock = function () {
|
||||
Q.all([self.cryptoService.clearKey(), self.cryptoService.clearOrgKeys(true)]).then(function () {
|
||||
self.cryptoService.clearPrivateKey();
|
||||
self.setIcon();
|
||||
self.folderService.clearCache();
|
||||
self.loginService.clearCache();
|
||||
self.refreshBadgeAndMenu();
|
||||
});
|
||||
};
|
||||
|
||||
function getLockOption() {
|
||||
var deferred = Q.defer();
|
||||
|
||||
chrome.storage.local.get(self.constantsService.lockOptionKey, function (obj) {
|
||||
if (obj && obj[constantsService.lockOptionKey] === 0 || obj[constantsService.lockOptionKey]) {
|
||||
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) {
|
||||
if (obj && obj[constantsService.lastActiveKey]) {
|
||||
deferred.resolve(obj[constantsService.lastActiveKey]);
|
||||
}
|
||||
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;
|
||||
}
|
||||
};
|
||||
Reference in New Issue
Block a user