From 4cf9ca9c3e1e4949fb101527dec6415bac460033 Mon Sep 17 00:00:00 2001 From: ameba23 Date: Thu, 24 Jun 2021 09:34:39 +0200 Subject: [PATCH 01/31] Handle transport properties correctly in backup and recovery --- .../socialbackup/SocialBackupManagerImpl.java | 17 ++++++++++++----- .../recovery/RestoreAccountImpl.java | 11 +++++++++-- 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/briar-core/src/main/java/org/briarproject/briar/socialbackup/SocialBackupManagerImpl.java b/briar-core/src/main/java/org/briarproject/briar/socialbackup/SocialBackupManagerImpl.java index f0d26ee7f..e7ec723d5 100644 --- a/briar-core/src/main/java/org/briarproject/briar/socialbackup/SocialBackupManagerImpl.java +++ b/briar-core/src/main/java/org/briarproject/briar/socialbackup/SocialBackupManagerImpl.java @@ -25,8 +25,11 @@ import org.briarproject.bramble.api.identity.IdentityManager; import org.briarproject.bramble.api.identity.LocalAuthor; import org.briarproject.bramble.api.lifecycle.LifecycleManager.OpenDatabaseHook; import org.briarproject.bramble.api.nullsafety.NotNullByDefault; +import org.briarproject.bramble.api.plugin.BluetoothConstants; +import org.briarproject.bramble.api.plugin.LanTcpConstants; import org.briarproject.bramble.api.plugin.TorConstants; import org.briarproject.bramble.api.plugin.TransportId; +import org.briarproject.bramble.api.plugin.WanTcpConstants; import org.briarproject.bramble.api.properties.TransportProperties; import org.briarproject.bramble.api.properties.TransportPropertyManager; import org.briarproject.bramble.api.sync.Group; @@ -57,6 +60,7 @@ import org.briarproject.briar.client.ConversationClientImpl; import java.util.ArrayList; import java.util.Collection; +import java.util.HashMap; import java.util.List; import java.util.ListIterator; import java.util.Map; @@ -66,7 +70,6 @@ import java.util.Set; import javax.annotation.Nullable; import javax.inject.Inject; -import static java.util.Collections.singletonMap; import static org.briarproject.bramble.api.nullsafety.NullSafety.requireNonNull; import static org.briarproject.briar.client.MessageTrackerConstants.MSG_KEY_READ; import static org.briarproject.briar.socialbackup.MessageType.BACKUP; @@ -465,9 +468,13 @@ class SocialBackupManagerImpl extends ConversationClientImpl private Map getTransportProperties( Transaction txn, ContactId c) throws DbException { // TODO: Include filtered properties for other transports - TransportProperties p = transportPropertyManager - .getRemoteProperties(txn, c, TorConstants.ID); - return singletonMap(TorConstants.ID, p); + TransportId ids[] = { TorConstants.ID, LanTcpConstants.ID, BluetoothConstants.ID }; + Map props = new HashMap(); + for (TransportId id : ids) { + props.put(id, transportPropertyManager + .getRemoteProperties(txn, c, id)); + } + return props; } private void sendShardMessage(Transaction txn, Contact custodian, @@ -561,7 +568,7 @@ class SocialBackupManagerImpl extends ConversationClientImpl db.deleteMessageMetadata(txn, prevId); } sendBackupMessage(txn, custodian, newVersion, payload); - } catch (NoSuchContactException|NoSuchGroupException e){ + } catch (NoSuchContactException | NoSuchGroupException e) { // The custodian is no longer a contact - continue } } 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 204622420..e5b928bf2 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 @@ -2,6 +2,7 @@ package org.briarproject.briar.socialbackup.recovery; import org.briarproject.bramble.api.FormatException; import org.briarproject.bramble.api.contact.Contact; +import org.briarproject.bramble.api.contact.ContactId; import org.briarproject.bramble.api.contact.ContactManager; import org.briarproject.bramble.api.crypto.SecretKey; import org.briarproject.bramble.api.db.DatabaseComponent; @@ -9,6 +10,7 @@ import org.briarproject.bramble.api.db.DbException; import org.briarproject.bramble.api.identity.AuthorId; import org.briarproject.bramble.api.lifecycle.IoExecutor; import org.briarproject.bramble.api.lifecycle.LifecycleManager; +import org.briarproject.bramble.api.properties.TransportPropertyManager; import org.briarproject.briar.api.socialbackup.BackupPayload; import org.briarproject.briar.api.socialbackup.ContactData; import org.briarproject.briar.api.socialbackup.DarkCrystal; @@ -34,6 +36,7 @@ public class RestoreAccountImpl implements RestoreAccount { private final Executor ioExecutor; private final DatabaseComponent db; private final ContactManager contactManager; + private final TransportPropertyManager transportPropertyManager; private final LifecycleManager lifecycleManager; private SecretKey secretKey; private final BackupPayloadDecoder backupPayloadDecoder; @@ -48,13 +51,15 @@ public class RestoreAccountImpl implements RestoreAccount { BackupPayloadDecoder backupPayloadDecoder, DatabaseComponent db, @IoExecutor Executor ioExecutor, ContactManager contactManager, - LifecycleManager lifecycleManager) { + LifecycleManager lifecycleManager, + TransportPropertyManager transportPropertyManager) { this.darkCrystal = darkCrystal; this.backupPayloadDecoder = backupPayloadDecoder; this.db = db; this.ioExecutor = ioExecutor; this.lifecycleManager = lifecycleManager; this.contactManager = contactManager; + this.transportPropertyManager = transportPropertyManager; } public int getNumberOfShards() { @@ -130,8 +135,10 @@ public class RestoreAccountImpl implements RestoreAccount { for (ContactData contactData : socialBackup.getContacts()) { Contact c = contactData.getContact(); LOG.info("Adding contact " + c.getAuthor().getName() + " " + c.getAlias()); - contactManager.addContact(txn, c.getAuthor(), localAuthorId, + ContactId contactId = contactManager.addContact(txn, c.getAuthor(), localAuthorId, c.getHandshakePublicKey(), c.isVerified()); + transportPropertyManager.addRemoteProperties(txn, contactId, + contactData.getProperties()); } }); } catch (DbException e) { From 3d807d9950dece9f76f67aa398ca1254b3604a2b Mon Sep 17 00:00:00 2001 From: ameba23 Date: Fri, 25 Jun 2021 08:44:37 +0200 Subject: [PATCH 02/31] Save recovered shards in sharedPreferences --- .../recover/OwnerReturnShardViewModel.java | 20 +++++++++- .../socialbackup/recovery/RestoreAccount.java | 8 +++- .../recovery/RestoreAccountImpl.java | 38 +++++++++++++++++-- 3 files changed, 60 insertions(+), 6 deletions(-) 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 f6ce8f27b..33e64f43d 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 @@ -1,6 +1,8 @@ package org.briarproject.briar.android.socialbackup.recover; import android.app.Application; +import android.content.Context; +import android.content.SharedPreferences; import android.graphics.Bitmap; import android.net.wifi.WifiInfo; 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.viewmodel.LiveEvent; 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.recovery.RestoreAccount; import org.briarproject.briar.api.socialbackup.recovery.SecretOwnerTask; @@ -22,6 +25,7 @@ import java.net.InetAddress; import java.net.UnknownHostException; import java.nio.charset.Charset; import java.security.GeneralSecurityException; +import java.util.HashSet; import java.util.concurrent.Executor; import java.util.logging.Logger; @@ -50,6 +54,7 @@ class OwnerReturnShardViewModel extends AndroidViewModel private final Executor ioExecutor; private final SecretOwnerTask task; private final RestoreAccount restoreAccount; + private final SharedPreferences prefs; private final MutableLiveEvent errorTryAgain = new MutableLiveEvent<>(); @@ -65,18 +70,25 @@ class OwnerReturnShardViewModel extends AndroidViewModel private Bitmap qrCodeBitmap; private WifiManager wifiManager; private SecretKey secretKey; + private final MessageEncoder messageEncoder; @Inject OwnerReturnShardViewModel(Application app, AndroidExecutor androidExecutor, SecretOwnerTask task, RestoreAccount restoreAccount, - @IoExecutor Executor ioExecutor) { + @IoExecutor Executor ioExecutor, + MessageEncoder messageEncoder) { super(app); this.androidExecutor = androidExecutor; this.ioExecutor = ioExecutor; this.restoreAccount = restoreAccount; + this.messageEncoder = messageEncoder; 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); // IntentFilter filter = new IntentFilter(ACTION_SCAN_MODE_CHANGED); @@ -227,7 +239,11 @@ class OwnerReturnShardViewModel extends AndroidViewModel } 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() { 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 cd03442c9..571ae5eac 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 @@ -6,17 +6,21 @@ import org.briarproject.briar.api.socialbackup.ReturnShardPayload; import org.briarproject.briar.api.socialbackup.SocialBackup; import java.security.GeneralSecurityException; +import java.util.Set; public interface RestoreAccount { enum AddReturnShardPayloadResult { DUPLICATE, MISMATCH, - OK + OK, + RECOVERED } int getNumberOfShards(); + Set getEncodedShards(); + AddReturnShardPayloadResult addReturnShardPayload(ReturnShardPayload toAdd); boolean canRecover(); @@ -26,4 +30,6 @@ public interface RestoreAccount { SocialBackup getSocialBackup(); void addContactsToDb() throws DbException; + + void restoreFromPrevious(Set previousShards); } 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 e5b928bf2..c3a56adbd 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,6 +1,7 @@ package org.briarproject.briar.socialbackup.recovery; 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.ContactId; 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.ContactData; 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.Shard; import org.briarproject.briar.api.socialbackup.SocialBackup; @@ -23,6 +26,8 @@ import org.briarproject.briar.socialbackup.BackupPayloadDecoder; import java.security.GeneralSecurityException; import java.util.ArrayList; import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; import java.util.concurrent.Executor; import java.util.logging.Logger; @@ -31,15 +36,18 @@ import javax.inject.Inject; import static java.util.logging.Logger.getLogger; public class RestoreAccountImpl implements RestoreAccount { - private final ArrayList recoveredShards = new ArrayList<>(); + private final Set recoveredShards = new HashSet<>(); private final DarkCrystal darkCrystal; private final Executor ioExecutor; private final DatabaseComponent db; private final ContactManager contactManager; + private final MessageEncoder messageEncoder; + private final MessageParser messageParser; private final TransportPropertyManager transportPropertyManager; private final LifecycleManager lifecycleManager; private SecretKey secretKey; private final BackupPayloadDecoder backupPayloadDecoder; + private final ClientHelper clientHelper; private SocialBackup socialBackup; private byte[] secretId; @@ -52,7 +60,10 @@ public class RestoreAccountImpl implements RestoreAccount { @IoExecutor Executor ioExecutor, ContactManager contactManager, LifecycleManager lifecycleManager, - TransportPropertyManager transportPropertyManager) { + TransportPropertyManager transportPropertyManager, + MessageEncoder messageEncoder, + MessageParser messageParser, + ClientHelper clientHelper) { this.darkCrystal = darkCrystal; this.backupPayloadDecoder = backupPayloadDecoder; this.db = db; @@ -60,6 +71,9 @@ public class RestoreAccountImpl implements RestoreAccount { this.lifecycleManager = lifecycleManager; this.contactManager = contactManager; this.transportPropertyManager = transportPropertyManager; + this.messageEncoder = messageEncoder; + this.messageParser = messageParser; + this.clientHelper = clientHelper; } public int getNumberOfShards() { @@ -80,7 +94,7 @@ public class RestoreAccountImpl implements RestoreAccount { return AddReturnShardPayloadResult.MISMATCH; } recoveredShards.add(toAdd); - return AddReturnShardPayloadResult.OK; + return canRecover() ? AddReturnShardPayloadResult.RECOVERED : AddReturnShardPayloadResult.OK; } public boolean canRecover() { @@ -148,4 +162,22 @@ public class RestoreAccountImpl implements RestoreAccount { LOG.info("Added all contacts"); }); } + + public Set getEncodedShards() { + Set s = new HashSet(); + for (ReturnShardPayload r : recoveredShards) { + s.add(new String(messageEncoder.encodeReturnShardPayload(r))); + } + return s; + } + + public void restoreFromPrevious(Set previousShards) { + for (String s : previousShards) { + try { + addReturnShardPayload(messageParser.parseReturnShardPayload(clientHelper.toList(s.getBytes()))); + } catch (FormatException e) { + e.printStackTrace(); + } + } + } } From ef05ecc342c096fb68554e685c700f0aaa36dde0 Mon Sep 17 00:00:00 2001 From: ameba23 Date: Fri, 25 Jun 2021 09:03:58 +0200 Subject: [PATCH 03/31] Clear partially recovered shards from shared preferences when recovered --- .../recover/OwnerReturnShardViewModel.java | 9 --------- .../recover/RestoreAccountViewModel.java | 12 +++++++++--- 2 files changed, 9 insertions(+), 12 deletions(-) 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 33e64f43d..16d88a32d 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 @@ -156,13 +156,6 @@ class OwnerReturnShardViewModel extends AndroidViewModel ioExecutor.execute(() -> { task.start(this, getWifiIpv4Address()); }); -// KeyAgreementTask oldTask = task; -// KeyAgreementTask newTask = keyAgreementTaskProvider.get(); -// task = newTask; -// ioExecutor.execute(() -> { -// if (oldTask != null) oldTask.stopListening(); -// newTask.listen(); -// }); } @UiThread @@ -230,9 +223,7 @@ class OwnerReturnShardViewModel extends AndroidViewModel this.state.postValue(state); }); } else if (state instanceof SecretOwnerTask.State.Success) { -// startClicked.setEvent(true); this.state.postValue(state); - // TODO do same for failure } else { this.state.postValue(state); } diff --git a/briar-android/src/main/java/org/briarproject/briar/android/socialbackup/recover/RestoreAccountViewModel.java b/briar-android/src/main/java/org/briarproject/briar/android/socialbackup/recover/RestoreAccountViewModel.java index beeaf22f4..a4fbc4cdf 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/socialbackup/recover/RestoreAccountViewModel.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/socialbackup/recover/RestoreAccountViewModel.java @@ -1,6 +1,8 @@ package org.briarproject.briar.android.socialbackup.recover; import android.app.Application; +import android.content.Context; +import android.content.SharedPreferences; import org.briarproject.bramble.api.account.AccountManager; import org.briarproject.bramble.api.contact.ContactManager; @@ -45,27 +47,27 @@ class RestoreAccountViewModel extends AndroidViewModel { new MutableLiveData<>(false); private final AccountManager accountManager; - private final ContactManager contactManager; private final Executor ioExecutor; private final PasswordStrengthEstimator strengthEstimator; private final DozeHelper dozeHelper; private final RestoreAccount restoreAccount; + private final SharedPreferences prefs; @Inject RestoreAccountViewModel(Application app, AccountManager accountManager, - ContactManager contactManager, RestoreAccount restoreAccount, @IoExecutor Executor ioExecutor, PasswordStrengthEstimator strengthEstimator, DozeHelper dozeHelper) { super(app); this.accountManager = accountManager; - this.contactManager = contactManager; this.ioExecutor = ioExecutor; this.strengthEstimator = strengthEstimator; this.dozeHelper = dozeHelper; this.restoreAccount = restoreAccount; + this.prefs = app.getSharedPreferences("account-recovery", + Context.MODE_PRIVATE); ioExecutor.execute(() -> { if (accountManager.accountExists()) { @@ -123,6 +125,10 @@ class RestoreAccountViewModel extends AndroidViewModel { LOG.warning("Cannot retrieve social backup"); state.postEvent(State.FAILED); } + + // Remove partial recovery from shared preferences + prefs.edit().clear().apply(); + state.postEvent(State.CREATED); } else { LOG.warning("Failed to create account"); From f67d2f0157f4e2a80cfd2a22cb14153d93edc0a2 Mon Sep 17 00:00:00 2001 From: ameba23 Date: Fri, 25 Jun 2021 13:03:45 +0200 Subject: [PATCH 04/31] Include local tor properties in backup and check for remote handshake public keys --- .../recover/RestoreAccountActivity.java | 6 +- .../recover/RestoreAccountViewModel.java | 7 +- .../briar/api/socialbackup/SocialBackup.java | 11 ++- .../socialbackup/recovery/RestoreAccount.java | 6 +- .../BackupPayloadDecoderImpl.java | 18 +++-- .../socialbackup/BackupPayloadEncoder.java | 5 +- .../BackupPayloadEncoderImpl.java | 28 +++++-- .../socialbackup/SocialBackupManagerImpl.java | 21 ++++- .../recovery/RestoreAccountImpl.java | 77 ++++++++++++++----- 9 files changed, 137 insertions(+), 42 deletions(-) diff --git a/briar-android/src/main/java/org/briarproject/briar/android/socialbackup/recover/RestoreAccountActivity.java b/briar-android/src/main/java/org/briarproject/briar/android/socialbackup/recover/RestoreAccountActivity.java index 2c9a3fefe..b8a97e7b8 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/socialbackup/recover/RestoreAccountActivity.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/socialbackup/recover/RestoreAccountActivity.java @@ -52,9 +52,11 @@ public class RestoreAccountActivity extends BaseActivity showInitialFragment(RestoreAccountSetPasswordFragment.newInstance()); } else if (state == State.DOZE) { showDozeFragment(); - } else if (state == State.CREATED || state == State.FAILED) { - // TODO: Show an error if failed + } else if (state == State.CREATED) { showApp(); + } else { // FAILED + // TODO: Show an error if failed + finish(); } } diff --git a/briar-android/src/main/java/org/briarproject/briar/android/socialbackup/recover/RestoreAccountViewModel.java b/briar-android/src/main/java/org/briarproject/briar/android/socialbackup/recover/RestoreAccountViewModel.java index a4fbc4cdf..a11ac2353 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/socialbackup/recover/RestoreAccountViewModel.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/socialbackup/recover/RestoreAccountViewModel.java @@ -114,16 +114,19 @@ class RestoreAccountViewModel extends AndroidViewModel { if (socialBackup == null) { LOG.warning("Cannot retrieve social backup"); state.postEvent(State.FAILED); + return; } Identity identity = socialBackup.getIdentity(); ioExecutor.execute(() -> { if (accountManager.restoreAccount(identity, password)) { LOG.info("Restored account"); try { - restoreAccount.addContactsToDb(); + restoreAccount.restoreAccountWhenDatabaseReady(); } catch (DbException e) { - LOG.warning("Cannot retrieve social backup"); + LOG.warning("Failure processing social backup"); + e.printStackTrace(); state.postEvent(State.FAILED); + return; } // Remove partial recovery from shared preferences diff --git a/briar-api/src/main/java/org/briarproject/briar/api/socialbackup/SocialBackup.java b/briar-api/src/main/java/org/briarproject/briar/api/socialbackup/SocialBackup.java index 1be5a0822..86ea4847b 100644 --- a/briar-api/src/main/java/org/briarproject/briar/api/socialbackup/SocialBackup.java +++ b/briar-api/src/main/java/org/briarproject/briar/api/socialbackup/SocialBackup.java @@ -1,17 +1,22 @@ package org.briarproject.briar.api.socialbackup; import org.briarproject.bramble.api.identity.Identity; +import org.briarproject.bramble.api.plugin.TransportId; +import org.briarproject.bramble.api.properties.TransportProperties; import java.util.List; +import java.util.Map; public class SocialBackup { private Identity identity; private List contacts; + private Map localTransportProperties; private int version; - public SocialBackup (Identity identity, List contacts, int version) { + public SocialBackup (Identity identity, List contacts, Map localTransportProperties, int version) { this.identity = identity; this.contacts = contacts; + this.localTransportProperties = localTransportProperties; this.version = version; } @@ -23,6 +28,10 @@ public class SocialBackup { return contacts; } + public Map getLocalTransportProperties() { + return localTransportProperties; + } + public int getVersion() { return version; } 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 571ae5eac..2edc812b7 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 @@ -29,7 +29,11 @@ public interface RestoreAccount { SocialBackup getSocialBackup(); - void addContactsToDb() throws DbException; +// void addContactsToDb() throws DbException; void restoreFromPrevious(Set previousShards); + + void restoreAccountWhenDatabaseReady() throws DbException; + +// void addLocalTransportProperties() throws DbException; } diff --git a/briar-core/src/main/java/org/briarproject/briar/socialbackup/BackupPayloadDecoderImpl.java b/briar-core/src/main/java/org/briarproject/briar/socialbackup/BackupPayloadDecoderImpl.java index 4171d8154..20404372a 100644 --- a/briar-core/src/main/java/org/briarproject/briar/socialbackup/BackupPayloadDecoderImpl.java +++ b/briar-core/src/main/java/org/briarproject/briar/socialbackup/BackupPayloadDecoderImpl.java @@ -15,9 +15,11 @@ import org.briarproject.bramble.api.data.BdfList; import org.briarproject.bramble.api.identity.Author; import org.briarproject.bramble.api.identity.Identity; import org.briarproject.bramble.api.identity.LocalAuthor; +import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.bramble.api.plugin.TransportId; import org.briarproject.bramble.api.properties.TransportProperties; import org.briarproject.briar.api.socialbackup.BackupPayload; +import org.briarproject.briar.api.socialbackup.ContactData; import org.briarproject.briar.api.socialbackup.MessageParser; import org.briarproject.briar.api.socialbackup.Shard; import org.briarproject.briar.api.socialbackup.SocialBackup; @@ -55,7 +57,7 @@ public class BackupPayloadDecoderImpl implements BackupPayloadDecoder { this.messageParser = messageParser; } - public org.briarproject.briar.api.socialbackup.SocialBackup decodeBackupPayload( + public SocialBackup decodeBackupPayload( SecretKey secret, BackupPayload backupPayload) throws FormatException, GeneralSecurityException { @@ -98,13 +100,17 @@ public class BackupPayloadDecoderImpl implements BackupPayloadDecoder { PrivateKey handShakePrivateKey = new AgreementPrivateKey(bdfIdentity.getRaw(3)); + Map localProperties = clientHelper + .parseAndValidateTransportPropertiesMap( + bdfIdentity.getDictionary(4)); + LOG.info("Local transport properties parsed"); + Long created = System.currentTimeMillis(); Identity identity = new Identity(localAuthor, handshakePublicKey, handShakePrivateKey, created); - LOG.info("New identity created"); - List contactDataList = new ArrayList(); + List contactDataList = new ArrayList(); for (int i = 0; i < bdfContactData.size(); i++) { BdfList bdfData = bdfContactData.getList(i); @@ -143,9 +149,9 @@ public class BackupPayloadDecoderImpl implements BackupPayloadDecoder { org.briarproject.briar.api.socialbackup.ContactData contactData = new org.briarproject.briar.api.socialbackup.ContactData(contact, properties, shard); contactDataList.add(contactData); - LOG.info("Contact added"); + LOG.info("Contact fully parsed"); } - LOG.info("All contacts added"); - return new SocialBackup(identity, contactDataList, version); + LOG.info("All contacts fully parsed"); + return new SocialBackup(identity, contactDataList, localProperties, version); } } diff --git a/briar-core/src/main/java/org/briarproject/briar/socialbackup/BackupPayloadEncoder.java b/briar-core/src/main/java/org/briarproject/briar/socialbackup/BackupPayloadEncoder.java index ed8e852b2..ca5274bd6 100644 --- a/briar-core/src/main/java/org/briarproject/briar/socialbackup/BackupPayloadEncoder.java +++ b/briar-core/src/main/java/org/briarproject/briar/socialbackup/BackupPayloadEncoder.java @@ -3,14 +3,17 @@ package org.briarproject.briar.socialbackup; import org.briarproject.bramble.api.crypto.SecretKey; import org.briarproject.bramble.api.identity.Identity; import org.briarproject.bramble.api.nullsafety.NotNullByDefault; +import org.briarproject.bramble.api.plugin.TransportId; +import org.briarproject.bramble.api.properties.TransportProperties; import org.briarproject.briar.api.socialbackup.BackupPayload; import org.briarproject.briar.api.socialbackup.ContactData; import java.util.List; +import java.util.Map; @NotNullByDefault interface BackupPayloadEncoder { BackupPayload encodeBackupPayload(SecretKey secret, Identity identity, - List contactData, int version); + List contactData, int version, Map localTransportProperties); } diff --git a/briar-core/src/main/java/org/briarproject/briar/socialbackup/BackupPayloadEncoderImpl.java b/briar-core/src/main/java/org/briarproject/briar/socialbackup/BackupPayloadEncoderImpl.java index 7e867f697..ba1df879f 100644 --- a/briar-core/src/main/java/org/briarproject/briar/socialbackup/BackupPayloadEncoderImpl.java +++ b/briar-core/src/main/java/org/briarproject/briar/socialbackup/BackupPayloadEncoderImpl.java @@ -10,11 +10,15 @@ import org.briarproject.bramble.api.data.BdfList; import org.briarproject.bramble.api.identity.Identity; import org.briarproject.bramble.api.identity.LocalAuthor; import org.briarproject.bramble.api.nullsafety.NotNullByDefault; +import org.briarproject.bramble.api.plugin.TransportId; +import org.briarproject.bramble.api.properties.TransportProperties; +import org.briarproject.briar.api.socialbackup.BackupPayload; import org.briarproject.briar.api.socialbackup.Shard; import java.security.GeneralSecurityException; import java.security.SecureRandom; import java.util.List; +import java.util.Map; import javax.annotation.concurrent.Immutable; import javax.inject.Inject; @@ -45,15 +49,26 @@ class BackupPayloadEncoderImpl implements BackupPayloadEncoder { } @Override - public org.briarproject.briar.api.socialbackup.BackupPayload encodeBackupPayload(SecretKey secret, - Identity identity, List contactData, int version) { + public BackupPayload encodeBackupPayload(SecretKey secret, + Identity identity, + List contactData, + int version, + Map localTransportProperties) { // Encode the local identity BdfList bdfIdentity = new BdfList(); LocalAuthor localAuthor = identity.getLocalAuthor(); bdfIdentity.add(clientHelper.toList(localAuthor)); bdfIdentity.add(localAuthor.getPrivateKey().getEncoded()); + + // Add handshake keypair + assert identity.getHandshakePublicKey() != null; bdfIdentity.add(identity.getHandshakePublicKey().getEncoded()); + assert identity.getHandshakePrivateKey() != null; bdfIdentity.add(identity.getHandshakePrivateKey().getEncoded()); + + // Add local transport properties + bdfIdentity.add(clientHelper.toDictionary(localTransportProperties)); + // Encode the contact data BdfList bdfContactData = new BdfList(); for (org.briarproject.briar.api.socialbackup.ContactData cd : contactData) { @@ -84,10 +99,13 @@ class BackupPayloadEncoderImpl implements BackupPayloadEncoder { int encrypted = cipher.process(plaintext, 0, plaintext.length, ciphertext, 0); if (encrypted != ciphertext.length) throw new AssertionError(); - byte[] ciphertextWithNonce = new byte[ciphertext.length + nonce.length]; + byte[] ciphertextWithNonce = + new byte[ciphertext.length + nonce.length]; System.arraycopy(nonce, 0, ciphertextWithNonce, 0, nonce.length); - System.arraycopy(ciphertext, 0, ciphertextWithNonce, nonce.length, ciphertext.length); - return new org.briarproject.briar.api.socialbackup.BackupPayload(ciphertextWithNonce); + System.arraycopy(ciphertext, 0, ciphertextWithNonce, nonce.length, + ciphertext.length); + return new org.briarproject.briar.api.socialbackup.BackupPayload( + ciphertextWithNonce); } catch (FormatException | GeneralSecurityException e) { throw new AssertionError(e); } diff --git a/briar-core/src/main/java/org/briarproject/briar/socialbackup/SocialBackupManagerImpl.java b/briar-core/src/main/java/org/briarproject/briar/socialbackup/SocialBackupManagerImpl.java index e7ec723d5..5e2198772 100644 --- a/briar-core/src/main/java/org/briarproject/briar/socialbackup/SocialBackupManagerImpl.java +++ b/briar-core/src/main/java/org/briarproject/briar/socialbackup/SocialBackupManagerImpl.java @@ -29,7 +29,6 @@ import org.briarproject.bramble.api.plugin.BluetoothConstants; import org.briarproject.bramble.api.plugin.LanTcpConstants; import org.briarproject.bramble.api.plugin.TorConstants; import org.briarproject.bramble.api.plugin.TransportId; -import org.briarproject.bramble.api.plugin.WanTcpConstants; import org.briarproject.bramble.api.properties.TransportProperties; import org.briarproject.bramble.api.properties.TransportPropertyManager; import org.briarproject.bramble.api.sync.Group; @@ -442,14 +441,23 @@ class SocialBackupManagerImpl extends ConversationClientImpl int version) throws DbException { Identity identity = identityManager.getIdentity(txn); + + // Add local transport properties + Map localProps = + transportPropertyManager.getLocalProperties(txn); + Map filteredLocalProps = + new HashMap<>(); + filteredLocalProps + .put(TorConstants.ID, localProps.get(TorConstants.ID)); + return backupPayloadEncoder.encodeBackupPayload(secret, identity, - contactData, version); + contactData, version, filteredLocalProps); } private List loadContactData(Transaction txn) throws DbException { Collection contacts = contactManager.getContacts(txn); - List contactData = + List contactData = new ArrayList<>(); for (Contact c : contacts) { // Skip contacts that are in the process of being removed @@ -458,6 +466,10 @@ class SocialBackupManagerImpl extends ConversationClientImpl Map props = getTransportProperties(txn, c.getId()); Shard shard = getRemoteShard(txn, contactGroup.getId()); + if (c.getHandshakePublicKey() == null) { + System.out.println( + "Warning - adding contact with no handshake public key"); + } contactData .add(new org.briarproject.briar.api.socialbackup.ContactData( c, props, shard)); @@ -468,7 +480,8 @@ class SocialBackupManagerImpl extends ConversationClientImpl private Map getTransportProperties( Transaction txn, ContactId c) throws DbException { // TODO: Include filtered properties for other transports - TransportId ids[] = { TorConstants.ID, LanTcpConstants.ID, BluetoothConstants.ID }; + TransportId ids[] = + {TorConstants.ID, LanTcpConstants.ID, BluetoothConstants.ID}; Map props = new HashMap(); for (TransportId id : ids) { props.put(id, transportPropertyManager 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 c3a56adbd..c8611753b 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 @@ -11,6 +11,8 @@ import org.briarproject.bramble.api.db.DbException; import org.briarproject.bramble.api.identity.AuthorId; import org.briarproject.bramble.api.lifecycle.IoExecutor; import org.briarproject.bramble.api.lifecycle.LifecycleManager; +import org.briarproject.bramble.api.plugin.TransportId; +import org.briarproject.bramble.api.properties.TransportProperties; import org.briarproject.bramble.api.properties.TransportPropertyManager; import org.briarproject.briar.api.socialbackup.BackupPayload; import org.briarproject.briar.api.socialbackup.ContactData; @@ -27,6 +29,7 @@ import java.security.GeneralSecurityException; import java.util.ArrayList; import java.util.Arrays; import java.util.HashSet; +import java.util.Map; import java.util.Set; import java.util.concurrent.Executor; import java.util.logging.Logger; @@ -80,7 +83,8 @@ public class RestoreAccountImpl implements RestoreAccount { return recoveredShards.size(); } - public AddReturnShardPayloadResult addReturnShardPayload(ReturnShardPayload toAdd) { + 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) { @@ -94,7 +98,8 @@ public class RestoreAccountImpl implements RestoreAccount { return AddReturnShardPayloadResult.MISMATCH; } recoveredShards.add(toAdd); - return canRecover() ? AddReturnShardPayloadResult.RECOVERED : AddReturnShardPayloadResult.OK; + return canRecover() ? AddReturnShardPayloadResult.RECOVERED : + AddReturnShardPayloadResult.OK; } public boolean canRecover() { @@ -134,10 +139,7 @@ public class RestoreAccountImpl implements RestoreAccount { return socialBackup; } - public void addContactsToDb() throws DbException { - if (socialBackup == null) throw new DbException(); - AuthorId localAuthorId = socialBackup.getIdentity().getId(); - + public void restoreAccountWhenDatabaseReady() throws DbException { ioExecutor.execute(() -> { try { lifecycleManager.waitForDatabase(); @@ -145,24 +147,58 @@ public class RestoreAccountImpl implements RestoreAccount { LOG.warning("Interrupted when waiting for database"); } try { - db.transaction(false, txn -> { - for (ContactData contactData : socialBackup.getContacts()) { - Contact c = contactData.getContact(); - LOG.info("Adding contact " + c.getAuthor().getName() + " " + c.getAlias()); - ContactId contactId = contactManager.addContact(txn, c.getAuthor(), localAuthorId, - c.getHandshakePublicKey(), c.isVerified()); - transportPropertyManager.addRemoteProperties(txn, contactId, - contactData.getProperties()); - } - }); + addLocalTransportProperties(); + addContactsToDb(); } catch (DbException e) { - LOG.warning("Error adding contacts to database"); - LOG.warning(e.getMessage()); + LOG.warning("Error when processing backup"); + e.printStackTrace(); } - LOG.info("Added all contacts"); }); } + + private void addContactsToDb() throws DbException { + if (socialBackup == null) throw new DbException(); + AuthorId localAuthorId = socialBackup.getIdentity().getId(); + + try { + db.transaction(false, txn -> { + for (ContactData contactData : socialBackup.getContacts()) { + Contact c = contactData.getContact(); + LOG.info("Adding contact " + c.getAuthor().getName() + + " " + c.getAlias()); + if (c.getHandshakePublicKey() == null) { + LOG.warning("Warning: contact has no handshake public key"); + } + ContactId contactId = contactManager + .addContact(txn, c.getAuthor(), localAuthorId, + c.getHandshakePublicKey(), + c.isVerified()); + transportPropertyManager + .addRemoteProperties(txn, contactId, + contactData.getProperties()); + } + }); + } catch (DbException e) { + LOG.warning("Error adding contacts to database"); + LOG.warning(e.getMessage()); + } + LOG.info("Added all contacts"); + } + + private void addLocalTransportProperties() + throws DbException { + LOG.info("Adding local transport properties"); + for (Map.Entry propertiesEntry : socialBackup + .getLocalTransportProperties().entrySet()) { + LOG.info("Adding transport property " + + propertiesEntry.getKey().getString()); + transportPropertyManager + .mergeLocalProperties(propertiesEntry.getKey(), + propertiesEntry.getValue()); + } + } + public Set getEncodedShards() { Set s = new HashSet(); for (ReturnShardPayload r : recoveredShards) { @@ -174,7 +210,8 @@ public class RestoreAccountImpl implements RestoreAccount { public void restoreFromPrevious(Set previousShards) { for (String s : previousShards) { try { - addReturnShardPayload(messageParser.parseReturnShardPayload(clientHelper.toList(s.getBytes()))); + addReturnShardPayload(messageParser.parseReturnShardPayload( + clientHelper.toList(s.getBytes()))); } catch (FormatException e) { e.printStackTrace(); } From 3484892628e68ace8672d22c90fbee9a298d2efa Mon Sep 17 00:00:00 2001 From: ameba23 Date: Fri, 25 Jun 2021 13:20:20 +0200 Subject: [PATCH 05/31] Use hex encoding for storing shards in shared preferences --- .../socialbackup/recovery/RestoreAccountImpl.java | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) 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 c8611753b..50a05af35 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 @@ -14,6 +14,7 @@ import org.briarproject.bramble.api.lifecycle.LifecycleManager; import org.briarproject.bramble.api.plugin.TransportId; import org.briarproject.bramble.api.properties.TransportProperties; import org.briarproject.bramble.api.properties.TransportPropertyManager; +import org.briarproject.bramble.util.StringUtils; import org.briarproject.briar.api.socialbackup.BackupPayload; import org.briarproject.briar.api.socialbackup.ContactData; import org.briarproject.briar.api.socialbackup.DarkCrystal; @@ -168,7 +169,8 @@ public class RestoreAccountImpl implements RestoreAccount { LOG.info("Adding contact " + c.getAuthor().getName() + " " + c.getAlias()); if (c.getHandshakePublicKey() == null) { - LOG.warning("Warning: contact has no handshake public key"); + LOG.warning( + "Warning: contact has no handshake public key"); } ContactId contactId = contactManager .addContact(txn, c.getAuthor(), localAuthorId, @@ -202,7 +204,8 @@ public class RestoreAccountImpl implements RestoreAccount { public Set getEncodedShards() { Set s = new HashSet(); for (ReturnShardPayload r : recoveredShards) { - s.add(new String(messageEncoder.encodeReturnShardPayload(r))); + s.add(StringUtils + .toHexString(messageEncoder.encodeReturnShardPayload(r))); } return s; } @@ -211,8 +214,9 @@ public class RestoreAccountImpl implements RestoreAccount { for (String s : previousShards) { try { addReturnShardPayload(messageParser.parseReturnShardPayload( - clientHelper.toList(s.getBytes()))); + clientHelper.toList(StringUtils.fromHexString(s)))); } catch (FormatException e) { + LOG.warning("Error parsing shard from previous session"); e.printStackTrace(); } } From e9f4f084ddf170007a82c27c5b4921d4dbb77666 Mon Sep 17 00:00:00 2001 From: ameba23 Date: Fri, 25 Jun 2021 13:36:03 +0200 Subject: [PATCH 06/31] Fix incorrect key for shared prefs --- .../socialbackup/recover/OwnerReturnShardViewModel.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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 16d88a32d..d7f1db7bc 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 @@ -87,7 +87,8 @@ class OwnerReturnShardViewModel extends AndroidViewModel this.task = task; this.prefs = app.getSharedPreferences("account-recovery", Context.MODE_PRIVATE); - restoreAccount.restoreFromPrevious(prefs.getStringSet("Recover", new HashSet<>())); + restoreAccount.restoreFromPrevious(prefs.getStringSet("recovered", new HashSet<>())); + wifiManager = (WifiManager) app.getSystemService(WIFI_SERVICE); From 0a0b79ad9b11fc409e509686cb506ae601d0a649 Mon Sep 17 00:00:00 2001 From: ameba23 Date: Fri, 25 Jun 2021 21:07:44 +0200 Subject: [PATCH 07/31] Check for null when adding local properties to fix integration test --- .../briar/socialbackup/SocialBackupManagerImpl.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/briar-core/src/main/java/org/briarproject/briar/socialbackup/SocialBackupManagerImpl.java b/briar-core/src/main/java/org/briarproject/briar/socialbackup/SocialBackupManagerImpl.java index 5e2198772..f5d1f5998 100644 --- a/briar-core/src/main/java/org/briarproject/briar/socialbackup/SocialBackupManagerImpl.java +++ b/briar-core/src/main/java/org/briarproject/briar/socialbackup/SocialBackupManagerImpl.java @@ -447,8 +447,10 @@ class SocialBackupManagerImpl extends ConversationClientImpl transportPropertyManager.getLocalProperties(txn); Map filteredLocalProps = new HashMap<>(); - filteredLocalProps - .put(TorConstants.ID, localProps.get(TorConstants.ID)); + if (localProps.get(TorConstants.ID) != null) { + filteredLocalProps + .put(TorConstants.ID, localProps.get(TorConstants.ID)); + } return backupPayloadEncoder.encodeBackupPayload(secret, identity, contactData, version, filteredLocalProps); From 47f136904c0206d5535bc16fa2c9775eb147f84a Mon Sep 17 00:00:00 2001 From: ameba23 Date: Mon, 28 Jun 2021 09:55:41 +0200 Subject: [PATCH 08/31] Create HandshakeKeyExchange client and module --- .../HandshakeKeyExchangeManager.java | 22 ++ .../HandshakeKeyExchangeConstants.java | 13 + .../HandshakeKeyExchangeManagerImpl.java | 235 ++++++++++++++++++ .../HandshakeKeyExchangeModule.java | 23 ++ .../HandshakeKeyExchangeValidator.java | 31 +++ 5 files changed, 324 insertions(+) create mode 100644 briar-api/src/main/java/org/briarproject/briar/api/handshakekeyexchange/HandshakeKeyExchangeManager.java create mode 100644 briar-core/src/main/java/org/briarproject/briar/handshakekeyexchange/HandshakeKeyExchangeConstants.java create mode 100644 briar-core/src/main/java/org/briarproject/briar/handshakekeyexchange/HandshakeKeyExchangeManagerImpl.java create mode 100644 briar-core/src/main/java/org/briarproject/briar/handshakekeyexchange/HandshakeKeyExchangeModule.java create mode 100644 briar-core/src/main/java/org/briarproject/briar/handshakekeyexchange/HandshakeKeyExchangeValidator.java diff --git a/briar-api/src/main/java/org/briarproject/briar/api/handshakekeyexchange/HandshakeKeyExchangeManager.java b/briar-api/src/main/java/org/briarproject/briar/api/handshakekeyexchange/HandshakeKeyExchangeManager.java new file mode 100644 index 000000000..c6da01697 --- /dev/null +++ b/briar-api/src/main/java/org/briarproject/briar/api/handshakekeyexchange/HandshakeKeyExchangeManager.java @@ -0,0 +1,22 @@ +package org.briarproject.briar.api.handshakekeyexchange; + +import org.briarproject.bramble.api.sync.ClientId; +import org.briarproject.briar.api.conversation.ConversationManager; + +public interface HandshakeKeyExchangeManager extends ConversationManager.ConversationClient { + + /** + * The unique ID of the client. + */ + ClientId CLIENT_ID = new ClientId("org.briarproject.briar.handshakekeyexchange"); + + /** + * The current major version of the handshake key exchange client. + */ + int MAJOR_VERSION = 0; + + /** + * The current minor version of the handshake key exchange client. + */ + int MINOR_VERSION = 0; +} diff --git a/briar-core/src/main/java/org/briarproject/briar/handshakekeyexchange/HandshakeKeyExchangeConstants.java b/briar-core/src/main/java/org/briarproject/briar/handshakekeyexchange/HandshakeKeyExchangeConstants.java new file mode 100644 index 000000000..8b4aa7ed4 --- /dev/null +++ b/briar-core/src/main/java/org/briarproject/briar/handshakekeyexchange/HandshakeKeyExchangeConstants.java @@ -0,0 +1,13 @@ +package org.briarproject.briar.handshakekeyexchange; + +public interface HandshakeKeyExchangeConstants { + + // Group metadata keys + String GROUP_KEY_CONTACT_ID = "contactId"; + + // Message metadata keys + String MSG_KEY_TIMESTAMP = "timestamp"; + String MSG_KEY_MESSAGE_TYPE = "messageType"; + String MSG_KEY_LOCAL = "local"; + String MSG_KEY_VERSION = "version"; +} diff --git a/briar-core/src/main/java/org/briarproject/briar/handshakekeyexchange/HandshakeKeyExchangeManagerImpl.java b/briar-core/src/main/java/org/briarproject/briar/handshakekeyexchange/HandshakeKeyExchangeManagerImpl.java new file mode 100644 index 000000000..3240ed458 --- /dev/null +++ b/briar-core/src/main/java/org/briarproject/briar/handshakekeyexchange/HandshakeKeyExchangeManagerImpl.java @@ -0,0 +1,235 @@ +package org.briarproject.briar.handshakekeyexchange; + +import org.briarproject.bramble.api.FormatException; +import org.briarproject.bramble.api.client.ClientHelper; +import org.briarproject.bramble.api.client.ContactGroupFactory; +import org.briarproject.bramble.api.contact.Contact; +import org.briarproject.bramble.api.contact.ContactId; +import org.briarproject.bramble.api.contact.ContactManager; +import org.briarproject.bramble.api.crypto.AgreementPublicKey; +import org.briarproject.bramble.api.crypto.PublicKey; +import org.briarproject.bramble.api.data.BdfDictionary; +import org.briarproject.bramble.api.data.BdfEntry; +import org.briarproject.bramble.api.data.BdfList; +import org.briarproject.bramble.api.data.MetadataParser; +import org.briarproject.bramble.api.db.DatabaseComponent; +import org.briarproject.bramble.api.db.DbException; +import org.briarproject.bramble.api.db.Transaction; +import org.briarproject.bramble.api.identity.Identity; +import org.briarproject.bramble.api.identity.IdentityManager; +import org.briarproject.bramble.api.lifecycle.LifecycleManager; +import org.briarproject.bramble.api.sync.Group; +import org.briarproject.bramble.api.sync.GroupId; +import org.briarproject.bramble.api.sync.Message; +import org.briarproject.bramble.api.sync.MessageId; +import org.briarproject.bramble.api.system.Clock; +import org.briarproject.bramble.api.versioning.ClientVersion; +import org.briarproject.bramble.api.versioning.ClientVersioningManager; +import org.briarproject.briar.api.client.MessageTracker; +import org.briarproject.briar.api.conversation.ConversationManager; +import org.briarproject.briar.api.conversation.ConversationMessageHeader; +import org.briarproject.briar.api.conversation.DeletionResult; +import org.briarproject.briar.api.handshakekeyexchange.HandshakeKeyExchangeManager; +import org.briarproject.briar.client.ConversationClientImpl; + +import java.util.Collection; +import java.util.Map; +import java.util.Set; +import java.util.logging.Logger; + +import javax.inject.Inject; + +import static java.util.logging.Logger.getLogger; +import static org.briarproject.briar.handshakekeyexchange.HandshakeKeyExchangeConstants.GROUP_KEY_CONTACT_ID; +import static org.briarproject.briar.handshakekeyexchange.HandshakeKeyExchangeConstants.MSG_KEY_LOCAL; +import static org.briarproject.briar.handshakekeyexchange.HandshakeKeyExchangeConstants.MSG_KEY_TIMESTAMP; + +public class HandshakeKeyExchangeManagerImpl extends ConversationClientImpl + implements + HandshakeKeyExchangeManager, LifecycleManager.OpenDatabaseHook, + ContactManager.ContactHook { + + private final ClientVersioningManager clientVersioningManager; + private final ContactGroupFactory contactGroupFactory; + private final ContactManager contactManager; + private final IdentityManager identityManager; + private final Group localGroup; + private final Clock clock; + private PublicKey handshakePublicKey; + private static final Logger LOG = + getLogger(HandshakeKeyExchangeManager.class.getName()); + + + @Inject + protected HandshakeKeyExchangeManagerImpl ( + DatabaseComponent db, + ClientHelper clientHelper, + MetadataParser metadataParser, + MessageTracker messageTracker, + ClientVersioningManager clientVersioningManager, + ContactGroupFactory contactGroupFactory, + ContactManager contactManager, + IdentityManager identityManager, + Clock clock + ) { + super(db, clientHelper, metadataParser, messageTracker); + this.clientVersioningManager = clientVersioningManager; + this.contactGroupFactory = contactGroupFactory; + this.contactManager = contactManager; + this.identityManager = identityManager; + this.clock = clock; + localGroup = contactGroupFactory.createLocalGroup(CLIENT_ID, MAJOR_VERSION); + } + + @Override + public void onDatabaseOpened(Transaction txn) throws DbException { + if (db.containsGroup(txn, localGroup.getId())) return; + db.addGroup(txn, localGroup); + + // Get our own handshake public key + handshakePublicKey = identityManager.getHandshakeKeys(txn).getPublic(); + + // Set things up for any pre-existing contacts + for (Contact c : db.getContacts(txn)) addingContact(txn, c); + } + + @Override + public Group getContactGroup(Contact c) { + return contactGroupFactory.createContactGroup(CLIENT_ID, + MAJOR_VERSION, c); + } + + @Override + public Collection getMessageHeaders( + Transaction txn, ContactId contactId) throws DbException { + return null; + } + + @Override + public Set getMessageIds(Transaction txn, ContactId contactId) + throws DbException { + Contact contact = db.getContact(txn, contactId); + GroupId contactGroupId = getContactGroup(contact).getId(); + try { + Map messages = clientHelper + .getMessageMetadataAsDictionary(txn, contactGroupId); + return messages.keySet(); + } catch (FormatException e) { + throw new DbException(e); + } + } + + @Override + public void setReadFlag(GroupId g, MessageId m, boolean read) + throws DbException { + + } + + @Override + public DeletionResult deleteAllMessages(Transaction txn, ContactId c) + throws DbException { + GroupId g = getContactGroup(db.getContact(txn, c)).getId(); + for (MessageId messageId : db.getMessageIds(txn, g)) { + db.deleteMessage(txn, messageId); + db.deleteMessageMetadata(txn, messageId); + } + messageTracker.initializeGroupCount(txn, g); + return new DeletionResult(); + } + + + @Override + public DeletionResult deleteMessages(Transaction txn, ContactId c, + Set messageIds) throws DbException { + for (MessageId m : messageIds) { + db.deleteMessage(txn, m); + db.deleteMessageMetadata(txn, m); + } + return new DeletionResult(); + } + + @Override + protected boolean incomingMessage(Transaction txn, Message m, BdfList body, + BdfDictionary meta) throws DbException, FormatException { + LOG.info("Incoming HandshakeKeyExchange message"); + ContactId contactId = getContactId(txn, m.getGroupId()); + Contact c = contactManager.getContact(txn, contactId); + if (c.getHandshakePublicKey() != null) { + LOG.info("Already have public key - ignoring message"); + return false; + } + PublicKey handshakePublicKey = new AgreementPublicKey(body.getRaw(0)); + return false; + } + + private ContactId getContactId(Transaction txn, GroupId g) + throws DbException { + try { + BdfDictionary meta = + clientHelper.getGroupMetadataAsDictionary(txn, g); + return new ContactId(meta.getLong( + HandshakeKeyExchangeConstants.GROUP_KEY_CONTACT_ID).intValue()); + } catch (FormatException e) { + throw new DbException(e); + } + } + + @Override + public void addingContact(Transaction txn, Contact c) throws DbException { + // Create a group to share with the contact + Group g = getContactGroup(c); + db.addGroup(txn, g); + // Apply the client's visibility to the contact group + Group.Visibility client = + clientVersioningManager.getClientVisibility(txn, + c.getId(), CLIENT_ID, MAJOR_VERSION); + db.setGroupVisibility(txn, c.getId(), g.getId(), client); + // Attach the contact ID to the group + setContactId(txn, g.getId(), c.getId()); + + if (c.getHandshakePublicKey() == null) { + sendHandshakePublicKey(txn, c); + } + } + + private void sendHandshakePublicKey(Transaction txn, Contact c) + throws DbException { + Group group = getContactGroup(c); + GroupId g = group.getId(); + if (!db.containsGroup(txn, g)) db.addGroup(txn, group); + long timestamp = clock.currentTimeMillis(); + + BdfList bodyList = new BdfList(); + bodyList.add(handshakePublicKey); + try { + byte[] body = clientHelper.toByteArray(bodyList); + Message m = clientHelper.createMessage(g, timestamp, body); + + BdfDictionary meta = BdfDictionary.of( + new BdfEntry(MSG_KEY_LOCAL, true), + new BdfEntry(MSG_KEY_TIMESTAMP, timestamp) + ); + clientHelper.addLocalMessage(txn, m, meta, true, false); + } catch (FormatException e) { + throw new DbException(); + } + +// messageTracker.trackOutgoingMessage(txn, m); + } + + @Override + public void removingContact(Transaction txn, Contact c) throws DbException { + db.removeGroup(txn, getContactGroup(c)); + } + + private void setContactId(Transaction txn, GroupId g, ContactId c) + throws DbException { + BdfDictionary d = new BdfDictionary(); + d.put(GROUP_KEY_CONTACT_ID, c.getInt()); + try { + clientHelper.mergeGroupMetadata(txn, g, d); + } catch (FormatException e) { + throw new AssertionError(e); + } + } +} diff --git a/briar-core/src/main/java/org/briarproject/briar/handshakekeyexchange/HandshakeKeyExchangeModule.java b/briar-core/src/main/java/org/briarproject/briar/handshakekeyexchange/HandshakeKeyExchangeModule.java new file mode 100644 index 000000000..011b4a7c4 --- /dev/null +++ b/briar-core/src/main/java/org/briarproject/briar/handshakekeyexchange/HandshakeKeyExchangeModule.java @@ -0,0 +1,23 @@ +package org.briarproject.briar.handshakekeyexchange; + +import org.briarproject.briar.api.handshakekeyexchange.HandshakeKeyExchangeManager; + +import javax.inject.Inject; +import javax.inject.Singleton; + +import dagger.Module; +import dagger.Provides; + +@Module +public class HandshakeKeyExchangeModule { + public static class EagerSingletons { + @Inject + HandshakeKeyExchangeManager handshakeKeyExchangeManager; + } + + @Provides + @Singleton + HandshakeKeyExchangeManager handshakeKeyExchangeManager(HandshakeKeyExchangeManagerImpl handshakeKeyExchangeManager) { + return handshakeKeyExchangeManager; + } +} diff --git a/briar-core/src/main/java/org/briarproject/briar/handshakekeyexchange/HandshakeKeyExchangeValidator.java b/briar-core/src/main/java/org/briarproject/briar/handshakekeyexchange/HandshakeKeyExchangeValidator.java new file mode 100644 index 000000000..a030013a2 --- /dev/null +++ b/briar-core/src/main/java/org/briarproject/briar/handshakekeyexchange/HandshakeKeyExchangeValidator.java @@ -0,0 +1,31 @@ +package org.briarproject.briar.handshakekeyexchange; + +import org.briarproject.bramble.api.FormatException; +import org.briarproject.bramble.api.client.BdfMessageContext; +import org.briarproject.bramble.api.client.BdfMessageValidator; +import org.briarproject.bramble.api.client.ClientHelper; +import org.briarproject.bramble.api.data.BdfList; +import org.briarproject.bramble.api.data.MetadataEncoder; +import org.briarproject.bramble.api.sync.Group; +import org.briarproject.bramble.api.sync.InvalidMessageException; +import org.briarproject.bramble.api.sync.Message; +import org.briarproject.bramble.api.system.Clock; + +import javax.inject.Inject; + +public class HandshakeKeyExchangeValidator extends BdfMessageValidator { + + @Inject + protected HandshakeKeyExchangeValidator( + ClientHelper clientHelper, + MetadataEncoder metadataEncoder, + Clock clock) { + super(clientHelper, metadataEncoder, clock); + } + + @Override + protected BdfMessageContext validateMessage(Message m, Group g, + BdfList body) throws InvalidMessageException, FormatException { + return null; + } +} From c7bca253fee0e3fba067caf5895ba8762271891b Mon Sep 17 00:00:00 2001 From: ameba23 Date: Mon, 28 Jun 2021 09:58:39 +0200 Subject: [PATCH 09/31] Inject HandshakeKeyExchangeModule as an eager singleton --- .../java/org/briarproject/briar/BriarCoreEagerSingletons.java | 4 ++++ .../src/main/java/org/briarproject/briar/BriarCoreModule.java | 2 ++ 2 files changed, 6 insertions(+) diff --git a/briar-core/src/main/java/org/briarproject/briar/BriarCoreEagerSingletons.java b/briar-core/src/main/java/org/briarproject/briar/BriarCoreEagerSingletons.java index 796ddfebe..696789899 100644 --- a/briar-core/src/main/java/org/briarproject/briar/BriarCoreEagerSingletons.java +++ b/briar-core/src/main/java/org/briarproject/briar/BriarCoreEagerSingletons.java @@ -4,6 +4,7 @@ import org.briarproject.briar.avatar.AvatarModule; import org.briarproject.briar.blog.BlogModule; import org.briarproject.briar.feed.FeedModule; import org.briarproject.briar.forum.ForumModule; +import org.briarproject.briar.handshakekeyexchange.HandshakeKeyExchangeModule; import org.briarproject.briar.identity.IdentityModule; import org.briarproject.briar.introduction.IntroductionModule; import org.briarproject.briar.messaging.MessagingModule; @@ -37,6 +38,8 @@ public interface BriarCoreEagerSingletons { void inject(SocialBackupModule.EagerSingletons init); + void inject(HandshakeKeyExchangeModule.EagerSingletons init); + class Helper { public static void injectEagerSingletons(BriarCoreEagerSingletons c) { @@ -51,6 +54,7 @@ public interface BriarCoreEagerSingletons { c.inject(new IdentityModule.EagerSingletons()); c.inject(new IntroductionModule.EagerSingletons()); c.inject(new SocialBackupModule.EagerSingletons()); + c.inject(new HandshakeKeyExchangeModule.EagerSingletons()); } } } diff --git a/briar-core/src/main/java/org/briarproject/briar/BriarCoreModule.java b/briar-core/src/main/java/org/briarproject/briar/BriarCoreModule.java index 2144fa654..d6c9ae67d 100644 --- a/briar-core/src/main/java/org/briarproject/briar/BriarCoreModule.java +++ b/briar-core/src/main/java/org/briarproject/briar/BriarCoreModule.java @@ -7,6 +7,7 @@ import org.briarproject.briar.client.BriarClientModule; import org.briarproject.briar.feed.DnsModule; import org.briarproject.briar.feed.FeedModule; import org.briarproject.briar.forum.ForumModule; +import org.briarproject.briar.handshakekeyexchange.HandshakeKeyExchangeModule; import org.briarproject.briar.identity.IdentityModule; import org.briarproject.briar.introduction.IntroductionModule; import org.briarproject.briar.messaging.MessagingModule; @@ -33,6 +34,7 @@ import dagger.Module; PrivateGroupModule.class, SharingModule.class, SocialBackupModule.class, + HandshakeKeyExchangeModule.class, TestModule.class }) public class BriarCoreModule { From 873b088a429bea15ef9f2085978ea5e2398de9c5 Mon Sep 17 00:00:00 2001 From: ameba23 Date: Mon, 28 Jun 2021 13:46:19 +0200 Subject: [PATCH 10/31] Add a method to set a contacts handshake public key in the database --- .../bramble/api/contact/ContactManager.java | 10 ++++++++++ .../bramble/api/db/DatabaseComponent.java | 5 +++++ .../bramble/contact/ContactManagerImpl.java | 18 ++++++++++++++++++ .../org/briarproject/bramble/db/Database.java | 6 ++++++ .../bramble/db/DatabaseComponentImpl.java | 9 +++++++++ .../briarproject/bramble/db/JdbcDatabase.java | 17 +++++++++++++++++ 6 files changed, 65 insertions(+) diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/contact/ContactManager.java b/bramble-api/src/main/java/org/briarproject/bramble/api/contact/ContactManager.java index d1eb4e913..ccd459169 100644 --- a/bramble-api/src/main/java/org/briarproject/bramble/api/contact/ContactManager.java +++ b/bramble-api/src/main/java/org/briarproject/bramble/api/contact/ContactManager.java @@ -209,6 +209,16 @@ public interface ContactManager { void setContactAlias(ContactId c, @Nullable String alias) throws DbException; + /** + * Sets the contact's handshake public key + */ + void setHandshakePublicKey(Transaction txn, ContactId c, PublicKey handshakePublicKey) throws DbException; + + /** + * Sets the contact's handshake public key + */ + void setHandshakePublicKey(ContactId c, PublicKey handshakePublicKey) throws DbException; + /** * Returns true if a contact with this {@code remoteAuthorId} belongs to * the local pseudonym with this {@code localAuthorId}. diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/db/DatabaseComponent.java b/bramble-api/src/main/java/org/briarproject/bramble/api/db/DatabaseComponent.java index 7c525bcd3..ef143d269 100644 --- a/bramble-api/src/main/java/org/briarproject/bramble/api/db/DatabaseComponent.java +++ b/bramble-api/src/main/java/org/briarproject/bramble/api/db/DatabaseComponent.java @@ -546,6 +546,11 @@ public interface DatabaseComponent extends TransactionManager { void setContactAlias(Transaction txn, ContactId c, @Nullable String alias) throws DbException; + /** + * Sets the remote handshake public key for a given contact + */ + void setHandshakePublicKey(Transaction txn, ContactId c, PublicKey handshakePublicKey) throws DbException; + /** * Sets the given group's visibility to the given contact. */ diff --git a/bramble-core/src/main/java/org/briarproject/bramble/contact/ContactManagerImpl.java b/bramble-core/src/main/java/org/briarproject/bramble/contact/ContactManagerImpl.java index f7992aa66..6ec0ebdfd 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/contact/ContactManagerImpl.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/contact/ContactManagerImpl.java @@ -9,6 +9,7 @@ import org.briarproject.bramble.api.contact.PendingContact; import org.briarproject.bramble.api.contact.PendingContactId; import org.briarproject.bramble.api.contact.PendingContactState; import org.briarproject.bramble.api.contact.event.PendingContactStateChangedEvent; +import org.briarproject.bramble.api.crypto.CryptoConstants; import org.briarproject.bramble.api.crypto.KeyPair; import org.briarproject.bramble.api.crypto.PublicKey; import org.briarproject.bramble.api.crypto.SecretKey; @@ -243,6 +244,23 @@ class ContactManagerImpl implements ContactManager, EventListener { db.transaction(false, txn -> setContactAlias(txn, c, alias)); } + @Override + public void setHandshakePublicKey(Transaction txn, ContactId c, + PublicKey handshakePublicKey) throws DbException { + if (handshakePublicKey.getKeyType() != + CryptoConstants.KEY_TYPE_AGREEMENT) { + throw new IllegalArgumentException(); + } + db.setHandshakePublicKey(txn, c, handshakePublicKey); + } + + @Override + public void setHandshakePublicKey(ContactId c, PublicKey handshakePublicKey) + throws DbException { + db.transaction(false, + txn -> setHandshakePublicKey(txn, c, handshakePublicKey)); + } + @Override public boolean contactExists(Transaction txn, AuthorId remoteAuthorId, AuthorId localAuthorId) throws DbException { diff --git a/bramble-core/src/main/java/org/briarproject/bramble/db/Database.java b/bramble-core/src/main/java/org/briarproject/bramble/db/Database.java index f6745af24..bd7568dc1 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/db/Database.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/db/Database.java @@ -32,6 +32,7 @@ import org.briarproject.bramble.api.transport.KeySetId; import org.briarproject.bramble.api.transport.TransportKeySet; import org.briarproject.bramble.api.transport.TransportKeys; +import java.sql.Connection; import java.util.Collection; import java.util.List; import java.util.Map; @@ -695,6 +696,11 @@ interface Database { void setHandshakeKeyPair(T txn, AuthorId local, PublicKey publicKey, PrivateKey privateKey) throws DbException; + /** + * Sets the handshake public key for a given contact + */ + void setHandshakePublicKey(T txn, ContactId c, PublicKey handshakePublicKey) throws DbException; + /** * Marks the given message as permanent, i.e. not temporary. */ diff --git a/bramble-core/src/main/java/org/briarproject/bramble/db/DatabaseComponentImpl.java b/bramble-core/src/main/java/org/briarproject/bramble/db/DatabaseComponentImpl.java index 6ec1760af..245efde96 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/db/DatabaseComponentImpl.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/db/DatabaseComponentImpl.java @@ -1040,6 +1040,15 @@ class DatabaseComponentImpl implements DatabaseComponent { } } + @Override + public void setHandshakePublicKey(Transaction transaction, ContactId c, PublicKey handshakePublicKey) throws DbException { + if (transaction.isReadOnly()) throw new IllegalArgumentException(); + T txn = unbox(transaction); + if (!db.containsContact(txn, c)) + throw new NoSuchContactException(); + db.setHandshakePublicKey(txn, c, handshakePublicKey); + } + @Override public void setHandshakeKeyPair(Transaction transaction, AuthorId local, PublicKey publicKey, PrivateKey privateKey) throws DbException { diff --git a/bramble-core/src/main/java/org/briarproject/bramble/db/JdbcDatabase.java b/bramble-core/src/main/java/org/briarproject/bramble/db/JdbcDatabase.java index c56b48e8d..6b2471952 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/db/JdbcDatabase.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/db/JdbcDatabase.java @@ -3058,6 +3058,23 @@ abstract class JdbcDatabase implements Database { } } + @Override + public void setHandshakePublicKey(Connection txn, ContactId c, PublicKey handshakePublicKey) throws DbException { + PreparedStatement ps = null; + try { + String sql = "UPDATE contacts SET handshakePublicKey = ? WHERE contactId = ?"; + ps = txn.prepareStatement(sql); + ps.setBytes(1, handshakePublicKey.getEncoded()); + ps.setInt(2, c.getInt()); + int affected = ps.executeUpdate(); + if (affected < 0 || affected > 1) throw new DbStateException(); + ps.close(); + } catch (SQLException e) { + tryToClose(ps, LOG, WARNING); + throw new DbException(e); + } + } + @Override public void setGroupVisibility(Connection txn, ContactId c, GroupId g, boolean shared) throws DbException { From fad92570661bd1d3bd9f9424a68cb2b76013a788 Mon Sep 17 00:00:00 2001 From: ameba23 Date: Mon, 28 Jun 2021 13:46:52 +0200 Subject: [PATCH 11/31] Set a contacts handshake public key on receiving one --- .../handshakekeyexchange/HandshakeKeyExchangeManagerImpl.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/briar-core/src/main/java/org/briarproject/briar/handshakekeyexchange/HandshakeKeyExchangeManagerImpl.java b/briar-core/src/main/java/org/briarproject/briar/handshakekeyexchange/HandshakeKeyExchangeManagerImpl.java index 3240ed458..a723db5a2 100644 --- a/briar-core/src/main/java/org/briarproject/briar/handshakekeyexchange/HandshakeKeyExchangeManagerImpl.java +++ b/briar-core/src/main/java/org/briarproject/briar/handshakekeyexchange/HandshakeKeyExchangeManagerImpl.java @@ -159,6 +159,7 @@ public class HandshakeKeyExchangeManagerImpl extends ConversationClientImpl return false; } PublicKey handshakePublicKey = new AgreementPublicKey(body.getRaw(0)); + contactManager.setHandshakePublicKey(txn, contactId, handshakePublicKey); return false; } @@ -194,6 +195,7 @@ public class HandshakeKeyExchangeManagerImpl extends ConversationClientImpl private void sendHandshakePublicKey(Transaction txn, Contact c) throws DbException { + LOG.info("Sending our handshake public key to " + c.getAlias()); Group group = getContactGroup(c); GroupId g = group.getId(); if (!db.containsGroup(txn, g)) db.addGroup(txn, group); From 75631721212173ced686c6bd1d658379ff03948e Mon Sep 17 00:00:00 2001 From: ameba23 Date: Mon, 28 Jun 2021 17:04:53 +0200 Subject: [PATCH 12/31] Logging --- .../HandshakeKeyExchangeManagerImpl.java | 26 ++++++++----------- 1 file changed, 11 insertions(+), 15 deletions(-) diff --git a/briar-core/src/main/java/org/briarproject/briar/handshakekeyexchange/HandshakeKeyExchangeManagerImpl.java b/briar-core/src/main/java/org/briarproject/briar/handshakekeyexchange/HandshakeKeyExchangeManagerImpl.java index a723db5a2..e3ed70d94 100644 --- a/briar-core/src/main/java/org/briarproject/briar/handshakekeyexchange/HandshakeKeyExchangeManagerImpl.java +++ b/briar-core/src/main/java/org/briarproject/briar/handshakekeyexchange/HandshakeKeyExchangeManagerImpl.java @@ -15,7 +15,6 @@ import org.briarproject.bramble.api.data.MetadataParser; import org.briarproject.bramble.api.db.DatabaseComponent; import org.briarproject.bramble.api.db.DbException; import org.briarproject.bramble.api.db.Transaction; -import org.briarproject.bramble.api.identity.Identity; import org.briarproject.bramble.api.identity.IdentityManager; import org.briarproject.bramble.api.lifecycle.LifecycleManager; import org.briarproject.bramble.api.sync.Group; @@ -23,10 +22,8 @@ import org.briarproject.bramble.api.sync.GroupId; import org.briarproject.bramble.api.sync.Message; import org.briarproject.bramble.api.sync.MessageId; import org.briarproject.bramble.api.system.Clock; -import org.briarproject.bramble.api.versioning.ClientVersion; import org.briarproject.bramble.api.versioning.ClientVersioningManager; import org.briarproject.briar.api.client.MessageTracker; -import org.briarproject.briar.api.conversation.ConversationManager; import org.briarproject.briar.api.conversation.ConversationMessageHeader; import org.briarproject.briar.api.conversation.DeletionResult; import org.briarproject.briar.api.handshakekeyexchange.HandshakeKeyExchangeManager; @@ -61,7 +58,7 @@ public class HandshakeKeyExchangeManagerImpl extends ConversationClientImpl @Inject - protected HandshakeKeyExchangeManagerImpl ( + protected HandshakeKeyExchangeManagerImpl( DatabaseComponent db, ClientHelper clientHelper, MetadataParser metadataParser, @@ -78,7 +75,8 @@ public class HandshakeKeyExchangeManagerImpl extends ConversationClientImpl this.contactManager = contactManager; this.identityManager = identityManager; this.clock = clock; - localGroup = contactGroupFactory.createLocalGroup(CLIENT_ID, MAJOR_VERSION); + localGroup = + contactGroupFactory.createLocalGroup(CLIENT_ID, MAJOR_VERSION); } @Override @@ -91,6 +89,7 @@ public class HandshakeKeyExchangeManagerImpl extends ConversationClientImpl // Set things up for any pre-existing contacts for (Contact c : db.getContacts(txn)) addingContact(txn, c); + LOG.info("HelloFromHandshake"); } @Override @@ -119,12 +118,6 @@ public class HandshakeKeyExchangeManagerImpl extends ConversationClientImpl } } - @Override - public void setReadFlag(GroupId g, MessageId m, boolean read) - throws DbException { - - } - @Override public DeletionResult deleteAllMessages(Transaction txn, ContactId c) throws DbException { @@ -153,13 +146,15 @@ public class HandshakeKeyExchangeManagerImpl extends ConversationClientImpl BdfDictionary meta) throws DbException, FormatException { LOG.info("Incoming HandshakeKeyExchange message"); ContactId contactId = getContactId(txn, m.getGroupId()); - Contact c = contactManager.getContact(txn, contactId); + Contact c = contactManager.getContact(txn, contactId); if (c.getHandshakePublicKey() != null) { LOG.info("Already have public key - ignoring message"); return false; } + LOG.info("Adding contact's handshake public key"); PublicKey handshakePublicKey = new AgreementPublicKey(body.getRaw(0)); - contactManager.setHandshakePublicKey(txn, contactId, handshakePublicKey); + contactManager + .setHandshakePublicKey(txn, contactId, handshakePublicKey); return false; } @@ -169,7 +164,8 @@ public class HandshakeKeyExchangeManagerImpl extends ConversationClientImpl BdfDictionary meta = clientHelper.getGroupMetadataAsDictionary(txn, g); return new ContactId(meta.getLong( - HandshakeKeyExchangeConstants.GROUP_KEY_CONTACT_ID).intValue()); + HandshakeKeyExchangeConstants.GROUP_KEY_CONTACT_ID) + .intValue()); } catch (FormatException e) { throw new DbException(e); } @@ -189,7 +185,7 @@ public class HandshakeKeyExchangeManagerImpl extends ConversationClientImpl setContactId(txn, g.getId(), c.getId()); if (c.getHandshakePublicKey() == null) { - sendHandshakePublicKey(txn, c); + sendHandshakePublicKey(txn, c); } } From 36aaea40bdf0bcf96a8fdf44a2a75d35b9fa635b Mon Sep 17 00:00:00 2001 From: ameba23 Date: Mon, 28 Jun 2021 17:18:12 +0200 Subject: [PATCH 13/31] Register the client and hooks --- .../HandshakeKeyExchangeManagerImpl.java | 10 +++++++- .../HandshakeKeyExchangeModule.java | 23 ++++++++++++++++++- 2 files changed, 31 insertions(+), 2 deletions(-) diff --git a/briar-core/src/main/java/org/briarproject/briar/handshakekeyexchange/HandshakeKeyExchangeManagerImpl.java b/briar-core/src/main/java/org/briarproject/briar/handshakekeyexchange/HandshakeKeyExchangeManagerImpl.java index e3ed70d94..66ab7a8ce 100644 --- a/briar-core/src/main/java/org/briarproject/briar/handshakekeyexchange/HandshakeKeyExchangeManagerImpl.java +++ b/briar-core/src/main/java/org/briarproject/briar/handshakekeyexchange/HandshakeKeyExchangeManagerImpl.java @@ -44,7 +44,7 @@ import static org.briarproject.briar.handshakekeyexchange.HandshakeKeyExchangeCo public class HandshakeKeyExchangeManagerImpl extends ConversationClientImpl implements HandshakeKeyExchangeManager, LifecycleManager.OpenDatabaseHook, - ContactManager.ContactHook { + ContactManager.ContactHook, ClientVersioningManager.ClientVersioningHook { private final ClientVersioningManager clientVersioningManager; private final ContactGroupFactory contactGroupFactory; @@ -230,4 +230,12 @@ public class HandshakeKeyExchangeManagerImpl extends ConversationClientImpl throw new AssertionError(e); } } + + @Override + public void onClientVisibilityChanging(Transaction txn, Contact c, + Group.Visibility v) throws DbException { + // Apply the client's visibility to the contact group + Group g = getContactGroup(c); + db.setGroupVisibility(txn, c.getId(), g.getId(), v); + } } diff --git a/briar-core/src/main/java/org/briarproject/briar/handshakekeyexchange/HandshakeKeyExchangeModule.java b/briar-core/src/main/java/org/briarproject/briar/handshakekeyexchange/HandshakeKeyExchangeModule.java index 011b4a7c4..925b80e7c 100644 --- a/briar-core/src/main/java/org/briarproject/briar/handshakekeyexchange/HandshakeKeyExchangeModule.java +++ b/briar-core/src/main/java/org/briarproject/briar/handshakekeyexchange/HandshakeKeyExchangeModule.java @@ -1,5 +1,10 @@ package org.briarproject.briar.handshakekeyexchange; +import org.briarproject.bramble.api.contact.ContactManager; +import org.briarproject.bramble.api.lifecycle.LifecycleManager; +import org.briarproject.bramble.api.sync.validation.ValidationManager; +import org.briarproject.bramble.api.versioning.ClientVersioningManager; +import org.briarproject.briar.api.conversation.ConversationManager; import org.briarproject.briar.api.handshakekeyexchange.HandshakeKeyExchangeManager; import javax.inject.Inject; @@ -17,7 +22,23 @@ public class HandshakeKeyExchangeModule { @Provides @Singleton - HandshakeKeyExchangeManager handshakeKeyExchangeManager(HandshakeKeyExchangeManagerImpl handshakeKeyExchangeManager) { + HandshakeKeyExchangeManager handshakeKeyExchangeManager( + LifecycleManager lifecycleManager, + ValidationManager validationManager, + ContactManager contactManager, + ClientVersioningManager clientVersioningManager, + ConversationManager conversationManager, + HandshakeKeyExchangeManagerImpl handshakeKeyExchangeManager) { + + lifecycleManager.registerOpenDatabaseHook(handshakeKeyExchangeManager); + validationManager + .registerIncomingMessageHook(HandshakeKeyExchangeManager.CLIENT_ID, + HandshakeKeyExchangeManager.MAJOR_VERSION, handshakeKeyExchangeManager); + + contactManager.registerContactHook(handshakeKeyExchangeManager); + clientVersioningManager.registerClient(HandshakeKeyExchangeManager.CLIENT_ID, HandshakeKeyExchangeManager.MAJOR_VERSION, + HandshakeKeyExchangeManager.MINOR_VERSION, handshakeKeyExchangeManager); + conversationManager.registerConversationClient(handshakeKeyExchangeManager); return handshakeKeyExchangeManager; } } From 851bbb293e9976f12337de615aa925216544ccc5 Mon Sep 17 00:00:00 2001 From: ameba23 Date: Mon, 28 Jun 2021 17:20:17 +0200 Subject: [PATCH 14/31] Rm logging --- .../handshakekeyexchange/HandshakeKeyExchangeManagerImpl.java | 1 - 1 file changed, 1 deletion(-) diff --git a/briar-core/src/main/java/org/briarproject/briar/handshakekeyexchange/HandshakeKeyExchangeManagerImpl.java b/briar-core/src/main/java/org/briarproject/briar/handshakekeyexchange/HandshakeKeyExchangeManagerImpl.java index 66ab7a8ce..f8f613f82 100644 --- a/briar-core/src/main/java/org/briarproject/briar/handshakekeyexchange/HandshakeKeyExchangeManagerImpl.java +++ b/briar-core/src/main/java/org/briarproject/briar/handshakekeyexchange/HandshakeKeyExchangeManagerImpl.java @@ -89,7 +89,6 @@ public class HandshakeKeyExchangeManagerImpl extends ConversationClientImpl // Set things up for any pre-existing contacts for (Contact c : db.getContacts(txn)) addingContact(txn, c); - LOG.info("HelloFromHandshake"); } @Override From b860e73bdc15f2520c83c0b32a4cb9b5c361a0fe Mon Sep 17 00:00:00 2001 From: ameba23 Date: Mon, 28 Jun 2021 17:34:38 +0200 Subject: [PATCH 15/31] Return an empty list when getting headers --- .../HandshakeKeyExchangeManagerImpl.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/briar-core/src/main/java/org/briarproject/briar/handshakekeyexchange/HandshakeKeyExchangeManagerImpl.java b/briar-core/src/main/java/org/briarproject/briar/handshakekeyexchange/HandshakeKeyExchangeManagerImpl.java index f8f613f82..2d41e67d2 100644 --- a/briar-core/src/main/java/org/briarproject/briar/handshakekeyexchange/HandshakeKeyExchangeManagerImpl.java +++ b/briar-core/src/main/java/org/briarproject/briar/handshakekeyexchange/HandshakeKeyExchangeManagerImpl.java @@ -29,6 +29,7 @@ import org.briarproject.briar.api.conversation.DeletionResult; import org.briarproject.briar.api.handshakekeyexchange.HandshakeKeyExchangeManager; import org.briarproject.briar.client.ConversationClientImpl; +import java.util.ArrayList; import java.util.Collection; import java.util.Map; import java.util.Set; @@ -44,7 +45,8 @@ import static org.briarproject.briar.handshakekeyexchange.HandshakeKeyExchangeCo public class HandshakeKeyExchangeManagerImpl extends ConversationClientImpl implements HandshakeKeyExchangeManager, LifecycleManager.OpenDatabaseHook, - ContactManager.ContactHook, ClientVersioningManager.ClientVersioningHook { + ContactManager.ContactHook, + ClientVersioningManager.ClientVersioningHook { private final ClientVersioningManager clientVersioningManager; private final ContactGroupFactory contactGroupFactory; @@ -100,7 +102,7 @@ public class HandshakeKeyExchangeManagerImpl extends ConversationClientImpl @Override public Collection getMessageHeaders( Transaction txn, ContactId contactId) throws DbException { - return null; + return new ArrayList<>(); } @Override From eb66a13dedd5967e791125ac4e24c9d4b9f46639 Mon Sep 17 00:00:00 2001 From: ameba23 Date: Tue, 29 Jun 2021 09:48:19 +0200 Subject: [PATCH 16/31] Implement message validator for handshake key exchange --- .../HandshakeKeyExchangeManagerImpl.java | 19 ++++++++++++------ .../HandshakeKeyExchangeModule.java | 20 +++++++++++++++++++ .../HandshakeKeyExchangeValidator.java | 11 +++++++++- 3 files changed, 43 insertions(+), 7 deletions(-) diff --git a/briar-core/src/main/java/org/briarproject/briar/handshakekeyexchange/HandshakeKeyExchangeManagerImpl.java b/briar-core/src/main/java/org/briarproject/briar/handshakekeyexchange/HandshakeKeyExchangeManagerImpl.java index 2d41e67d2..cd7bf4380 100644 --- a/briar-core/src/main/java/org/briarproject/briar/handshakekeyexchange/HandshakeKeyExchangeManagerImpl.java +++ b/briar-core/src/main/java/org/briarproject/briar/handshakekeyexchange/HandshakeKeyExchangeManagerImpl.java @@ -83,14 +83,21 @@ public class HandshakeKeyExchangeManagerImpl extends ConversationClientImpl @Override public void onDatabaseOpened(Transaction txn) throws DbException { - if (db.containsGroup(txn, localGroup.getId())) return; - db.addGroup(txn, localGroup); - // Get our own handshake public key handshakePublicKey = identityManager.getHandshakeKeys(txn).getPublic(); - // Set things up for any pre-existing contacts - for (Contact c : db.getContacts(txn)) addingContact(txn, c); + if (!db.containsGroup(txn, localGroup.getId())) { + db.addGroup(txn, localGroup); + + // Set things up for any pre-existing contacts + for (Contact c : db.getContacts(txn)) addingContact(txn, c); + } else { + for (Contact c : db.getContacts(txn)) { + if (c.getHandshakePublicKey() == null) { + sendHandshakePublicKey(txn, c); + } + } + } } @Override @@ -192,7 +199,7 @@ public class HandshakeKeyExchangeManagerImpl extends ConversationClientImpl private void sendHandshakePublicKey(Transaction txn, Contact c) throws DbException { - LOG.info("Sending our handshake public key to " + c.getAlias()); + LOG.info("Sending our handshake public key to " + c.getAuthor().getName()); Group group = getContactGroup(c); GroupId g = group.getId(); if (!db.containsGroup(txn, g)) db.addGroup(txn, group); diff --git a/briar-core/src/main/java/org/briarproject/briar/handshakekeyexchange/HandshakeKeyExchangeModule.java b/briar-core/src/main/java/org/briarproject/briar/handshakekeyexchange/HandshakeKeyExchangeModule.java index 925b80e7c..e1cb335f9 100644 --- a/briar-core/src/main/java/org/briarproject/briar/handshakekeyexchange/HandshakeKeyExchangeModule.java +++ b/briar-core/src/main/java/org/briarproject/briar/handshakekeyexchange/HandshakeKeyExchangeModule.java @@ -1,8 +1,11 @@ package org.briarproject.briar.handshakekeyexchange; +import org.briarproject.bramble.api.client.ClientHelper; import org.briarproject.bramble.api.contact.ContactManager; +import org.briarproject.bramble.api.data.MetadataEncoder; import org.briarproject.bramble.api.lifecycle.LifecycleManager; import org.briarproject.bramble.api.sync.validation.ValidationManager; +import org.briarproject.bramble.api.system.Clock; import org.briarproject.bramble.api.versioning.ClientVersioningManager; import org.briarproject.briar.api.conversation.ConversationManager; import org.briarproject.briar.api.handshakekeyexchange.HandshakeKeyExchangeManager; @@ -18,6 +21,9 @@ public class HandshakeKeyExchangeModule { public static class EagerSingletons { @Inject HandshakeKeyExchangeManager handshakeKeyExchangeManager; + + @Inject + HandshakeKeyExchangeValidator handshakeKeyExchangeValidator; } @Provides @@ -41,4 +47,18 @@ public class HandshakeKeyExchangeModule { conversationManager.registerConversationClient(handshakeKeyExchangeManager); return handshakeKeyExchangeManager; } + + @Provides + @Singleton + HandshakeKeyExchangeValidator handshakeKeyExchangeValidator( + ValidationManager validationManager, + ClientHelper clientHelper, + MetadataEncoder metadataEncoder, + Clock clock) { + HandshakeKeyExchangeValidator validator = + new HandshakeKeyExchangeValidator(clientHelper, metadataEncoder, clock); + validationManager.registerMessageValidator(HandshakeKeyExchangeManager.CLIENT_ID, HandshakeKeyExchangeManager.MAJOR_VERSION, + validator); + return validator; + } } diff --git a/briar-core/src/main/java/org/briarproject/briar/handshakekeyexchange/HandshakeKeyExchangeValidator.java b/briar-core/src/main/java/org/briarproject/briar/handshakekeyexchange/HandshakeKeyExchangeValidator.java index a030013a2..1a26694c7 100644 --- a/briar-core/src/main/java/org/briarproject/briar/handshakekeyexchange/HandshakeKeyExchangeValidator.java +++ b/briar-core/src/main/java/org/briarproject/briar/handshakekeyexchange/HandshakeKeyExchangeValidator.java @@ -4,12 +4,17 @@ import org.briarproject.bramble.api.FormatException; import org.briarproject.bramble.api.client.BdfMessageContext; import org.briarproject.bramble.api.client.BdfMessageValidator; import org.briarproject.bramble.api.client.ClientHelper; +import org.briarproject.bramble.api.data.BdfDictionary; +import org.briarproject.bramble.api.data.BdfEntry; import org.briarproject.bramble.api.data.BdfList; import org.briarproject.bramble.api.data.MetadataEncoder; import org.briarproject.bramble.api.sync.Group; import org.briarproject.bramble.api.sync.InvalidMessageException; import org.briarproject.bramble.api.sync.Message; import org.briarproject.bramble.api.system.Clock; +import static org.briarproject.briar.handshakekeyexchange.HandshakeKeyExchangeConstants.MSG_KEY_LOCAL; + +import static org.briarproject.bramble.util.ValidationUtils.checkSize; import javax.inject.Inject; @@ -26,6 +31,10 @@ public class HandshakeKeyExchangeValidator extends BdfMessageValidator { @Override protected BdfMessageContext validateMessage(Message m, Group g, BdfList body) throws InvalidMessageException, FormatException { - return null; + checkSize(body,1); + BdfDictionary meta = BdfDictionary.of( + new BdfEntry(MSG_KEY_LOCAL, false) + ); + return new BdfMessageContext(meta); } } From 4b9c3a1a96eb82e84f6bb7d161c0d5046ee831c9 Mon Sep 17 00:00:00 2001 From: ameba23 Date: Tue, 29 Jun 2021 11:43:14 +0200 Subject: [PATCH 17/31] Call KeyManager#AddContact when restoring contacts --- .../briarproject/bramble/api/contact/ContactManager.java | 9 ++++++--- .../briarproject/bramble/contact/ContactManagerImpl.java | 5 ++++- .../HandshakeKeyExchangeManagerImpl.java | 4 ++++ .../briar/socialbackup/recovery/RestoreAccountImpl.java | 3 +++ 4 files changed, 17 insertions(+), 4 deletions(-) diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/contact/ContactManager.java b/bramble-api/src/main/java/org/briarproject/bramble/api/contact/ContactManager.java index ccd459169..1cb466993 100644 --- a/bramble-api/src/main/java/org/briarproject/bramble/api/contact/ContactManager.java +++ b/bramble-api/src/main/java/org/briarproject/bramble/api/contact/ContactManager.java @@ -50,7 +50,8 @@ public interface ContactManager { boolean active) throws DbException; ContactId addContact(Transaction txn, Author remote, AuthorId local, - PublicKey handshake, boolean verified) throws DbException; + PublicKey handshake, boolean verified) + throws DbException, GeneralSecurityException; /** * Stores a contact associated with the given local and remote pseudonyms, @@ -212,12 +213,14 @@ public interface ContactManager { /** * Sets the contact's handshake public key */ - void setHandshakePublicKey(Transaction txn, ContactId c, PublicKey handshakePublicKey) throws DbException; + void setHandshakePublicKey(Transaction txn, ContactId c, + PublicKey handshakePublicKey) throws DbException; /** * Sets the contact's handshake public key */ - void setHandshakePublicKey(ContactId c, PublicKey handshakePublicKey) throws DbException; + void setHandshakePublicKey(ContactId c, PublicKey handshakePublicKey) + throws DbException; /** * Returns true if a contact with this {@code remoteAuthorId} belongs to diff --git a/bramble-core/src/main/java/org/briarproject/bramble/contact/ContactManagerImpl.java b/bramble-core/src/main/java/org/briarproject/bramble/contact/ContactManagerImpl.java index 6ec0ebdfd..a95b761b6 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/contact/ContactManagerImpl.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/contact/ContactManagerImpl.java @@ -122,9 +122,12 @@ class ContactManagerImpl implements ContactManager, EventListener { @Override public ContactId addContact(Transaction txn, Author remote, AuthorId local, - PublicKey handshake, boolean verified) throws DbException { + PublicKey handshake, boolean verified) + throws DbException, GeneralSecurityException { ContactId c = db.addContact(txn, remote, local, handshake, verified); Contact contact = db.getContact(txn, c); + KeyPair ourKeyPair = identityManager.getHandshakeKeys(txn); + keyManager.addContact(txn, c, handshake, ourKeyPair); for (ContactHook hook : hooks) hook.addingContact(txn, contact); return c; } diff --git a/briar-core/src/main/java/org/briarproject/briar/handshakekeyexchange/HandshakeKeyExchangeManagerImpl.java b/briar-core/src/main/java/org/briarproject/briar/handshakekeyexchange/HandshakeKeyExchangeManagerImpl.java index cd7bf4380..dd5bfd6b2 100644 --- a/briar-core/src/main/java/org/briarproject/briar/handshakekeyexchange/HandshakeKeyExchangeManagerImpl.java +++ b/briar-core/src/main/java/org/briarproject/briar/handshakekeyexchange/HandshakeKeyExchangeManagerImpl.java @@ -95,6 +95,8 @@ public class HandshakeKeyExchangeManagerImpl extends ConversationClientImpl for (Contact c : db.getContacts(txn)) { if (c.getHandshakePublicKey() == null) { sendHandshakePublicKey(txn, c); + } else { + LOG.info("Have pk for contact " + c.getAuthor().getName()); } } } @@ -194,6 +196,8 @@ public class HandshakeKeyExchangeManagerImpl extends ConversationClientImpl if (c.getHandshakePublicKey() == null) { sendHandshakePublicKey(txn, c); + } else { + LOG.info("Have pk for contact " + c.getAuthor().getName()); } } 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 50a05af35..1e91ede33 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 @@ -184,6 +184,9 @@ public class RestoreAccountImpl implements RestoreAccount { } catch (DbException e) { LOG.warning("Error adding contacts to database"); LOG.warning(e.getMessage()); + } catch (GeneralSecurityException e) { + LOG.warning("Error adding handshake key"); + LOG.warning(e.getMessage()); } LOG.info("Added all contacts"); } From 53c4ba184d99253a991652cea45cab89b4f92059 Mon Sep 17 00:00:00 2001 From: ameba23 Date: Tue, 29 Jun 2021 16:09:08 +0200 Subject: [PATCH 18/31] Improve logging for DuplexSyncConnection --- .../connection/IncomingDuplexSyncConnection.java | 12 ++++++------ .../connection/OutgoingDuplexSyncConnection.java | 3 ++- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/bramble-core/src/main/java/org/briarproject/bramble/connection/IncomingDuplexSyncConnection.java b/bramble-core/src/main/java/org/briarproject/bramble/connection/IncomingDuplexSyncConnection.java index 6e9c53e18..052f486d9 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/connection/IncomingDuplexSyncConnection.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/connection/IncomingDuplexSyncConnection.java @@ -3,7 +3,6 @@ package org.briarproject.bramble.connection; import org.briarproject.bramble.api.connection.ConnectionRegistry; import org.briarproject.bramble.api.contact.ContactId; import org.briarproject.bramble.api.contact.HandshakeManager; -import org.briarproject.bramble.api.contact.PendingContactId; import org.briarproject.bramble.api.db.DbException; import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.bramble.api.plugin.TransportId; @@ -50,7 +49,8 @@ class IncomingDuplexSyncConnection extends DuplexSyncConnection @Override public void run() { - LOG.info("Running IncomingDuplexSyncConnection"); + LOG.info("Running IncomingDuplexSyncConnection on transport " + + transportId.getString()); // Read and recognise the tag StreamContext ctx = recogniseTag(reader, transportId); if (ctx == null) { @@ -65,10 +65,10 @@ class IncomingDuplexSyncConnection extends DuplexSyncConnection return; } if (ctx.isHandshakeMode()) { - if (!performHandshake(ctx, contactId)) { - LOG.warning("Handshake failed"); - return; - } + if (!performHandshake(ctx, contactId)) { + LOG.warning("Handshake failed"); + return; + } // Allocate a rotation mode stream context ctx = allocateStreamContext(contactId, transportId); if (ctx == null) { diff --git a/bramble-core/src/main/java/org/briarproject/bramble/connection/OutgoingDuplexSyncConnection.java b/bramble-core/src/main/java/org/briarproject/bramble/connection/OutgoingDuplexSyncConnection.java index 382e6e23f..000150287 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/connection/OutgoingDuplexSyncConnection.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/connection/OutgoingDuplexSyncConnection.java @@ -61,7 +61,8 @@ class OutgoingDuplexSyncConnection extends DuplexSyncConnection @Override public void run() { - LOG.info("Running OutgoingDuplexSyncConnection"); + LOG.info("Running OutgoingDuplexSyncConnection on transport " + + transportId.getString()); // Allocate a stream context StreamContext ctx = allocateStreamContext(contactId, transportId); if (ctx == null) { From 1eb6be2407996bbf117ebb6cceb095ef2fdc36cb Mon Sep 17 00:00:00 2001 From: ameba23 Date: Tue, 29 Jun 2021 16:40:05 +0200 Subject: [PATCH 19/31] Only add Tor transport properties to our social backup --- .../briar/socialbackup/SocialBackupManagerImpl.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/briar-core/src/main/java/org/briarproject/briar/socialbackup/SocialBackupManagerImpl.java b/briar-core/src/main/java/org/briarproject/briar/socialbackup/SocialBackupManagerImpl.java index f5d1f5998..530542d00 100644 --- a/briar-core/src/main/java/org/briarproject/briar/socialbackup/SocialBackupManagerImpl.java +++ b/briar-core/src/main/java/org/briarproject/briar/socialbackup/SocialBackupManagerImpl.java @@ -25,8 +25,6 @@ import org.briarproject.bramble.api.identity.IdentityManager; import org.briarproject.bramble.api.identity.LocalAuthor; import org.briarproject.bramble.api.lifecycle.LifecycleManager.OpenDatabaseHook; import org.briarproject.bramble.api.nullsafety.NotNullByDefault; -import org.briarproject.bramble.api.plugin.BluetoothConstants; -import org.briarproject.bramble.api.plugin.LanTcpConstants; import org.briarproject.bramble.api.plugin.TorConstants; import org.briarproject.bramble.api.plugin.TransportId; import org.briarproject.bramble.api.properties.TransportProperties; @@ -482,8 +480,8 @@ class SocialBackupManagerImpl extends ConversationClientImpl private Map getTransportProperties( Transaction txn, ContactId c) throws DbException { // TODO: Include filtered properties for other transports - TransportId ids[] = - {TorConstants.ID, LanTcpConstants.ID, BluetoothConstants.ID}; + TransportId ids[] = {TorConstants.ID}; +// {TorConstants.ID, LanTcpConstants.ID, BluetoothConstants.ID}; Map props = new HashMap(); for (TransportId id : ids) { props.put(id, transportPropertyManager From b7d71a21b02f4bbaaceb6f1ac3fd5d11a846ad96 Mon Sep 17 00:00:00 2001 From: ameba23 Date: Tue, 20 Jul 2021 11:40:14 +0200 Subject: [PATCH 20/31] When setting remote handshake key, derive tags --- .../briarproject/bramble/contact/ContactManagerImpl.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/bramble-core/src/main/java/org/briarproject/bramble/contact/ContactManagerImpl.java b/bramble-core/src/main/java/org/briarproject/bramble/contact/ContactManagerImpl.java index a95b761b6..0dfc76dfe 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/contact/ContactManagerImpl.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/contact/ContactManagerImpl.java @@ -1,5 +1,7 @@ package org.briarproject.bramble.contact; +import com.sun.tools.javac.jvm.Gen; + import org.briarproject.bramble.api.FormatException; import org.briarproject.bramble.api.Pair; import org.briarproject.bramble.api.contact.Contact; @@ -249,17 +251,19 @@ class ContactManagerImpl implements ContactManager, EventListener { @Override public void setHandshakePublicKey(Transaction txn, ContactId c, - PublicKey handshakePublicKey) throws DbException { + PublicKey handshakePublicKey) throws DbException, GeneralSecurityException { if (handshakePublicKey.getKeyType() != CryptoConstants.KEY_TYPE_AGREEMENT) { throw new IllegalArgumentException(); } db.setHandshakePublicKey(txn, c, handshakePublicKey); + KeyPair ourKeyPair = identityManager.getHandshakeKeys(txn); + keyManager.addContact(txn, c, handshakePublicKey, ourKeyPair); } @Override public void setHandshakePublicKey(ContactId c, PublicKey handshakePublicKey) - throws DbException { + throws DbException, GeneralSecurityException { db.transaction(false, txn -> setHandshakePublicKey(txn, c, handshakePublicKey)); } From 6fc6ae727f82f2e3d8b94a7ddddf8db15d919600 Mon Sep 17 00:00:00 2001 From: ameba23 Date: Tue, 20 Jul 2021 11:40:53 +0200 Subject: [PATCH 21/31] Handle security exception when setting handshake public key --- .../org/briarproject/bramble/api/contact/ContactManager.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/contact/ContactManager.java b/bramble-api/src/main/java/org/briarproject/bramble/api/contact/ContactManager.java index 1cb466993..ed645e6e7 100644 --- a/bramble-api/src/main/java/org/briarproject/bramble/api/contact/ContactManager.java +++ b/bramble-api/src/main/java/org/briarproject/bramble/api/contact/ContactManager.java @@ -214,13 +214,14 @@ public interface ContactManager { * Sets the contact's handshake public key */ void setHandshakePublicKey(Transaction txn, ContactId c, - PublicKey handshakePublicKey) throws DbException; + PublicKey handshakePublicKey) throws DbException, + GeneralSecurityException; /** * Sets the contact's handshake public key */ void setHandshakePublicKey(ContactId c, PublicKey handshakePublicKey) - throws DbException; + throws DbException, GeneralSecurityException; /** * Returns true if a contact with this {@code remoteAuthorId} belongs to From 27b402f57c25051130c08047fb49840f40bdb00d Mon Sep 17 00:00:00 2001 From: ameba23 Date: Tue, 20 Jul 2021 11:41:17 +0200 Subject: [PATCH 22/31] Log warning on failure to set handshake public key --- .../HandshakeKeyExchangeManagerImpl.java | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/briar-core/src/main/java/org/briarproject/briar/handshakekeyexchange/HandshakeKeyExchangeManagerImpl.java b/briar-core/src/main/java/org/briarproject/briar/handshakekeyexchange/HandshakeKeyExchangeManagerImpl.java index dd5bfd6b2..5a6d9010c 100644 --- a/briar-core/src/main/java/org/briarproject/briar/handshakekeyexchange/HandshakeKeyExchangeManagerImpl.java +++ b/briar-core/src/main/java/org/briarproject/briar/handshakekeyexchange/HandshakeKeyExchangeManagerImpl.java @@ -29,6 +29,7 @@ import org.briarproject.briar.api.conversation.DeletionResult; import org.briarproject.briar.api.handshakekeyexchange.HandshakeKeyExchangeManager; import org.briarproject.briar.client.ConversationClientImpl; +import java.security.GeneralSecurityException; import java.util.ArrayList; import java.util.Collection; import java.util.Map; @@ -163,8 +164,14 @@ public class HandshakeKeyExchangeManagerImpl extends ConversationClientImpl } LOG.info("Adding contact's handshake public key"); PublicKey handshakePublicKey = new AgreementPublicKey(body.getRaw(0)); - contactManager - .setHandshakePublicKey(txn, contactId, handshakePublicKey); + + try { + contactManager + .setHandshakePublicKey(txn, contactId, handshakePublicKey); + } catch (GeneralSecurityException e) { + LOG.warning("Security exception when adding remote handshake public key"); + e.printStackTrace(); + } return false; } From 5e530c25b6fdc40e15629d48e34efb294bd69126 Mon Sep 17 00:00:00 2001 From: ameba23 Date: Tue, 20 Jul 2021 12:15:21 +0200 Subject: [PATCH 23/31] Rm unused import --- .../org/briarproject/bramble/contact/ContactManagerImpl.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/bramble-core/src/main/java/org/briarproject/bramble/contact/ContactManagerImpl.java b/bramble-core/src/main/java/org/briarproject/bramble/contact/ContactManagerImpl.java index 0dfc76dfe..f1882fbbe 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/contact/ContactManagerImpl.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/contact/ContactManagerImpl.java @@ -1,7 +1,5 @@ package org.briarproject.bramble.contact; -import com.sun.tools.javac.jvm.Gen; - import org.briarproject.bramble.api.FormatException; import org.briarproject.bramble.api.Pair; import org.briarproject.bramble.api.contact.Contact; From c49c1f78d258bce0d0b85e57e23f4c820ca27f39 Mon Sep 17 00:00:00 2001 From: ameba23 Date: Fri, 27 Aug 2021 12:08:36 +0200 Subject: [PATCH 24/31] Disable help recover account option by default --- .../conversation/ConversationActivity.java | 7 +++++++ .../conversation/ConversationViewModel.java | 18 +++++++++++++++++- .../src/main/res/menu/conversation_actions.xml | 1 + 3 files changed, 25 insertions(+), 1 deletion(-) diff --git a/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationActivity.java b/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationActivity.java index 3c9cb48f8..e2e16ffe0 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationActivity.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationActivity.java @@ -371,6 +371,13 @@ public class ConversationActivity extends BriarActivity observeOnce(viewModel.getContactItem(), this, contact -> menu.findItem(R.id.action_set_alias).setEnabled(true)); + // enable help recover account action if available + observeOnce(viewModel.amCustodian(), this, enable -> { + if (enable) { + menu.findItem(R.id.action_help_recover_account).setEnabled(true); + } + }); + return super.onCreateOptionsMenu(menu); } diff --git a/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationViewModel.java b/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationViewModel.java index 2a7e23dc7..2fa2533d5 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationViewModel.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationViewModel.java @@ -40,6 +40,8 @@ import org.briarproject.briar.api.messaging.PrivateMessage; import org.briarproject.briar.api.messaging.PrivateMessageFactory; import org.briarproject.briar.api.messaging.PrivateMessageHeader; import org.briarproject.briar.api.messaging.event.AttachmentReceivedEvent; +import org.briarproject.briar.api.socialbackup.SocialBackup; +import org.briarproject.briar.api.socialbackup.SocialBackupManager; import java.util.Collection; import java.util.List; @@ -84,6 +86,7 @@ public class ConversationViewModel extends DbViewModel private final PrivateMessageFactory privateMessageFactory; private final AttachmentRetriever attachmentRetriever; private final AttachmentCreator attachmentCreator; + private final SocialBackupManager socialBackupManager; @Nullable private ContactId contactId = null; @@ -104,6 +107,7 @@ public class ConversationViewModel extends DbViewModel new MutableLiveData<>(); private final MutableLiveEvent addedHeader = new MutableLiveEvent<>(); + private final MutableLiveData amCustodian = new MutableLiveData<>(); @Inject ConversationViewModel(Application application, @@ -118,7 +122,8 @@ public class ConversationViewModel extends DbViewModel SettingsManager settingsManager, PrivateMessageFactory privateMessageFactory, AttachmentRetriever attachmentRetriever, - AttachmentCreator attachmentCreator) { + AttachmentCreator attachmentCreator, + SocialBackupManager socialBackupManager) { super(application, dbExecutor, lifecycleManager, db, androidExecutor); this.db = db; this.eventBus = eventBus; @@ -129,6 +134,7 @@ public class ConversationViewModel extends DbViewModel this.privateMessageFactory = privateMessageFactory; this.attachmentRetriever = attachmentRetriever; this.attachmentCreator = attachmentCreator; + this.socialBackupManager = socialBackupManager; messagingGroupId = map(contactItem, c -> messagingManager.getContactGroup(c.getContact()).getId()); contactDeleted.setValue(false); @@ -296,6 +302,12 @@ public class ConversationViewModel extends DbViewModel onOnboardingShown(SHOW_ONBOARDING_INTRODUCTION); showIntroductionOnboarding.postEvent(true); } + + // Check if we are a social backup custodian for this contact + boolean amCustodianBool = db.transactionWithResult(true, + txn -> socialBackupManager.amCustodian(txn, c)); + amCustodian.postValue(amCustodianBool); + } @DatabaseExecutor @@ -381,6 +393,10 @@ public class ConversationViewModel extends DbViewModel return addedHeader; } + LiveData amCustodian() { + return amCustodian; + } + @UiThread void recheckFeaturesAndOnboarding(ContactId contactId) { runOnDbThread(() -> { diff --git a/briar-android/src/main/res/menu/conversation_actions.xml b/briar-android/src/main/res/menu/conversation_actions.xml index da47ae7d4..0165f3366 100644 --- a/briar-android/src/main/res/menu/conversation_actions.xml +++ b/briar-android/src/main/res/menu/conversation_actions.xml @@ -31,5 +31,6 @@ android:id="@+id/action_help_recover_account" android:icon="@drawable/introduction_white" android:title="@string/help_recover_account" + android:enabled="false" app:showAsAction="never"/> \ No newline at end of file From be8e5c4bf2a09760ab0613c3772f990c470969e8 Mon Sep 17 00:00:00 2001 From: ameba23 Date: Fri, 27 Aug 2021 12:30:10 +0200 Subject: [PATCH 25/31] When creating social backup, only allow selecting contacts when there are at least 2 contacts in contact list --- .../DistributedBackupActivity.java | 18 ++++++++++++++++++ briar-android/src/main/res/values/strings.xml | 3 +++ 2 files changed, 21 insertions(+) diff --git a/briar-android/src/main/java/org/briarproject/briar/android/socialbackup/DistributedBackupActivity.java b/briar-android/src/main/java/org/briarproject/briar/android/socialbackup/DistributedBackupActivity.java index 593670034..aa9f48275 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/socialbackup/DistributedBackupActivity.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/socialbackup/DistributedBackupActivity.java @@ -4,6 +4,7 @@ import android.os.Bundle; import android.widget.Toast; import org.briarproject.bramble.api.contact.ContactId; +import org.briarproject.bramble.api.contact.ContactManager; import org.briarproject.bramble.api.db.DatabaseComponent; import org.briarproject.bramble.api.db.DbException; import org.briarproject.briar.R; @@ -29,6 +30,9 @@ public class DistributedBackupActivity extends BriarActivity implements @Inject public SocialBackupManager socialBackupManager; + @Inject + public ContactManager contactManager; + @Inject public DatabaseComponent db; @@ -52,6 +56,20 @@ public class DistributedBackupActivity extends BriarActivity implements showInitialFragment(fragment); }); } catch (DbException e) { + // Check the number of contacts in the contacts list > 1 + try { + if (contactManager.getContacts().size() < 2) { + Toast.makeText(this, + R.string.social_backup_not_enough_contacts, + Toast.LENGTH_LONG).show(); + finish(); + } + } catch (DbException dbException) { + Toast.makeText(this, + R.string.reading_contacts_error, + Toast.LENGTH_LONG).show(); + finish(); + } CustodianSelectorFragment fragment = CustodianSelectorFragment.newInstance(); showInitialFragment(fragment); diff --git a/briar-android/src/main/res/values/strings.xml b/briar-android/src/main/res/values/strings.xml index 0d6560783..3d4390b41 100644 --- a/briar-android/src/main/res/values/strings.xml +++ b/briar-android/src/main/res/values/strings.xml @@ -729,4 +729,7 @@ Recover Account Help recover account %d of the following contacts are needed to restore your account: + + To make a social backup, you need at least 2 contacts in your contacts list + There was an error reading your contacts list From 3835dcf3a724914eb982b8e202353d2adbdbf08e Mon Sep 17 00:00:00 2001 From: ameba23 Date: Fri, 27 Aug 2021 12:42:36 +0200 Subject: [PATCH 26/31] Improve lost password and setup password dialog for social backup --- briar-android/src/main/res/values/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/briar-android/src/main/res/values/strings.xml b/briar-android/src/main/res/values/strings.xml index 3d4390b41..5a5f1683e 100644 --- a/briar-android/src/main/res/values/strings.xml +++ b/briar-android/src/main/res/values/strings.xml @@ -9,7 +9,7 @@ Your nickname will be shown next to any content you post. You can\'t change it after creating your account. Next Choose a Password - Your Briar account is stored encrypted on your device, not in the cloud. If you forget your password or uninstall Briar, there\'s no way to recover your account.\n\nChoose a long password that\'s hard to guess, such as four random words, or ten random letters, numbers and symbols. + Your Briar account is stored encrypted on your device, not in the cloud. If you forget your password or uninstall Briar, you can only recover your account if you have made a social backup.\n\nChoose a long password that\'s hard to guess, such as four random words, or ten random letters, numbers and symbols. Background Connections To receive messages, Briar needs to stay connected in the background. To receive messages, Briar needs to stay connected in the background. Please disable battery optimizations so Briar can stay connected. @@ -37,7 +37,7 @@ Sign In I have forgotten my password Lost Password - Your Briar account is stored encrypted on your device, not in the cloud, so we can\'t reset your password. Would you like to delete your account and start again?\n\nCaution: Your identities, contacts and messages will be permanently lost. + Your Briar account is stored encrypted on your device, not in the cloud, so we can\'t reset your password. If you have made a social backup, you can delete your account and set a new password when you restore it. Would you like to delete your account and start again?\n\nCaution: Your identities, contacts and messages will be permanently lost if you do not have a backup. Briar could not start Tap for more information. Briar Startup Failure From 67dbc3d9a00c06785e9b3497817b980cdef86ecd Mon Sep 17 00:00:00 2001 From: ameba23 Date: Fri, 27 Aug 2021 14:49:25 +0200 Subject: [PATCH 27/31] Tell animal sniffer gradle plugin to ignore java.util.Objects --- bramble-core/build.gradle | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/bramble-core/build.gradle b/bramble-core/build.gradle index ce33f1ad9..217b1985a 100644 --- a/bramble-core/build.gradle +++ b/bramble-core/build.gradle @@ -31,6 +31,14 @@ dependencies { signature 'org.codehaus.mojo.signature:java16:1.1@signature' } +animalsniffer { + // Allow requireNonNull: Android desugaring rewrites it (so it's safe for us to use), + // and it gets used when passing method references instead of lambdas with Java 11. + // Note that this line allows *all* methods from java.util.Objects. + // That's the best that we can do with the configuration options that Animal Sniffer offers. + ignore 'java.util.Objects' +} + // needed to make test output available to bramble-java configurations { testOutput.extendsFrom(testCompile) From 75f8d72e5471ea59d7cab414df204de064884d53 Mon Sep 17 00:00:00 2001 From: akwizgran Date: Thu, 2 Sep 2021 14:39:27 +0100 Subject: [PATCH 28/31] Resolve conflict on cherry pick commit to use ByteBuddyClassImposteriser --- bramble-android/build.gradle | 8 +- .../account/AndroidAccountManagerTest.java | 4 +- bramble-android/witness.gradle | 27 +-- bramble-api/build.gradle | 7 +- bramble-api/witness.gradle | 27 +-- bramble-core/build.gradle | 9 +- .../client/BdfMessageValidatorTest.java | 4 +- .../KeyAgreementProtocolTest.java | 4 +- .../KeyAgreementTransportTest.java | 4 +- .../bramble/plugin/PollerImplTest.java | 4 +- bramble-core/witness.gradle | 28 +-- bramble-java/build.gradle | 7 +- bramble-java/witness.gradle | 27 +-- briar-android/build.gradle | 11 +- .../android/account/SetupViewModelTest.java | 4 +- .../attachment/AttachmentRetrieverTest.java | 4 +- .../list/GroupListViewModelTest.java | 4 +- .../util/UiUtilsFormatDurationTest.java | 168 ++++++++++++++++++ briar-android/witness.gradle | 32 ++-- briar-core/build.gradle | 8 +- .../GroupInvitationManagerImplTest.java | 4 +- briar-core/witness.gradle | 27 +-- build.gradle | 3 + 23 files changed, 310 insertions(+), 115 deletions(-) create mode 100644 briar-android/src/test/java/org/briarproject/briar/android/util/UiUtilsFormatDurationTest.java diff --git a/bramble-android/build.gradle b/bramble-android/build.gradle index 239abe7c2..bed2c54b2 100644 --- a/bramble-android/build.gradle +++ b/bramble-android/build.gradle @@ -50,10 +50,10 @@ dependencies { compileOnly 'javax.annotation:jsr250-api:1.0' testImplementation project(path: ':bramble-api', configuration: 'testOutput') - testImplementation 'junit:junit:4.12' - testImplementation "org.jmock:jmock:2.8.2" - testImplementation "org.jmock:jmock-junit4:2.8.2" - testImplementation "org.jmock:jmock-legacy:2.8.2" + testImplementation "junit:junit:$junit_version" + testImplementation "org.jmock:jmock:$jmock_version" + testImplementation "org.jmock:jmock-junit4:$jmock_version" + testImplementation "org.jmock:jmock-imposters:$jmock_version" } def torBinariesDir = 'src/main/res/raw' diff --git a/bramble-android/src/test/java/org/briarproject/bramble/account/AndroidAccountManagerTest.java b/bramble-android/src/test/java/org/briarproject/bramble/account/AndroidAccountManagerTest.java index 2b7b8bb88..cad9fa49c 100644 --- a/bramble-android/src/test/java/org/briarproject/bramble/account/AndroidAccountManagerTest.java +++ b/bramble-android/src/test/java/org/briarproject/bramble/account/AndroidAccountManagerTest.java @@ -9,7 +9,7 @@ import org.briarproject.bramble.api.db.DatabaseConfig; import org.briarproject.bramble.api.identity.IdentityManager; import org.briarproject.bramble.test.BrambleMockTestCase; import org.jmock.Expectations; -import org.jmock.lib.legacy.ClassImposteriser; +import org.jmock.imposters.ByteBuddyClassImposteriser; import org.junit.After; import org.junit.Before; import org.junit.Test; @@ -44,7 +44,7 @@ public class AndroidAccountManagerTest extends BrambleMockTestCase { private AndroidAccountManager accountManager; public AndroidAccountManagerTest() { - context.setImposteriser(ClassImposteriser.INSTANCE); + context.setImposteriser(ByteBuddyClassImposteriser.INSTANCE); app = context.mock(Application.class); applicationInfo = new ApplicationInfo(); applicationInfo.dataDir = testDir.getAbsolutePath(); diff --git a/bramble-android/witness.gradle b/bramble-android/witness.gradle index fe630b472..3aed6321e 100644 --- a/bramble-android/witness.gradle +++ b/bramble-android/witness.gradle @@ -1,6 +1,6 @@ dependencyVerification { verify = [ - 'cglib:cglib:3.2.0:cglib-3.2.0.jar:adb13bab79712ad6bdf1bd59f2a3918018a8016e722e8a357065afb9e6690861', + 'cglib:cglib:3.2.8:cglib-3.2.8.jar:3f64de999ecc5595dc84ca8ff0879d8a34c8623f9ef3c517a53ed59023fcb9db', 'com.android.tools.analytics-library:protos:27.1.1:protos-27.1.1.jar:13f77e73762e58ab372d140b3a6be6903aea9775b62dd14fbc62d4cc7069c9a4', 'com.android.tools.analytics-library:shared:27.1.1:shared-27.1.1.jar:82930a52001410e97d809930b670f4de3002286975f046b9de5f6b777b06d366', 'com.android.tools.analytics-library:tracker:27.1.1:tracker-27.1.1.jar:31bc5a00be0055bac89c9b2f34751883e987cd89e3ac1783720645c164f591d9', @@ -31,6 +31,7 @@ dependencyVerification { 'com.android.tools:sdklib:27.1.1:sdklib-27.1.1.jar:08e6b83961ac9724b3c1e3d0eff971f13be6701292c77914b8794480f3391250', 'com.android:signflinger:4.1.1:signflinger-4.1.1.jar:0c66825988873ec2d51057fa463f54a8f18fc7326ff4530b9da363b71e97ce60', 'com.android:zipflinger:4.1.1:zipflinger-4.1.1.jar:0a8c3e52ac13dd031236f9fb5ba4408b1d5dcd12325a05440b36da09d8881446', + 'com.google.code.findbugs:annotations:3.0.1:annotations-3.0.1.jar:6b47ff0a6de0ce17cbedc3abb0828ca5bce3009d53ea47b3723ff023c4742f79', 'com.google.code.findbugs:jsr305:3.0.2:jsr305-3.0.2.jar:766ad2a0783f2687962c8ad74ceecc38a28b9f72a2d085ee438b7813e928d0c7', 'com.google.code.gson:gson:2.8.5:gson-2.8.5.jar:233a0149fc365c9f6edbd683cfe266b19bdc773be98eabdaf6b3c924b48e7d81', 'com.google.dagger:dagger-compiler:2.24:dagger-compiler-2.24.jar:3c5afb955fb188da485cb2c048eff37dce0e1530b9780a0f2f7187d16d1ccc1f', @@ -63,16 +64,16 @@ dependencyVerification { 'javax.inject:javax.inject:1:javax.inject-1.jar:91c77044a50c481636c32d916fd89c9118a72195390452c81065080f957de7ff', 'javax.xml.bind:jaxb-api:2.3.1:jaxb-api-2.3.1.jar:88b955a0df57880a26a74708bc34f74dcaf8ebf4e78843a28b50eae945732b06', 'junit:junit:4.12:junit-4.12.jar:59721f0805e223d84b90677887d9ff567dc534d7c502ca903c0c2b17f05c116a', + 'net.bytebuddy:byte-buddy:1.9.12:byte-buddy-1.9.12.jar:3688c3d434bebc3edc5516296a2ed0f47b65e451071b4afecad84f902f0efc11', + 'net.jcip:jcip-annotations:1.0:jcip-annotations-1.0.jar:be5805392060c71474bf6c9a67a099471274d30b83eef84bfc4e0889a4f1dcc0', 'net.ltgt.gradle.incap:incap:0.2:incap-0.2.jar:b625b9806b0f1e4bc7a2e3457119488de3cd57ea20feedd513db070a573a4ffd', 'net.sf.jopt-simple:jopt-simple:4.9:jopt-simple-4.9.jar:26c5856e954b5f864db76f13b86919b59c6eecf9fd930b96baa8884626baf2f5', 'net.sf.kxml:kxml2:2.3.0:kxml2-2.3.0.jar:f264dd9f79a1fde10ce5ecc53221eff24be4c9331c830b7d52f2f08a7b633de2', - 'org.apache.ant:ant-launcher:1.9.4:ant-launcher-1.9.4.jar:7bccea20b41801ca17bcbc909a78c835d0f443f12d639c77bd6ae3d05861608d', - 'org.apache.ant:ant:1.9.4:ant-1.9.4.jar:649ae0730251de07b8913f49286d46bba7b92d47c5f332610aa426c4f02161d8', + 'org.apache-extras.beanshell:bsh:2.0b6:bsh-2.0b6.jar:a17955976070c0573235ee662f2794a78082758b61accffce8d3f8aedcd91047', 'org.apache.commons:commons-compress:1.12:commons-compress-1.12.jar:2c1542faf343185b7cab9c3d55c8ae5471d6d095d3887a4adefdbdf2984dc0b6', 'org.apache.httpcomponents:httpclient:4.5.6:httpclient-4.5.6.jar:c03f813195e7a80e3608d0ddd8da80b21696a4c92a6a2298865bf149071551c7', 'org.apache.httpcomponents:httpcore:4.4.10:httpcore-4.4.10.jar:78ba1096561957db1b55200a159b648876430342d15d461277e62360da19f6fd', 'org.apache.httpcomponents:httpmime:4.5.6:httpmime-4.5.6.jar:0b2b1102c18d3c7e05a77214b9b7501a6f6056174ae5604e0e256776eda7553e', - 'org.beanshell:bsh:1.3.0:bsh-1.3.0.jar:9b04edc75d19db54f1b4e8b5355e9364384c6cf71eb0a1b9724c159d779879f8', 'org.bouncycastle:bcpkix-jdk15on:1.56:bcpkix-jdk15on-1.56.jar:7043dee4e9e7175e93e0b36f45b1ec1ecb893c5f755667e8b916eb8dd201c6ca', 'org.bouncycastle:bcprov-jdk15on:1.56:bcprov-jdk15on-1.56.jar:963e1ee14f808ffb99897d848ddcdb28fa91ddda867eb18d303e82728f878349', 'org.briarproject:obfs4proxy-android:0.0.12-dev-40245c4a:obfs4proxy-android-0.0.12-dev-40245c4a.zip:8ab05a8f8391be2cb5ab2b665c281a06d9e3a756bd0f95a40a36ca927866ea82', @@ -85,8 +86,9 @@ dependencyVerification { 'org.codehaus.mojo:animal-sniffer-annotations:1.18:animal-sniffer-annotations-1.18.jar:47f05852b48ee9baefef80fa3d8cea60efa4753c0013121dd7fe5eef2e5c729d', 'org.glassfish.jaxb:jaxb-runtime:2.3.1:jaxb-runtime-2.3.1.jar:45fecfa5c8217ce1f3652ab95179790ec8cc0dec0384bca51cbeb94a293d9f2f', 'org.glassfish.jaxb:txw2:2.3.1:txw2-2.3.1.jar:34975dde1c6920f1a39791142235689bc3cd357e24d05edd8ff93b885bd68d60', - 'org.hamcrest:hamcrest-core:1.3:hamcrest-core-1.3.jar:66fdef91e9739348df7a096aa384a5685f4e875584cce89386a7a47251c4d8e9', - 'org.hamcrest:hamcrest-library:1.3:hamcrest-library-1.3.jar:711d64522f9ec410983bd310934296da134be4254a125080a0416ec178dfad1c', + 'org.hamcrest:hamcrest-core:2.1:hamcrest-core-2.1.jar:e09109e54a289d88506b9bfec987ddd199f4217c9464132668351b9a4f00bee9', + 'org.hamcrest:hamcrest-library:2.1:hamcrest-library-2.1.jar:b7e2b6895b3b679f0e47b6380fda391b225e9b78505db9d8bdde8d3cc8d52a21', + 'org.hamcrest:hamcrest:2.1:hamcrest-2.1.jar:ba93b2e3a562322ba432f0a1b53addcc55cb188253319a020ed77f824e692050', 'org.jetbrains.kotlin:kotlin-reflect:1.3.72:kotlin-reflect-1.3.72.jar:a188d9367de1c4ee9479db630985c0597b20709c83161b1430d24edb27e38c40', 'org.jetbrains.kotlin:kotlin-stdlib-common:1.3.72:kotlin-stdlib-common-1.3.72.jar:5e7d1552863e480c1628b1cc39ce230ef829f5b7230106215a05acda5172203a', 'org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.3.72:kotlin-stdlib-jdk7-1.3.72.jar:40566c0c08d414b9413ba556ff7f8a0b04b98b9f0f424d122dd2088510efccc4', @@ -94,17 +96,18 @@ dependencyVerification { 'org.jetbrains.kotlin:kotlin-stdlib:1.3.72:kotlin-stdlib-1.3.72.jar:3856a7349ebacd6d1be6802b2fed9c4dc2c5a564ea92b6b945ac988243d4b16b', 'org.jetbrains.trove4j:trove4j:20160824:trove4j-20160824.jar:1917871c8deb468307a584680c87a44572f5a8b0b98c6d397fc0f5f86596dbe7', 'org.jetbrains:annotations:13.0:annotations-13.0.jar:ace2a10dc8e2d5fd34925ecac03e4988b2c0f851650c94b8cef49ba1bd111478', - 'org.jmock:jmock-junit4:2.8.2:jmock-junit4-2.8.2.jar:f7ee4df4f7bd7b7f1cafad3b99eb74d579f109d5992ff625347352edb55e674c', - 'org.jmock:jmock-legacy:2.8.2:jmock-legacy-2.8.2.jar:f2b985a5c08a9edb7f37612330c058809da3f6a6d63ce792426ebf8ff0d6d31b', - 'org.jmock:jmock-testjar:2.8.2:jmock-testjar-2.8.2.jar:8900860f72c474e027cf97fe78dcbf154a1aa7fc62b6845c5fb4e4f3c7bc8760', - 'org.jmock:jmock:2.8.2:jmock-2.8.2.jar:6c73cb4a2e6dbfb61fd99c9a768539c170ab6568e57846bd60dbf19596b65b16', + 'org.jmock:jmock-imposters:2.12.0:jmock-imposters-2.12.0.jar:3b836269745a137c9b2347e8d7c2104845b126ef04f012d6bfd94f1a7dea7b09', + 'org.jmock:jmock-junit4:2.12.0:jmock-junit4-2.12.0.jar:3233062fc889637c151a24f1ee086bad04321ab7d8264fef279daff0fa27205b', + 'org.jmock:jmock-legacy:2.12.0:jmock-legacy-2.12.0.jar:dea3a9cca653d082e2fe7e40232e982fe03a9984c7d67ceff24f3e03fe580dcd', + 'org.jmock:jmock-testjar:2.12.0:jmock-testjar-2.12.0.jar:efefbcf6cd294d0e29f0c46eb2a3380d4ca4e1763ff719c69e2f2ac62f564a04', + 'org.jmock:jmock:2.12.0:jmock-2.12.0.jar:266d07314c0cd343c46ff8a55601272de8cf406807caf55e6f313295f83d10be', 'org.jvnet.staxex:stax-ex:1.8:stax-ex-1.8.jar:95b05d9590af4154c6513b9c5dc1fb2e55b539972ba0a9ef28e9a0c01d83ad77', - 'org.objenesis:objenesis:2.1:objenesis-2.1.jar:c74330cc6b806c804fd37e74487b4fe5d7c2750c5e15fbc6efa13bdee1bdef80', + 'org.objenesis:objenesis:3.0.1:objenesis-3.0.1.jar:7a8ff780b9ff48415d7c705f60030b0acaa616e7f823c98eede3b63508d4e984', 'org.ow2.asm:asm-analysis:7.0:asm-analysis-7.0.jar:e981f8f650c4d900bb033650b18e122fa6b161eadd5f88978d08751f72ee8474', 'org.ow2.asm:asm-commons:7.0:asm-commons-7.0.jar:fed348ef05958e3e846a3ac074a12af5f7936ef3d21ce44a62c4fa08a771927d', 'org.ow2.asm:asm-tree:7.0:asm-tree-7.0.jar:cfd7a0874f9de36a999c127feeadfbfe6e04d4a71ee954d7af3d853f0be48a6c', 'org.ow2.asm:asm-util:7.0:asm-util-7.0.jar:75fbbca440ef463f41c2b0ab1a80abe67e910ac486da60a7863cbcb5bae7e145', - 'org.ow2.asm:asm:5.0.4:asm-5.0.4.jar:896618ed8ae62702521a78bc7be42b7c491a08e6920a15f89a3ecdec31e9a220', 'org.ow2.asm:asm:7.0:asm-7.0.jar:b88ef66468b3c978ad0c97fd6e90979e56155b4ac69089ba7a44e9aa7ffe9acf', + 'org.ow2.asm:asm:7.1:asm-7.1.jar:4ab2fa2b6d2cc9ccb1eaa05ea329c407b47b13ed2915f62f8c4b8cc96258d4de', ] } diff --git a/bramble-api/build.gradle b/bramble-api/build.gradle index 9e5cf946a..654c17976 100644 --- a/bramble-api/build.gradle +++ b/bramble-api/build.gradle @@ -10,10 +10,9 @@ dependencies { implementation "com.google.dagger:dagger:2.24" implementation 'com.google.code.findbugs:jsr305:3.0.2' - testImplementation 'junit:junit:4.12' - testImplementation "org.jmock:jmock:2.8.2" - testImplementation "org.jmock:jmock-junit4:2.8.2" - testImplementation "org.jmock:jmock-legacy:2.8.2" + testImplementation "junit:junit:$junit_version" + testImplementation "org.jmock:jmock:$jmock_version" + testImplementation "org.jmock:jmock-junit4:$jmock_version" signature 'org.codehaus.mojo.signature:java16:1.1@signature' } diff --git a/bramble-api/witness.gradle b/bramble-api/witness.gradle index 1b9593118..9159be492 100644 --- a/bramble-api/witness.gradle +++ b/bramble-api/witness.gradle @@ -1,24 +1,27 @@ dependencyVerification { verify = [ - 'cglib:cglib:3.2.0:cglib-3.2.0.jar:adb13bab79712ad6bdf1bd59f2a3918018a8016e722e8a357065afb9e6690861', + 'cglib:cglib:3.2.8:cglib-3.2.8.jar:3f64de999ecc5595dc84ca8ff0879d8a34c8623f9ef3c517a53ed59023fcb9db', + 'com.google.code.findbugs:annotations:3.0.1:annotations-3.0.1.jar:6b47ff0a6de0ce17cbedc3abb0828ca5bce3009d53ea47b3723ff023c4742f79', 'com.google.code.findbugs:jsr305:3.0.2:jsr305-3.0.2.jar:766ad2a0783f2687962c8ad74ceecc38a28b9f72a2d085ee438b7813e928d0c7', 'com.google.dagger:dagger:2.24:dagger-2.24.jar:550a6e46a6dfcdf1d764887b6090cea94f783327e50e5c73754f18facfc70b64', 'javax.inject:javax.inject:1:javax.inject-1.jar:91c77044a50c481636c32d916fd89c9118a72195390452c81065080f957de7ff', 'junit:junit:4.12:junit-4.12.jar:59721f0805e223d84b90677887d9ff567dc534d7c502ca903c0c2b17f05c116a', - 'org.apache.ant:ant-launcher:1.9.4:ant-launcher-1.9.4.jar:7bccea20b41801ca17bcbc909a78c835d0f443f12d639c77bd6ae3d05861608d', - 'org.apache.ant:ant:1.9.4:ant-1.9.4.jar:649ae0730251de07b8913f49286d46bba7b92d47c5f332610aa426c4f02161d8', - 'org.beanshell:bsh:1.3.0:bsh-1.3.0.jar:9b04edc75d19db54f1b4e8b5355e9364384c6cf71eb0a1b9724c159d779879f8', + 'net.bytebuddy:byte-buddy:1.9.12:byte-buddy-1.9.12.jar:3688c3d434bebc3edc5516296a2ed0f47b65e451071b4afecad84f902f0efc11', + 'net.jcip:jcip-annotations:1.0:jcip-annotations-1.0.jar:be5805392060c71474bf6c9a67a099471274d30b83eef84bfc4e0889a4f1dcc0', + 'org.apache-extras.beanshell:bsh:2.0b6:bsh-2.0b6.jar:a17955976070c0573235ee662f2794a78082758b61accffce8d3f8aedcd91047', 'org.codehaus.mojo.signature:java16:1.1:java16-1.1.signature:53799223a2c98dba2d0add810bed76315460df285c69e4f397ae6098f87dd619', 'org.codehaus.mojo:animal-sniffer-ant-tasks:1.16:animal-sniffer-ant-tasks-1.16.jar:890040976fbe2d584619a6a61b1fd2e925b3b5eb342a85eb2762c467c0d64e90', 'org.codehaus.mojo:animal-sniffer:1.16:animal-sniffer-1.16.jar:72be8bcc226ba43b937c722a08a07852bfa1b11400089265d5df0ee7b38b1d52', - 'org.hamcrest:hamcrest-core:1.3:hamcrest-core-1.3.jar:66fdef91e9739348df7a096aa384a5685f4e875584cce89386a7a47251c4d8e9', - 'org.hamcrest:hamcrest-library:1.3:hamcrest-library-1.3.jar:711d64522f9ec410983bd310934296da134be4254a125080a0416ec178dfad1c', - 'org.jmock:jmock-junit4:2.8.2:jmock-junit4-2.8.2.jar:f7ee4df4f7bd7b7f1cafad3b99eb74d579f109d5992ff625347352edb55e674c', - 'org.jmock:jmock-legacy:2.8.2:jmock-legacy-2.8.2.jar:f2b985a5c08a9edb7f37612330c058809da3f6a6d63ce792426ebf8ff0d6d31b', - 'org.jmock:jmock-testjar:2.8.2:jmock-testjar-2.8.2.jar:8900860f72c474e027cf97fe78dcbf154a1aa7fc62b6845c5fb4e4f3c7bc8760', - 'org.jmock:jmock:2.8.2:jmock-2.8.2.jar:6c73cb4a2e6dbfb61fd99c9a768539c170ab6568e57846bd60dbf19596b65b16', - 'org.objenesis:objenesis:2.1:objenesis-2.1.jar:c74330cc6b806c804fd37e74487b4fe5d7c2750c5e15fbc6efa13bdee1bdef80', + 'org.hamcrest:hamcrest-core:2.1:hamcrest-core-2.1.jar:e09109e54a289d88506b9bfec987ddd199f4217c9464132668351b9a4f00bee9', + 'org.hamcrest:hamcrest-library:2.1:hamcrest-library-2.1.jar:b7e2b6895b3b679f0e47b6380fda391b225e9b78505db9d8bdde8d3cc8d52a21', + 'org.hamcrest:hamcrest:2.1:hamcrest-2.1.jar:ba93b2e3a562322ba432f0a1b53addcc55cb188253319a020ed77f824e692050', + 'org.jmock:jmock-imposters:2.12.0:jmock-imposters-2.12.0.jar:3b836269745a137c9b2347e8d7c2104845b126ef04f012d6bfd94f1a7dea7b09', + 'org.jmock:jmock-junit4:2.12.0:jmock-junit4-2.12.0.jar:3233062fc889637c151a24f1ee086bad04321ab7d8264fef279daff0fa27205b', + 'org.jmock:jmock-legacy:2.12.0:jmock-legacy-2.12.0.jar:dea3a9cca653d082e2fe7e40232e982fe03a9984c7d67ceff24f3e03fe580dcd', + 'org.jmock:jmock-testjar:2.12.0:jmock-testjar-2.12.0.jar:efefbcf6cd294d0e29f0c46eb2a3380d4ca4e1763ff719c69e2f2ac62f564a04', + 'org.jmock:jmock:2.12.0:jmock-2.12.0.jar:266d07314c0cd343c46ff8a55601272de8cf406807caf55e6f313295f83d10be', + 'org.objenesis:objenesis:3.0.1:objenesis-3.0.1.jar:7a8ff780b9ff48415d7c705f60030b0acaa616e7f823c98eede3b63508d4e984', 'org.ow2.asm:asm-all:5.2:asm-all-5.2.jar:7fbffbc1db3422e2101689fd88df8384b15817b52b9b2b267b9f6d2511dc198d', - 'org.ow2.asm:asm:5.0.4:asm-5.0.4.jar:896618ed8ae62702521a78bc7be42b7c491a08e6920a15f89a3ecdec31e9a220', + 'org.ow2.asm:asm:7.1:asm-7.1.jar:4ab2fa2b6d2cc9ccb1eaa05ea329c407b47b13ed2915f62f8c4b8cc96258d4de', ] } diff --git a/bramble-core/build.gradle b/bramble-core/build.gradle index 217b1985a..fbabac02d 100644 --- a/bramble-core/build.gradle +++ b/bramble-core/build.gradle @@ -21,10 +21,11 @@ dependencies { testImplementation project(path: ':bramble-api', configuration: 'testOutput') testImplementation 'org.hsqldb:hsqldb:2.3.5' // The last version that supports Java 1.6 - testImplementation 'junit:junit:4.12' - testImplementation "org.jmock:jmock:2.8.2" - testImplementation "org.jmock:jmock-junit4:2.8.2" - testImplementation "org.jmock:jmock-legacy:2.8.2" + testImplementation 'net.jodah:concurrentunit:0.4.2' + testImplementation "junit:junit:$junit_version" + testImplementation "org.jmock:jmock:$jmock_version" + testImplementation "org.jmock:jmock-junit4:$jmock_version" + testImplementation "org.jmock:jmock-imposters:$jmock_version" testAnnotationProcessor 'com.google.dagger:dagger-compiler:2.24' diff --git a/bramble-core/src/test/java/org/briarproject/bramble/client/BdfMessageValidatorTest.java b/bramble-core/src/test/java/org/briarproject/bramble/client/BdfMessageValidatorTest.java index c60bb4fef..4c0bf1418 100644 --- a/bramble-core/src/test/java/org/briarproject/bramble/client/BdfMessageValidatorTest.java +++ b/bramble-core/src/test/java/org/briarproject/bramble/client/BdfMessageValidatorTest.java @@ -13,7 +13,7 @@ import org.briarproject.bramble.api.sync.Message; import org.briarproject.bramble.api.sync.MessageContext; import org.briarproject.bramble.test.ValidatorTestCase; import org.jmock.Expectations; -import org.jmock.lib.legacy.ClassImposteriser; +import org.jmock.imposters.ByteBuddyClassImposteriser; import org.junit.Test; import static org.briarproject.bramble.api.transport.TransportConstants.MAX_CLOCK_DIFFERENCE; @@ -38,7 +38,7 @@ public class BdfMessageValidatorTest extends ValidatorTestCase { private final Metadata meta = new Metadata(); public BdfMessageValidatorTest() { - context.setImposteriser(ClassImposteriser.INSTANCE); + context.setImposteriser(ByteBuddyClassImposteriser.INSTANCE); } @Test(expected = InvalidMessageException.class) diff --git a/bramble-core/src/test/java/org/briarproject/bramble/keyagreement/KeyAgreementProtocolTest.java b/bramble-core/src/test/java/org/briarproject/bramble/keyagreement/KeyAgreementProtocolTest.java index 78b375631..4c360f86b 100644 --- a/bramble-core/src/test/java/org/briarproject/bramble/keyagreement/KeyAgreementProtocolTest.java +++ b/bramble-core/src/test/java/org/briarproject/bramble/keyagreement/KeyAgreementProtocolTest.java @@ -11,8 +11,8 @@ import org.briarproject.bramble.api.keyagreement.PayloadEncoder; import org.briarproject.bramble.test.BrambleTestCase; import org.jmock.Expectations; import org.jmock.auto.Mock; +import org.jmock.imposters.ByteBuddyClassImposteriser; import org.jmock.integration.junit4.JUnitRuleMockery; -import org.jmock.lib.legacy.ClassImposteriser; import org.junit.Rule; import org.junit.Test; @@ -34,7 +34,7 @@ public class KeyAgreementProtocolTest extends BrambleTestCase { @Rule public JUnitRuleMockery context = new JUnitRuleMockery() {{ // So we can mock concrete classes like KeyAgreementTransport - setImposteriser(ClassImposteriser.INSTANCE); + setImposteriser(ByteBuddyClassImposteriser.INSTANCE); }}; private final PublicKey alicePubKey = getAgreementPublicKey(); diff --git a/bramble-core/src/test/java/org/briarproject/bramble/keyagreement/KeyAgreementTransportTest.java b/bramble-core/src/test/java/org/briarproject/bramble/keyagreement/KeyAgreementTransportTest.java index c5c111c77..d75bf40f4 100644 --- a/bramble-core/src/test/java/org/briarproject/bramble/keyagreement/KeyAgreementTransportTest.java +++ b/bramble-core/src/test/java/org/briarproject/bramble/keyagreement/KeyAgreementTransportTest.java @@ -14,7 +14,7 @@ import org.briarproject.bramble.api.record.RecordWriterFactory; import org.briarproject.bramble.test.BrambleMockTestCase; import org.briarproject.bramble.test.CaptureArgumentAction; import org.jmock.Expectations; -import org.jmock.lib.legacy.ClassImposteriser; +import org.jmock.imposters.ByteBuddyClassImposteriser; import org.junit.Test; import java.io.InputStream; @@ -58,7 +58,7 @@ public class KeyAgreementTransportTest extends BrambleMockTestCase { private KeyAgreementTransport kat; public KeyAgreementTransportTest() { - context.setImposteriser(ClassImposteriser.INSTANCE); + context.setImposteriser(ByteBuddyClassImposteriser.INSTANCE); inputStream = context.mock(InputStream.class); outputStream = context.mock(OutputStream.class); } diff --git a/bramble-core/src/test/java/org/briarproject/bramble/plugin/PollerImplTest.java b/bramble-core/src/test/java/org/briarproject/bramble/plugin/PollerImplTest.java index 6c85747ac..82f58436b 100644 --- a/bramble-core/src/test/java/org/briarproject/bramble/plugin/PollerImplTest.java +++ b/bramble-core/src/test/java/org/briarproject/bramble/plugin/PollerImplTest.java @@ -25,7 +25,7 @@ import org.briarproject.bramble.test.BrambleMockTestCase; import org.briarproject.bramble.test.ImmediateExecutor; import org.briarproject.bramble.test.RunAction; import org.jmock.Expectations; -import org.jmock.lib.legacy.ClassImposteriser; +import org.jmock.imposters.ByteBuddyClassImposteriser; import org.junit.Before; import org.junit.Test; @@ -69,7 +69,7 @@ public class PollerImplTest extends BrambleMockTestCase { private PollerImpl poller; public PollerImplTest() { - context.setImposteriser(ClassImposteriser.INSTANCE); + context.setImposteriser(ByteBuddyClassImposteriser.INSTANCE); random = context.mock(SecureRandom.class); } diff --git a/bramble-core/witness.gradle b/bramble-core/witness.gradle index 9ab2fac6d..d2f2ef859 100644 --- a/bramble-core/witness.gradle +++ b/bramble-core/witness.gradle @@ -1,6 +1,7 @@ dependencyVerification { verify = [ - 'cglib:cglib:3.2.0:cglib-3.2.0.jar:adb13bab79712ad6bdf1bd59f2a3918018a8016e722e8a357065afb9e6690861', + 'cglib:cglib:3.2.8:cglib-3.2.8.jar:3f64de999ecc5595dc84ca8ff0879d8a34c8623f9ef3c517a53ed59023fcb9db', + 'com.google.code.findbugs:annotations:3.0.1:annotations-3.0.1.jar:6b47ff0a6de0ce17cbedc3abb0828ca5bce3009d53ea47b3723ff023c4742f79', 'com.google.code.findbugs:jsr305:3.0.2:jsr305-3.0.2.jar:766ad2a0783f2687962c8ad74ceecc38a28b9f72a2d085ee438b7813e928d0c7', 'com.google.dagger:dagger-compiler:2.24:dagger-compiler-2.24.jar:3c5afb955fb188da485cb2c048eff37dce0e1530b9780a0f2f7187d16d1ccc1f', 'com.google.dagger:dagger-producers:2.24:dagger-producers-2.24.jar:f10f45b95191954d5d6b043fca9e62fb621d21bf70634b8f8476c7988b504c3a', @@ -19,11 +20,12 @@ dependencyVerification { 'javax.annotation:jsr250-api:1.0:jsr250-api-1.0.jar:a1a922d0d9b6d183ed3800dfac01d1e1eb159f0e8c6f94736931c1def54a941f', 'javax.inject:javax.inject:1:javax.inject-1.jar:91c77044a50c481636c32d916fd89c9118a72195390452c81065080f957de7ff', 'junit:junit:4.12:junit-4.12.jar:59721f0805e223d84b90677887d9ff567dc534d7c502ca903c0c2b17f05c116a', + 'net.bytebuddy:byte-buddy:1.9.12:byte-buddy-1.9.12.jar:3688c3d434bebc3edc5516296a2ed0f47b65e451071b4afecad84f902f0efc11', 'net.i2p.crypto:eddsa:0.2.0:eddsa-0.2.0.jar:a7cb1b85c16e2f0730b9204106929a1d9aaae1df728adc7041a8b8b605692140', + 'net.jcip:jcip-annotations:1.0:jcip-annotations-1.0.jar:be5805392060c71474bf6c9a67a099471274d30b83eef84bfc4e0889a4f1dcc0', + 'net.jodah:concurrentunit:0.4.2:concurrentunit-0.4.2.jar:5583078e1acf91734939e985bc9e7ee947b0e93a8eef679da6bb07bbeb47ced3', 'net.ltgt.gradle.incap:incap:0.2:incap-0.2.jar:b625b9806b0f1e4bc7a2e3457119488de3cd57ea20feedd513db070a573a4ffd', - 'org.apache.ant:ant-launcher:1.9.4:ant-launcher-1.9.4.jar:7bccea20b41801ca17bcbc909a78c835d0f443f12d639c77bd6ae3d05861608d', - 'org.apache.ant:ant:1.9.4:ant-1.9.4.jar:649ae0730251de07b8913f49286d46bba7b92d47c5f332610aa426c4f02161d8', - 'org.beanshell:bsh:1.3.0:bsh-1.3.0.jar:9b04edc75d19db54f1b4e8b5355e9364384c6cf71eb0a1b9724c159d779879f8', + 'org.apache-extras.beanshell:bsh:2.0b6:bsh-2.0b6.jar:a17955976070c0573235ee662f2794a78082758b61accffce8d3f8aedcd91047', 'org.bitlet:weupnp:0.1.4:weupnp-0.1.4.jar:88df7e6504929d00bdb832863761385c68ab92af945b04f0770b126270a444fb', 'org.briarproject:jtorctl:0.3:jtorctl-0.3.jar:f2939238a097898998432effe93b0334d97a787972ab3a91a8973a1d309fc864', 'org.checkerframework:checker-compat-qual:2.5.3:checker-compat-qual-2.5.3.jar:d76b9afea61c7c082908023f0cbc1427fab9abd2df915c8b8a3e7a509bccbc6d', @@ -32,16 +34,18 @@ dependencyVerification { 'org.codehaus.mojo:animal-sniffer-annotations:1.17:animal-sniffer-annotations-1.17.jar:92654f493ecfec52082e76354f0ebf87648dc3d5cec2e3c3cdb947c016747a53', 'org.codehaus.mojo:animal-sniffer-ant-tasks:1.16:animal-sniffer-ant-tasks-1.16.jar:890040976fbe2d584619a6a61b1fd2e925b3b5eb342a85eb2762c467c0d64e90', 'org.codehaus.mojo:animal-sniffer:1.16:animal-sniffer-1.16.jar:72be8bcc226ba43b937c722a08a07852bfa1b11400089265d5df0ee7b38b1d52', - 'org.hamcrest:hamcrest-core:1.3:hamcrest-core-1.3.jar:66fdef91e9739348df7a096aa384a5685f4e875584cce89386a7a47251c4d8e9', - 'org.hamcrest:hamcrest-library:1.3:hamcrest-library-1.3.jar:711d64522f9ec410983bd310934296da134be4254a125080a0416ec178dfad1c', + 'org.hamcrest:hamcrest-core:2.1:hamcrest-core-2.1.jar:e09109e54a289d88506b9bfec987ddd199f4217c9464132668351b9a4f00bee9', + 'org.hamcrest:hamcrest-library:2.1:hamcrest-library-2.1.jar:b7e2b6895b3b679f0e47b6380fda391b225e9b78505db9d8bdde8d3cc8d52a21', + 'org.hamcrest:hamcrest:2.1:hamcrest-2.1.jar:ba93b2e3a562322ba432f0a1b53addcc55cb188253319a020ed77f824e692050', 'org.hsqldb:hsqldb:2.3.5:hsqldb-2.3.5.jar:6676a6977ac98997a80f827ddbd3fe8ca1e0853dad1492512135fd1a222ccfad', - 'org.jmock:jmock-junit4:2.8.2:jmock-junit4-2.8.2.jar:f7ee4df4f7bd7b7f1cafad3b99eb74d579f109d5992ff625347352edb55e674c', - 'org.jmock:jmock-legacy:2.8.2:jmock-legacy-2.8.2.jar:f2b985a5c08a9edb7f37612330c058809da3f6a6d63ce792426ebf8ff0d6d31b', - 'org.jmock:jmock-testjar:2.8.2:jmock-testjar-2.8.2.jar:8900860f72c474e027cf97fe78dcbf154a1aa7fc62b6845c5fb4e4f3c7bc8760', - 'org.jmock:jmock:2.8.2:jmock-2.8.2.jar:6c73cb4a2e6dbfb61fd99c9a768539c170ab6568e57846bd60dbf19596b65b16', - 'org.objenesis:objenesis:2.1:objenesis-2.1.jar:c74330cc6b806c804fd37e74487b4fe5d7c2750c5e15fbc6efa13bdee1bdef80', + 'org.jmock:jmock-imposters:2.12.0:jmock-imposters-2.12.0.jar:3b836269745a137c9b2347e8d7c2104845b126ef04f012d6bfd94f1a7dea7b09', + 'org.jmock:jmock-junit4:2.12.0:jmock-junit4-2.12.0.jar:3233062fc889637c151a24f1ee086bad04321ab7d8264fef279daff0fa27205b', + 'org.jmock:jmock-legacy:2.12.0:jmock-legacy-2.12.0.jar:dea3a9cca653d082e2fe7e40232e982fe03a9984c7d67ceff24f3e03fe580dcd', + 'org.jmock:jmock-testjar:2.12.0:jmock-testjar-2.12.0.jar:efefbcf6cd294d0e29f0c46eb2a3380d4ca4e1763ff719c69e2f2ac62f564a04', + 'org.jmock:jmock:2.12.0:jmock-2.12.0.jar:266d07314c0cd343c46ff8a55601272de8cf406807caf55e6f313295f83d10be', + 'org.objenesis:objenesis:3.0.1:objenesis-3.0.1.jar:7a8ff780b9ff48415d7c705f60030b0acaa616e7f823c98eede3b63508d4e984', 'org.ow2.asm:asm-all:5.2:asm-all-5.2.jar:7fbffbc1db3422e2101689fd88df8384b15817b52b9b2b267b9f6d2511dc198d', - 'org.ow2.asm:asm:5.0.4:asm-5.0.4.jar:896618ed8ae62702521a78bc7be42b7c491a08e6920a15f89a3ecdec31e9a220', + 'org.ow2.asm:asm:7.1:asm-7.1.jar:4ab2fa2b6d2cc9ccb1eaa05ea329c407b47b13ed2915f62f8c4b8cc96258d4de', 'org.whispersystems:curve25519-java:0.5.0:curve25519-java-0.5.0.jar:0aadd43cf01d11e9b58f867b3c4f25c3194e8b0623d1953d32dfbfbee009e38d', ] } diff --git a/bramble-java/build.gradle b/bramble-java/build.gradle index 3d51e8fec..1458063a3 100644 --- a/bramble-java/build.gradle +++ b/bramble-java/build.gradle @@ -23,10 +23,9 @@ dependencies { testImplementation project(path: ':bramble-api', configuration: 'testOutput') testImplementation project(path: ':bramble-core', configuration: 'testOutput') - testImplementation 'junit:junit:4.12' - testImplementation "org.jmock:jmock:2.8.2" - testImplementation "org.jmock:jmock-junit4:2.8.2" - testImplementation "org.jmock:jmock-legacy:2.8.2" + testImplementation "junit:junit:$junit_version" + testImplementation "org.jmock:jmock:$jmock_version" + testImplementation "org.jmock:jmock-junit4:$jmock_version" testAnnotationProcessor 'com.google.dagger:dagger-compiler:2.24' } diff --git a/bramble-java/witness.gradle b/bramble-java/witness.gradle index a6b8c8672..b83530b90 100644 --- a/bramble-java/witness.gradle +++ b/bramble-java/witness.gradle @@ -1,6 +1,7 @@ dependencyVerification { verify = [ - 'cglib:cglib:3.2.0:cglib-3.2.0.jar:adb13bab79712ad6bdf1bd59f2a3918018a8016e722e8a357065afb9e6690861', + 'cglib:cglib:3.2.8:cglib-3.2.8.jar:3f64de999ecc5595dc84ca8ff0879d8a34c8623f9ef3c517a53ed59023fcb9db', + 'com.google.code.findbugs:annotations:3.0.1:annotations-3.0.1.jar:6b47ff0a6de0ce17cbedc3abb0828ca5bce3009d53ea47b3723ff023c4742f79', 'com.google.code.findbugs:jsr305:3.0.2:jsr305-3.0.2.jar:766ad2a0783f2687962c8ad74ceecc38a28b9f72a2d085ee438b7813e928d0c7', 'com.google.dagger:dagger-compiler:2.24:dagger-compiler-2.24.jar:3c5afb955fb188da485cb2c048eff37dce0e1530b9780a0f2f7187d16d1ccc1f', 'com.google.dagger:dagger-producers:2.24:dagger-producers-2.24.jar:f10f45b95191954d5d6b043fca9e62fb621d21bf70634b8f8476c7988b504c3a', @@ -17,24 +18,26 @@ dependencyVerification { 'javax.annotation:jsr250-api:1.0:jsr250-api-1.0.jar:a1a922d0d9b6d183ed3800dfac01d1e1eb159f0e8c6f94736931c1def54a941f', 'javax.inject:javax.inject:1:javax.inject-1.jar:91c77044a50c481636c32d916fd89c9118a72195390452c81065080f957de7ff', 'junit:junit:4.12:junit-4.12.jar:59721f0805e223d84b90677887d9ff567dc534d7c502ca903c0c2b17f05c116a', + 'net.bytebuddy:byte-buddy:1.9.12:byte-buddy-1.9.12.jar:3688c3d434bebc3edc5516296a2ed0f47b65e451071b4afecad84f902f0efc11', 'net.java.dev.jna:jna-platform:4.5.2:jna-platform-4.5.2.jar:f1d00c167d8921c6e23c626ef9f1c3ae0be473c95c68ffa012bc7ae55a87e2d6', 'net.java.dev.jna:jna:4.5.2:jna-4.5.2.jar:0c8eb7acf67261656d79005191debaba3b6bf5dd60a43735a245429381dbecff', + 'net.jcip:jcip-annotations:1.0:jcip-annotations-1.0.jar:be5805392060c71474bf6c9a67a099471274d30b83eef84bfc4e0889a4f1dcc0', 'net.ltgt.gradle.incap:incap:0.2:incap-0.2.jar:b625b9806b0f1e4bc7a2e3457119488de3cd57ea20feedd513db070a573a4ffd', - 'org.apache.ant:ant-launcher:1.9.4:ant-launcher-1.9.4.jar:7bccea20b41801ca17bcbc909a78c835d0f443f12d639c77bd6ae3d05861608d', - 'org.apache.ant:ant:1.9.4:ant-1.9.4.jar:649ae0730251de07b8913f49286d46bba7b92d47c5f332610aa426c4f02161d8', - 'org.beanshell:bsh:1.3.0:bsh-1.3.0.jar:9b04edc75d19db54f1b4e8b5355e9364384c6cf71eb0a1b9724c159d779879f8', + 'org.apache-extras.beanshell:bsh:2.0b6:bsh-2.0b6.jar:a17955976070c0573235ee662f2794a78082758b61accffce8d3f8aedcd91047', 'org.briarproject:obfs4proxy:0.0.12-dev-40245c4a:obfs4proxy-0.0.12-dev-40245c4a.zip:172029e7058b3a83ac93ac4991a44bf76e16ce8d46f558f5836d57da3cb3a766', 'org.briarproject:tor:0.3.5.13-1:tor-0.3.5.13-1.zip:ef35c16bf8dc1f4c75ed71d9f55e4514f383d124ec96b859aca647c990927c99', 'org.checkerframework:checker-compat-qual:2.5.3:checker-compat-qual-2.5.3.jar:d76b9afea61c7c082908023f0cbc1427fab9abd2df915c8b8a3e7a509bccbc6d', 'org.checkerframework:checker-qual:2.5.2:checker-qual-2.5.2.jar:64b02691c8b9d4e7700f8ee2e742dce7ea2c6e81e662b7522c9ee3bf568c040a', 'org.codehaus.mojo:animal-sniffer-annotations:1.17:animal-sniffer-annotations-1.17.jar:92654f493ecfec52082e76354f0ebf87648dc3d5cec2e3c3cdb947c016747a53', - 'org.hamcrest:hamcrest-core:1.3:hamcrest-core-1.3.jar:66fdef91e9739348df7a096aa384a5685f4e875584cce89386a7a47251c4d8e9', - 'org.hamcrest:hamcrest-library:1.3:hamcrest-library-1.3.jar:711d64522f9ec410983bd310934296da134be4254a125080a0416ec178dfad1c', - 'org.jmock:jmock-junit4:2.8.2:jmock-junit4-2.8.2.jar:f7ee4df4f7bd7b7f1cafad3b99eb74d579f109d5992ff625347352edb55e674c', - 'org.jmock:jmock-legacy:2.8.2:jmock-legacy-2.8.2.jar:f2b985a5c08a9edb7f37612330c058809da3f6a6d63ce792426ebf8ff0d6d31b', - 'org.jmock:jmock-testjar:2.8.2:jmock-testjar-2.8.2.jar:8900860f72c474e027cf97fe78dcbf154a1aa7fc62b6845c5fb4e4f3c7bc8760', - 'org.jmock:jmock:2.8.2:jmock-2.8.2.jar:6c73cb4a2e6dbfb61fd99c9a768539c170ab6568e57846bd60dbf19596b65b16', - 'org.objenesis:objenesis:2.1:objenesis-2.1.jar:c74330cc6b806c804fd37e74487b4fe5d7c2750c5e15fbc6efa13bdee1bdef80', - 'org.ow2.asm:asm:5.0.4:asm-5.0.4.jar:896618ed8ae62702521a78bc7be42b7c491a08e6920a15f89a3ecdec31e9a220', + 'org.hamcrest:hamcrest-core:2.1:hamcrest-core-2.1.jar:e09109e54a289d88506b9bfec987ddd199f4217c9464132668351b9a4f00bee9', + 'org.hamcrest:hamcrest-library:2.1:hamcrest-library-2.1.jar:b7e2b6895b3b679f0e47b6380fda391b225e9b78505db9d8bdde8d3cc8d52a21', + 'org.hamcrest:hamcrest:2.1:hamcrest-2.1.jar:ba93b2e3a562322ba432f0a1b53addcc55cb188253319a020ed77f824e692050', + 'org.jmock:jmock-imposters:2.12.0:jmock-imposters-2.12.0.jar:3b836269745a137c9b2347e8d7c2104845b126ef04f012d6bfd94f1a7dea7b09', + 'org.jmock:jmock-junit4:2.12.0:jmock-junit4-2.12.0.jar:3233062fc889637c151a24f1ee086bad04321ab7d8264fef279daff0fa27205b', + 'org.jmock:jmock-legacy:2.12.0:jmock-legacy-2.12.0.jar:dea3a9cca653d082e2fe7e40232e982fe03a9984c7d67ceff24f3e03fe580dcd', + 'org.jmock:jmock-testjar:2.12.0:jmock-testjar-2.12.0.jar:efefbcf6cd294d0e29f0c46eb2a3380d4ca4e1763ff719c69e2f2ac62f564a04', + 'org.jmock:jmock:2.12.0:jmock-2.12.0.jar:266d07314c0cd343c46ff8a55601272de8cf406807caf55e6f313295f83d10be', + 'org.objenesis:objenesis:3.0.1:objenesis-3.0.1.jar:7a8ff780b9ff48415d7c705f60030b0acaa616e7f823c98eede3b63508d4e984', + 'org.ow2.asm:asm:7.1:asm-7.1.jar:4ab2fa2b6d2cc9ccb1eaa05ea329c407b47b13ed2915f62f8c4b8cc96258d4de', ] } diff --git a/briar-android/build.gradle b/briar-android/build.gradle index b78a0a3ce..9ac64e336 100644 --- a/briar-android/build.gradle +++ b/briar-android/build.gradle @@ -137,11 +137,12 @@ dependencies { testImplementation "androidx.arch.core:core-testing:2.1.0" testImplementation "androidx.test.espresso:espresso-core:$espressoVersion" testImplementation 'org.robolectric:robolectric:4.3.1' - testImplementation 'org.mockito:mockito-core:3.1.0' - testImplementation 'junit:junit:4.13.1' - testImplementation "org.jmock:jmock:$jmockVersion" - testImplementation "org.jmock:jmock-junit4:$jmockVersion" - testImplementation "org.jmock:jmock-legacy:$jmockVersion" + + testImplementation 'org.mockito:mockito-core:3.9.0' + testImplementation "junit:junit:$junit_version" + testImplementation "org.jmock:jmock:$jmock_version" + testImplementation "org.jmock:jmock-junit4:$jmock_version" + testImplementation "org.jmock:jmock-imposters:$jmock_version" testAnnotationProcessor "com.google.dagger:dagger-compiler:2.24" androidTestImplementation project(path: ':bramble-api', configuration: 'testOutput') diff --git a/briar-android/src/test/java/org/briarproject/briar/android/account/SetupViewModelTest.java b/briar-android/src/test/java/org/briarproject/briar/android/account/SetupViewModelTest.java index e64693789..3cc74b11d 100644 --- a/briar-android/src/test/java/org/briarproject/briar/android/account/SetupViewModelTest.java +++ b/briar-android/src/test/java/org/briarproject/briar/android/account/SetupViewModelTest.java @@ -9,7 +9,7 @@ import org.briarproject.bramble.test.BrambleMockTestCase; import org.briarproject.bramble.test.ImmediateExecutor; import org.briarproject.briar.android.account.SetupViewModel.State; import org.jmock.Expectations; -import org.jmock.lib.legacy.ClassImposteriser; +import org.jmock.imposters.ByteBuddyClassImposteriser; import org.junit.Rule; import org.junit.Test; @@ -36,7 +36,7 @@ public class SetupViewModelTest extends BrambleMockTestCase { private final DozeHelper dozeHelper; public SetupViewModelTest() { - context.setImposteriser(ClassImposteriser.INSTANCE); + context.setImposteriser(ByteBuddyClassImposteriser.INSTANCE); app = context.mock(Application.class); appContext = context.mock(Context.class); accountManager = context.mock(AccountManager.class); diff --git a/briar-android/src/test/java/org/briarproject/briar/android/attachment/AttachmentRetrieverTest.java b/briar-android/src/test/java/org/briarproject/briar/android/attachment/AttachmentRetrieverTest.java index 1b9bdde06..565ddbe0a 100644 --- a/briar-android/src/test/java/org/briarproject/briar/android/attachment/AttachmentRetrieverTest.java +++ b/briar-android/src/test/java/org/briarproject/briar/android/attachment/AttachmentRetrieverTest.java @@ -11,7 +11,7 @@ import org.briarproject.briar.api.attachment.Attachment; import org.briarproject.briar.api.attachment.AttachmentHeader; import org.briarproject.briar.api.attachment.AttachmentReader; import org.jmock.Expectations; -import org.jmock.lib.legacy.ClassImposteriser; +import org.jmock.imposters.ByteBuddyClassImposteriser; import org.junit.Test; import java.io.ByteArrayInputStream; @@ -36,7 +36,7 @@ public class AttachmentRetrieverTest extends BrambleMockTestCase { private final AttachmentRetriever retriever; public AttachmentRetrieverTest() { - context.setImposteriser(ClassImposteriser.INSTANCE); + context.setImposteriser(ByteBuddyClassImposteriser.INSTANCE); AttachmentReader attachmentReader = context.mock(AttachmentReader.class); imageSizeCalculator = context.mock(ImageSizeCalculator.class); diff --git a/briar-android/src/test/java/org/briarproject/briar/android/privategroup/list/GroupListViewModelTest.java b/briar-android/src/test/java/org/briarproject/briar/android/privategroup/list/GroupListViewModelTest.java index bfdc0c126..15e432dc5 100644 --- a/briar-android/src/test/java/org/briarproject/briar/android/privategroup/list/GroupListViewModelTest.java +++ b/briar-android/src/test/java/org/briarproject/briar/android/privategroup/list/GroupListViewModelTest.java @@ -26,7 +26,7 @@ import org.briarproject.briar.api.privategroup.event.GroupDissolvedEvent; import org.briarproject.briar.api.privategroup.invitation.GroupInvitationItem; import org.briarproject.briar.api.privategroup.invitation.GroupInvitationManager; import org.jmock.Expectations; -import org.jmock.lib.legacy.ClassImposteriser; +import org.jmock.imposters.ByteBuddyClassImposteriser; import org.junit.Rule; import org.junit.Test; @@ -95,7 +95,7 @@ public class GroupListViewModelTest extends BrambleMockTestCase { new GroupItem(privateGroup2, authorInfo2, groupCount2, false); public GroupListViewModelTest() { - context.setImposteriser(ClassImposteriser.INSTANCE); + context.setImposteriser(ByteBuddyClassImposteriser.INSTANCE); Application app = context.mock(Application.class); context.checking(new Expectations() {{ oneOf(eventBus).addListener(with(any(EventListener.class))); diff --git a/briar-android/src/test/java/org/briarproject/briar/android/util/UiUtilsFormatDurationTest.java b/briar-android/src/test/java/org/briarproject/briar/android/util/UiUtilsFormatDurationTest.java new file mode 100644 index 000000000..6162af3fe --- /dev/null +++ b/briar-android/src/test/java/org/briarproject/briar/android/util/UiUtilsFormatDurationTest.java @@ -0,0 +1,168 @@ +package org.briarproject.briar.android.util; + +import android.content.Context; +import android.content.res.Resources; + +import org.briarproject.bramble.test.BrambleMockTestCase; +import org.briarproject.briar.R; +import org.jmock.Expectations; +import org.jmock.imposters.ByteBuddyClassImposteriser; +import org.junit.Test; + +import static java.util.concurrent.TimeUnit.DAYS; +import static java.util.concurrent.TimeUnit.HOURS; +import static java.util.concurrent.TimeUnit.MINUTES; +import static java.util.concurrent.TimeUnit.SECONDS; +import static org.briarproject.briar.android.util.UiUtils.formatDuration; + +public class UiUtilsFormatDurationTest extends BrambleMockTestCase { + + private final Context ctx; + private final Resources r; + private final int strMinutes = R.plurals.duration_minutes; + private final int strHours = R.plurals.duration_hours; + private final int strDays = R.plurals.duration_days; + + public UiUtilsFormatDurationTest() { + context.setImposteriser(ByteBuddyClassImposteriser.INSTANCE); + ctx = context.mock(Context.class); + r = context.mock(Resources.class); + } + + @Test + public void testOneMinute() { + expectMinuteString(1); + formatDuration(ctx, MINUTES.toMillis(1)); + } + + @Test + public void testOneHour() { + expectHourString(1); + formatDuration(ctx, HOURS.toMillis(1)); + } + + @Test + public void testOneDay() { + expectDayString(1); + formatDuration(ctx, DAYS.toMillis(1)); + } + + @Test + public void test10Seconds() { + // capped to 1min + expectMinuteString(1); + formatDuration(ctx, SECONDS.toMillis(10)); + } + + @Test + public void test100Seconds() { + expectMinuteString(2); + formatDuration(ctx, SECONDS.toMillis(100)); + } + + @Test + public void test2Minutes() { + expectMinuteString(2); + formatDuration(ctx, MINUTES.toMillis(2)); + } + + @Test + public void test10Minutes() { + expectMinuteString(10); + formatDuration(ctx, MINUTES.toMillis(10)); + } + + @Test + public void test130Minutes() { + expectHourString(2); + expectMinuteString(10); + formatDuration(ctx, MINUTES.toMillis(130)); + } + + @Test + public void test13Hours() { + expectHourString(13); + formatDuration(ctx, HOURS.toMillis(13)); + } + + @Test + public void testSevenDays() { + expectDayString(7); + formatDuration(ctx, DAYS.toMillis(7)); + } + + @Test + public void testSevenDays2Hours() { + expectDayString(7); + expectHourString(2); + formatDuration(ctx, DAYS.toMillis(7) + HOURS.toMillis(2)); + } + + @Test + public void testSevenDays20Minutes() { + expectDayString(7); + formatDuration(ctx, DAYS.toMillis(7) + MINUTES.toMillis(20)); + } + + @Test + public void testSevenDays40Minutes() { + expectDayString(7); + expectMinuteString(40); + formatDuration(ctx, DAYS.toMillis(7) + MINUTES.toMillis(40)); + } + + @Test + public void testTwoDays11Hours() { + expectDayString(2); + expectHourString(11); + formatDuration(ctx, DAYS.toMillis(2) + HOURS.toMillis(11)); + } + + @Test + public void testTwoDays12Hours() { + expectDayString(2); + expectHourString(12); + formatDuration(ctx, DAYS.toMillis(2) + HOURS.toMillis(12)); + } + + @Test + public void testTwoDays13Hours() { + expectDayString(2); + expectHourString(13); + formatDuration(ctx, DAYS.toMillis(2) + HOURS.toMillis(13)); + } + + @Test + public void test7Days23Hours55Minutes() { + expectDayString(7); + expectHourString(23); + expectMinuteString(55); + formatDuration(ctx, + DAYS.toMillis(7) + HOURS.toMillis(23) + MINUTES.toMillis(55)); + } + + private void expectMinuteString(int minutes) { + context.checking(new Expectations() {{ + oneOf(ctx).getResources(); + will(returnValue(r)); + oneOf(r).getQuantityString(strMinutes, minutes, minutes); + }}); + } + + private void expectHourString(int hours) { + context.checking(new Expectations() {{ + oneOf(ctx).getResources(); + will(returnValue(r)); + oneOf(r).getQuantityString(strHours, hours, hours); + }}); + } + + private void expectDayString(int days) { + context.checking(new Expectations() {{ + oneOf(ctx).getResources(); + will(returnValue(r)); + oneOf(r).getQuantityString(strDays, days, days); + }}); + } + +} diff --git a/briar-android/witness.gradle b/briar-android/witness.gradle index 3bef77ee0..204f505a4 100644 --- a/briar-android/witness.gradle +++ b/briar-android/witness.gradle @@ -64,7 +64,7 @@ dependencyVerification { 'androidx.viewpager2:viewpager2:1.0.0:viewpager2-1.0.0.aar:e95c0031d4cc247cd48196c6287e58d2cee54d9c79b85afea7c90920330275af', 'androidx.viewpager:viewpager:1.0.0:viewpager-1.0.0.aar:147af4e14a1984010d8f155e5e19d781f03c1d70dfed02a8e0d18428b8fc8682', 'backport-util-concurrent:backport-util-concurrent:3.1:backport-util-concurrent-3.1.jar:f5759b7fcdfc83a525a036deedcbd32e5b536b625ebc282426f16ca137eb5902', - 'cglib:cglib:3.2.0:cglib-3.2.0.jar:adb13bab79712ad6bdf1bd59f2a3918018a8016e722e8a357065afb9e6690861', + 'cglib:cglib:3.2.8:cglib-3.2.8.jar:3f64de999ecc5595dc84ca8ff0879d8a34c8623f9ef3c517a53ed59023fcb9db', 'classworlds:classworlds:1.1-alpha-2:classworlds-1.1-alpha-2.jar:2bf4e59f3acd106fea6145a9a88fe8956509f8b9c0fdd11eb96fee757269e3f3', 'com.almworks.sqlite4java:sqlite4java:0.282:sqlite4java-0.282.jar:9e1d8dd83ca6003f841e3af878ce2dc7c22497493a7bb6d1b62ec1b0d0a83c05', 'com.android.tools.analytics-library:protos:27.1.1:protos-27.1.1.jar:13f77e73762e58ab372d140b3a6be6903aea9775b62dd14fbc62d4cc7069c9a4', @@ -108,6 +108,7 @@ dependencyVerification { 'com.google.android.material:material:1.2.1:material-1.2.1.aar:d3d0cc776f2341da8e572586c7d390a5b356ce39a0deb2768071dc40b364ac80', 'com.google.auto.service:auto-service:1.0-rc4:auto-service-1.0-rc4.jar:e422d49c312fd2031222e7306e8108c1b4118eb9c049f1b51eca280bed87e924', 'com.google.auto:auto-common:0.8:auto-common-0.8.jar:97db1709f57b91b32edacb596ef4641872f227b7d99ad90e467f0d77f5ba134a', + 'com.google.code.findbugs:annotations:3.0.1:annotations-3.0.1.jar:6b47ff0a6de0ce17cbedc3abb0828ca5bce3009d53ea47b3723ff023c4742f79', 'com.google.code.findbugs:jsr305:3.0.2:jsr305-3.0.2.jar:766ad2a0783f2687962c8ad74ceecc38a28b9f72a2d085ee438b7813e928d0c7', 'com.google.code.gson:gson:2.8.5:gson-2.8.5.jar:233a0149fc365c9f6edbd683cfe266b19bdc773be98eabdaf6b3c924b48e7d81', 'com.google.code.gson:gson:2.8.6:gson-2.8.6.jar:c8fb4839054d280b3033f800d1f5a97de2f028eb8ba2eb458ad287e536f3f25f', @@ -155,18 +156,21 @@ dependencyVerification { 'javax.annotation:jsr250-api:1.0:jsr250-api-1.0.jar:a1a922d0d9b6d183ed3800dfac01d1e1eb159f0e8c6f94736931c1def54a941f', 'javax.inject:javax.inject:1:javax.inject-1.jar:91c77044a50c481636c32d916fd89c9118a72195390452c81065080f957de7ff', 'javax.xml.bind:jaxb-api:2.3.1:jaxb-api-2.3.1.jar:88b955a0df57880a26a74708bc34f74dcaf8ebf4e78843a28b50eae945732b06', + 'junit:junit:4.12:junit-4.12.jar:59721f0805e223d84b90677887d9ff567dc534d7c502ca903c0c2b17f05c116a', 'junit:junit:4.13.1:junit-4.13.1.jar:c30719db974d6452793fe191b3638a5777005485bae145924044530ffa5f6122', 'nekohtml:nekohtml:1.9.6.2:nekohtml-1.9.6.2.jar:fdff6cfa9ed9cc911c842a5d2395f209ec621ef1239d46810e9e495809d3ae09', 'nekohtml:xercesMinimal:1.9.6.2:xercesMinimal-1.9.6.2.jar:95b8b357d19f63797dd7d67622fd3f18374d64acbc6584faba1c7759a31e8438', - 'net.bytebuddy:byte-buddy-agent:1.9.10:byte-buddy-agent-1.9.10.jar:8ed739d29132103250d307d2e8e3c95f07588ef0543ab11d2881d00768a5e182', - 'net.bytebuddy:byte-buddy:1.9.10:byte-buddy-1.9.10.jar:2936debc4d7b6c534848d361412e2d0f8bd06f7f27a6f4e728a20e97648d2bf3', + 'net.bytebuddy:byte-buddy-agent:1.10.20:byte-buddy-agent-1.10.20.jar:b592a6c43e752bf41659717956c57fbb790394d2ee5f8941876659f9c5c0e7e8', + 'net.bytebuddy:byte-buddy:1.10.20:byte-buddy-1.10.20.jar:5fcad05da791e9a22811c255a4a74b7ea094b7243d9dbf3e6fc578c8c94290ac', 'net.i2p.crypto:eddsa:0.2.0:eddsa-0.2.0.jar:a7cb1b85c16e2f0730b9204106929a1d9aaae1df728adc7041a8b8b605692140', 'net.java.dev.jna:jna:5.5.0:jna-5.5.0.aar:12ef4a3c2ea685c9c816caa6a77ae8f17bb7727d8460f249925409acda270101', + 'net.jcip:jcip-annotations:1.0:jcip-annotations-1.0.jar:be5805392060c71474bf6c9a67a099471274d30b83eef84bfc4e0889a4f1dcc0', 'net.ltgt.gradle.incap:incap:0.2:incap-0.2.jar:b625b9806b0f1e4bc7a2e3457119488de3cd57ea20feedd513db070a573a4ffd', 'net.sf.jopt-simple:jopt-simple:4.9:jopt-simple-4.9.jar:26c5856e954b5f864db76f13b86919b59c6eecf9fd930b96baa8884626baf2f5', 'net.sf.kxml:kxml2:2.3.0:kxml2-2.3.0.jar:f264dd9f79a1fde10ce5ecc53221eff24be4c9331c830b7d52f2f08a7b633de2', - 'org.apache.ant:ant-launcher:1.9.4:ant-launcher-1.9.4.jar:7bccea20b41801ca17bcbc909a78c835d0f443f12d639c77bd6ae3d05861608d', - 'org.apache.ant:ant:1.9.4:ant-1.9.4.jar:649ae0730251de07b8913f49286d46bba7b92d47c5f332610aa426c4f02161d8', + 'org.apache-extras.beanshell:bsh:2.0b6:bsh-2.0b6.jar:a17955976070c0573235ee662f2794a78082758b61accffce8d3f8aedcd91047', + 'org.apache.ant:ant-launcher:1.8.0:ant-launcher-1.8.0.jar:da9fd92eacdf63daf0be52eb71accc10ff7943a85d7aac9ea96cf7e03ee3d3cc', + 'org.apache.ant:ant:1.8.0:ant-1.8.0.jar:0251dbb938740ace07a53675113eee753ba389db65aebc814b175af50321620e', 'org.apache.commons:commons-compress:1.12:commons-compress-1.12.jar:2c1542faf343185b7cab9c3d55c8ae5471d6d095d3887a4adefdbdf2984dc0b6', 'org.apache.httpcomponents:httpclient:4.5.6:httpclient-4.5.6.jar:c03f813195e7a80e3608d0ddd8da80b21696a4c92a6a2298865bf149071551c7', 'org.apache.httpcomponents:httpcore:4.4.10:httpcore-4.4.10.jar:78ba1096561957db1b55200a159b648876430342d15d461277e62360da19f6fd', @@ -185,7 +189,6 @@ dependencyVerification { 'org.apache.maven:maven-project:2.2.1:maven-project-2.2.1.jar:24ddb65b7a6c3befb6267ce5f739f237c84eba99389265c30df67c3dd8396a40', 'org.apache.maven:maven-repository-metadata:2.2.1:maven-repository-metadata-2.2.1.jar:5fe283f47b0e7f7d95a4252af3fa7a0db4d8f080cd9df308608c0472b8f168a1', 'org.apache.maven:maven-settings:2.2.1:maven-settings-2.2.1.jar:9a9f556713a404e770c9dbdaed7eb086078014c989291960c76fdde6db4192f7', - 'org.beanshell:bsh:1.3.0:bsh-1.3.0.jar:9b04edc75d19db54f1b4e8b5355e9364384c6cf71eb0a1b9724c159d779879f8', 'org.bouncycastle:bcpkix-jdk15on:1.56:bcpkix-jdk15on-1.56.jar:7043dee4e9e7175e93e0b36f45b1ec1ecb893c5f755667e8b916eb8dd201c6ca', 'org.bouncycastle:bcprov-jdk15on:1.52:bcprov-jdk15on-1.52.jar:0dc4d181e4d347893c2ddbd2e6cd5d7287fc651c03648fa64b2341c7366b1773', 'org.bouncycastle:bcprov-jdk15on:1.56:bcprov-jdk15on-1.56.jar:963e1ee14f808ffb99897d848ddcdb28fa91ddda867eb18d303e82728f878349', @@ -202,8 +205,11 @@ dependencyVerification { 'org.glassfish.jaxb:jaxb-runtime:2.3.1:jaxb-runtime-2.3.1.jar:45fecfa5c8217ce1f3652ab95179790ec8cc0dec0384bca51cbeb94a293d9f2f', 'org.glassfish.jaxb:txw2:2.3.1:txw2-2.3.1.jar:34975dde1c6920f1a39791142235689bc3cd357e24d05edd8ff93b885bd68d60', 'org.hamcrest:hamcrest-core:1.3:hamcrest-core-1.3.jar:66fdef91e9739348df7a096aa384a5685f4e875584cce89386a7a47251c4d8e9', + 'org.hamcrest:hamcrest-core:2.1:hamcrest-core-2.1.jar:e09109e54a289d88506b9bfec987ddd199f4217c9464132668351b9a4f00bee9', 'org.hamcrest:hamcrest-integration:1.3:hamcrest-integration-1.3.jar:70f418efbb506c5155da5f9a5a33262ea08a9e4d7fea186aa9015c41a7224ac2', 'org.hamcrest:hamcrest-library:1.3:hamcrest-library-1.3.jar:711d64522f9ec410983bd310934296da134be4254a125080a0416ec178dfad1c', + 'org.hamcrest:hamcrest-library:2.1:hamcrest-library-2.1.jar:b7e2b6895b3b679f0e47b6380fda391b225e9b78505db9d8bdde8d3cc8d52a21', + 'org.hamcrest:hamcrest:2.1:hamcrest-2.1.jar:ba93b2e3a562322ba432f0a1b53addcc55cb188253319a020ed77f824e692050', 'org.jetbrains.kotlin:kotlin-reflect:1.3.72:kotlin-reflect-1.3.72.jar:a188d9367de1c4ee9479db630985c0597b20709c83161b1430d24edb27e38c40', 'org.jetbrains.kotlin:kotlin-stdlib-common:1.3.50:kotlin-stdlib-common-1.3.50.jar:8ce678e88e4ba018b66dacecf952471e4d7dfee156a8a819760a5a5ff29d323c', 'org.jetbrains.kotlin:kotlin-stdlib-common:1.3.72:kotlin-stdlib-common-1.3.72.jar:5e7d1552863e480c1628b1cc39ce230ef829f5b7230106215a05acda5172203a', @@ -215,21 +221,23 @@ dependencyVerification { 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.0:kotlinx-coroutines-core-1.3.0.jar:6f3a60fea2403b80385b399952aeb3a4cf0985a45b8da04b6f31825171901a1d', 'org.jetbrains.trove4j:trove4j:20160824:trove4j-20160824.jar:1917871c8deb468307a584680c87a44572f5a8b0b98c6d397fc0f5f86596dbe7', 'org.jetbrains:annotations:13.0:annotations-13.0.jar:ace2a10dc8e2d5fd34925ecac03e4988b2c0f851650c94b8cef49ba1bd111478', - 'org.jmock:jmock-junit4:2.8.2:jmock-junit4-2.8.2.jar:f7ee4df4f7bd7b7f1cafad3b99eb74d579f109d5992ff625347352edb55e674c', - 'org.jmock:jmock-legacy:2.8.2:jmock-legacy-2.8.2.jar:f2b985a5c08a9edb7f37612330c058809da3f6a6d63ce792426ebf8ff0d6d31b', - 'org.jmock:jmock-testjar:2.8.2:jmock-testjar-2.8.2.jar:8900860f72c474e027cf97fe78dcbf154a1aa7fc62b6845c5fb4e4f3c7bc8760', - 'org.jmock:jmock:2.8.2:jmock-2.8.2.jar:6c73cb4a2e6dbfb61fd99c9a768539c170ab6568e57846bd60dbf19596b65b16', + 'org.jmock:jmock-imposters:2.12.0:jmock-imposters-2.12.0.jar:3b836269745a137c9b2347e8d7c2104845b126ef04f012d6bfd94f1a7dea7b09', + 'org.jmock:jmock-junit4:2.12.0:jmock-junit4-2.12.0.jar:3233062fc889637c151a24f1ee086bad04321ab7d8264fef279daff0fa27205b', + 'org.jmock:jmock-legacy:2.12.0:jmock-legacy-2.12.0.jar:dea3a9cca653d082e2fe7e40232e982fe03a9984c7d67ceff24f3e03fe580dcd', + 'org.jmock:jmock-testjar:2.12.0:jmock-testjar-2.12.0.jar:efefbcf6cd294d0e29f0c46eb2a3380d4ca4e1763ff719c69e2f2ac62f564a04', + 'org.jmock:jmock:2.12.0:jmock-2.12.0.jar:266d07314c0cd343c46ff8a55601272de8cf406807caf55e6f313295f83d10be', 'org.jvnet.staxex:stax-ex:1.8:stax-ex-1.8.jar:95b05d9590af4154c6513b9c5dc1fb2e55b539972ba0a9ef28e9a0c01d83ad77', 'org.magmacollective.darkcrystal:dark-crystal-key-backup-crypto:1.0.0:dark-crystal-key-backup-crypto-1.0.0.jar:7c808f30314f7bc0c715b53415b07bd7e9a6bbcc55e5f672a296e5298d335f78', 'org.magmacollective.darkcrystal:dark-crystal-secret-sharing-wrapper:1.1.0:dark-crystal-secret-sharing-wrapper-1.1.0.aar:b8cac2348b9e652de413fa587168e9bb6ff36f6eea4bd1c72d3ecd56fc186e09', 'org.magmacollective.darkcrystal:shamir-secret-sharing-jna:1.0.0:shamir-secret-sharing-jna-1.0.0.aar:cdccfaf74dc1fcf30799a45d034c406315ce8507a8f4382eee118a66fb229ced', - 'org.mockito:mockito-core:3.1.0:mockito-core-3.1.0.jar:89b09e518e04f5c35f5ccf7abe45e72f594070a53d95cc2579001bd392c5afa6', - 'org.objenesis:objenesis:2.6:objenesis-2.6.jar:5e168368fbc250af3c79aa5fef0c3467a2d64e5a7bd74005f25d8399aeb0708d', + 'org.mockito:mockito-core:3.9.0:mockito-core-3.9.0.jar:a1f64211407b8dc4cf80b16e07cc11aa9e5228d53dc4a5357326d66825f6a4ac', + 'org.objenesis:objenesis:3.2:objenesis-3.2.jar:03d960bd5aef03c653eb000413ada15eb77cdd2b8e4448886edf5692805e35f3', 'org.ow2.asm:asm-analysis:7.0:asm-analysis-7.0.jar:e981f8f650c4d900bb033650b18e122fa6b161eadd5f88978d08751f72ee8474', 'org.ow2.asm:asm-commons:7.0:asm-commons-7.0.jar:fed348ef05958e3e846a3ac074a12af5f7936ef3d21ce44a62c4fa08a771927d', 'org.ow2.asm:asm-tree:7.0:asm-tree-7.0.jar:cfd7a0874f9de36a999c127feeadfbfe6e04d4a71ee954d7af3d853f0be48a6c', 'org.ow2.asm:asm-util:7.0:asm-util-7.0.jar:75fbbca440ef463f41c2b0ab1a80abe67e910ac486da60a7863cbcb5bae7e145', 'org.ow2.asm:asm:7.0:asm-7.0.jar:b88ef66468b3c978ad0c97fd6e90979e56155b4ac69089ba7a44e9aa7ffe9acf', + 'org.ow2.asm:asm:7.1:asm-7.1.jar:4ab2fa2b6d2cc9ccb1eaa05ea329c407b47b13ed2915f62f8c4b8cc96258d4de', 'org.robolectric:annotations:4.3.1:annotations-4.3.1.jar:ce679af70c22620b5752aa6c1555d0653198d6370e9a93fe71b8eaaebc5ffaf6', 'org.robolectric:junit:4.3.1:junit-4.3.1.jar:60c85ea7fd652bc4e57567cbd3c41c5d32f2c678e212b713cefa6c63570451ce', 'org.robolectric:pluginapi:4.3.1:pluginapi-4.3.1.jar:229256a260a1d8e8d33613a3de7ccd639661a7061251c1974975ed427428b468', diff --git a/briar-core/build.gradle b/briar-core/build.gradle index 14bc3aa16..e81e941f5 100644 --- a/briar-core/build.gradle +++ b/briar-core/build.gradle @@ -22,10 +22,10 @@ dependencies { testImplementation project(path: ':bramble-core', configuration: 'testOutput') testImplementation project(path: ':bramble-api', configuration: 'testOutput') testImplementation 'net.jodah:concurrentunit:0.4.2' - testImplementation 'junit:junit:4.12' - testImplementation "org.jmock:jmock:2.8.2" - testImplementation "org.jmock:jmock-junit4:2.8.2" - testImplementation "org.jmock:jmock-legacy:2.8.2" + testImplementation "junit:junit:$junit_version" + testImplementation "org.jmock:jmock:$jmock_version" + testImplementation "org.jmock:jmock-junit4:$jmock_version" + testImplementation "org.jmock:jmock-imposters:$jmock_version" testAnnotationProcessor 'com.google.dagger:dagger-compiler:2.24' diff --git a/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/GroupInvitationManagerImplTest.java b/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/GroupInvitationManagerImplTest.java index 58df14e7c..cd7158c9a 100644 --- a/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/GroupInvitationManagerImplTest.java +++ b/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/GroupInvitationManagerImplTest.java @@ -33,7 +33,7 @@ import org.briarproject.briar.api.privategroup.invitation.GroupInvitationRequest import org.briarproject.briar.api.privategroup.invitation.GroupInvitationResponse; import org.jmock.AbstractExpectations; import org.jmock.Expectations; -import org.jmock.lib.legacy.ClassImposteriser; +import org.jmock.imposters.ByteBuddyClassImposteriser; import org.junit.Test; import java.util.Collection; @@ -120,7 +120,7 @@ public class GroupInvitationManagerImplTest extends BrambleMockTestCase { public GroupInvitationManagerImplTest() { - context.setImposteriser(ClassImposteriser.INSTANCE); + context.setImposteriser(ByteBuddyClassImposteriser.INSTANCE); creatorEngine = context.mock(CreatorProtocolEngine.class); inviteeEngine = context.mock(InviteeProtocolEngine.class); peerEngine = context.mock(PeerProtocolEngine.class); diff --git a/briar-core/witness.gradle b/briar-core/witness.gradle index 603dd3432..e176ef43d 100644 --- a/briar-core/witness.gradle +++ b/briar-core/witness.gradle @@ -1,6 +1,7 @@ dependencyVerification { verify = [ - 'cglib:cglib:3.2.0:cglib-3.2.0.jar:adb13bab79712ad6bdf1bd59f2a3918018a8016e722e8a357065afb9e6690861', + 'cglib:cglib:3.2.8:cglib-3.2.8.jar:3f64de999ecc5595dc84ca8ff0879d8a34c8623f9ef3c517a53ed59023fcb9db', + 'com.google.code.findbugs:annotations:3.0.1:annotations-3.0.1.jar:6b47ff0a6de0ce17cbedc3abb0828ca5bce3009d53ea47b3723ff023c4742f79', 'com.google.code.findbugs:jsr305:3.0.2:jsr305-3.0.2.jar:766ad2a0783f2687962c8ad74ceecc38a28b9f72a2d085ee438b7813e928d0c7', 'com.google.dagger:dagger-compiler:2.24:dagger-compiler-2.24.jar:3c5afb955fb188da485cb2c048eff37dce0e1530b9780a0f2f7187d16d1ccc1f', 'com.google.dagger:dagger-producers:2.24:dagger-producers-2.24.jar:f10f45b95191954d5d6b043fca9e62fb621d21bf70634b8f8476c7988b504c3a', @@ -21,28 +22,30 @@ dependencyVerification { 'javax.annotation:jsr250-api:1.0:jsr250-api-1.0.jar:a1a922d0d9b6d183ed3800dfac01d1e1eb159f0e8c6f94736931c1def54a941f', 'javax.inject:javax.inject:1:javax.inject-1.jar:91c77044a50c481636c32d916fd89c9118a72195390452c81065080f957de7ff', 'junit:junit:4.12:junit-4.12.jar:59721f0805e223d84b90677887d9ff567dc534d7c502ca903c0c2b17f05c116a', + 'net.bytebuddy:byte-buddy:1.9.12:byte-buddy-1.9.12.jar:3688c3d434bebc3edc5516296a2ed0f47b65e451071b4afecad84f902f0efc11', + 'net.jcip:jcip-annotations:1.0:jcip-annotations-1.0.jar:be5805392060c71474bf6c9a67a099471274d30b83eef84bfc4e0889a4f1dcc0', 'net.jodah:concurrentunit:0.4.2:concurrentunit-0.4.2.jar:5583078e1acf91734939e985bc9e7ee947b0e93a8eef679da6bb07bbeb47ced3', 'net.ltgt.gradle.incap:incap:0.2:incap-0.2.jar:b625b9806b0f1e4bc7a2e3457119488de3cd57ea20feedd513db070a573a4ffd', - 'org.apache.ant:ant-launcher:1.9.4:ant-launcher-1.9.4.jar:7bccea20b41801ca17bcbc909a78c835d0f443f12d639c77bd6ae3d05861608d', - 'org.apache.ant:ant:1.9.4:ant-1.9.4.jar:649ae0730251de07b8913f49286d46bba7b92d47c5f332610aa426c4f02161d8', - 'org.beanshell:bsh:1.3.0:bsh-1.3.0.jar:9b04edc75d19db54f1b4e8b5355e9364384c6cf71eb0a1b9724c159d779879f8', + 'org.apache-extras.beanshell:bsh:2.0b6:bsh-2.0b6.jar:a17955976070c0573235ee662f2794a78082758b61accffce8d3f8aedcd91047', 'org.checkerframework:checker-compat-qual:2.5.3:checker-compat-qual-2.5.3.jar:d76b9afea61c7c082908023f0cbc1427fab9abd2df915c8b8a3e7a509bccbc6d', 'org.checkerframework:checker-qual:2.5.2:checker-qual-2.5.2.jar:64b02691c8b9d4e7700f8ee2e742dce7ea2c6e81e662b7522c9ee3bf568c040a', 'org.codehaus.mojo.signature:java16:1.1:java16-1.1.signature:53799223a2c98dba2d0add810bed76315460df285c69e4f397ae6098f87dd619', 'org.codehaus.mojo:animal-sniffer-annotations:1.17:animal-sniffer-annotations-1.17.jar:92654f493ecfec52082e76354f0ebf87648dc3d5cec2e3c3cdb947c016747a53', 'org.codehaus.mojo:animal-sniffer-ant-tasks:1.16:animal-sniffer-ant-tasks-1.16.jar:890040976fbe2d584619a6a61b1fd2e925b3b5eb342a85eb2762c467c0d64e90', 'org.codehaus.mojo:animal-sniffer:1.16:animal-sniffer-1.16.jar:72be8bcc226ba43b937c722a08a07852bfa1b11400089265d5df0ee7b38b1d52', - 'org.hamcrest:hamcrest-core:1.3:hamcrest-core-1.3.jar:66fdef91e9739348df7a096aa384a5685f4e875584cce89386a7a47251c4d8e9', - 'org.hamcrest:hamcrest-library:1.3:hamcrest-library-1.3.jar:711d64522f9ec410983bd310934296da134be4254a125080a0416ec178dfad1c', + 'org.hamcrest:hamcrest-core:2.1:hamcrest-core-2.1.jar:e09109e54a289d88506b9bfec987ddd199f4217c9464132668351b9a4f00bee9', + 'org.hamcrest:hamcrest-library:2.1:hamcrest-library-2.1.jar:b7e2b6895b3b679f0e47b6380fda391b225e9b78505db9d8bdde8d3cc8d52a21', + 'org.hamcrest:hamcrest:2.1:hamcrest-2.1.jar:ba93b2e3a562322ba432f0a1b53addcc55cb188253319a020ed77f824e692050', 'org.jdom:jdom2:2.0.6:jdom2-2.0.6.jar:1345f11ba606d15603d6740551a8c21947c0215640770ec67271fe78bea97cf5', - 'org.jmock:jmock-junit4:2.8.2:jmock-junit4-2.8.2.jar:f7ee4df4f7bd7b7f1cafad3b99eb74d579f109d5992ff625347352edb55e674c', - 'org.jmock:jmock-legacy:2.8.2:jmock-legacy-2.8.2.jar:f2b985a5c08a9edb7f37612330c058809da3f6a6d63ce792426ebf8ff0d6d31b', - 'org.jmock:jmock-testjar:2.8.2:jmock-testjar-2.8.2.jar:8900860f72c474e027cf97fe78dcbf154a1aa7fc62b6845c5fb4e4f3c7bc8760', - 'org.jmock:jmock:2.8.2:jmock-2.8.2.jar:6c73cb4a2e6dbfb61fd99c9a768539c170ab6568e57846bd60dbf19596b65b16', + 'org.jmock:jmock-imposters:2.12.0:jmock-imposters-2.12.0.jar:3b836269745a137c9b2347e8d7c2104845b126ef04f012d6bfd94f1a7dea7b09', + 'org.jmock:jmock-junit4:2.12.0:jmock-junit4-2.12.0.jar:3233062fc889637c151a24f1ee086bad04321ab7d8264fef279daff0fa27205b', + 'org.jmock:jmock-legacy:2.12.0:jmock-legacy-2.12.0.jar:dea3a9cca653d082e2fe7e40232e982fe03a9984c7d67ceff24f3e03fe580dcd', + 'org.jmock:jmock-testjar:2.12.0:jmock-testjar-2.12.0.jar:efefbcf6cd294d0e29f0c46eb2a3380d4ca4e1763ff719c69e2f2ac62f564a04', + 'org.jmock:jmock:2.12.0:jmock-2.12.0.jar:266d07314c0cd343c46ff8a55601272de8cf406807caf55e6f313295f83d10be', 'org.jsoup:jsoup:1.11.3:jsoup-1.11.3.jar:df2c71a4240ecbdae7cdcd1667bcf0d747e4e3dcefe8161e787adcff7e5f2fa0', - 'org.objenesis:objenesis:2.1:objenesis-2.1.jar:c74330cc6b806c804fd37e74487b4fe5d7c2750c5e15fbc6efa13bdee1bdef80', + 'org.objenesis:objenesis:3.0.1:objenesis-3.0.1.jar:7a8ff780b9ff48415d7c705f60030b0acaa616e7f823c98eede3b63508d4e984', 'org.ow2.asm:asm-all:5.2:asm-all-5.2.jar:7fbffbc1db3422e2101689fd88df8384b15817b52b9b2b267b9f6d2511dc198d', - 'org.ow2.asm:asm:5.0.4:asm-5.0.4.jar:896618ed8ae62702521a78bc7be42b7c491a08e6920a15f89a3ecdec31e9a220', + 'org.ow2.asm:asm:7.1:asm-7.1.jar:4ab2fa2b6d2cc9ccb1eaa05ea329c407b47b13ed2915f62f8c4b8cc96258d4de', 'org.slf4j:slf4j-api:1.7.16:slf4j-api-1.7.16.jar:e56288031f5e60652c06e7bb6e9fa410a61231ab54890f7b708fc6adc4107c5b', ] } diff --git a/build.gradle b/build.gradle index 241efb19f..0b0800e3f 100644 --- a/build.gradle +++ b/build.gradle @@ -33,4 +33,7 @@ buildscript { classpath 'ru.vyarus:gradle-animalsniffer-plugin:1.5.0' classpath files('libs/gradle-witness.jar') } +// ext.dagger_version = "2.33" + ext.junit_version = "4.12" + ext.jmock_version = '2.12.0' } From 44bc35b949357a187a69a9324ea854cd22bd3d28 Mon Sep 17 00:00:00 2001 From: ameba23 Date: Mon, 6 Sep 2021 08:50:35 +0200 Subject: [PATCH 29/31] Rm test which was not present in this branch before cherry pick --- .../util/UiUtilsFormatDurationTest.java | 168 ------------------ 1 file changed, 168 deletions(-) delete mode 100644 briar-android/src/test/java/org/briarproject/briar/android/util/UiUtilsFormatDurationTest.java diff --git a/briar-android/src/test/java/org/briarproject/briar/android/util/UiUtilsFormatDurationTest.java b/briar-android/src/test/java/org/briarproject/briar/android/util/UiUtilsFormatDurationTest.java deleted file mode 100644 index 6162af3fe..000000000 --- a/briar-android/src/test/java/org/briarproject/briar/android/util/UiUtilsFormatDurationTest.java +++ /dev/null @@ -1,168 +0,0 @@ -package org.briarproject.briar.android.util; - -import android.content.Context; -import android.content.res.Resources; - -import org.briarproject.bramble.test.BrambleMockTestCase; -import org.briarproject.briar.R; -import org.jmock.Expectations; -import org.jmock.imposters.ByteBuddyClassImposteriser; -import org.junit.Test; - -import static java.util.concurrent.TimeUnit.DAYS; -import static java.util.concurrent.TimeUnit.HOURS; -import static java.util.concurrent.TimeUnit.MINUTES; -import static java.util.concurrent.TimeUnit.SECONDS; -import static org.briarproject.briar.android.util.UiUtils.formatDuration; - -public class UiUtilsFormatDurationTest extends BrambleMockTestCase { - - private final Context ctx; - private final Resources r; - private final int strMinutes = R.plurals.duration_minutes; - private final int strHours = R.plurals.duration_hours; - private final int strDays = R.plurals.duration_days; - - public UiUtilsFormatDurationTest() { - context.setImposteriser(ByteBuddyClassImposteriser.INSTANCE); - ctx = context.mock(Context.class); - r = context.mock(Resources.class); - } - - @Test - public void testOneMinute() { - expectMinuteString(1); - formatDuration(ctx, MINUTES.toMillis(1)); - } - - @Test - public void testOneHour() { - expectHourString(1); - formatDuration(ctx, HOURS.toMillis(1)); - } - - @Test - public void testOneDay() { - expectDayString(1); - formatDuration(ctx, DAYS.toMillis(1)); - } - - @Test - public void test10Seconds() { - // capped to 1min - expectMinuteString(1); - formatDuration(ctx, SECONDS.toMillis(10)); - } - - @Test - public void test100Seconds() { - expectMinuteString(2); - formatDuration(ctx, SECONDS.toMillis(100)); - } - - @Test - public void test2Minutes() { - expectMinuteString(2); - formatDuration(ctx, MINUTES.toMillis(2)); - } - - @Test - public void test10Minutes() { - expectMinuteString(10); - formatDuration(ctx, MINUTES.toMillis(10)); - } - - @Test - public void test130Minutes() { - expectHourString(2); - expectMinuteString(10); - formatDuration(ctx, MINUTES.toMillis(130)); - } - - @Test - public void test13Hours() { - expectHourString(13); - formatDuration(ctx, HOURS.toMillis(13)); - } - - @Test - public void testSevenDays() { - expectDayString(7); - formatDuration(ctx, DAYS.toMillis(7)); - } - - @Test - public void testSevenDays2Hours() { - expectDayString(7); - expectHourString(2); - formatDuration(ctx, DAYS.toMillis(7) + HOURS.toMillis(2)); - } - - @Test - public void testSevenDays20Minutes() { - expectDayString(7); - formatDuration(ctx, DAYS.toMillis(7) + MINUTES.toMillis(20)); - } - - @Test - public void testSevenDays40Minutes() { - expectDayString(7); - expectMinuteString(40); - formatDuration(ctx, DAYS.toMillis(7) + MINUTES.toMillis(40)); - } - - @Test - public void testTwoDays11Hours() { - expectDayString(2); - expectHourString(11); - formatDuration(ctx, DAYS.toMillis(2) + HOURS.toMillis(11)); - } - - @Test - public void testTwoDays12Hours() { - expectDayString(2); - expectHourString(12); - formatDuration(ctx, DAYS.toMillis(2) + HOURS.toMillis(12)); - } - - @Test - public void testTwoDays13Hours() { - expectDayString(2); - expectHourString(13); - formatDuration(ctx, DAYS.toMillis(2) + HOURS.toMillis(13)); - } - - @Test - public void test7Days23Hours55Minutes() { - expectDayString(7); - expectHourString(23); - expectMinuteString(55); - formatDuration(ctx, - DAYS.toMillis(7) + HOURS.toMillis(23) + MINUTES.toMillis(55)); - } - - private void expectMinuteString(int minutes) { - context.checking(new Expectations() {{ - oneOf(ctx).getResources(); - will(returnValue(r)); - oneOf(r).getQuantityString(strMinutes, minutes, minutes); - }}); - } - - private void expectHourString(int hours) { - context.checking(new Expectations() {{ - oneOf(ctx).getResources(); - will(returnValue(r)); - oneOf(r).getQuantityString(strHours, hours, hours); - }}); - } - - private void expectDayString(int days) { - context.checking(new Expectations() {{ - oneOf(ctx).getResources(); - will(returnValue(r)); - oneOf(r).getQuantityString(strDays, days, days); - }}); - } - -} From f1b8edd8cf5ae7552078e3bda8721a996ded3921 Mon Sep 17 00:00:00 2001 From: ameba23 Date: Wed, 6 Oct 2021 10:19:25 +0200 Subject: [PATCH 30/31] Rm danger of loss message with 2 custodians --- .../briar/android/socialbackup/ThresholdSelectorFragment.java | 3 --- briar-android/src/main/res/values/strings.xml | 1 - 2 files changed, 4 deletions(-) diff --git a/briar-android/src/main/java/org/briarproject/briar/android/socialbackup/ThresholdSelectorFragment.java b/briar-android/src/main/java/org/briarproject/briar/android/socialbackup/ThresholdSelectorFragment.java index c20a64dc4..02839fa50 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/socialbackup/ThresholdSelectorFragment.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/socialbackup/ThresholdSelectorFragment.java @@ -64,9 +64,6 @@ public class ThresholdSelectorFragment extends BaseFragment { message = view.findViewById(R.id.textViewMessage); mOfn = view.findViewById(R.id.textViewmOfn); - if (numberOfCustodians == 2) { - message.setText(R.string.threshold_too_few_custodians); - } if (numberOfCustodians > 3) { seekBar.setMax(numberOfCustodians -3); seekBar.setProgress(threshold - 2); diff --git a/briar-android/src/main/res/values/strings.xml b/briar-android/src/main/res/values/strings.xml index 5a5f1683e..c124efcab 100644 --- a/briar-android/src/main/res/values/strings.xml +++ b/briar-android/src/main/res/values/strings.xml @@ -664,7 +664,6 @@ Secure - recommended threshold Insecure – higher threshold recommended Danger of loss – lower threshold recommended - Danger of loss - more contacts recommended Choose Threshold %d of %d contacts needed to recover your account From 01fd1936860f92865dc87f2627a05ea5c93c10f6 Mon Sep 17 00:00:00 2001 From: ameba23 Date: Wed, 6 Oct 2021 10:26:32 +0200 Subject: [PATCH 31/31] Fix setting default threshold slider position --- .../briar/android/socialbackup/ThresholdSelectorFragment.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/briar-android/src/main/java/org/briarproject/briar/android/socialbackup/ThresholdSelectorFragment.java b/briar-android/src/main/java/org/briarproject/briar/android/socialbackup/ThresholdSelectorFragment.java index 02839fa50..c4b689f39 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/socialbackup/ThresholdSelectorFragment.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/socialbackup/ThresholdSelectorFragment.java @@ -66,12 +66,11 @@ public class ThresholdSelectorFragment extends BaseFragment { if (numberOfCustodians > 3) { seekBar.setMax(numberOfCustodians -3); - seekBar.setProgress(threshold - 2); seekBar.setOnSeekBarChangeListener(new SeekBarListener()); recommendedThreshold = SecretSharingWrapper.defaultThreshold(numberOfCustodians); threshold = recommendedThreshold; - + seekBar.setProgress(threshold - 2); } else { seekBar.setEnabled(false); threshold = 2;