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);