support application lock

This commit is contained in:
MaysWind
2020-11-21 02:31:37 +08:00
parent d59ff3180d
commit 7290835bb8
15 changed files with 374 additions and 22 deletions
+3
View File
@@ -5,6 +5,7 @@ const serverSettingsCookieKey = 'ACP_SETTINGS';
const defaultSettings = {
lang: 'en',
applicationLock: false,
autoUpdateExchangeRatesData: true,
thousandsSeparator: true,
currencyDisplayMode: 'code', // or 'none' or 'name'
@@ -73,6 +74,8 @@ function clearSettings() {
export default {
getLanguage: () => getOriginalOption('lang'),
setLanguage: value => setOption('lang', value),
isEnableApplicationLock: () => getOption('applicationLock'),
setEnableApplicationLock: value => setOption('applicationLock', value),
isAutoUpdateExchangeRatesData: () => getOption('autoUpdateExchangeRatesData'),
setAutoUpdateExchangeRatesData: value => setOption('autoUpdateExchangeRatesData', value),
isEnableThousandsSeparator: () => getOption('thousandsSeparator'),
+80 -4
View File
@@ -1,10 +1,34 @@
import utils from './utils.js'
import CryptoJS from 'crypto-js';
import settings from './settings.js';
import utils from './utils.js';
const APP_LOCK_SECRET_BASE_STRING_PREFIX = 'LAB_LOCK_SECRET_';
const tokenLocalStorageKey = 'lab_user_token';
const userInfoLocalStorageKey = 'lab_user_info';
const tokenSessionStorageKey = 'lab_user_session_token';
const appLockSecretSessionStorageKey = 'lab_user_app_lock_secret';
function getAppLockSecret(pinCode) {
return CryptoJS.SHA256(APP_LOCK_SECRET_BASE_STRING_PREFIX + pinCode).toString();
}
function getEncryptedToken(token, secret) {
return CryptoJS.AES.encrypt(token, secret).toString();
}
function getDecryptedToken(encryptedToken, secret) {
const bytes = CryptoJS.AES.decrypt(encryptedToken, secret);
return bytes.toString(CryptoJS.enc.Utf8);
}
function getToken() {
return localStorage.getItem(tokenLocalStorageKey);
if (settings.isEnableApplicationLock()) {
return sessionStorage.getItem(tokenSessionStorageKey);
} else {
return localStorage.getItem(tokenLocalStorageKey);
}
}
function getUserInfo() {
@@ -13,12 +37,58 @@ function getUserInfo() {
}
function isUserLogined() {
return !!getToken();
return !!localStorage.getItem(tokenLocalStorageKey);
}
function isUserUnlocked() {
if (!isUserLogined()) {
return false;
}
if (!settings.isEnableApplicationLock()) {
return true;
}
return !!sessionStorage.getItem(appLockSecretSessionStorageKey) && !!sessionStorage.getItem(tokenSessionStorageKey);
}
function unlockToken(pinCode) {
const encryptedToken = localStorage.getItem(tokenLocalStorageKey);
const secret = getAppLockSecret(pinCode);
const token = getDecryptedToken(encryptedToken, secret);
sessionStorage.setItem(appLockSecretSessionStorageKey, secret);
sessionStorage.setItem(tokenSessionStorageKey, token);
}
function encryptToken(pinCode) {
const token = localStorage.getItem(tokenLocalStorageKey);
const secret = getAppLockSecret(pinCode);
const encryptedToken = getEncryptedToken(token, secret);
sessionStorage.setItem(appLockSecretSessionStorageKey, secret);
sessionStorage.setItem(tokenSessionStorageKey, token);
localStorage.setItem(tokenLocalStorageKey, encryptedToken);
}
function decryptToken() {
const token = sessionStorage.getItem(tokenSessionStorageKey);
localStorage.setItem(tokenLocalStorageKey, token);
sessionStorage.removeItem(tokenSessionStorageKey);
sessionStorage.removeItem(appLockSecretSessionStorageKey);
}
function updateToken(token) {
if (utils.isString(token)) {
localStorage.setItem(tokenLocalStorageKey, token);
if (settings.isEnableApplicationLock()) {
sessionStorage.setItem(tokenSessionStorageKey, token);
const secret = sessionStorage.getItem(appLockSecretSessionStorageKey);
localStorage.setItem(tokenLocalStorageKey, getEncryptedToken(token, secret));
} else {
localStorage.setItem(tokenLocalStorageKey, token);
}
}
}
@@ -41,6 +111,8 @@ function updateTokenAndUserInfo(item) {
}
function clearTokenAndUserInfo() {
sessionStorage.removeItem(tokenSessionStorageKey);
sessionStorage.removeItem(appLockSecretSessionStorageKey);
localStorage.removeItem(tokenLocalStorageKey);
localStorage.removeItem(userInfoLocalStorageKey);
}
@@ -49,6 +121,10 @@ export default {
getToken,
getUserInfo,
isUserLogined,
isUserUnlocked,
unlockToken,
encryptToken,
decryptToken,
updateToken,
updateUserInfo,
updateTokenAndUserInfo,