option do disable caching files in offline storage

fix #404, fix #1115
This commit is contained in:
antelle 2021-02-06 13:53:12 +01:00
parent 56604de7f1
commit a6c0fc3984
No known key found for this signature in database
GPG Key ID: 63C9777AAB7C563C
7 changed files with 61 additions and 11 deletions

View File

@ -45,6 +45,7 @@ const DefaultAppSettings = {
useLegacyAutoType: false, // use legacy auto-type engine (will be removed in future versions)
deviceOwnerAuth: null, // Touch ID: null / 'memory' / 'file'
deviceOwnerAuthTimeoutMinutes: 0, // how often master password is required with Touch ID
disableOfflineStorage: false, // don't cache loaded files in offline storage
yubiKeyShowIcon: true, // show an icon to open OTP codes from YubiKey
yubiKeyAutoOpen: false, // auto-load one-time codes when there are open files

View File

@ -449,6 +449,7 @@
"setGenLockAutoType": "On auto-type",
"setGenLockOrSleep": "When the computer is locked or put to sleep",
"setGenStorage": "Storage",
"setGenDisableOfflineStorage": "Don't cache loaded files in offline storage",
"setGenStorageLogout": "Log out",
"setGenShowAdvanced": "Show advanced settings",
"setGenDevTools": "Show dev tools",

View File

@ -526,7 +526,8 @@ class AppModel {
fileInfo &&
fileInfo.openDate &&
fileInfo.rev === params.rev &&
fileInfo.storage !== 'file'
fileInfo.storage !== 'file' &&
!this.settings.disableOfflineStorage
) {
logger.info('Open file from cache because it is latest');
this.openFileFromCache(
@ -547,7 +548,12 @@ class AppModel {
},
fileInfo
);
} else if (!fileInfo || !fileInfo.openDate || params.storage === 'file') {
} else if (
!fileInfo ||
!fileInfo.openDate ||
params.storage === 'file' ||
this.settings.disableOfflineStorage
) {
this.openFileFromStorage(params, callback, fileInfo, logger);
} else {
logger.info('Open file from cache, will sync after load', params.storage);
@ -595,7 +601,7 @@ class AppModel {
logger.info('Load from storage');
storage.load(params.path, params.opts, (err, data, stat) => {
if (err) {
if (fileInfo && fileInfo.openDate) {
if (fileInfo && fileInfo.openDate && !this.settings.disableOfflineStorage) {
logger.info('Open file from cache because of storage load error', err);
this.openFileFromCache(params, callback, fileInfo);
} else {
@ -619,7 +625,8 @@ class AppModel {
!noCache &&
fileInfo &&
storage.name !== 'file' &&
(err || (stat && stat.rev === cacheRev))
(err || (stat && stat.rev === cacheRev)) &&
!this.settings.disableOfflineStorage
) {
logger.info(
'Open file from cache because ' + (err ? 'stat error' : 'it is latest'),
@ -689,7 +696,7 @@ class AppModel {
if (fileInfo) {
file.syncDate = fileInfo.syncDate;
}
if (updateCacheOnSuccess) {
if (updateCacheOnSuccess && !this.settings.disableOfflineStorage) {
logger.info('Save loaded file to cache');
Storage.cache.save(file.id, null, params.fileData);
}
@ -976,6 +983,10 @@ class AppModel {
logger.info('Updated sync date, saving modified file');
saveToCacheAndStorage();
} else if (file.dirty) {
if (this.settings.disableOfflineStorage) {
logger.info('File is dirty and cache is disabled');
return complete(err);
}
logger.info('Saving not modified dirty file to cache');
Storage.cache.save(fileInfo.id, null, data, (err) => {
if (err) {
@ -1038,6 +1049,9 @@ class AppModel {
} else if (!file.dirty) {
logger.info('Saving to storage, skip cache because not dirty');
saveToStorage(data);
} else if (this.settings.disableOfflineStorage) {
logger.info('Saving to storage because cache is disabled');
saveToStorage(data);
} else {
logger.info('Saving to cache');
Storage.cache.save(fileInfo.id, null, data, (err) => {
@ -1061,6 +1075,10 @@ class AppModel {
logger.info('File does not exist in storage, creating');
saveToCacheAndStorage();
} else if (file.dirty) {
if (this.settings.disableOfflineStorage) {
logger.info('Stat error, dirty, cache is disabled', err || 'no error');
return complete(err);
}
logger.info('Stat error, dirty, save to cache', err || 'no error');
file.getData((data, e) => {
if (e) {
@ -1098,6 +1116,14 @@ class AppModel {
}
}
deleteAllCachedFiles() {
for (const fileInfo of this.fileInfos) {
if (fileInfo.storage && !fileInfo.modified) {
Storage.cache.remove(fileInfo.id);
}
}
}
clearStoredKeyFiles() {
for (const fileInfo of this.fileInfos) {
fileInfo.set({

View File

@ -578,9 +578,13 @@ class AppView extends View {
complete: (res) => {
if (res === 'ignore') {
this.model.closeAllFiles();
complete(true);
if (complete) {
complete(true);
}
} else {
complete(false);
if (complete) {
complete(false);
}
}
}
});

View File

@ -61,6 +61,7 @@ class SettingsGeneralView extends View {
'click .settings__general-restart-btn': 'installUpdateAndRestart',
'click .settings__general-download-update-btn': 'downloadUpdate',
'click .settings__general-update-found-btn': 'installFoundUpdate',
'change .settings__general-disable-offline-storage': 'changeDisableOfflineStorage',
'change .settings__general-prv-check': 'changeStorageEnabled',
'click .settings__general-prv-logout': 'logoutFromStorage',
'click .settings__general-show-advanced': 'showAdvancedSettings',
@ -139,7 +140,8 @@ class SettingsGeneralView extends View {
showReloadApp: Features.isStandalone,
hasDeviceOwnerAuth: Launcher && Launcher.hasTouchId(),
deviceOwnerAuth: AppSettingsModel.deviceOwnerAuth,
deviceOwnerAuthTimeout: AppSettingsModel.deviceOwnerAuthTimeoutMinutes
deviceOwnerAuthTimeout: AppSettingsModel.deviceOwnerAuthTimeoutMinutes,
disableOfflineStorage: AppSettingsModel.disableOfflineStorage
});
this.renderProviderViews(storageProviders);
}
@ -476,6 +478,14 @@ class SettingsGeneralView extends View {
Events.emit('refresh');
}
changeDisableOfflineStorage(e) {
const disableOfflineStorage = e.target.checked;
AppSettingsModel.disableOfflineStorage = disableOfflineStorage;
if (disableOfflineStorage) {
this.appModel.deleteAllCachedFiles();
}
}
changeStorageEnabled(e) {
const storage = Storage[$(e.target).data('storage')];
if (storage) {

View File

@ -300,6 +300,12 @@
{{/if}}
<h2 id="storage">{{res 'setGenStorage'}}</h2>
<div>
<input type="checkbox" class="settings__input input-base settings__general-disable-offline-storage" id="settings__general-disable-offline-storage"
{{#if disableOfflineStorage}}checked{{/if}} />
<label for="settings__general-disable-offline-storage">{{res 'setGenDisableOfflineStorage'}}</label>
</div>
{{#each storageProviders as |prv|}}
<h4 class="settings__general-storage-header"><input
type="checkbox" id="settings__general-prv-check-{{prv.name}}" class="settings__general-prv-check"

View File

@ -2,15 +2,16 @@ Release notes
-------------
##### v1.17.0 (TBD)
`+` opening files with Touch ID on macOS
`+` password quality warnings
`+` password quality warnings
`+` "Have I Been Pwned" service integration (opt-in)
`+` automatically switching between dark and light theme
`*` new updater capable to upgrade major versions
`+` clear searchbox button
`+` clear searchbox button
`+` more options for auto-lock timeout
`+` favicon download improvements
`+` auto-type field selection dropdown improvements
`+` new completion page after storage provider authentication
`+` option do disable caching files in offline storage
`-` fixed creating files with Argon2id KDF
##### v1.16.7 (2020-12-31)
@ -622,7 +623,8 @@ Performance, stability and quality improvements
`+` track changes in local files
`+` mobile layout made more convenient
`+` command-line option to disable updater
`+` using system proxy settings for updater
`+` using system proxy se
ttings for updater
`+` webapp icon for touch devices
`-` #80: prevent data loss on group move
`-` issues with clipboard clear fixed