From fc5533ec6eb5f1139edfaf9fddf9e4f2834ede84 Mon Sep 17 00:00:00 2001 From: Torsten Grote Date: Mon, 24 Jan 2022 08:58:33 -0300 Subject: [PATCH] Add method for wiping the mailbox --- .../bramble/mailbox/MailboxApi.java | 8 ++++ .../bramble/mailbox/MailboxApiImpl.java | 13 +++++ .../bramble/mailbox/MailboxApiTest.java | 47 +++++++++++++++++++ .../mailbox/MailboxIntegrationTest.java | 26 ++++++++-- 4 files changed, 91 insertions(+), 3 deletions(-) diff --git a/bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxApi.java b/bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxApi.java index 966cf1056..64856faf7 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxApi.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxApi.java @@ -35,6 +35,14 @@ interface MailboxApi { boolean checkStatus(MailboxProperties properties) throws IOException, ApiException; + /** + * Unpairs Briar and the mailbox (owner only). + * Resets mailbox state to that after first install + * (e.g. removes all stored files as well). + */ + void wipeMailbox(MailboxProperties properties) + throws IOException, ApiException; + /** * Adds a new contact to the mailbox. * diff --git a/bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxApiImpl.java b/bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxApiImpl.java index a09bba09c..2ea4bb00b 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxApiImpl.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxApiImpl.java @@ -105,6 +105,19 @@ class MailboxApiImpl implements MailboxApi { return response.isSuccessful(); } + @Override + public void wipeMailbox(MailboxProperties properties) + throws IOException, ApiException { + if (!properties.isOwner()) throw new IllegalArgumentException(); + Request request = getRequestBuilder(properties.getAuthToken()) + .url(properties.getOnionAddress() + "/") + .delete() + .build(); + OkHttpClient client = httpClientProvider.get(); + Response response = client.newCall(request).execute(); + if (response.code() != 204) throw new ApiException(); + } + /* Contact Management API (owner only) */ @Override diff --git a/bramble-core/src/test/java/org/briarproject/bramble/mailbox/MailboxApiTest.java b/bramble-core/src/test/java/org/briarproject/bramble/mailbox/MailboxApiTest.java index 05a8b2695..48489a6fa 100644 --- a/bramble-core/src/test/java/org/briarproject/bramble/mailbox/MailboxApiTest.java +++ b/bramble-core/src/test/java/org/briarproject/bramble/mailbox/MailboxApiTest.java @@ -194,6 +194,53 @@ public class MailboxApiTest extends BrambleTestCase { ); } + @Test + public void testWipe() throws Exception { + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setResponseCode(204)); + server.enqueue(new MockResponse().setResponseCode(200)); + server.enqueue(new MockResponse().setResponseCode(401)); + server.enqueue(new MockResponse().setResponseCode(500)); + server.start(); + String baseUrl = getBaseUrl(server); + MailboxProperties properties = + new MailboxProperties(baseUrl, token, true); + MailboxProperties properties2 = + new MailboxProperties(baseUrl, token2, true); + + api.wipeMailbox(properties); + RecordedRequest request1 = server.takeRequest(); + assertEquals("/", request1.getPath()); + assertEquals("DELETE", request1.getMethod()); + assertToken(request1, token); + + assertThrows(ApiException.class, () -> api.wipeMailbox(properties2)); + RecordedRequest request2 = server.takeRequest(); + assertEquals("/", request2.getPath()); + assertEquals("DELETE", request2.getMethod()); + assertToken(request2, token2); + + assertThrows(ApiException.class, () -> api.wipeMailbox(properties)); + RecordedRequest request3 = server.takeRequest(); + assertEquals("/", request3.getPath()); + assertEquals("DELETE", request3.getMethod()); + assertToken(request3, token); + + assertThrows(ApiException.class, () -> api.wipeMailbox(properties)); + RecordedRequest request4 = server.takeRequest(); + assertEquals("/", request4.getPath()); + assertEquals("DELETE", request4.getMethod()); + assertToken(request4, token); + } + + @Test + public void testWipeOnlyForOwner() { + MailboxProperties properties = + new MailboxProperties("", token, false); + assertThrows(IllegalArgumentException.class, () -> + api.wipeMailbox(properties)); + } + @Test public void testAddContact() throws Exception { MockWebServer server = new MockWebServer(); diff --git a/bramble-core/src/test/java/org/briarproject/bramble/mailbox/MailboxIntegrationTest.java b/bramble-core/src/test/java/org/briarproject/bramble/mailbox/MailboxIntegrationTest.java index 7d98e93c2..98d2f31d5 100644 --- a/bramble-core/src/test/java/org/briarproject/bramble/mailbox/MailboxIntegrationTest.java +++ b/bramble-core/src/test/java/org/briarproject/bramble/mailbox/MailboxIntegrationTest.java @@ -9,6 +9,7 @@ import org.briarproject.bramble.mailbox.MailboxApi.MailboxContact; import org.briarproject.bramble.mailbox.MailboxApi.MailboxFile; import org.briarproject.bramble.mailbox.MailboxApi.TolerableFailureException; import org.briarproject.bramble.test.BrambleTestCase; +import org.junit.AfterClass; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Rule; @@ -48,11 +49,12 @@ public class MailboxIntegrationTest extends BrambleTestCase { private final static MailboxId SETUP_TOKEN = MailboxId.fromString( "54686973206973206120736574757020746f6b656e20666f722042726961722e"); - private final OkHttpClient client = new OkHttpClient.Builder() + private static final OkHttpClient client = new OkHttpClient.Builder() .socketFactory(SocketFactory.getDefault()) .connectTimeout(60_000, MILLISECONDS) .build(); - private final WeakSingletonProvider httpClientProvider = + private static final WeakSingletonProvider + httpClientProvider = new WeakSingletonProvider() { @Override @Nonnull @@ -60,7 +62,8 @@ public class MailboxIntegrationTest extends BrambleTestCase { return client; } }; - private final MailboxApiImpl api = new MailboxApiImpl(httpClientProvider); + private final static MailboxApiImpl api = + new MailboxApiImpl(httpClientProvider); // needs to be static to keep values across different tests private static MailboxProperties ownerProperties; @@ -81,6 +84,23 @@ public class MailboxIntegrationTest extends BrambleTestCase { ownerProperties = new MailboxProperties(URL_BASE, ownerToken, true); } + @AfterClass + // we can't test wiping as a regular test as it stops the mailbox + public static void wipe() throws IOException, ApiException { + if (!isOptionalTestEnabled(MailboxIntegrationTest.class)) return; + + api.wipeMailbox(ownerProperties); + + // check doesn't work anymore + assertThrows(ApiException.class, () -> + api.checkStatus(ownerProperties)); + + // new setup doesn't work as mailbox is stopping + MailboxProperties setupProperties = + new MailboxProperties(URL_BASE, SETUP_TOKEN, true); + assertThrows(ApiException.class, () -> api.setup(setupProperties)); + } + @Test public void testStatus() throws Exception { assertTrue(api.checkStatus(ownerProperties));