From a252078d6590b3a8c17539dc815738bc0566811a Mon Sep 17 00:00:00 2001 From: Tom Hacohen Date: Thu, 24 Oct 2019 10:28:08 +0300 Subject: [PATCH] Use the new getCryptoManager when editing journals/userInfos. This also fixes an issue when editing and deleting journals after an encryption password change. --- src/Journals/JournalMembers.tsx | 11 ++--------- src/Journals/JournalsList.tsx | 18 +++--------------- src/Journals/index.tsx | 20 ++++++++++++++++---- src/SyncGate.tsx | 20 +++++--------------- src/etesync-helpers.ts | 11 ++--------- src/store/construct.ts | 2 +- 6 files changed, 29 insertions(+), 53 deletions(-) diff --git a/src/Journals/JournalMembers.tsx b/src/Journals/JournalMembers.tsx index ef7054c..62f3a0b 100644 --- a/src/Journals/JournalMembers.tsx +++ b/src/Journals/JournalMembers.tsx @@ -155,15 +155,8 @@ class JournalMembers extends React.PureComponent { const journal = syncJournal.journal; const derived = this.props.etesync.encryptionKey; - const keyPair = userInfo.getKeyPair(new EteSync.CryptoManager(derived, 'userInfo', userInfo.version)); - let cryptoManager: EteSync.CryptoManager; - if (journal.key) { - const asymmetricCryptoManager = new EteSync.AsymmetricCryptoManager(keyPair); - const derivedJournalKey = asymmetricCryptoManager.decryptBytes(journal.key); - cryptoManager = EteSync.CryptoManager.fromDerivedKey(derivedJournalKey, journal.version); - } else { - cryptoManager = new EteSync.CryptoManager(derived, journal.uid, journal.version); - } + const keyPair = userInfo.getKeyPair(userInfo.getCryptoManager(derived)); + const cryptoManager = journal.getCryptoManager(derived, keyPair); const pubkeyBytes = sjcl.codec.bytes.fromBits(sjcl.codec.base64.toBits(publicKey)); const encryptedKey = sjcl.codec.base64.fromBits(sjcl.codec.bytes.toBits(cryptoManager.getEncryptedKey(keyPair, pubkeyBytes))); diff --git a/src/Journals/JournalsList.tsx b/src/Journals/JournalsList.tsx index 7bd103c..4bfeb8c 100644 --- a/src/Journals/JournalsList.tsx +++ b/src/Journals/JournalsList.tsx @@ -11,8 +11,6 @@ import { List, ListItem } from '../widgets/List'; import AppBarOverride from '../widgets/AppBarOverride'; import Container from '../widgets/Container'; -import * as EteSync from '../api/EteSync'; - import { routeResolver } from '../App'; import { JournalsData, UserInfoData, CredentialsData } from '../store'; @@ -32,21 +30,11 @@ class JournalsList extends React.PureComponent { public render() { const derived = this.props.etesync.encryptionKey; - let asymmetricCryptoManager: EteSync.AsymmetricCryptoManager; const journalMap = this.props.journals.reduce( (ret, journal) => { - let cryptoManager: EteSync.CryptoManager; - if (journal.key) { - if (!asymmetricCryptoManager) { - const userInfo = this.props.userInfo; - const keyPair = userInfo.getKeyPair(new EteSync.CryptoManager(derived, 'userInfo', userInfo.version)); - asymmetricCryptoManager = new EteSync.AsymmetricCryptoManager(keyPair); - } - const derivedJournalKey = asymmetricCryptoManager.decryptBytes(journal.key); - cryptoManager = EteSync.CryptoManager.fromDerivedKey(derivedJournalKey, journal.version); - } else { - cryptoManager = new EteSync.CryptoManager(derived, journal.uid, journal.version); - } + const userInfo = this.props.userInfo; + const keyPair = userInfo.getKeyPair(userInfo.getCryptoManager(derived)); + const cryptoManager = journal.getCryptoManager(derived, keyPair); const info = journal.getInfo(cryptoManager); ret[info.type] = ret[info.type] || []; ret[info.type].push( diff --git a/src/Journals/index.tsx b/src/Journals/index.tsx index 9fe7f83..efe79ce 100644 --- a/src/Journals/index.tsx +++ b/src/Journals/index.tsx @@ -118,8 +118,14 @@ class Journals extends React.PureComponent { } public onItemSave(info: EteSync.CollectionInfo, originalInfo?: EteSync.CollectionInfo) { - const journal = new EteSync.Journal(); - const cryptoManager = new EteSync.CryptoManager(this.props.etesync.encryptionKey, info.uid); + const syncJournal = this.props.syncInfo.get(info.uid); + + const derived = this.props.etesync.encryptionKey; + const userInfo = this.props.userInfo; + const existingJournal = (syncJournal) ? syncJournal.journal.serialize() : { uid: info.uid }; + const journal = new EteSync.Journal(existingJournal); + const keyPair = userInfo.getKeyPair(userInfo.getCryptoManager(derived)); + const cryptoManager = journal.getCryptoManager(derived, keyPair); journal.setInfo(cryptoManager, info); if (originalInfo) { @@ -134,8 +140,14 @@ class Journals extends React.PureComponent { } public onItemDelete(info: EteSync.CollectionInfo) { - const journal = new EteSync.Journal(); - const cryptoManager = new EteSync.CryptoManager(this.props.etesync.encryptionKey, info.uid); + const syncJournal = this.props.syncInfo.get(info.uid); + + const derived = this.props.etesync.encryptionKey; + const userInfo = this.props.userInfo; + const existingJournal = (syncJournal) ? syncJournal.journal.serialize() : { uid: info.uid }; + const journal = new EteSync.Journal(existingJournal); + const keyPair = userInfo.getKeyPair(userInfo.getCryptoManager(derived)); + const cryptoManager = journal.getCryptoManager(derived, keyPair); journal.setInfo(cryptoManager, info); store.dispatch(deleteJournal(this.props.etesync, journal)).then(() => diff --git a/src/SyncGate.tsx b/src/SyncGate.tsx index 0ac90cc..e8be9c2 100644 --- a/src/SyncGate.tsx +++ b/src/SyncGate.tsx @@ -53,9 +53,8 @@ const syncInfoSelector = createSelector( (props: PropsTypeInner) => props.userInfo.value!, (etesync, journals, entries, userInfo) => { const derived = etesync.encryptionKey; - let asymmetricCryptoManager: EteSync.AsymmetricCryptoManager; + const userInfoCryptoManager = userInfo.getCryptoManager(etesync.encryptionKey); try { - const userInfoCryptoManager = new EteSync.CryptoManager(etesync.encryptionKey, 'userInfo'); userInfo.verify(userInfoCryptoManager); } catch (error) { if (error instanceof EteSync.IntegrityError) { @@ -74,17 +73,8 @@ const syncInfoSelector = createSelector( return ret; } - let cryptoManager: EteSync.CryptoManager; - if (journal.key) { - if (!asymmetricCryptoManager) { - const keyPair = userInfo.getKeyPair(new EteSync.CryptoManager(derived, 'userInfo', userInfo.version)); - asymmetricCryptoManager = new EteSync.AsymmetricCryptoManager(keyPair); - } - const derivedJournalKey = asymmetricCryptoManager.decryptBytes(journal.key); - cryptoManager = EteSync.CryptoManager.fromDerivedKey(derivedJournalKey, journal.version); - } else { - cryptoManager = new EteSync.CryptoManager(derived, journal.uid, journal.version); - } + const keyPair = userInfo.getKeyPair(userInfoCryptoManager); + const cryptoManager = journal.getCryptoManager(derived, keyPair); const collectionInfo = journal.getInfo(cryptoManager); @@ -124,7 +114,7 @@ class SyncGate extends React.PureComponent { collection.type = collectionType; collection.displayName = 'Default'; - const journal = new EteSync.Journal(); + const journal = new EteSync.Journal({ uid: collection.uid }); const cryptoManager = new EteSync.CryptoManager(this.props.etesync.encryptionKey, collection.uid); journal.setInfo(cryptoManager, collection); store.dispatch(addJournal(this.props.etesync, journal)).then( @@ -144,7 +134,7 @@ class SyncGate extends React.PureComponent { } else { const userInfo = new EteSync.UserInfo(me, CURRENT_VERSION); const keyPair = EteSync.AsymmetricCryptoManager.generateKeyPair(); - const cryptoManager = new EteSync.CryptoManager(this.props.etesync.encryptionKey, 'userInfo'); + const cryptoManager = userInfo.getCryptoManager(this.props.etesync.encryptionKey); userInfo.setKeyPair(cryptoManager, keyPair); diff --git a/src/etesync-helpers.ts b/src/etesync-helpers.ts index d877b68..8694bbf 100644 --- a/src/etesync-helpers.ts +++ b/src/etesync-helpers.ts @@ -27,15 +27,8 @@ export function createJournalEntryFromSyncEntry( const derived = etesync.encryptionKey; - let cryptoManager: EteSync.CryptoManager; - if (journal.key) { - const keyPair = userInfo.getKeyPair(new EteSync.CryptoManager(derived, 'userInfo', userInfo.version)); - const asymmetricCryptoManager = new EteSync.AsymmetricCryptoManager(keyPair); - const derivedJournalKey = asymmetricCryptoManager.decryptBytes(journal.key); - cryptoManager = EteSync.CryptoManager.fromDerivedKey(derivedJournalKey, journal.version); - } else { - cryptoManager = new EteSync.CryptoManager(derived, journal.uid, journal.version); - } + const keyPair = userInfo.getKeyPair(userInfo.getCryptoManager(derived)); + const cryptoManager = journal.getCryptoManager(derived, keyPair); const entry = new EteSync.Entry(); entry.setSyncEntry(cryptoManager, syncEntry, prevUid); diff --git a/src/store/construct.ts b/src/store/construct.ts index 56cc5c4..3d2d919 100644 --- a/src/store/construct.ts +++ b/src/store/construct.ts @@ -56,7 +56,7 @@ const journalsDeserialize = (state: {}) => { const newState = new Map(); Object.keys(state).forEach((uid) => { const x = state[uid]; - const ret = new EteSync.Journal(uid, x.version); + const ret = new EteSync.Journal({ uid }, x.version); ret.deserialize(x); newState.set(uid, ret); });