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