Save recovered shards in sharedPreferences

This commit is contained in:
ameba23
2021-06-25 08:44:37 +02:00
parent 4cf9ca9c3e
commit 3d807d9950
3 changed files with 60 additions and 6 deletions

View File

@@ -1,6 +1,8 @@
package org.briarproject.briar.android.socialbackup.recover; package org.briarproject.briar.android.socialbackup.recover;
import android.app.Application; import android.app.Application;
import android.content.Context;
import android.content.SharedPreferences;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import android.net.wifi.WifiInfo; import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager; import android.net.wifi.WifiManager;
@@ -14,6 +16,7 @@ import org.briarproject.bramble.api.system.AndroidExecutor;
import org.briarproject.briar.android.contact.add.nearby.QrCodeUtils; import org.briarproject.briar.android.contact.add.nearby.QrCodeUtils;
import org.briarproject.briar.android.viewmodel.LiveEvent; import org.briarproject.briar.android.viewmodel.LiveEvent;
import org.briarproject.briar.android.viewmodel.MutableLiveEvent; import org.briarproject.briar.android.viewmodel.MutableLiveEvent;
import org.briarproject.briar.api.socialbackup.MessageEncoder;
import org.briarproject.briar.api.socialbackup.ReturnShardPayload; import org.briarproject.briar.api.socialbackup.ReturnShardPayload;
import org.briarproject.briar.api.socialbackup.recovery.RestoreAccount; import org.briarproject.briar.api.socialbackup.recovery.RestoreAccount;
import org.briarproject.briar.api.socialbackup.recovery.SecretOwnerTask; import org.briarproject.briar.api.socialbackup.recovery.SecretOwnerTask;
@@ -22,6 +25,7 @@ import java.net.InetAddress;
import java.net.UnknownHostException; import java.net.UnknownHostException;
import java.nio.charset.Charset; import java.nio.charset.Charset;
import java.security.GeneralSecurityException; import java.security.GeneralSecurityException;
import java.util.HashSet;
import java.util.concurrent.Executor; import java.util.concurrent.Executor;
import java.util.logging.Logger; import java.util.logging.Logger;
@@ -50,6 +54,7 @@ class OwnerReturnShardViewModel extends AndroidViewModel
private final Executor ioExecutor; private final Executor ioExecutor;
private final SecretOwnerTask task; private final SecretOwnerTask task;
private final RestoreAccount restoreAccount; private final RestoreAccount restoreAccount;
private final SharedPreferences prefs;
private final MutableLiveEvent<Boolean> errorTryAgain = private final MutableLiveEvent<Boolean> errorTryAgain =
new MutableLiveEvent<>(); new MutableLiveEvent<>();
@@ -65,18 +70,25 @@ class OwnerReturnShardViewModel extends AndroidViewModel
private Bitmap qrCodeBitmap; private Bitmap qrCodeBitmap;
private WifiManager wifiManager; private WifiManager wifiManager;
private SecretKey secretKey; private SecretKey secretKey;
private final MessageEncoder messageEncoder;
@Inject @Inject
OwnerReturnShardViewModel(Application app, OwnerReturnShardViewModel(Application app,
AndroidExecutor androidExecutor, AndroidExecutor androidExecutor,
SecretOwnerTask task, SecretOwnerTask task,
RestoreAccount restoreAccount, RestoreAccount restoreAccount,
@IoExecutor Executor ioExecutor) { @IoExecutor Executor ioExecutor,
MessageEncoder messageEncoder) {
super(app); super(app);
this.androidExecutor = androidExecutor; this.androidExecutor = androidExecutor;
this.ioExecutor = ioExecutor; this.ioExecutor = ioExecutor;
this.restoreAccount = restoreAccount; this.restoreAccount = restoreAccount;
this.messageEncoder = messageEncoder;
this.task = task; this.task = task;
this.prefs = app.getSharedPreferences("account-recovery",
Context.MODE_PRIVATE);
restoreAccount.restoreFromPrevious(prefs.getStringSet("Recover", new HashSet<>()));
wifiManager = (WifiManager) app.getSystemService(WIFI_SERVICE); wifiManager = (WifiManager) app.getSystemService(WIFI_SERVICE);
// IntentFilter filter = new IntentFilter(ACTION_SCAN_MODE_CHANGED); // IntentFilter filter = new IntentFilter(ACTION_SCAN_MODE_CHANGED);
@@ -227,7 +239,11 @@ class OwnerReturnShardViewModel extends AndroidViewModel
} }
public RestoreAccount.AddReturnShardPayloadResult addToShardSet(ReturnShardPayload toAdd) { public RestoreAccount.AddReturnShardPayloadResult addToShardSet(ReturnShardPayload toAdd) {
return restoreAccount.addReturnShardPayload(toAdd); RestoreAccount.AddReturnShardPayloadResult result = restoreAccount.addReturnShardPayload(toAdd);
if (result == RestoreAccount.AddReturnShardPayloadResult.OK) {
prefs.edit().putStringSet("recovered", restoreAccount.getEncodedShards()).apply();
}
return result;
} }
public boolean canRecover() { public boolean canRecover() {

View File

@@ -6,17 +6,21 @@ import org.briarproject.briar.api.socialbackup.ReturnShardPayload;
import org.briarproject.briar.api.socialbackup.SocialBackup; import org.briarproject.briar.api.socialbackup.SocialBackup;
import java.security.GeneralSecurityException; import java.security.GeneralSecurityException;
import java.util.Set;
public interface RestoreAccount { public interface RestoreAccount {
enum AddReturnShardPayloadResult { enum AddReturnShardPayloadResult {
DUPLICATE, DUPLICATE,
MISMATCH, MISMATCH,
OK OK,
RECOVERED
} }
int getNumberOfShards(); int getNumberOfShards();
Set<String> getEncodedShards();
AddReturnShardPayloadResult addReturnShardPayload(ReturnShardPayload toAdd); AddReturnShardPayloadResult addReturnShardPayload(ReturnShardPayload toAdd);
boolean canRecover(); boolean canRecover();
@@ -26,4 +30,6 @@ public interface RestoreAccount {
SocialBackup getSocialBackup(); SocialBackup getSocialBackup();
void addContactsToDb() throws DbException; void addContactsToDb() throws DbException;
void restoreFromPrevious(Set<String> previousShards);
} }

View File

@@ -1,6 +1,7 @@
package org.briarproject.briar.socialbackup.recovery; package org.briarproject.briar.socialbackup.recovery;
import org.briarproject.bramble.api.FormatException; import org.briarproject.bramble.api.FormatException;
import org.briarproject.bramble.api.client.ClientHelper;
import org.briarproject.bramble.api.contact.Contact; import org.briarproject.bramble.api.contact.Contact;
import org.briarproject.bramble.api.contact.ContactId; import org.briarproject.bramble.api.contact.ContactId;
import org.briarproject.bramble.api.contact.ContactManager; import org.briarproject.bramble.api.contact.ContactManager;
@@ -14,6 +15,8 @@ import org.briarproject.bramble.api.properties.TransportPropertyManager;
import org.briarproject.briar.api.socialbackup.BackupPayload; import org.briarproject.briar.api.socialbackup.BackupPayload;
import org.briarproject.briar.api.socialbackup.ContactData; import org.briarproject.briar.api.socialbackup.ContactData;
import org.briarproject.briar.api.socialbackup.DarkCrystal; import org.briarproject.briar.api.socialbackup.DarkCrystal;
import org.briarproject.briar.api.socialbackup.MessageEncoder;
import org.briarproject.briar.api.socialbackup.MessageParser;
import org.briarproject.briar.api.socialbackup.ReturnShardPayload; import org.briarproject.briar.api.socialbackup.ReturnShardPayload;
import org.briarproject.briar.api.socialbackup.Shard; import org.briarproject.briar.api.socialbackup.Shard;
import org.briarproject.briar.api.socialbackup.SocialBackup; import org.briarproject.briar.api.socialbackup.SocialBackup;
@@ -23,6 +26,8 @@ import org.briarproject.briar.socialbackup.BackupPayloadDecoder;
import java.security.GeneralSecurityException; import java.security.GeneralSecurityException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
import java.util.concurrent.Executor; import java.util.concurrent.Executor;
import java.util.logging.Logger; import java.util.logging.Logger;
@@ -31,15 +36,18 @@ import javax.inject.Inject;
import static java.util.logging.Logger.getLogger; import static java.util.logging.Logger.getLogger;
public class RestoreAccountImpl implements RestoreAccount { public class RestoreAccountImpl implements RestoreAccount {
private final ArrayList<ReturnShardPayload> recoveredShards = new ArrayList<>(); private final Set<ReturnShardPayload> recoveredShards = new HashSet<>();
private final DarkCrystal darkCrystal; private final DarkCrystal darkCrystal;
private final Executor ioExecutor; private final Executor ioExecutor;
private final DatabaseComponent db; private final DatabaseComponent db;
private final ContactManager contactManager; private final ContactManager contactManager;
private final MessageEncoder messageEncoder;
private final MessageParser messageParser;
private final TransportPropertyManager transportPropertyManager; private final TransportPropertyManager transportPropertyManager;
private final LifecycleManager lifecycleManager; private final LifecycleManager lifecycleManager;
private SecretKey secretKey; private SecretKey secretKey;
private final BackupPayloadDecoder backupPayloadDecoder; private final BackupPayloadDecoder backupPayloadDecoder;
private final ClientHelper clientHelper;
private SocialBackup socialBackup; private SocialBackup socialBackup;
private byte[] secretId; private byte[] secretId;
@@ -52,7 +60,10 @@ public class RestoreAccountImpl implements RestoreAccount {
@IoExecutor Executor ioExecutor, @IoExecutor Executor ioExecutor,
ContactManager contactManager, ContactManager contactManager,
LifecycleManager lifecycleManager, LifecycleManager lifecycleManager,
TransportPropertyManager transportPropertyManager) { TransportPropertyManager transportPropertyManager,
MessageEncoder messageEncoder,
MessageParser messageParser,
ClientHelper clientHelper) {
this.darkCrystal = darkCrystal; this.darkCrystal = darkCrystal;
this.backupPayloadDecoder = backupPayloadDecoder; this.backupPayloadDecoder = backupPayloadDecoder;
this.db = db; this.db = db;
@@ -60,6 +71,9 @@ public class RestoreAccountImpl implements RestoreAccount {
this.lifecycleManager = lifecycleManager; this.lifecycleManager = lifecycleManager;
this.contactManager = contactManager; this.contactManager = contactManager;
this.transportPropertyManager = transportPropertyManager; this.transportPropertyManager = transportPropertyManager;
this.messageEncoder = messageEncoder;
this.messageParser = messageParser;
this.clientHelper = clientHelper;
} }
public int getNumberOfShards() { public int getNumberOfShards() {
@@ -80,7 +94,7 @@ public class RestoreAccountImpl implements RestoreAccount {
return AddReturnShardPayloadResult.MISMATCH; return AddReturnShardPayloadResult.MISMATCH;
} }
recoveredShards.add(toAdd); recoveredShards.add(toAdd);
return AddReturnShardPayloadResult.OK; return canRecover() ? AddReturnShardPayloadResult.RECOVERED : AddReturnShardPayloadResult.OK;
} }
public boolean canRecover() { public boolean canRecover() {
@@ -148,4 +162,22 @@ public class RestoreAccountImpl implements RestoreAccount {
LOG.info("Added all contacts"); LOG.info("Added all contacts");
}); });
} }
public Set<String> getEncodedShards() {
Set<String> s = new HashSet();
for (ReturnShardPayload r : recoveredShards) {
s.add(new String(messageEncoder.encodeReturnShardPayload(r)));
}
return s;
}
public void restoreFromPrevious(Set<String> previousShards) {
for (String s : previousShards) {
try {
addReturnShardPayload(messageParser.parseReturnShardPayload(clientHelper.toList(s.getBytes())));
} catch (FormatException e) {
e.printStackTrace();
}
}
}
} }