diff --git a/app/src/main/java/com/etesync/syncadapter/journalmanager/JournalManager.java b/app/src/main/java/com/etesync/syncadapter/journalmanager/JournalManager.java index 2fc076f1..de5b2095 100644 --- a/app/src/main/java/com/etesync/syncadapter/journalmanager/JournalManager.java +++ b/app/src/main/java/com/etesync/syncadapter/journalmanager/JournalManager.java @@ -26,6 +26,8 @@ import static com.etesync.syncadapter.journalmanager.Crypto.toHex; public class JournalManager extends BaseManager { final static private Type journalType = new TypeToken>() { }.getType(); + final static private Type memberType = new TypeToken>() { + }.getType(); public JournalManager(OkHttpClient httpClient, HttpUrl remote) { @@ -90,6 +92,43 @@ public class JournalManager extends BaseManager { newCall(request); } + private HttpUrl getMemberRemote(Journal journal) { + return this.remote.resolve(journal.getUid() + "/members/"); + } + + public List listMembers(Journal journal) throws Exceptions.HttpException, Exceptions.IntegrityException, Exceptions.GenericCryptoException { + Request request = new Request.Builder() + .get() + .url(getMemberRemote(journal)) + .build(); + + Response response = newCall(request); + ResponseBody body = response.body(); + return GsonHelper.gson.fromJson(body.charStream(), memberType); + } + + public void deleteMember(Journal journal, Member member) throws Exceptions.HttpException { + RequestBody body = RequestBody.create(JSON, member.toJson()); + + Request request = new Request.Builder() + .delete(body) + .url(getMemberRemote(journal)) + .build(); + + newCall(request); + } + + public void addMember(Journal journal, Member member) throws Exceptions.HttpException { + RequestBody body = RequestBody.create(JSON, member.toJson()); + + Request request = new Request.Builder() + .post(body) + .url(getMemberRemote(journal)) + .build(); + + newCall(request); + } + public static class Journal extends Base { @Getter private int version = -1; @@ -140,4 +179,24 @@ public class JournalManager extends BaseManager { return ret; } } + + public static class Member { + @Getter + private String user; + @Getter + private byte[] key; + + @SuppressWarnings("unused") + private Member() { + } + + public Member(String user, byte[] encryptedKey) { + this.user = user; + this.key = encryptedKey; + } + + String toJson() { + return GsonHelper.gson.toJson(this, getClass()); + } + } } diff --git a/app/src/test/java/com/etesync/syncadapter/journalmanager/ServiceTest.java b/app/src/test/java/com/etesync/syncadapter/journalmanager/ServiceTest.java index 5b4d03c7..b98bdf8b 100644 --- a/app/src/test/java/com/etesync/syncadapter/journalmanager/ServiceTest.java +++ b/app/src/test/java/com/etesync/syncadapter/journalmanager/ServiceTest.java @@ -31,7 +31,6 @@ import okio.BufferedSink; import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; @@ -232,4 +231,29 @@ public class ServiceTest { userInfo = manager.get(cryptoManager, Helpers.USER); assertNull(userInfo); } + + + @Test + public void testJournalMember() throws IOException, Exceptions.HttpException, Exceptions.GenericCryptoException, Exceptions.IntegrityException { + JournalManager journalManager = new JournalManager(httpClient, remote); + CollectionInfo info = CollectionInfo.defaultForServiceType(CollectionInfo.Type.ADDRESS_BOOK); + info.uid = JournalManager.Journal.genUid(); + info.displayName = "Test"; + Crypto.CryptoManager crypto = new Crypto.CryptoManager(info.version, Helpers.keyBase64, info.uid); + JournalManager.Journal journal = new JournalManager.Journal(crypto, info.toJson(), info.uid); + journalManager.putJournal(journal); + + assertEquals(journalManager.listMembers(journal).size(), 0); + + // Test inviting ourselves + JournalManager.Member member = new JournalManager.Member(Helpers.USER, "test".getBytes(Charsets.UTF_8)); + journalManager.addMember(journal, member); + + assertEquals(journalManager.listMembers(journal).size(), 1); + + // Uninviting ourselves + journalManager.deleteMember(journal, member); + + assertEquals(journalManager.listMembers(journal).size(), 0); + } }