diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/contact/ContactManager.java b/bramble-api/src/main/java/org/briarproject/bramble/api/contact/ContactManager.java index 9d3d10e50..318e2e11c 100644 --- a/bramble-api/src/main/java/org/briarproject/bramble/api/contact/ContactManager.java +++ b/bramble-api/src/main/java/org/briarproject/bramble/api/contact/ContactManager.java @@ -113,6 +113,26 @@ public interface ContactManager { */ String getHandshakeLink(Transaction txn) throws DbException; + /** + * Creates a {@link PendingContact} from the given handshake link and + * alias, adds it to the database and returns it. + * + * @param link The handshake link received from the pending contact + * @param alias The alias the user has given this pending contact + * @throws UnsupportedVersionException If the link uses a format version + * that is not supported + * @throws FormatException If the link is invalid + * @throws GeneralSecurityException If the pending contact's handshake + * 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(Transaction txn, String link, String alias) + throws DbException, FormatException, GeneralSecurityException, + ContactExistsException, PendingContactExistsException; + /** * Creates a {@link PendingContact} from the given handshake link and * alias, adds it to the database and returns it. @@ -146,6 +166,13 @@ public interface ContactManager { Collection> getPendingContacts() throws DbException; + /** + * Returns a list of {@link PendingContact PendingContacts} and their + * {@link PendingContactState states}. + */ + Collection> getPendingContacts(Transaction txn) + throws DbException; + /** * Removes a {@link PendingContact}. */ diff --git a/bramble-core/src/main/java/org/briarproject/bramble/contact/ContactManagerImpl.java b/bramble-core/src/main/java/org/briarproject/bramble/contact/ContactManagerImpl.java index d4c5b532e..eb0fa519b 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/contact/ContactManagerImpl.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/contact/ContactManagerImpl.java @@ -131,22 +131,29 @@ class ContactManagerImpl implements ContactManager, EventListener { } @Override - public PendingContact addPendingContact(String link, String alias) + public PendingContact addPendingContact(Transaction txn, String link, String alias) throws DbException, FormatException, GeneralSecurityException { PendingContact p = pendingContactFactory.createPendingContact(link, alias); + AuthorId local = identityManager.getLocalAuthor(txn).getId(); + db.addPendingContact(txn, p, local); + KeyPair ourKeyPair = identityManager.getHandshakeKeys(txn); + keyManager.addPendingContact(txn, p.getId(), p.getPublicKey(), + ourKeyPair); + return p; + } + + @Override + public PendingContact addPendingContact(String link, String alias) + throws DbException, FormatException, GeneralSecurityException { Transaction txn = db.startTransaction(false); try { - AuthorId local = identityManager.getLocalAuthor(txn).getId(); - db.addPendingContact(txn, p, local); - KeyPair ourKeyPair = identityManager.getHandshakeKeys(txn); - keyManager.addPendingContact(txn, p.getId(), p.getPublicKey(), - ourKeyPair); + PendingContact p = addPendingContact(txn, link, alias); db.commitTransaction(txn); + return p; } finally { db.endTransaction(txn); } - return p; } @Override @@ -158,8 +165,13 @@ class ContactManagerImpl implements ContactManager, EventListener { @Override public Collection> getPendingContacts() throws DbException { - Collection pendingContacts = - db.transactionWithResult(true, db::getPendingContacts); + return db.transactionWithResult(true, this::getPendingContacts); + } + + @Override + public Collection> getPendingContacts(Transaction txn) + throws DbException { + Collection pendingContacts = db.getPendingContacts(txn); List> pairs = new ArrayList<>(pendingContacts.size()); for (PendingContact p : pendingContacts) { diff --git a/briar-api/src/main/java/org/briarproject/briar/api/introduction/IntroductionManager.java b/briar-api/src/main/java/org/briarproject/briar/api/introduction/IntroductionManager.java index 71c28028f..53c690398 100644 --- a/briar-api/src/main/java/org/briarproject/briar/api/introduction/IntroductionManager.java +++ b/briar-api/src/main/java/org/briarproject/briar/api/introduction/IntroductionManager.java @@ -3,6 +3,7 @@ package org.briarproject.briar.api.introduction; import org.briarproject.bramble.api.contact.Contact; import org.briarproject.bramble.api.contact.ContactId; import org.briarproject.bramble.api.db.DbException; +import org.briarproject.bramble.api.db.Transaction; import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.bramble.api.sync.ClientId; import org.briarproject.briar.api.client.SessionId; @@ -45,4 +46,10 @@ public interface IntroductionManager extends ConversationClient { void respondToIntroduction(ContactId contactId, SessionId sessionId, boolean accept) throws DbException; + /** + * Responds to an introduction. + */ + void respondToIntroduction(Transaction txn, ContactId contactId, + SessionId sessionId, boolean accept) throws DbException; + } diff --git a/briar-api/src/main/java/org/briarproject/briar/api/messaging/MessagingManager.java b/briar-api/src/main/java/org/briarproject/briar/api/messaging/MessagingManager.java index 91470b07e..c1f17e187 100644 --- a/briar-api/src/main/java/org/briarproject/briar/api/messaging/MessagingManager.java +++ b/briar-api/src/main/java/org/briarproject/briar/api/messaging/MessagingManager.java @@ -67,6 +67,11 @@ public interface MessagingManager extends ConversationClient { */ GroupId getConversationId(ContactId c) throws DbException; + /** + * Returns the ID of the private conversation with the given contact. + */ + GroupId getConversationId(Transaction txn, ContactId c) throws DbException; + /** * Returns the text of the private message with the given ID, or null if * the private message has no text. diff --git a/briar-core/src/main/java/org/briarproject/briar/introduction/IntroductionManagerImpl.java b/briar-core/src/main/java/org/briarproject/briar/introduction/IntroductionManagerImpl.java index 2eb8dfbf5..bc7bf0f3b 100644 --- a/briar-core/src/main/java/org/briarproject/briar/introduction/IntroductionManagerImpl.java +++ b/briar-core/src/main/java/org/briarproject/briar/introduction/IntroductionManagerImpl.java @@ -377,6 +377,12 @@ class IntroductionManagerImpl extends ConversationClientImpl respondToIntroduction(contactId, sessionId, accept, false); } + @Override + public void respondToIntroduction(Transaction txn, ContactId contactId, + SessionId sessionId, boolean accept) throws DbException { + respondToIntroduction(txn, contactId, sessionId, accept, false); + } + private void respondToIntroduction(ContactId contactId, SessionId sessionId, boolean accept, boolean isAutoDecline) throws DbException { db.transaction(false, diff --git a/briar-core/src/main/java/org/briarproject/briar/messaging/MessagingManagerImpl.java b/briar-core/src/main/java/org/briarproject/briar/messaging/MessagingManagerImpl.java index 4db04b63b..e8beca439 100644 --- a/briar-core/src/main/java/org/briarproject/briar/messaging/MessagingManagerImpl.java +++ b/briar-core/src/main/java/org/briarproject/briar/messaging/MessagingManagerImpl.java @@ -389,14 +389,13 @@ class MessagingManagerImpl implements MessagingManager, IncomingMessageHook, @Override public GroupId getConversationId(ContactId c) throws DbException { - Contact contact; - Transaction txn = db.startTransaction(true); - try { - contact = db.getContact(txn, c); - db.commitTransaction(txn); - } finally { - db.endTransaction(txn); - } + return db.transactionWithResult(true, + txn -> getConversationId(txn, c)); + } + + @Override + public GroupId getConversationId(Transaction txn, ContactId c) throws DbException { + Contact contact = db.getContact(txn, c); return getContactGroup(contact).getId(); }