1
0
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:
Laurent Cozic 2023-09-24 16:26:01 +01:00
parent da58d1f0d7
commit bcf054fd08
2 changed files with 38 additions and 4 deletions

View File

@ -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;
});
}); });

View File

@ -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 {