From 77a986318e9f79a09e12e44d9985ad68673e3dd6 Mon Sep 17 00:00:00 2001 From: Daniel Lublin Date: Thu, 11 Nov 2021 14:07:05 +0100 Subject: [PATCH] Add MailboxPairViewModel that decodes Mailbox QR code --- .../briarproject/briar/android/AppModule.java | 2 + .../briar/android/mailbox/MailboxModule.java | 19 ++++ .../android/mailbox/MailboxPairViewModel.java | 95 +++++++++++++++++++ 3 files changed, 116 insertions(+) create mode 100644 briar-android/src/main/java/org/briarproject/briar/android/mailbox/MailboxModule.java create mode 100644 briar-android/src/main/java/org/briarproject/briar/android/mailbox/MailboxPairViewModel.java diff --git a/briar-android/src/main/java/org/briarproject/briar/android/AppModule.java b/briar-android/src/main/java/org/briarproject/briar/android/AppModule.java index a5b6299d0..1d37010ef 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/AppModule.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/AppModule.java @@ -43,6 +43,7 @@ import org.briarproject.briar.android.hotspot.HotspotModule; import org.briarproject.briar.android.introduction.IntroductionModule; import org.briarproject.briar.android.logging.LoggingModule; import org.briarproject.briar.android.login.LoginModule; +import org.briarproject.briar.android.mailbox.MailboxModule; import org.briarproject.briar.android.navdrawer.NavDrawerModule; import org.briarproject.briar.android.privategroup.conversation.GroupConversationModule; import org.briarproject.briar.android.privategroup.list.GroupListModule; @@ -103,6 +104,7 @@ import static org.briarproject.briar.android.TestingConstants.IS_DEBUG_BUILD; SharingModule.class, HotspotModule.class, TransferDataModule.class, + MailboxModule.class, }) public class AppModule { diff --git a/briar-android/src/main/java/org/briarproject/briar/android/mailbox/MailboxModule.java b/briar-android/src/main/java/org/briarproject/briar/android/mailbox/MailboxModule.java new file mode 100644 index 000000000..196e4e151 --- /dev/null +++ b/briar-android/src/main/java/org/briarproject/briar/android/mailbox/MailboxModule.java @@ -0,0 +1,19 @@ +package org.briarproject.briar.android.mailbox; + +import org.briarproject.briar.android.viewmodel.ViewModelKey; + +import androidx.lifecycle.ViewModel; +import dagger.Binds; +import dagger.Module; +import dagger.multibindings.IntoMap; + +@Module +public interface MailboxModule { + + @Binds + @IntoMap + @ViewModelKey(MailboxPairViewModel.class) + ViewModel bindMailboxViewModel( + MailboxPairViewModel mailboxPairViewModel); + +} diff --git a/briar-android/src/main/java/org/briarproject/briar/android/mailbox/MailboxPairViewModel.java b/briar-android/src/main/java/org/briarproject/briar/android/mailbox/MailboxPairViewModel.java new file mode 100644 index 000000000..1c6023997 --- /dev/null +++ b/briar-android/src/main/java/org/briarproject/briar/android/mailbox/MailboxPairViewModel.java @@ -0,0 +1,95 @@ +package org.briarproject.briar.android.mailbox; + +import android.app.Application; + +import com.google.zxing.Result; + +import org.briarproject.bramble.api.crypto.CryptoComponent; +import org.briarproject.bramble.api.db.DatabaseExecutor; +import org.briarproject.bramble.api.db.TransactionManager; +import org.briarproject.bramble.api.lifecycle.IoExecutor; +import org.briarproject.bramble.api.lifecycle.LifecycleManager; +import org.briarproject.bramble.api.nullsafety.NotNullByDefault; +import org.briarproject.bramble.api.system.AndroidExecutor; +import org.briarproject.bramble.util.StringUtils; +import org.briarproject.briar.android.qrcode.QrCodeDecoder; +import org.briarproject.briar.android.viewmodel.DbViewModel; + +import java.nio.charset.Charset; +import java.util.Arrays; +import java.util.concurrent.Executor; +import java.util.logging.Logger; + +import javax.inject.Inject; + +import androidx.annotation.Nullable; +import androidx.annotation.UiThread; + +import static java.util.logging.Level.INFO; +import static java.util.logging.Logger.getLogger; + +@UiThread +@NotNullByDefault +class MailboxPairViewModel extends DbViewModel + implements QrCodeDecoder.ResultCallback { + private static final Logger LOG = + getLogger(MailboxPairViewModel.class.getName()); + + private static final int VERSION_REQUIRED = 32; + + @SuppressWarnings("CharsetObjectCanBeUsed") // Requires minSdkVersion >= 19 + private static final Charset ISO_8859_1 = Charset.forName("ISO-8859-1"); + + private final CryptoComponent crypto; + private final QrCodeDecoder qrCodeDecoder; + + @Nullable + private String onionAddress = null; + @Nullable + private String setupToken = null; + + @Inject + MailboxPairViewModel( + Application app, + @DatabaseExecutor Executor dbExecutor, + LifecycleManager lifecycleManager, + TransactionManager db, + AndroidExecutor androidExecutor, + @IoExecutor Executor ioExecutor, + CryptoComponent crypto) { + super(app, dbExecutor, lifecycleManager, db, androidExecutor); + this.crypto = crypto; + qrCodeDecoder = new QrCodeDecoder(androidExecutor, ioExecutor, this); + } + + @Override + public void onQrCodeDecoded(Result result) { + LOG.info("Got result from decoder"); + byte[] bytes = result.getText().getBytes(ISO_8859_1); + + if (LOG.isLoggable(INFO)) + LOG.info("QR code length in bytes: " + bytes.length); + if (bytes.length != 65) { + LOG.info("QR code has wrong length"); + return; + } + + if (LOG.isLoggable(INFO)) + LOG.info("QR code version: " + bytes[0]); + if (bytes[0] != VERSION_REQUIRED) { + LOG.info("QR code has wrong version"); + return; + } + + byte[] onionPubKey = Arrays.copyOfRange(bytes, 1, 33); + onionAddress = crypto.encodeOnionAddress(onionPubKey); + setupToken = StringUtils.toHexString(Arrays.copyOfRange(bytes, 33, 65)) + .toLowerCase(); + LOG.info("QR code is valid"); + } + + QrCodeDecoder getQrCodeDecoder() { + return qrCodeDecoder; + } + +}