mirror of
https://code.briarproject.org/briar/briar.git
synced 2026-02-19 14:19:53 +01:00
Improve UI for account recovery
This commit is contained in:
@@ -5,6 +5,7 @@ import android.os.Bundle;
|
|||||||
import android.view.MenuItem;
|
import android.view.MenuItem;
|
||||||
import android.widget.Toast;
|
import android.widget.Toast;
|
||||||
|
|
||||||
|
import org.briarproject.bramble.api.FormatException;
|
||||||
import org.briarproject.bramble.api.nullsafety.MethodsNotNullByDefault;
|
import org.briarproject.bramble.api.nullsafety.MethodsNotNullByDefault;
|
||||||
import org.briarproject.bramble.api.nullsafety.ParametersNotNullByDefault;
|
import org.briarproject.bramble.api.nullsafety.ParametersNotNullByDefault;
|
||||||
import org.briarproject.briar.R;
|
import org.briarproject.briar.R;
|
||||||
@@ -14,6 +15,7 @@ import org.briarproject.briar.android.fragment.BaseFragment;
|
|||||||
import org.briarproject.briar.api.socialbackup.ReturnShardPayload;
|
import org.briarproject.briar.api.socialbackup.ReturnShardPayload;
|
||||||
import org.briarproject.briar.api.socialbackup.recovery.SecretOwnerTask;
|
import org.briarproject.briar.api.socialbackup.recovery.SecretOwnerTask;
|
||||||
|
|
||||||
|
import java.security.GeneralSecurityException;
|
||||||
import java.util.logging.Logger;
|
import java.util.logging.Logger;
|
||||||
|
|
||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
@@ -128,8 +130,25 @@ public class OwnerReturnShardActivity extends BaseActivity
|
|||||||
"Success - got shard" + (added ? "" : " duplicate"),
|
"Success - got shard" + (added ? "" : " duplicate"),
|
||||||
Toast.LENGTH_SHORT).show();
|
Toast.LENGTH_SHORT).show();
|
||||||
if (added && viewModel.canRecover()) {
|
if (added && viewModel.canRecover()) {
|
||||||
|
LOG.info("Secret key recovered");
|
||||||
|
int version = 0;
|
||||||
|
try {
|
||||||
|
version = viewModel.recover();
|
||||||
|
} catch (GeneralSecurityException e) {
|
||||||
|
LOG.warning("Unable to decrypt backup" + e.toString());
|
||||||
|
Toast.makeText(this,
|
||||||
|
"Unable to decrypt backup",
|
||||||
|
Toast.LENGTH_LONG).show();
|
||||||
|
return;
|
||||||
|
} catch (FormatException e) {
|
||||||
|
LOG.warning("Unable to parse backup" + e.getMessage() + e.getStackTrace().toString());
|
||||||
|
Toast.makeText(this,
|
||||||
|
"Unable to parse backup",
|
||||||
|
Toast.LENGTH_LONG).show();
|
||||||
|
return;
|
||||||
|
}
|
||||||
Toast.makeText(this,
|
Toast.makeText(this,
|
||||||
"Secret key recovered!",
|
"Account recovered! " + version,
|
||||||
Toast.LENGTH_LONG).show();
|
Toast.LENGTH_LONG).show();
|
||||||
finish();
|
finish();
|
||||||
return;
|
return;
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import android.net.wifi.WifiInfo;
|
|||||||
import android.net.wifi.WifiManager;
|
import android.net.wifi.WifiManager;
|
||||||
import android.util.DisplayMetrics;
|
import android.util.DisplayMetrics;
|
||||||
|
|
||||||
|
import org.briarproject.bramble.api.FormatException;
|
||||||
import org.briarproject.bramble.api.crypto.SecretKey;
|
import org.briarproject.bramble.api.crypto.SecretKey;
|
||||||
import org.briarproject.bramble.api.lifecycle.IoExecutor;
|
import org.briarproject.bramble.api.lifecycle.IoExecutor;
|
||||||
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
|
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
|
||||||
@@ -13,10 +14,13 @@ 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.BackupPayload;
|
||||||
import org.briarproject.briar.api.socialbackup.DarkCrystal;
|
import org.briarproject.briar.api.socialbackup.DarkCrystal;
|
||||||
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.recovery.SecretOwnerTask;
|
import org.briarproject.briar.api.socialbackup.recovery.SecretOwnerTask;
|
||||||
|
import org.briarproject.briar.socialbackup.BackupPayloadDecoder;
|
||||||
|
import org.briarproject.briar.socialbackup.SocialBackup;
|
||||||
|
|
||||||
import java.net.InetAddress;
|
import java.net.InetAddress;
|
||||||
import java.net.UnknownHostException;
|
import java.net.UnknownHostException;
|
||||||
@@ -53,6 +57,7 @@ class OwnerReturnShardViewModel extends AndroidViewModel
|
|||||||
private final Executor ioExecutor;
|
private final Executor ioExecutor;
|
||||||
private final SecretOwnerTask task;
|
private final SecretOwnerTask task;
|
||||||
private final DarkCrystal darkCrystal;
|
private final DarkCrystal darkCrystal;
|
||||||
|
private final BackupPayloadDecoder backupPayloadDecoder;
|
||||||
|
|
||||||
private final MutableLiveEvent<Boolean> showQrCodeFragment =
|
private final MutableLiveEvent<Boolean> showQrCodeFragment =
|
||||||
new MutableLiveEvent<>();
|
new MutableLiveEvent<>();
|
||||||
@@ -65,16 +70,19 @@ class OwnerReturnShardViewModel extends AndroidViewModel
|
|||||||
private ArrayList<ReturnShardPayload> recoveredShards = new ArrayList<>();
|
private ArrayList<ReturnShardPayload> recoveredShards = new ArrayList<>();
|
||||||
private Bitmap qrCodeBitmap;
|
private Bitmap qrCodeBitmap;
|
||||||
private WifiManager wifiManager;
|
private WifiManager wifiManager;
|
||||||
|
private SecretKey secretKey;
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
OwnerReturnShardViewModel(Application app,
|
OwnerReturnShardViewModel(Application app,
|
||||||
AndroidExecutor androidExecutor,
|
AndroidExecutor androidExecutor,
|
||||||
SecretOwnerTask task,
|
SecretOwnerTask task,
|
||||||
DarkCrystal darkCrystal,
|
DarkCrystal darkCrystal,
|
||||||
|
BackupPayloadDecoder backupPayloadDecoder,
|
||||||
@IoExecutor Executor ioExecutor) {
|
@IoExecutor Executor ioExecutor) {
|
||||||
super(app);
|
super(app);
|
||||||
this.androidExecutor = androidExecutor;
|
this.androidExecutor = androidExecutor;
|
||||||
this.ioExecutor = ioExecutor;
|
this.ioExecutor = ioExecutor;
|
||||||
|
this.backupPayloadDecoder = backupPayloadDecoder;
|
||||||
this.darkCrystal = darkCrystal;
|
this.darkCrystal = darkCrystal;
|
||||||
this.task = task;
|
this.task = task;
|
||||||
wifiManager = (WifiManager) app.getSystemService(WIFI_SERVICE);
|
wifiManager = (WifiManager) app.getSystemService(WIFI_SERVICE);
|
||||||
@@ -236,15 +244,21 @@ class OwnerReturnShardViewModel extends AndroidViewModel
|
|||||||
// TODO check shards all have same secret id
|
// TODO check shards all have same secret id
|
||||||
shards.add(returnShardPayload.getShard());
|
shards.add(returnShardPayload.getShard());
|
||||||
}
|
}
|
||||||
SecretKey secretKey;
|
|
||||||
try {
|
try {
|
||||||
secretKey = darkCrystal.combineShards(shards);
|
secretKey = darkCrystal.combineShards(shards);
|
||||||
} catch (GeneralSecurityException e) {
|
} catch (GeneralSecurityException e) {
|
||||||
// TODO handle error message
|
// TODO handle error message
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
// TODO find backup with highest version number
|
|
||||||
// recoveredShards.get(0).getBackupPayload();
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int recover() throws FormatException, GeneralSecurityException {
|
||||||
|
if (secretKey == null) throw new GeneralSecurityException();
|
||||||
|
// TODO find backup with highest version number
|
||||||
|
BackupPayload backupPayload = recoveredShards.get(0).getBackupPayload();
|
||||||
|
SocialBackup decodedBackup = backupPayloadDecoder.decodeBackupPayload(secretKey, backupPayload);
|
||||||
|
int version = decodedBackup.getVersion();
|
||||||
|
return version;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user