mirror of
https://code.briarproject.org/briar/briar.git
synced 2026-02-18 13:49:53 +01:00
Don't allow local identities to be added as contacts.
This commit is contained in:
@@ -157,6 +157,8 @@ class DatabaseComponentImpl<T> implements DatabaseComponent {
|
|||||||
T txn = unbox(transaction);
|
T txn = unbox(transaction);
|
||||||
if (!db.containsLocalAuthor(txn, local))
|
if (!db.containsLocalAuthor(txn, local))
|
||||||
throw new NoSuchLocalAuthorException();
|
throw new NoSuchLocalAuthorException();
|
||||||
|
if (db.containsLocalAuthor(txn, remote.getId()))
|
||||||
|
throw new ContactExistsException();
|
||||||
if (db.containsContact(txn, remote.getId(), local))
|
if (db.containsContact(txn, remote.getId(), local))
|
||||||
throw new ContactExistsException();
|
throw new ContactExistsException();
|
||||||
ContactId c = db.addContact(txn, remote, local, active);
|
ContactId c = db.addContact(txn, remote, local, active);
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import org.briarproject.api.TransportId;
|
|||||||
import org.briarproject.api.contact.Contact;
|
import org.briarproject.api.contact.Contact;
|
||||||
import org.briarproject.api.contact.ContactId;
|
import org.briarproject.api.contact.ContactId;
|
||||||
import org.briarproject.api.crypto.SecretKey;
|
import org.briarproject.api.crypto.SecretKey;
|
||||||
|
import org.briarproject.api.db.ContactExistsException;
|
||||||
import org.briarproject.api.db.DatabaseComponent;
|
import org.briarproject.api.db.DatabaseComponent;
|
||||||
import org.briarproject.api.db.Metadata;
|
import org.briarproject.api.db.Metadata;
|
||||||
import org.briarproject.api.db.NoSuchContactException;
|
import org.briarproject.api.db.NoSuchContactException;
|
||||||
@@ -143,6 +144,8 @@ public class DatabaseComponentImplTest extends BriarTestCase {
|
|||||||
// addContact()
|
// addContact()
|
||||||
oneOf(database).containsLocalAuthor(txn, localAuthorId);
|
oneOf(database).containsLocalAuthor(txn, localAuthorId);
|
||||||
will(returnValue(true));
|
will(returnValue(true));
|
||||||
|
oneOf(database).containsLocalAuthor(txn, authorId);
|
||||||
|
will(returnValue(false));
|
||||||
oneOf(database).containsContact(txn, authorId, localAuthorId);
|
oneOf(database).containsContact(txn, authorId, localAuthorId);
|
||||||
will(returnValue(false));
|
will(returnValue(false));
|
||||||
oneOf(database).addContact(txn, author, localAuthorId, true);
|
oneOf(database).addContact(txn, author, localAuthorId, true);
|
||||||
@@ -767,6 +770,8 @@ public class DatabaseComponentImplTest extends BriarTestCase {
|
|||||||
// addContact()
|
// addContact()
|
||||||
oneOf(database).containsLocalAuthor(txn, localAuthorId);
|
oneOf(database).containsLocalAuthor(txn, localAuthorId);
|
||||||
will(returnValue(true));
|
will(returnValue(true));
|
||||||
|
oneOf(database).containsLocalAuthor(txn, authorId);
|
||||||
|
will(returnValue(false));
|
||||||
oneOf(database).containsContact(txn, authorId, localAuthorId);
|
oneOf(database).containsContact(txn, authorId, localAuthorId);
|
||||||
will(returnValue(false));
|
will(returnValue(false));
|
||||||
oneOf(database).addContact(txn, author, localAuthorId, true);
|
oneOf(database).addContact(txn, author, localAuthorId, true);
|
||||||
@@ -1484,7 +1489,7 @@ public class DatabaseComponentImplTest extends BriarTestCase {
|
|||||||
|
|
||||||
context.checking(new Expectations() {{
|
context.checking(new Expectations() {{
|
||||||
oneOf(database).startTransaction();
|
oneOf(database).startTransaction();
|
||||||
will(returnValue(new Object()));
|
will(returnValue(txn));
|
||||||
}});
|
}});
|
||||||
|
|
||||||
DatabaseComponent db = createDatabaseComponent(database, eventBus,
|
DatabaseComponent db = createDatabaseComponent(database, eventBus,
|
||||||
@@ -1493,8 +1498,81 @@ public class DatabaseComponentImplTest extends BriarTestCase {
|
|||||||
assertNotNull(db.startTransaction(firstTxnReadOnly));
|
assertNotNull(db.startTransaction(firstTxnReadOnly));
|
||||||
try {
|
try {
|
||||||
db.startTransaction(secondTxnReadOnly);
|
db.startTransaction(secondTxnReadOnly);
|
||||||
|
fail();
|
||||||
} finally {
|
} finally {
|
||||||
context.assertIsSatisfied();
|
context.assertIsSatisfied();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testCannotAddLocalIdentityAsContact() throws Exception {
|
||||||
|
Mockery context = new Mockery();
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
final Database<Object> database = context.mock(Database.class);
|
||||||
|
final ShutdownManager shutdown = context.mock(ShutdownManager.class);
|
||||||
|
final EventBus eventBus = context.mock(EventBus.class);
|
||||||
|
|
||||||
|
context.checking(new Expectations() {{
|
||||||
|
oneOf(database).startTransaction();
|
||||||
|
will(returnValue(txn));
|
||||||
|
oneOf(database).containsLocalAuthor(txn, localAuthorId);
|
||||||
|
will(returnValue(true));
|
||||||
|
// Contact is a local identity
|
||||||
|
oneOf(database).containsLocalAuthor(txn, authorId);
|
||||||
|
will(returnValue(true));
|
||||||
|
oneOf(database).abortTransaction(txn);
|
||||||
|
}});
|
||||||
|
|
||||||
|
DatabaseComponent db = createDatabaseComponent(database, eventBus,
|
||||||
|
shutdown);
|
||||||
|
|
||||||
|
Transaction transaction = db.startTransaction(false);
|
||||||
|
try {
|
||||||
|
db.addContact(transaction, author, localAuthorId, true);
|
||||||
|
fail();
|
||||||
|
} catch (ContactExistsException expected) {
|
||||||
|
// Expected
|
||||||
|
} finally {
|
||||||
|
db.endTransaction(transaction);
|
||||||
|
}
|
||||||
|
|
||||||
|
context.assertIsSatisfied();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testCannotAddDuplicateContact() throws Exception {
|
||||||
|
Mockery context = new Mockery();
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
final Database<Object> database = context.mock(Database.class);
|
||||||
|
final ShutdownManager shutdown = context.mock(ShutdownManager.class);
|
||||||
|
final EventBus eventBus = context.mock(EventBus.class);
|
||||||
|
|
||||||
|
context.checking(new Expectations() {{
|
||||||
|
oneOf(database).startTransaction();
|
||||||
|
will(returnValue(txn));
|
||||||
|
oneOf(database).containsLocalAuthor(txn, localAuthorId);
|
||||||
|
will(returnValue(true));
|
||||||
|
oneOf(database).containsLocalAuthor(txn, authorId);
|
||||||
|
will(returnValue(false));
|
||||||
|
// Contact already exists for this local identity
|
||||||
|
oneOf(database).containsContact(txn, authorId, localAuthorId);
|
||||||
|
will(returnValue(true));
|
||||||
|
oneOf(database).abortTransaction(txn);
|
||||||
|
}});
|
||||||
|
|
||||||
|
DatabaseComponent db = createDatabaseComponent(database, eventBus,
|
||||||
|
shutdown);
|
||||||
|
|
||||||
|
Transaction transaction = db.startTransaction(false);
|
||||||
|
try {
|
||||||
|
db.addContact(transaction, author, localAuthorId, true);
|
||||||
|
fail();
|
||||||
|
} catch (ContactExistsException expected) {
|
||||||
|
// Expected
|
||||||
|
} finally {
|
||||||
|
db.endTransaction(transaction);
|
||||||
|
}
|
||||||
|
|
||||||
|
context.assertIsSatisfied();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user