From 1f0b305139ae5aee5cd42b92a565d79dbbf5273c Mon Sep 17 00:00:00 2001 From: Torsten Grote <t@grobox.de> Date: Wed, 28 Sep 2016 13:12:20 -0300 Subject: [PATCH] Prevent personal blogs from being removed This also adds unit tests to prevent regressions like this in the future. --- .../briarproject/blogs/BlogManagerImpl.java | 1 + .../blogs/BlogManagerImplTest.java | 82 ++++++++++++++++--- 2 files changed, 73 insertions(+), 10 deletions(-) diff --git a/briar-core/src/org/briarproject/blogs/BlogManagerImpl.java b/briar-core/src/org/briarproject/blogs/BlogManagerImpl.java index 71a5721cf5..cfc53a1ce4 100644 --- a/briar-core/src/org/briarproject/blogs/BlogManagerImpl.java +++ b/briar-core/src/org/briarproject/blogs/BlogManagerImpl.java @@ -259,6 +259,7 @@ class BlogManagerImpl extends BdfIncomingMessageHook implements BlogManager, Blog b = getBlog(txn, g); AuthorId authorId = b.getAuthor().getId(); LocalAuthor localAuthor = identityManager.getLocalAuthor(txn); + if (localAuthor.getId().equals(authorId)) return false; canBeRemoved = !contactManager .contactExists(txn, authorId, localAuthor.getId()); return canBeRemoved; diff --git a/briar-tests/src/org/briarproject/blogs/BlogManagerImplTest.java b/briar-tests/src/org/briarproject/blogs/BlogManagerImplTest.java index c7819edddd..7bb296871e 100644 --- a/briar-tests/src/org/briarproject/blogs/BlogManagerImplTest.java +++ b/briar-tests/src/org/briarproject/blogs/BlogManagerImplTest.java @@ -52,6 +52,7 @@ import static org.briarproject.api.identity.Author.Status.VERIFIED; import static org.briarproject.api.identity.AuthorConstants.MAX_PUBLIC_KEY_LENGTH; import static org.briarproject.blogs.BlogManagerImpl.CLIENT_ID; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; public class BlogManagerImplTest extends BriarTestCase { @@ -132,6 +133,7 @@ public class BlogManagerImplTest extends BriarTestCase { }}); blogManager.createLocalState(txn); + context.assertIsSatisfied(); } @Test @@ -149,6 +151,7 @@ public class BlogManagerImplTest extends BriarTestCase { }}); blogManager.removingContact(txn, contact); + context.assertIsSatisfied(); } @Test @@ -166,6 +169,7 @@ public class BlogManagerImplTest extends BriarTestCase { }}); blogManager.addingIdentity(txn, localAuthor); + context.assertIsSatisfied(); } @Test @@ -183,6 +187,7 @@ public class BlogManagerImplTest extends BriarTestCase { }}); blogManager.removingIdentity(txn, localAuthor); + context.assertIsSatisfied(); } @Test @@ -206,6 +211,7 @@ public class BlogManagerImplTest extends BriarTestCase { }}); blogManager.incomingMessage(txn, message, list, meta); + context.assertIsSatisfied(); assertEquals(1, txn.getEvents().size()); assertTrue(txn.getEvents().get(0) instanceof BlogPostAddedEvent); @@ -246,22 +252,16 @@ public class BlogManagerImplTest extends BriarTestCase { blogManager .addBlog(localAuthor, blog1.getName(), blog1.getDescription()); + context.assertIsSatisfied(); assertTrue(txn.isComplete()); } @Test - public void testRemoveBlog() throws DbException, FormatException { + public void testRemoveBlog() throws Exception { final Transaction txn = new Transaction(null, false); + checkGetBlogExpectations(txn, false, blog1); context.checking(new Expectations() {{ - oneOf(db).startTransaction(false); - will(returnValue(txn)); - oneOf(db).getGroup(txn, blog1.getId()); - will(returnValue(blog1.getGroup())); - oneOf(clientHelper) - .getGroupMetadataAsDictionary(txn, blog1.getId()); - oneOf(blogFactory).parseBlog(blog1.getGroup(), ""); - will(returnValue(blog1)); oneOf(identityManager).getLocalAuthor(txn); will(returnValue(blog2.getAuthor())); oneOf(contactManager).contactExists(txn, blog1.getAuthor().getId(), @@ -272,12 +272,13 @@ public class BlogManagerImplTest extends BriarTestCase { }}); blogManager.removeBlog(blog1); + context.assertIsSatisfied(); assertTrue(txn.isComplete()); } @Test public void testAddLocalPost() throws DbException, FormatException { - final Transaction txn = new Transaction(null, true); + final Transaction txn = new Transaction(null, false); final BlogPost post = new BlogPost(message, null, blog1.getAuthor()); BdfDictionary authorMeta = authorToBdfDictionary(blog1.getAuthor()); @@ -300,6 +301,7 @@ public class BlogManagerImplTest extends BriarTestCase { }}); blogManager.addLocalPost(post); + context.assertIsSatisfied(); assertTrue(txn.isComplete()); assertEquals(1, txn.getEvents().size()); @@ -316,6 +318,66 @@ public class BlogManagerImplTest extends BriarTestCase { assertEquals(blog1.getAuthor(), h.getAuthor()); } + @Test + public void testBlogCanBeRemoved() throws Exception { + // check that own personal blogs can not be removed + final Transaction txn = new Transaction(null, true); + checkGetBlogExpectations(txn, true, blog1); + context.checking(new Expectations() {{ + oneOf(identityManager).getLocalAuthor(txn); + will(returnValue(blog1.getAuthor())); + oneOf(db).endTransaction(txn); + }}); + assertFalse(blogManager.canBeRemoved(blog1.getId())); + context.assertIsSatisfied(); + assertTrue(txn.isComplete()); + + // check that blogs of contacts can not be removed + final Transaction txn2 = new Transaction(null, true); + checkGetBlogExpectations(txn2, true, blog1); + context.checking(new Expectations() {{ + oneOf(identityManager).getLocalAuthor(txn2); + will(returnValue(blog2.getAuthor())); + oneOf(contactManager).contactExists(txn2, blog1.getAuthor().getId(), + blog2.getAuthor().getId()); + will(returnValue(true)); + oneOf(db).endTransaction(txn2); + }}); + assertFalse(blogManager.canBeRemoved(blog1.getId())); + context.assertIsSatisfied(); + assertTrue(txn2.isComplete()); + + // check that blogs can be removed if they don't belong to a contact + final Transaction txn3 = new Transaction(null, true); + checkGetBlogExpectations(txn3, true, blog1); + context.checking(new Expectations() {{ + oneOf(identityManager).getLocalAuthor(txn3); + will(returnValue(blog2.getAuthor())); + oneOf(contactManager).contactExists(txn3, blog1.getAuthor().getId(), + blog2.getAuthor().getId()); + will(returnValue(false)); + oneOf(db).endTransaction(txn3); + }}); + assertTrue(blogManager.canBeRemoved(blog1.getId())); + context.assertIsSatisfied(); + assertTrue(txn3.isComplete()); + } + + private void checkGetBlogExpectations(final Transaction txn, + final boolean readOnly, final Blog blog) throws Exception { + context.checking(new Expectations() {{ + oneOf(db).startTransaction(readOnly); + will(returnValue(txn)); + oneOf(db).getGroup(txn, blog.getId()); + will(returnValue(blog.getGroup())); + oneOf(clientHelper) + .getGroupMetadataAsDictionary(txn, blog.getId()); + will(returnValue(new BdfDictionary())); + oneOf(blogFactory).parseBlog(blog.getGroup(), ""); + will(returnValue(blog)); + }}); + } + private Blog getBlog(String name, String desc) { final GroupId groupId = new GroupId(getRandomId()); final Group group = new Group(groupId, CLIENT_ID, getRandomBytes(42)); -- GitLab