Fix bugs in multi device pairing.

This commit is contained in:
Mikunj 2019-10-03 12:24:56 +10:00
parent be9afa243c
commit 8e495d087b
4 changed files with 15 additions and 9 deletions

View File

@ -994,6 +994,11 @@ public class PushDecryptJob extends BaseJob implements InjectableType {
private void handleTextMessage(@NonNull SignalServiceDataMessage message, @NonNull IncomingTextMessage textMessage, @NonNull Optional<Long> smsMessageId, @NonNull Optional<Long> messageServerIDOrNull) { private void handleTextMessage(@NonNull SignalServiceDataMessage message, @NonNull IncomingTextMessage textMessage, @NonNull Optional<Long> smsMessageId, @NonNull Optional<Long> messageServerIDOrNull) {
SmsDatabase database = DatabaseFactory.getSmsDatabase(context); SmsDatabase database = DatabaseFactory.getSmsDatabase(context);
// Ignore the message if the body is empty
if (textMessage.getMessageBody().length() == 0) { return; }
// Insert the message into the database
Optional<InsertResult> insertResult = database.insertMessageInbox(textMessage); Optional<InsertResult> insertResult = database.insertMessageInbox(textMessage);
Long threadId; Long threadId;
@ -1065,7 +1070,7 @@ public class PushDecryptJob extends BaseJob implements InjectableType {
return; return;
} }
if (LokiDeviceLinkingSession.Companion.getShared().isListeningForLinkingRequest()) { if (!LokiDeviceLinkingSession.Companion.getShared().isListeningForLinkingRequest()) {
Log.w("Loki", "Received authorisation but device is not is listening."); Log.w("Loki", "Received authorisation but device is not is listening.");
return; return;
} }
@ -1074,15 +1079,15 @@ public class PushDecryptJob extends BaseJob implements InjectableType {
if (authorisation.getType() != LokiPairingAuthorisation.Type.GRANT) { return; } if (authorisation.getType() != LokiPairingAuthorisation.Type.GRANT) { return; }
Log.d("Loki", "Receiving pairing authorisation from: " + authorisation.getPrimaryDevicePubKey()); Log.d("Loki", "Receiving pairing authorisation from: " + authorisation.getPrimaryDevicePubKey());
// Send out accept event
LokiDeviceLinkingSession.Companion.getShared().acceptedLinkingRequest(authorisation);
// Set the current device as secondary and update our authorisations // Set the current device as secondary and update our authorisations
String ourNumber = TextSecurePreferences.getLocalNumber(context); String ourNumber = TextSecurePreferences.getLocalNumber(context);
DatabaseFactory.getLokiAPIDatabase(context).removePairingAuthorisations(ourNumber); DatabaseFactory.getLokiAPIDatabase(context).removePairingAuthorisations(ourNumber);
DatabaseFactory.getLokiAPIDatabase(context).insertOrUpdatePairingAuthorisation(authorisation); DatabaseFactory.getLokiAPIDatabase(context).insertOrUpdatePairingAuthorisation(authorisation);
TextSecurePreferences.setIsSecondaryDevice(context, true); TextSecurePreferences.setIsSecondaryDevice(context, true);
// Send out accept event
LokiDeviceLinkingSession.Companion.getShared().acceptedLinkingRequest(authorisation);
// Send a background message to the primary device // Send a background message to the primary device
sendBackgroundMessage(authorisation.getPrimaryDevicePubKey()); sendBackgroundMessage(authorisation.getPrimaryDevicePubKey());

View File

@ -12,7 +12,6 @@ import org.whispersystems.signalservice.loki.api.LokiStorageAPI
import org.whispersystems.signalservice.loki.utilities.retryIfNeeded import org.whispersystems.signalservice.loki.utilities.retryIfNeeded
import org.thoughtcrime.securesms.util.Util import org.thoughtcrime.securesms.util.Util
class DeviceLinkingDialog private constructor(private val context: Context, private val mode: DeviceLinkingView.Mode, private val delegate: DeviceLinkingDialogDelegate? = null): DeviceLinkingViewDelegate, LokiDeviceLinkingSessionListener { class DeviceLinkingDialog private constructor(private val context: Context, private val mode: DeviceLinkingView.Mode, private val delegate: DeviceLinkingDialogDelegate? = null): DeviceLinkingViewDelegate, LokiDeviceLinkingSessionListener {
private lateinit var view: DeviceLinkingView private lateinit var view: DeviceLinkingView
private lateinit var dialog: AlertDialog private lateinit var dialog: AlertDialog
@ -56,7 +55,7 @@ class DeviceLinkingDialog private constructor(private val context: Context, priv
// region Dialog View Delegate // region Dialog View Delegate
override fun authorise(pairing: LokiPairingAuthorisation): Boolean { override fun authorise(pairing: LokiPairingAuthorisation): Boolean {
val signedAuthorisation = pairing.sign(LokiPairingAuthorisation.Type.GRANT, userPrivateKey) val signedAuthorisation = pairing.sign(LokiPairingAuthorisation.Type.GRANT, userPrivateKey)
if (signedAuthorisation == null) { if (signedAuthorisation == null || signedAuthorisation.type != LokiPairingAuthorisation.Type.GRANT) {
Log.e("Loki", "Failed to sign grant authorisation") Log.e("Loki", "Failed to sign grant authorisation")
return false return false
} }

View File

@ -134,7 +134,8 @@ class DeviceLinkingView private constructor(context: Context, attrs: AttributeSe
fun onDeviceLinkAuthorized(authorisation: LokiPairingAuthorisation) { fun onDeviceLinkAuthorized(authorisation: LokiPairingAuthorisation) {
// To be called when a device link was accepted by the primary device // To be called when a device link was accepted by the primary device
if (mode == Mode.Master || authorisation != pairingAuthorisation) { return } if (mode == Mode.Master || pairingAuthorisation != null) { return }
pairingAuthorisation = authorisation
spinner.visibility = View.GONE spinner.visibility = View.GONE
val titleTextViewLayoutParams = titleTextView.layoutParams as LayoutParams val titleTextViewLayoutParams = titleTextView.layoutParams as LayoutParams
@ -148,6 +149,7 @@ class DeviceLinkingView private constructor(context: Context, attrs: AttributeSe
titleTextView.text = resources.getString(R.string.view_device_linking_title_4) titleTextView.text = resources.getString(R.string.view_device_linking_title_4)
mnemonicTextView.visibility = View.GONE mnemonicTextView.visibility = View.GONE
buttonContainer.visibility = View.GONE buttonContainer.visibility = View.GONE
cancelButton.visibility = View.GONE
Handler().postDelayed({ Handler().postDelayed({
delegate.handleDeviceLinkAuthorized() delegate.handleDeviceLinkAuthorized()

View File

@ -154,7 +154,7 @@ class LokiAPIDatabase(context: Context, helper: SQLCipherOpenHelper) : Database(
override fun getPairingAuthorisations(pubKey: String): List<LokiPairingAuthorisation> { override fun getPairingAuthorisations(pubKey: String): List<LokiPairingAuthorisation> {
val database = databaseHelper.readableDatabase val database = databaseHelper.readableDatabase
return database.getAll(multiDeviceAuthTable, "$primaryDevice = ? OR $secondaryDevice = ?", arrayOf(pubKey)) { cursor -> return database.getAll(multiDeviceAuthTable, "$primaryDevice = ? OR $secondaryDevice = ?", arrayOf(pubKey, pubKey)) { cursor ->
val primaryDevicePubKey = cursor.getString(primaryDevice) val primaryDevicePubKey = cursor.getString(primaryDevice)
val secondaryDevicePubKey = cursor.getString(secondaryDevice) val secondaryDevicePubKey = cursor.getString(secondaryDevice)
val requestSignature: ByteArray? = if (cursor.isNull(cursor.getColumnIndexOrThrow(requestSignature))) null else cursor.getBase64EncodedData(requestSignature) val requestSignature: ByteArray? = if (cursor.isNull(cursor.getColumnIndexOrThrow(requestSignature))) null else cursor.getBase64EncodedData(requestSignature)
@ -175,7 +175,7 @@ class LokiAPIDatabase(context: Context, helper: SQLCipherOpenHelper) : Database(
override fun removePairingAuthorisations(pubKey: String) { override fun removePairingAuthorisations(pubKey: String) {
val database = databaseHelper.readableDatabase val database = databaseHelper.readableDatabase
database.delete(multiDeviceAuthTable, "$primaryDevice = ? OR $secondaryDevice = ?", arrayOf(pubKey)) database.delete(multiDeviceAuthTable, "$primaryDevice = ? OR $secondaryDevice = ?", arrayOf(pubKey, pubKey))
} }
} }