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 82a628766..6b9bf2203 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 @@ -37,6 +37,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 9c80bdda7..ee20aac3a 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 @@ -92,6 +92,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 3f6cbafd3..7665ff528 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 @@ -200,6 +200,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 eccb311ed..31554b20e 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 @@ -12,6 +12,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; @@ -59,11 +60,12 @@ public class MailboxIntegrationTest extends BrambleTestCase { } } - 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 @@ -71,7 +73,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; @@ -92,6 +95,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));