From 0fd8a67ee0bbac4c066da2f2fd838b1674a29ae3 Mon Sep 17 00:00:00 2001 From: akwizgran <akwizgran@users.sourceforge.net> Date: Thu, 28 Jan 2016 15:57:22 +0000 Subject: [PATCH] Allow multiple identities to have the same contact. #224 --- briar-core/src/org/briarproject/db/Database.java | 6 ++++-- .../org/briarproject/db/DatabaseComponentImpl.java | 4 ++-- briar-core/src/org/briarproject/db/JdbcDatabase.java | 10 ++++++---- .../briarproject/db/DatabaseComponentImplTest.java | 11 ++++------- 4 files changed, 16 insertions(+), 15 deletions(-) diff --git a/briar-core/src/org/briarproject/db/Database.java b/briar-core/src/org/briarproject/db/Database.java index e912671b53..f8901b01ab 100644 --- a/briar-core/src/org/briarproject/db/Database.java +++ b/briar-core/src/org/briarproject/db/Database.java @@ -155,11 +155,13 @@ interface Database<T> { void addVisibility(T txn, ContactId c, GroupId g) throws DbException; /** - * Returns true if the database contains the given contact. + * Returns true if the database contains the given contact for the given + * local pseudonym. * <p> * Locking: read. */ - boolean containsContact(T txn, AuthorId a) throws DbException; + boolean containsContact(T txn, AuthorId remote, AuthorId local) + throws DbException; /** * Returns true if the database contains the given contact. diff --git a/briar-core/src/org/briarproject/db/DatabaseComponentImpl.java b/briar-core/src/org/briarproject/db/DatabaseComponentImpl.java index 39c0f796f0..9cce3d3147 100644 --- a/briar-core/src/org/briarproject/db/DatabaseComponentImpl.java +++ b/briar-core/src/org/briarproject/db/DatabaseComponentImpl.java @@ -144,10 +144,10 @@ class DatabaseComponentImpl<T> implements DatabaseComponent { try { T txn = db.startTransaction(); try { - if (db.containsContact(txn, remote.getId())) - throw new ContactExistsException(); if (!db.containsLocalAuthor(txn, local)) throw new NoSuchLocalAuthorException(); + if (db.containsContact(txn, remote.getId(), local)) + throw new ContactExistsException(); ContactId c = db.addContact(txn, remote, local); db.commitTransaction(txn); return c; diff --git a/briar-core/src/org/briarproject/db/JdbcDatabase.java b/briar-core/src/org/briarproject/db/JdbcDatabase.java index 411d7246c7..e79e51932a 100644 --- a/briar-core/src/org/briarproject/db/JdbcDatabase.java +++ b/briar-core/src/org/briarproject/db/JdbcDatabase.java @@ -871,14 +871,16 @@ abstract class JdbcDatabase implements Database<Connection> { } } - public boolean containsContact(Connection txn, AuthorId a) - throws DbException { + public boolean containsContact(Connection txn, AuthorId remote, + AuthorId local) throws DbException { PreparedStatement ps = null; ResultSet rs = null; try { - String sql = "SELECT NULL FROM contacts WHERE authorId = ?"; + String sql = "SELECT NULL FROM contacts" + + " WHERE authorId = ? AND localAuthorId = ?"; ps = txn.prepareStatement(sql); - ps.setBytes(1, a.getBytes()); + ps.setBytes(1, remote.getBytes()); + ps.setBytes(2, local.getBytes()); rs = ps.executeQuery(); boolean found = rs.next(); if (rs.next()) throw new DbStateException(); diff --git a/briar-tests/src/org/briarproject/db/DatabaseComponentImplTest.java b/briar-tests/src/org/briarproject/db/DatabaseComponentImplTest.java index dae5884310..37998807a7 100644 --- a/briar-tests/src/org/briarproject/db/DatabaseComponentImplTest.java +++ b/briar-tests/src/org/briarproject/db/DatabaseComponentImplTest.java @@ -132,10 +132,10 @@ public class DatabaseComponentImplTest extends BriarTestCase { will(returnValue(false)); oneOf(database).addLocalAuthor(txn, localAuthor); // addContact() - oneOf(database).containsContact(txn, authorId); - will(returnValue(false)); oneOf(database).containsLocalAuthor(txn, localAuthorId); will(returnValue(true)); + oneOf(database).containsContact(txn, authorId, localAuthorId); + will(returnValue(false)); oneOf(database).addContact(txn, author, localAuthorId); will(returnValue(contactId)); // getContacts() @@ -447,9 +447,6 @@ public class DatabaseComponentImplTest extends BriarTestCase { exactly(3).of(database).containsLocalAuthor(txn, localAuthorId); will(returnValue(false)); exactly(3).of(database).abortTransaction(txn); - // This is needed for addContact() to proceed - exactly(1).of(database).containsContact(txn, authorId); - will(returnValue(false)); }}); DatabaseComponent db = createDatabaseComponent(database, eventBus, shutdown); @@ -624,10 +621,10 @@ public class DatabaseComponentImplTest extends BriarTestCase { // addContact() oneOf(database).startTransaction(); will(returnValue(txn)); - oneOf(database).containsContact(txn, authorId); - will(returnValue(false)); oneOf(database).containsLocalAuthor(txn, localAuthorId); will(returnValue(true)); + oneOf(database).containsContact(txn, authorId, localAuthorId); + will(returnValue(false)); oneOf(database).addContact(txn, author, localAuthorId); will(returnValue(contactId)); oneOf(database).commitTransaction(txn); -- GitLab