diff --git a/briar-android/src/main/java/org/briarproject/briar/android/socialbackup/recover/OwnerReturnShardActivity.java b/briar-android/src/main/java/org/briarproject/briar/android/socialbackup/recover/OwnerReturnShardActivity.java
index a98660349..3ea98fcc4 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/socialbackup/recover/OwnerReturnShardActivity.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/socialbackup/recover/OwnerReturnShardActivity.java
@@ -13,6 +13,7 @@ import org.briarproject.briar.android.activity.ActivityComponent;
import org.briarproject.briar.android.activity.BaseActivity;
import org.briarproject.briar.android.fragment.BaseFragment;
import org.briarproject.briar.api.socialbackup.ReturnShardPayload;
+import org.briarproject.briar.api.socialbackup.recovery.RestoreAccount;
import org.briarproject.briar.api.socialbackup.recovery.SecretOwnerTask;
import java.security.GeneralSecurityException;
@@ -146,9 +147,16 @@ public class OwnerReturnShardActivity extends BaseActivity
if (state instanceof SecretOwnerTask.State.Success) {
ReturnShardPayload shardPayload =
((SecretOwnerTask.State.Success) state).getRemotePayload();
- boolean added = viewModel.addToShardSet(shardPayload);
+ RestoreAccount.AddReturnShardPayloadResult result = viewModel.addToShardSet(shardPayload);
+ if (result == RestoreAccount.AddReturnShardPayloadResult.MISMATCH) {
+ // TODO improve this
+ Toast.makeText(this,
+ "WARNING: Mismatched backup piece!",
+ Toast.LENGTH_LONG).show();
+ }
+ boolean added = (result != RestoreAccount.AddReturnShardPayloadResult.DUPLICATE) ? true : false;
Toast.makeText(this,
- "Success - got shard" + (added ? "" : " duplicate"),
+ "Success - got backup piece" + (added ? "" : " duplicate"),
Toast.LENGTH_SHORT).show();
if (added && viewModel.canRecover()) {
LOG.info("Secret key recovered");
@@ -173,19 +181,10 @@ public class OwnerReturnShardActivity extends BaseActivity
}
onBackPressed();
} else if (state instanceof SecretOwnerTask.State.Failure) {
-// Toast.makeText(this,
-// "Shard return failed!",
-// Toast.LENGTH_SHORT).show();
-// onBackPressed();
showNextFragment(new OwnerRecoveryModeErrorFragment());
}
}
-// private void showErrorFragment() {
-// // TODO change this for an appropriate error message fragment
-// showNextFragment(new AddNearbyContactErrorFragment());
-// }
-
@Override
@Deprecated
public void runOnDbThread(Runnable runnable) {
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/socialbackup/recover/OwnerReturnShardViewModel.java b/briar-android/src/main/java/org/briarproject/briar/android/socialbackup/recover/OwnerReturnShardViewModel.java
index b476cc488..f6ce8f27b 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/socialbackup/recover/OwnerReturnShardViewModel.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/socialbackup/recover/OwnerReturnShardViewModel.java
@@ -226,8 +226,7 @@ class OwnerReturnShardViewModel extends AndroidViewModel
}
}
- // TODO figure out how to actually use a hash set for these objects
- public boolean addToShardSet(ReturnShardPayload toAdd) {
+ public RestoreAccount.AddReturnShardPayloadResult addToShardSet(ReturnShardPayload toAdd) {
return restoreAccount.addReturnShardPayload(toAdd);
}
diff --git a/briar-android/src/main/res/layout/fragment_account_recovered.xml b/briar-android/src/main/res/layout/fragment_account_recovered.xml
index fcfa9cfa1..745750081 100644
--- a/briar-android/src/main/res/layout/fragment_account_recovered.xml
+++ b/briar-android/src/main/res/layout/fragment_account_recovered.xml
@@ -15,7 +15,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="32dp"
- android:text="@string/backup_done_dismiss"
+ android:text="@string/ok"
android:textSize="24sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
diff --git a/briar-android/src/main/res/layout/fragment_recovery_custodian_done.xml b/briar-android/src/main/res/layout/fragment_recovery_custodian_done.xml
index 25b9e72c6..8daec3c6b 100644
--- a/briar-android/src/main/res/layout/fragment_recovery_custodian_done.xml
+++ b/briar-android/src/main/res/layout/fragment_recovery_custodian_done.xml
@@ -15,7 +15,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="32dp"
- android:text="@string/backup_done_dismiss"
+ android:text="@string/ok"
android:textSize="24sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
diff --git a/briar-android/src/main/res/layout/fragment_shards_received.xml b/briar-android/src/main/res/layout/fragment_shards_received.xml
index cabb2a117..2772c5e5f 100644
--- a/briar-android/src/main/res/layout/fragment_shards_received.xml
+++ b/briar-android/src/main/res/layout/fragment_shards_received.xml
@@ -15,7 +15,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="32dp"
- android:text="@string/backup_done_dismiss"
+ android:text="@string/ok"
android:textSize="24sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
diff --git a/briar-android/src/main/res/layout/fragment_shards_sent.xml b/briar-android/src/main/res/layout/fragment_shards_sent.xml
index 462e3dfcb..06be9a80a 100644
--- a/briar-android/src/main/res/layout/fragment_shards_sent.xml
+++ b/briar-android/src/main/res/layout/fragment_shards_sent.xml
@@ -15,7 +15,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="32dp"
- android:text="@string/backup_done_dismiss"
+ android:text="@string/ok"
android:textSize="24sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
diff --git a/briar-android/src/main/res/values/strings.xml b/briar-android/src/main/res/values/strings.xml
index b100a5f2e..30f5feaee 100644
--- a/briar-android/src/main/res/values/strings.xml
+++ b/briar-android/src/main/res/values/strings.xml
@@ -669,7 +669,6 @@
%d of %d contacts needed to recover your account
Backup pieces sent to trusted contacts
- Got it
Backup created 1/6/2020
@@ -723,8 +722,8 @@
Restore Account
- %1$s has sent you a social backup shard.
- You have sent a social backup shard to %1$s.
+ %1$s has sent you a social backup piece.
+ You have sent a social backup piece to %1$s.
Create new account or recover existing account
Recover Account
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 db56ad81d..cd03442c9 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
@@ -9,10 +9,15 @@ import java.security.GeneralSecurityException;
public interface RestoreAccount {
+ enum AddReturnShardPayloadResult {
+ DUPLICATE,
+ MISMATCH,
+ OK
+ }
int getNumberOfShards();
- boolean addReturnShardPayload(ReturnShardPayload toAdd);
+ AddReturnShardPayloadResult addReturnShardPayload(ReturnShardPayload toAdd);
boolean canRecover();
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 5b05e5d1e..204622420 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
@@ -20,6 +20,7 @@ import org.briarproject.briar.socialbackup.BackupPayloadDecoder;
import java.security.GeneralSecurityException;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.concurrent.Executor;
import java.util.logging.Logger;
@@ -37,6 +38,7 @@ public class RestoreAccountImpl implements RestoreAccount {
private SecretKey secretKey;
private final BackupPayloadDecoder backupPayloadDecoder;
private SocialBackup socialBackup;
+ private byte[] secretId;
private static final Logger LOG =
getLogger(RestoreAccountImpl.class.getName());
@@ -59,24 +61,30 @@ public class RestoreAccountImpl implements RestoreAccount {
return recoveredShards.size();
}
- // TODO figure out how to actually use a hash set for these objects
- public boolean addReturnShardPayload(ReturnShardPayload toAdd) {
- boolean found = false;
+ public AddReturnShardPayloadResult addReturnShardPayload(ReturnShardPayload toAdd) {
+ AddReturnShardPayloadResult result = AddReturnShardPayloadResult.OK;
+ // TODO figure out how to actually use a hash set for these objects
for (ReturnShardPayload returnShardPayload : recoveredShards) {
if (toAdd.equals(returnShardPayload)) {
- found = true;
- break;
+ return AddReturnShardPayloadResult.DUPLICATE;
}
}
- if (!found) recoveredShards.add(toAdd);
- return !found;
+
+ if (secretId == null) secretId = toAdd.getShard().getSecretId();
+ if (!Arrays.equals(secretId, toAdd.getShard().getSecretId())) {
+ return AddReturnShardPayloadResult.MISMATCH;
+ }
+ recoveredShards.add(toAdd);
+ return AddReturnShardPayloadResult.OK;
}
public boolean canRecover() {
ArrayList shards = new ArrayList<>();
for (ReturnShardPayload returnShardPayload : recoveredShards) {
// TODO check shards all have same secret id
- shards.add(returnShardPayload.getShard());
+ Shard shard = returnShardPayload.getShard();
+// shard.getSecretId();
+ shards.add(shard);
}
try {
secretKey = darkCrystal.combineShards(shards);