From 07141b688ace4e01a0193e6923029ae3e6d5e10d Mon Sep 17 00:00:00 2001 From: ameba23 Date: Thu, 22 Apr 2021 17:42:33 +0200 Subject: [PATCH] Add a method to add recovered contacts to db --- .../socialbackup/recovery/RestoreAccount.java | 3 ++ .../recovery/RestoreAccountImpl.java | 35 ++++++++++++++++--- 2 files changed, 34 insertions(+), 4 deletions(-) diff --git a/briar-api/src/main/java/org/briarproject/briar/api/socialbackup/recovery/RestoreAccount.java b/briar-api/src/main/java/org/briarproject/briar/api/socialbackup/recovery/RestoreAccount.java index 32b5e5030..45e2e983f 100644 --- a/briar-api/src/main/java/org/briarproject/briar/api/socialbackup/recovery/RestoreAccount.java +++ b/briar-api/src/main/java/org/briarproject/briar/api/socialbackup/recovery/RestoreAccount.java @@ -1,6 +1,7 @@ package org.briarproject.briar.api.socialbackup.recovery; import org.briarproject.bramble.api.FormatException; +import org.briarproject.bramble.api.db.DbException; import org.briarproject.briar.api.socialbackup.ReturnShardPayload; import org.briarproject.briar.api.socialbackup.SocialBackup; @@ -17,4 +18,6 @@ public interface RestoreAccount { int recover() throws FormatException, GeneralSecurityException; SocialBackup getSocialBackup(); + + void addContactsToDb() throws InterruptedException, DbException; } diff --git a/briar-core/src/main/java/org/briarproject/briar/socialbackup/recovery/RestoreAccountImpl.java b/briar-core/src/main/java/org/briarproject/briar/socialbackup/recovery/RestoreAccountImpl.java index fb39f7f42..25f0d351f 100644 --- a/briar-core/src/main/java/org/briarproject/briar/socialbackup/recovery/RestoreAccountImpl.java +++ b/briar-core/src/main/java/org/briarproject/briar/socialbackup/recovery/RestoreAccountImpl.java @@ -1,14 +1,19 @@ package org.briarproject.briar.socialbackup.recovery; import org.briarproject.bramble.api.FormatException; +import org.briarproject.bramble.api.contact.Contact; import org.briarproject.bramble.api.crypto.SecretKey; +import org.briarproject.bramble.api.db.DatabaseComponent; +import org.briarproject.bramble.api.db.DbException; +import org.briarproject.bramble.api.lifecycle.LifecycleManager; import org.briarproject.briar.api.socialbackup.BackupPayload; +import org.briarproject.briar.api.socialbackup.ContactData; import org.briarproject.briar.api.socialbackup.DarkCrystal; import org.briarproject.briar.api.socialbackup.ReturnShardPayload; import org.briarproject.briar.api.socialbackup.Shard; +import org.briarproject.briar.api.socialbackup.SocialBackup; import org.briarproject.briar.api.socialbackup.recovery.RestoreAccount; import org.briarproject.briar.socialbackup.BackupPayloadDecoder; -import org.briarproject.briar.api.socialbackup.SocialBackup; import java.security.GeneralSecurityException; import java.util.ArrayList; @@ -18,17 +23,25 @@ import javax.inject.Inject; public class RestoreAccountImpl implements RestoreAccount { private ArrayList recoveredShards = new ArrayList<>(); private final DarkCrystal darkCrystal; + private final DatabaseComponent db; + private final LifecycleManager lifecycleManager; private SecretKey secretKey; private final BackupPayloadDecoder backupPayloadDecoder; private SocialBackup socialBackup; @Inject - RestoreAccountImpl(DarkCrystal darkCrystal, BackupPayloadDecoder backupPayloadDecoder) { + RestoreAccountImpl(DarkCrystal darkCrystal, + BackupPayloadDecoder backupPayloadDecoder, DatabaseComponent db, + LifecycleManager lifecycleManager) { this.darkCrystal = darkCrystal; this.backupPayloadDecoder = backupPayloadDecoder; + this.db = db; + this.lifecycleManager = lifecycleManager; } - public int getNumberOfShards() { return recoveredShards.size(); } + public int getNumberOfShards() { + return recoveredShards.size(); + } // TODO figure out how to actually use a hash set for these objects public boolean addReturnShardPayload(ReturnShardPayload toAdd) { @@ -64,7 +77,8 @@ public class RestoreAccountImpl implements RestoreAccount { int highestVersion = -1; for (ReturnShardPayload returnShardPayload : recoveredShards) { BackupPayload backupPayload = returnShardPayload.getBackupPayload(); - SocialBackup s = backupPayloadDecoder.decodeBackupPayload(secretKey, backupPayload); + SocialBackup s = backupPayloadDecoder + .decodeBackupPayload(secretKey, backupPayload); if (s.getVersion() > highestVersion) { socialBackup = s; highestVersion = s.getVersion(); @@ -76,4 +90,17 @@ public class RestoreAccountImpl implements RestoreAccount { public SocialBackup getSocialBackup() { return socialBackup; } + + public void addContactsToDb() throws InterruptedException, DbException { + if (socialBackup == null) throw new DbException(); + // TODO maybe waitForDatabase should be in another thread + lifecycleManager.waitForDatabase(); + db.transaction(false, txn -> { + for (ContactData contactData : socialBackup.getContacts()) { + Contact c = contactData.getContact(); + db.addContact(txn, c.getAuthor(), c.getLocalAuthorId(), + c.getHandshakePublicKey(), c.isVerified()); + } + }); + } }