diff --git a/packages/lib/Synchronizer.ts b/packages/lib/Synchronizer.ts index 4c4b73f5a..f82d3957d 100644 --- a/packages/lib/Synchronizer.ts +++ b/packages/lib/Synchronizer.ts @@ -451,7 +451,7 @@ export default class Synchronizer { try { let remoteInfo = await fetchSyncInfo(this.api()); - logger.info('Sync target remote info:', remoteInfo); + logger.info('Sync target remote info:', remoteInfo.filterSyncInfo()); eventManager.emit(EventName.SessionEstablished); let syncTargetIsNew = false; @@ -471,8 +471,7 @@ export default class Synchronizer { if (appVersion !== 'unknown') checkIfCanSync(remoteInfo, appVersion); let localInfo = await localSyncInfo(); - - logger.info('Sync target local info:', localInfo); + logger.info('Sync target local info:', localInfo.filterSyncInfo()); localInfo = await this.setPpkIfNotExist(localInfo, remoteInfo); diff --git a/packages/lib/services/synchronizer/syncInfoUtils.test.ts b/packages/lib/services/synchronizer/syncInfoUtils.test.ts index 869408b6f..2dfd307d1 100644 --- a/packages/lib/services/synchronizer/syncInfoUtils.test.ts +++ b/packages/lib/services/synchronizer/syncInfoUtils.test.ts @@ -200,6 +200,89 @@ describe('syncInfoUtils', () => { logger.enabled = true; }); + // cSpell:disable + it('should filter unnecessary sync info', async () => { + const initialData = { + 'version': 3, + 'e2ee': { + 'value': true, + 'updatedTime': 0, + }, + 'activeMasterKeyId': { + 'value': '400227d2222c4d3bb7346514861c643b', + 'updatedTime': 0, + }, + 'masterKeys': [ + { + 'id': '400227d8a77c4d3bb7346514861c643b', + 'created_time': 1515008161362, + 'updated_time': 1708103706234, + 'source_application': 'net.cozic.joplin-desktop', + 'encryption_method': 4, + 'checksum': '', + 'content': '{"iv":"M1uezlW1Pu1g3dwrCTqcHg==","v":1,"iter":10000,"ks":256,"ts":64,"mode":"ccm","adata":"","cipher":"aes","salt":"0dqWvU/PUVQ=","ct":"wHXN5pk1s7qKX+2Y9puEGZGkojI1Pvc+TvZUKC6QCfwxtMK6C1Hmgvm53vAaeCMcCXPvGVLo9JwqINFhEgb0ux+KUFcCqgT1pNO2Sf/hJsH8PjaUvl0kwpC511zdnvY7Hk3WIpgXVKUevsQt9TkMK5e8y1JMsuuTD3fW7bEiv/ehe4CBSQ9eH1tWjr1qQ=="}', + 'hasBeenUsed': true, + }, + ], + 'ppk': { + 'value': { + 'id': 'SNQ5ZCs61KDVUW2qqqqHd3', + 'keySize': 2048, + 'privateKey': { + 'encryptionMethod': 4, + 'ciphertext': '{"iv":"Z2y11b4nCYvpmQ9gvxELug==","v":1,"iter":10000,"ks":256,"ts":64,"mode":"ccm","adata":"","cipher":"aes","salt":"0dqWvU/PUVQ=","ct":"8CvjYayXMpLsrAMwtu18liRfewKfZVpRlC0D0I2FYziyFhRf4Cjqi2+Uy8kIC8au7oBSBUnNU6jd04ooNozneKv2MzkhbGlXo3izxqCMVHboqa2vkPWbBAxGlvUYQUg213xG61FjZ19ZJdpti+AQy7qpQU7/h5kyC0iJ2aXG5TIGcBuDq3lbGAVfG/RlL/abMKLYb8KouFYAJe+0bUajUXa1KJsey+eD+2hFVc+nAxKOLe1UoZysB77Lq43DRTBFGH2gTSC1zOXxuZeSbFPPN0Cj+FvV7D5pF9LhUSLPDsIiRwF/q+E506YgDjirSZAvW1Y2EEM22F2Mh0I0pbVPFXhhBafqPLRwXmUGULCnA64gkGwctK5mEs985VVSrpQ0nMvf/drg2vUQrJ3exgl43ddVSOCjeJuF7F06IBL5FQ34iAujsOheRNvlWtG9xm008Vc19NxvhtzIl1RO7XLXrrTBzbFHDrcHjda/xNWNEKwU/LZrH0xPgwEcwBmLItvy/NojI/JKNeck8R431QWooFb7cTplO4qsgCQNL9MJ9avpmNSXJAUQx8VnifKVbzcY4T7X7TmJWSrpvBWV8MLfi3TOF4kahR75vg47kCrMbthFMw5bvrjvMmGOtyKxheqbS5IlSnSSz5x7wIVz0g3vzMbcbb5rF5MuzNhU97wNiz3L1Aonjmnu8r3vCyXTB/4GSiwYH7KfixwYM68T4crqJ0VneNy+owznCdJQXnG4cmjxek1wmJMEmurQ1JtANNv/m43gzoqd62V6Dq05vLJF+n7CS9HgJ3FTqYVCZLGGYrSilIYnEjhdaBpkcnFrCitbfYj+IpNC6eN6qg2hpGAbmKId7RLOGwJyda0jkuNP9mTqWOF+6eYn8Q+Y3YIY"}', + }, + 'publicKey': '-----BEGIN RSA PUBLIC KEY-----\nMIIBCgKCAQEAiSTY5wBscae/WmU3PfVP5FYQiuTi5V7BjPcge/6pXvgF3zwe43uy\nTWdzO2YgK/a8f3H507clcGlZN4e0e1jZ/rh4lMfaN\nugfNo0RAvuwn8Yniqfb69reygJywbFBIauxbBpVKbc21MLuCbPkVFjKG7qGNYdF4\nc17mQ8nQsbFPZcuvxsZvgvvbza1q0rqVETdDUClyIrY8plAjMgTKCRwq2gafP6eX\nWpkENAyIbOFxSKXjWy0yFidvZfYLz4mIRwIDAQAB\n-----END RSA PUBLIC KEY-----', + 'createdTime': 1633274368892, + }, + 'updatedTime': 1633274368892, + }, + 'appMinVersion': '0.0.0', + }; + + const syncInfo = new SyncInfo(); + syncInfo.load(JSON.stringify(initialData)); + + const filteredSyncInfo = syncInfo.filterSyncInfo(); + + expect(filteredSyncInfo).toEqual({ + 'activeMasterKeyId': { + 'updatedTime': 0, + 'value': '400227d2222c4d3bb7346514861c643b', + }, + 'appMinVersion': '0.0.0', + 'e2ee': { + 'updatedTime': 0, + 'value': true, + }, + 'masterKeys': [ + { + 'created_time': 1515008161362, + 'encryption_method': 4, + 'hasBeenUsed': true, + 'id': '400227d8a77c4d3bb7346514861c643b', + 'source_application': 'net.cozic.joplin-desktop', + 'updated_time': 1708103706234, + }, + ], + 'ppk': { + 'updatedTime': 1633274368892, + 'value': { + 'createdTime': 1633274368892, + 'id': 'SNQ5ZCs61KDVUW2qqqqHd3', + 'keySize': 2048, + 'privateKey': { + 'ciphertext': '{"iv":"Z2y11b4nCYvpm...TqWOF+6eYn8Q+Y3YIY"}', + 'encryptionMethod': 4, + }, + 'publicKey': '-----BEGIN RSA PUBLIC KEY-----\nMIIBCgKCA...', + }, + }, + 'version': 3, + }); + }); + // cSpell:enable + test.each([ ['1.0.0', '1.0.4', true], ['1.0.0', '0.0.5', false], diff --git a/packages/lib/services/synchronizer/syncInfoUtils.ts b/packages/lib/services/synchronizer/syncInfoUtils.ts index 2042aaf02..c2d6dcfab 100644 --- a/packages/lib/services/synchronizer/syncInfoUtils.ts +++ b/packages/lib/services/synchronizer/syncInfoUtils.ts @@ -240,6 +240,26 @@ export class SyncInfo { }; } + public filterSyncInfo() { + const filtered = JSON.parse(JSON.stringify(this.toObject())); + + // Filter content and checksum properties from master keys + if (filtered.masterKeys) { + filtered.masterKeys = filtered.masterKeys.map((mk: MasterKeyEntity) => { + delete mk.content; + delete mk.checksum; + return mk; + }); + } + + // Truncate the private key and public key + if (filtered.ppk.value) { + filtered.ppk.value.privateKey.ciphertext = `${filtered.ppk.value.privateKey.ciphertext.substr(0, 20)}...${filtered.ppk.value.privateKey.ciphertext.substr(-20)}`; + filtered.ppk.value.publicKey = `${filtered.ppk.value.publicKey.substr(0, 40)}...`; + } + return filtered; + } + public serialize(): string { return JSON.stringify(this.toObject(), null, '\t'); }