You've already forked joplin
mirror of
https://github.com/laurent22/joplin.git
synced 2025-11-26 22:41:17 +02:00
@@ -451,7 +451,7 @@ export default class Synchronizer {
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
let remoteInfo = await fetchSyncInfo(this.api());
|
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);
|
eventManager.emit(EventName.SessionEstablished);
|
||||||
|
|
||||||
let syncTargetIsNew = false;
|
let syncTargetIsNew = false;
|
||||||
@@ -471,8 +471,7 @@ export default class Synchronizer {
|
|||||||
if (appVersion !== 'unknown') checkIfCanSync(remoteInfo, appVersion);
|
if (appVersion !== 'unknown') checkIfCanSync(remoteInfo, appVersion);
|
||||||
|
|
||||||
let localInfo = await localSyncInfo();
|
let localInfo = await localSyncInfo();
|
||||||
|
logger.info('Sync target local info:', localInfo.filterSyncInfo());
|
||||||
logger.info('Sync target local info:', localInfo);
|
|
||||||
|
|
||||||
localInfo = await this.setPpkIfNotExist(localInfo, remoteInfo);
|
localInfo = await this.setPpkIfNotExist(localInfo, remoteInfo);
|
||||||
|
|
||||||
|
|||||||
@@ -200,6 +200,89 @@ describe('syncInfoUtils', () => {
|
|||||||
logger.enabled = true;
|
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([
|
test.each([
|
||||||
['1.0.0', '1.0.4', true],
|
['1.0.0', '1.0.4', true],
|
||||||
['1.0.0', '0.0.5', false],
|
['1.0.0', '0.0.5', false],
|
||||||
|
|||||||
@@ -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 {
|
public serialize(): string {
|
||||||
return JSON.stringify(this.toObject(), null, '\t');
|
return JSON.stringify(this.toObject(), null, '\t');
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user