mirror of
https://github.com/laurent22/joplin.git
synced 2025-01-02 12:47:41 +02:00
All: Resolves #6978: Improved handling of invalid sync info
This commit is contained in:
parent
da58d1f0d7
commit
bcf054fd08
@ -1,6 +1,6 @@
|
|||||||
import { afterAllCleanUp, setupDatabaseAndSynchronizer, switchClient, encryptionService, msleep } from '../../testing/test-utils';
|
import { afterAllCleanUp, setupDatabaseAndSynchronizer, logger, switchClient, encryptionService, msleep } from '../../testing/test-utils';
|
||||||
import MasterKey from '../../models/MasterKey';
|
import MasterKey from '../../models/MasterKey';
|
||||||
import { masterKeyEnabled, mergeSyncInfos, setMasterKeyEnabled, SyncInfo, syncInfoEquals } from './syncInfoUtils';
|
import { localSyncInfo, masterKeyEnabled, mergeSyncInfos, saveLocalSyncInfo, setMasterKeyEnabled, SyncInfo, syncInfoEquals } from './syncInfoUtils';
|
||||||
|
|
||||||
describe('syncInfoUtils', () => {
|
describe('syncInfoUtils', () => {
|
||||||
|
|
||||||
@ -154,4 +154,25 @@ describe('syncInfoUtils', () => {
|
|||||||
expect(mergeSyncInfos(syncInfo1, syncInfo2).activeMasterKeyId).toBe('1');
|
expect(mergeSyncInfos(syncInfo1, syncInfo2).activeMasterKeyId).toBe('1');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should fix the sync info if it contains invalid data', async () => {
|
||||||
|
logger.enabled = false;
|
||||||
|
|
||||||
|
const syncInfo = new SyncInfo();
|
||||||
|
syncInfo.masterKeys = [{
|
||||||
|
id: '1',
|
||||||
|
content: 'content1',
|
||||||
|
hasBeenUsed: true,
|
||||||
|
enabled: 0,
|
||||||
|
}];
|
||||||
|
syncInfo.activeMasterKeyId = '2';
|
||||||
|
|
||||||
|
saveLocalSyncInfo(syncInfo);
|
||||||
|
|
||||||
|
const loaded = localSyncInfo();
|
||||||
|
expect(loaded.activeMasterKeyId).toBe('');
|
||||||
|
expect(loaded.masterKeys.length).toBe(1);
|
||||||
|
|
||||||
|
logger.enabled = true;
|
||||||
|
});
|
||||||
|
|
||||||
});
|
});
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
import Logger from '@joplin/utils/Logger';
|
||||||
import { FileApi } from '../../file-api';
|
import { FileApi } from '../../file-api';
|
||||||
import JoplinDatabase from '../../JoplinDatabase';
|
import JoplinDatabase from '../../JoplinDatabase';
|
||||||
import Setting from '../../models/Setting';
|
import Setting from '../../models/Setting';
|
||||||
@ -6,6 +7,8 @@ import { PublicPrivateKeyPair } from '../e2ee/ppk';
|
|||||||
import { MasterKeyEntity } from '../e2ee/types';
|
import { MasterKeyEntity } from '../e2ee/types';
|
||||||
const fastDeepEqual = require('fast-deep-equal');
|
const fastDeepEqual = require('fast-deep-equal');
|
||||||
|
|
||||||
|
const logger = Logger.create('syncInfoUtils');
|
||||||
|
|
||||||
export interface SyncInfoValueBoolean {
|
export interface SyncInfoValueBoolean {
|
||||||
value: boolean;
|
value: boolean;
|
||||||
updatedTime: number;
|
updatedTime: number;
|
||||||
@ -75,15 +78,25 @@ export async function fetchSyncInfo(api: FileApi): Promise<SyncInfo> {
|
|||||||
if (oldVersion) output = { version: 1 };
|
if (oldVersion) output = { version: 1 };
|
||||||
}
|
}
|
||||||
|
|
||||||
return new SyncInfo(JSON.stringify(output));
|
return fixSyncInfo(new SyncInfo(JSON.stringify(output)));
|
||||||
}
|
}
|
||||||
|
|
||||||
export function saveLocalSyncInfo(syncInfo: SyncInfo) {
|
export function saveLocalSyncInfo(syncInfo: SyncInfo) {
|
||||||
Setting.setValue('syncInfoCache', syncInfo.serialize());
|
Setting.setValue('syncInfoCache', syncInfo.serialize());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const fixSyncInfo = (syncInfo: SyncInfo) => {
|
||||||
|
if (syncInfo.activeMasterKeyId) {
|
||||||
|
if (!syncInfo.masterKeys || !syncInfo.masterKeys.find(mk => mk.id === syncInfo.activeMasterKeyId)) {
|
||||||
|
logger.warn(`Sync info is using a non-existent key as the active key - clearing it: ${syncInfo.activeMasterKeyId}`);
|
||||||
|
syncInfo.activeMasterKeyId = '';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return syncInfo;
|
||||||
|
};
|
||||||
|
|
||||||
export function localSyncInfo(): SyncInfo {
|
export function localSyncInfo(): SyncInfo {
|
||||||
return new SyncInfo(Setting.value('syncInfoCache'));
|
return fixSyncInfo(new SyncInfo(Setting.value('syncInfoCache')));
|
||||||
}
|
}
|
||||||
|
|
||||||
export function localSyncInfoFromState(state: State): SyncInfo {
|
export function localSyncInfoFromState(state: State): SyncInfo {
|
||||||
|
Loading…
Reference in New Issue
Block a user