Move conversations to SQLCipher
This commit is contained in:
		
					parent
					
						
							
								8cd3db0262
							
						
					
				
			
			
				commit
				
					
						cd60bdd08a
					
				
			
		
					 31 changed files with 1354 additions and 774 deletions
				
			
		|  | @ -224,7 +224,49 @@ function eliminateClientConfigInBackup(data, targetPath) { | |||
|   } | ||||
| } | ||||
| 
 | ||||
| function importFromJsonString(db, jsonString, targetPath, options) { | ||||
| async function importConversationsFromJSON(conversations, options) { | ||||
|   const { writeNewAttachmentData } = window.Signal.Migrations; | ||||
|   const { conversationLookup } = options; | ||||
| 
 | ||||
|   let count = 0; | ||||
|   let skipCount = 0; | ||||
| 
 | ||||
|   for (let i = 0, max = conversations.length; i < max; i += 1) { | ||||
|     const toAdd = unstringify(conversations[i]); | ||||
|     const haveConversationAlready = | ||||
|       conversationLookup[getConversationKey(toAdd)]; | ||||
| 
 | ||||
|     if (haveConversationAlready) { | ||||
|       skipCount += 1; | ||||
|       count += 1; | ||||
|       // eslint-disable-next-line no-continue
 | ||||
|       continue; | ||||
|     } | ||||
| 
 | ||||
|     count += 1; | ||||
|     // eslint-disable-next-line no-await-in-loop
 | ||||
|     const migrated = await window.Signal.Types.Conversation.migrateConversation( | ||||
|       toAdd, | ||||
|       { | ||||
|         writeNewAttachmentData, | ||||
|       } | ||||
|     ); | ||||
|     // eslint-disable-next-line no-await-in-loop
 | ||||
|     await window.Signal.Data.saveConversation(migrated, { | ||||
|       Conversation: Whisper.Conversation, | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   window.log.info( | ||||
|     'Done importing conversations:', | ||||
|     'Total count:', | ||||
|     count, | ||||
|     'Skipped:', | ||||
|     skipCount | ||||
|   ); | ||||
| } | ||||
| 
 | ||||
| async function importFromJsonString(db, jsonString, targetPath, options) { | ||||
|   options = options || {}; | ||||
|   _.defaults(options, { | ||||
|     forceLightImport: false, | ||||
|  | @ -232,12 +274,12 @@ function importFromJsonString(db, jsonString, targetPath, options) { | |||
|     groupLookup: {}, | ||||
|   }); | ||||
| 
 | ||||
|   const { conversationLookup, groupLookup } = options; | ||||
|   const { groupLookup } = options; | ||||
|   const result = { | ||||
|     fullImport: true, | ||||
|   }; | ||||
| 
 | ||||
|   return new Promise((resolve, reject) => { | ||||
|   return new Promise(async (resolve, reject) => { | ||||
|     const importObject = JSON.parse(jsonString); | ||||
|     delete importObject.debug; | ||||
| 
 | ||||
|  | @ -273,7 +315,25 @@ function importFromJsonString(db, jsonString, targetPath, options) { | |||
|       finished = true; | ||||
|     }; | ||||
| 
 | ||||
|     const transaction = db.transaction(storeNames, 'readwrite'); | ||||
|     // Special-case conversations key here, going to SQLCipher
 | ||||
|     const { conversations } = importObject; | ||||
|     const remainingStoreNames = _.without( | ||||
|       storeNames, | ||||
|       'conversations', | ||||
|       'unprocessed' | ||||
|     ); | ||||
|     try { | ||||
|       await importConversationsFromJSON(conversations, options); | ||||
|     } catch (error) { | ||||
|       reject(error); | ||||
|     } | ||||
| 
 | ||||
|     // Because the 'are we done?' check below looks at the keys remaining in importObject
 | ||||
|     delete importObject.conversations; | ||||
|     delete importObject.unprocessed; | ||||
| 
 | ||||
|     // The rest go to IndexedDB
 | ||||
|     const transaction = db.transaction(remainingStoreNames, 'readwrite'); | ||||
|     transaction.onerror = () => { | ||||
|       Whisper.Database.handleDOMException( | ||||
|         'importFromJsonString transaction error', | ||||
|  | @ -283,7 +343,7 @@ function importFromJsonString(db, jsonString, targetPath, options) { | |||
|     }; | ||||
|     transaction.oncomplete = finish.bind(null, 'transaction complete'); | ||||
| 
 | ||||
|     _.each(storeNames, storeName => { | ||||
|     _.each(remainingStoreNames, storeName => { | ||||
|       window.log.info('Importing items for store', storeName); | ||||
| 
 | ||||
|       if (!importObject[storeName].length) { | ||||
|  | @ -315,13 +375,10 @@ function importFromJsonString(db, jsonString, targetPath, options) { | |||
|       _.each(importObject[storeName], toAdd => { | ||||
|         toAdd = unstringify(toAdd); | ||||
| 
 | ||||
|         const haveConversationAlready = | ||||
|           storeName === 'conversations' && | ||||
|           conversationLookup[getConversationKey(toAdd)]; | ||||
|         const haveGroupAlready = | ||||
|           storeName === 'groups' && groupLookup[getGroupKey(toAdd)]; | ||||
| 
 | ||||
|         if (haveConversationAlready || haveGroupAlready) { | ||||
|         if (haveGroupAlready) { | ||||
|           skipCount += 1; | ||||
|           count += 1; | ||||
|           return; | ||||
|  | @ -1137,20 +1194,17 @@ function getMessageKey(message) { | |||
|   const sourceDevice = message.sourceDevice || 1; | ||||
|   return `${source}.${sourceDevice} ${message.timestamp}`; | ||||
| } | ||||
| async function loadMessagesLookup(db) { | ||||
|   const array = await window.Signal.Data.getAllMessageIds({ | ||||
|     db, | ||||
|     getMessageKey, | ||||
|     handleDOMException: Whisper.Database.handleDOMException, | ||||
|   }); | ||||
|   return fromPairs(map(array, item => [item, true])); | ||||
| async function loadMessagesLookup() { | ||||
|   const array = await window.Signal.Data.getAllMessageIds(); | ||||
|   return fromPairs(map(array, item => [getMessageKey(item), true])); | ||||
| } | ||||
| 
 | ||||
| function getConversationKey(conversation) { | ||||
|   return conversation.id; | ||||
| } | ||||
| function loadConversationLookup(db) { | ||||
|   return assembleLookup(db, 'conversations', getConversationKey); | ||||
| async function loadConversationLookup() { | ||||
|   const array = await window.Signal.Data.getAllConversationIds(); | ||||
|   return fromPairs(map(array, item => [getConversationKey(item), true])); | ||||
| } | ||||
| 
 | ||||
| function getGroupKey(group) { | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Scott Nonnenberg
				Scott Nonnenberg