From 3f13e7e9c356a4d033d4a18c2cacfa583f0aecaa Mon Sep 17 00:00:00 2001 From: Torsten Grote Date: Fri, 3 Feb 2023 08:53:52 -0300 Subject: [PATCH] Add convenience method for converting mailbox pairing text into QR code payload --- .../bramble/api/mailbox/MailboxManager.java | 11 ++++++ .../bramble/mailbox/MailboxManagerImpl.java | 21 +++++++++++ .../mailbox/MailboxManagerImplTest.java | 35 +++++++++++++++++++ 3 files changed, 67 insertions(+) diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/mailbox/MailboxManager.java b/bramble-api/src/main/java/org/briarproject/bramble/api/mailbox/MailboxManager.java index 89730f715..eb974b4b7 100644 --- a/bramble-api/src/main/java/org/briarproject/bramble/api/mailbox/MailboxManager.java +++ b/bramble-api/src/main/java/org/briarproject/bramble/api/mailbox/MailboxManager.java @@ -1,5 +1,6 @@ package org.briarproject.bramble.api.mailbox; +import org.briarproject.bramble.api.FormatException; import org.briarproject.bramble.api.db.DbException; import org.briarproject.bramble.api.db.Transaction; import org.briarproject.bramble.api.lifecycle.IoExecutor; @@ -34,6 +35,16 @@ public interface MailboxManager { */ MailboxPairingTask startPairingTask(String qrCodePayload); + /** + * Takes a textual QR code representation in + * {@link org.briarproject.bramble.util.Base32} format and converts it + * into a qrCodePayload as expected by {@link #startPairingTask(String)}. + * + * @throws FormatException when the provided payload did not include a + * proper briar-mailbox:// link. + */ + String convertBase32Payload(String base32Payload) throws FormatException; + /** * Can be used by the UI to test the mailbox connection. * diff --git a/bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxManagerImpl.java b/bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxManagerImpl.java index 5913a883b..eae1dd816 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxManagerImpl.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxManagerImpl.java @@ -1,5 +1,6 @@ package org.briarproject.bramble.mailbox; +import org.briarproject.bramble.api.FormatException; import org.briarproject.bramble.api.db.DbException; import org.briarproject.bramble.api.db.Transaction; import org.briarproject.bramble.api.db.TransactionManager; @@ -11,12 +12,15 @@ import org.briarproject.bramble.api.mailbox.MailboxSettingsManager; import org.briarproject.bramble.api.mailbox.MailboxStatus; import org.briarproject.bramble.api.mailbox.MailboxVersion; import org.briarproject.bramble.api.system.Clock; +import org.briarproject.bramble.util.Base32; import org.briarproject.nullsafety.NotNullByDefault; import java.io.IOException; import java.util.List; import java.util.concurrent.Executor; import java.util.logging.Logger; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import javax.annotation.Nullable; import javax.annotation.concurrent.GuardedBy; @@ -26,6 +30,7 @@ import javax.inject.Inject; import static java.util.logging.Level.WARNING; import static java.util.logging.Logger.getLogger; import static org.briarproject.bramble.util.LogUtils.logException; +import static org.briarproject.bramble.util.StringUtils.ISO_8859_1; @Immutable @NotNullByDefault @@ -98,6 +103,22 @@ class MailboxManagerImpl implements MailboxManager { return created; } + @Override + public String convertBase32Payload(String base32Payload) + throws FormatException { + Pattern regex = Pattern.compile("(briar-mailbox://)?([a-z2-7]{104})"); + Matcher matcher = regex.matcher(base32Payload); + if (!matcher.find()) throw new FormatException(); + String base32 = matcher.group(2); + byte[] payloadBytes; + try { + payloadBytes = Base32.decode(base32, false); + } catch (IllegalArgumentException e) { + throw new FormatException(); + } + return new String(payloadBytes, ISO_8859_1); + } + @Override public boolean checkConnection() { List versions = null; diff --git a/bramble-core/src/test/java/org/briarproject/bramble/mailbox/MailboxManagerImplTest.java b/bramble-core/src/test/java/org/briarproject/bramble/mailbox/MailboxManagerImplTest.java index ae1ee4666..c7538548b 100644 --- a/bramble-core/src/test/java/org/briarproject/bramble/mailbox/MailboxManagerImplTest.java +++ b/bramble-core/src/test/java/org/briarproject/bramble/mailbox/MailboxManagerImplTest.java @@ -1,5 +1,6 @@ package org.briarproject.bramble.mailbox; +import org.briarproject.bramble.api.FormatException; import org.briarproject.bramble.api.db.DbException; import org.briarproject.bramble.api.db.Transaction; import org.briarproject.bramble.api.db.TransactionManager; @@ -9,17 +10,23 @@ import org.briarproject.bramble.api.mailbox.event.OwnMailboxConnectionStatusEven import org.briarproject.bramble.api.system.Clock; import org.briarproject.bramble.test.BrambleMockTestCase; import org.briarproject.bramble.test.DbExpectations; +import org.briarproject.bramble.util.Base32; import org.junit.Test; import java.io.IOException; +import java.util.Locale; import java.util.Random; import java.util.concurrent.Executor; +import static org.briarproject.bramble.util.StringUtils.ISO_8859_1; import static org.briarproject.bramble.api.mailbox.MailboxConstants.CLIENT_SUPPORTS; import static org.briarproject.bramble.test.TestUtils.getMailboxProperties; +import static org.briarproject.bramble.test.TestUtils.getRandomBytes; import static org.briarproject.bramble.test.TestUtils.hasEvent; +import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; public class MailboxManagerImplTest extends BrambleMockTestCase { @@ -125,4 +132,32 @@ public class MailboxManagerImplTest extends BrambleMockTestCase { assertTrue(manager.checkConnection()); } + @Test + public void testConvertBase32Payload() throws FormatException { + byte[] payload = getRandomBytes(65); + String base32payload = Base32.encode(payload).toLowerCase(Locale.ROOT); + String expected = new String(payload, ISO_8859_1); + try { + manager.convertBase32Payload("foo bar"); + fail(); + } catch (FormatException e) { + // expected + } + try { // doesn't work with shorter link + manager.convertBase32Payload("briar-mailbox://" + + base32payload.substring(0, base32payload.length() - 1)); + fail(); + } catch (FormatException e) { + // expected + } + // works with white-spaces + assertEquals(expected, manager.convertBase32Payload( + "foo bar briar-mailbox://" + base32payload + " foo bar")); + // even works without white-space at the end + assertEquals(expected, manager.convertBase32Payload( + "foo bar briar-mailbox://" + base32payload + "foobar")); + // even works without schema and extra chars at end + assertEquals(expected, manager.convertBase32Payload( + "foo bar " + base32payload + "foobar")); + } }