mirror of
https://code.briarproject.org/briar/briar.git
synced 2026-02-19 22:29:53 +01:00
[bramble] throw exceptions when adding pending contact which exists
This commit is contained in:
@@ -4,8 +4,10 @@ import org.briarproject.bramble.api.FormatException;
|
|||||||
import org.briarproject.bramble.api.Pair;
|
import org.briarproject.bramble.api.Pair;
|
||||||
import org.briarproject.bramble.api.UnsupportedVersionException;
|
import org.briarproject.bramble.api.UnsupportedVersionException;
|
||||||
import org.briarproject.bramble.api.crypto.SecretKey;
|
import org.briarproject.bramble.api.crypto.SecretKey;
|
||||||
|
import org.briarproject.bramble.api.db.ContactExistsException;
|
||||||
import org.briarproject.bramble.api.db.DbException;
|
import org.briarproject.bramble.api.db.DbException;
|
||||||
import org.briarproject.bramble.api.db.NoSuchContactException;
|
import org.briarproject.bramble.api.db.NoSuchContactException;
|
||||||
|
import org.briarproject.bramble.api.db.PendingContactExistsException;
|
||||||
import org.briarproject.bramble.api.db.Transaction;
|
import org.briarproject.bramble.api.db.Transaction;
|
||||||
import org.briarproject.bramble.api.identity.Author;
|
import org.briarproject.bramble.api.identity.Author;
|
||||||
import org.briarproject.bramble.api.identity.AuthorId;
|
import org.briarproject.bramble.api.identity.AuthorId;
|
||||||
@@ -117,9 +119,14 @@ public interface ContactManager {
|
|||||||
* @throws FormatException If the link is invalid
|
* @throws FormatException If the link is invalid
|
||||||
* @throws GeneralSecurityException If the pending contact's handshake
|
* @throws GeneralSecurityException If the pending contact's handshake
|
||||||
* public key is invalid
|
* public key is invalid
|
||||||
|
* @throws ContactExistsException If a contact with the same handshake
|
||||||
|
* public key already exists
|
||||||
|
* @throws PendingContactExistsException If a pending contact with the same
|
||||||
|
* handshake public key already exists
|
||||||
*/
|
*/
|
||||||
PendingContact addPendingContact(String link, String alias)
|
PendingContact addPendingContact(String link, String alias)
|
||||||
throws DbException, FormatException, GeneralSecurityException;
|
throws DbException, FormatException, GeneralSecurityException,
|
||||||
|
ContactExistsException, PendingContactExistsException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the pending contact with the given ID.
|
* Returns the pending contact with the given ID.
|
||||||
|
|||||||
@@ -83,7 +83,7 @@ public interface DatabaseComponent extends TransactionManager {
|
|||||||
/**
|
/**
|
||||||
* Stores a pending contact.
|
* Stores a pending contact.
|
||||||
*/
|
*/
|
||||||
void addPendingContact(Transaction txn, PendingContact p)
|
void addPendingContact(Transaction txn, PendingContact p, AuthorId local)
|
||||||
throws DbException;
|
throws DbException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -1,9 +1,21 @@
|
|||||||
package org.briarproject.bramble.api.db;
|
package org.briarproject.bramble.api.db;
|
||||||
|
|
||||||
|
import org.briarproject.bramble.api.contact.PendingContact;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Thrown when a duplicate pending contact is added to the database. This
|
* Thrown when a duplicate pending contact is added to the database. This
|
||||||
* exception may occur due to concurrent updates and does not indicate a
|
* exception may occur due to concurrent updates and does not indicate a
|
||||||
* database error.
|
* database error.
|
||||||
*/
|
*/
|
||||||
public class PendingContactExistsException extends DbException {
|
public class PendingContactExistsException extends DbException {
|
||||||
|
|
||||||
|
private final PendingContact pendingContact;
|
||||||
|
|
||||||
|
public PendingContactExistsException(PendingContact pendingContact) {
|
||||||
|
this.pendingContact = pendingContact;
|
||||||
|
}
|
||||||
|
|
||||||
|
public PendingContact getPendingContact() {
|
||||||
|
return pendingContact;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -139,7 +139,8 @@ class ContactManagerImpl implements ContactManager, EventListener {
|
|||||||
pendingContactFactory.createPendingContact(link, alias);
|
pendingContactFactory.createPendingContact(link, alias);
|
||||||
Transaction txn = db.startTransaction(false);
|
Transaction txn = db.startTransaction(false);
|
||||||
try {
|
try {
|
||||||
db.addPendingContact(txn, p);
|
AuthorId local = identityManager.getLocalAuthor(txn).getId();
|
||||||
|
db.addPendingContact(txn, p, local);
|
||||||
KeyPair ourKeyPair = identityManager.getHandshakeKeys(txn);
|
KeyPair ourKeyPair = identityManager.getHandshakeKeys(txn);
|
||||||
keyManager.addPendingContact(txn, p.getId(), p.getPublicKey(),
|
keyManager.addPendingContact(txn, p.getId(), p.getPublicKey(),
|
||||||
ourKeyPair);
|
ourKeyPair);
|
||||||
|
|||||||
@@ -291,12 +291,17 @@ class DatabaseComponentImpl<T> implements DatabaseComponent {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void addPendingContact(Transaction transaction, PendingContact p)
|
public void addPendingContact(Transaction transaction, PendingContact p,
|
||||||
throws DbException {
|
AuthorId local) throws DbException {
|
||||||
if (transaction.isReadOnly()) throw new IllegalArgumentException();
|
if (transaction.isReadOnly()) throw new IllegalArgumentException();
|
||||||
T txn = unbox(transaction);
|
T txn = unbox(transaction);
|
||||||
if (db.containsPendingContact(txn, p.getId()))
|
Contact contact = db.getContact(txn, p.getPublicKey(), local);
|
||||||
throw new PendingContactExistsException();
|
if (contact != null)
|
||||||
|
throw new ContactExistsException(local, contact.getAuthor());
|
||||||
|
if (db.containsPendingContact(txn, p.getId())) {
|
||||||
|
PendingContact existing = db.getPendingContact(txn, p.getId());
|
||||||
|
throw new PendingContactExistsException(existing);
|
||||||
|
}
|
||||||
db.addPendingContact(txn, p);
|
db.addPendingContact(txn, p);
|
||||||
transaction.attach(new PendingContactAddedEvent(p));
|
transaction.attach(new PendingContactAddedEvent(p));
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user