From 6d0aebd7ec050f41e4fde42195fd85d756b360a4 Mon Sep 17 00:00:00 2001 From: ameba23 Date: Tue, 16 Mar 2021 17:28:00 +0100 Subject: [PATCH] SocialBackupManager implements a ConverationClient for shard message headers --- .../DefaultSocialBackupModule.java | 5 +- .../socialbackup/SocialBackupConstants.java | 1 + .../socialbackup/SocialBackupManagerImpl.java | 70 +++++++++++++++++-- 3 files changed, 70 insertions(+), 6 deletions(-) diff --git a/briar-core/src/main/java/org/briarproject/briar/socialbackup/DefaultSocialBackupModule.java b/briar-core/src/main/java/org/briarproject/briar/socialbackup/DefaultSocialBackupModule.java index c42545fe8..63b977f78 100644 --- a/briar-core/src/main/java/org/briarproject/briar/socialbackup/DefaultSocialBackupModule.java +++ b/briar-core/src/main/java/org/briarproject/briar/socialbackup/DefaultSocialBackupModule.java @@ -7,6 +7,7 @@ import org.briarproject.bramble.api.lifecycle.LifecycleManager; import org.briarproject.bramble.api.sync.validation.ValidationManager; import org.briarproject.bramble.api.system.Clock; import org.briarproject.bramble.api.versioning.ClientVersioningManager; +import org.briarproject.briar.api.conversation.ConversationManager; import org.briarproject.briar.api.socialbackup.DarkCrystal; import org.briarproject.briar.api.socialbackup.SocialBackupManager; @@ -37,13 +38,15 @@ public class DefaultSocialBackupModule { ContactManager contactManager, ValidationManager validationManager, ClientVersioningManager clientVersioningManager, - SocialBackupManagerImpl socialBackupManager) { + SocialBackupManagerImpl socialBackupManager, + ConversationManager conversationManager) { lifecycleManager.registerOpenDatabaseHook(socialBackupManager); contactManager.registerContactHook(socialBackupManager); validationManager.registerIncomingMessageHook(CLIENT_ID, MAJOR_VERSION, socialBackupManager); clientVersioningManager.registerClient(CLIENT_ID, MAJOR_VERSION, MINOR_VERSION, socialBackupManager); + conversationManager.registerConversationClient(socialBackupManager); return socialBackupManager; } diff --git a/briar-core/src/main/java/org/briarproject/briar/socialbackup/SocialBackupConstants.java b/briar-core/src/main/java/org/briarproject/briar/socialbackup/SocialBackupConstants.java index 4de42b420..cde901ccf 100644 --- a/briar-core/src/main/java/org/briarproject/briar/socialbackup/SocialBackupConstants.java +++ b/briar-core/src/main/java/org/briarproject/briar/socialbackup/SocialBackupConstants.java @@ -10,6 +10,7 @@ public interface SocialBackupConstants { String GROUP_KEY_VERSION = "version"; // Message metadata keys + String MSG_KEY_TIMESTAMP = "timestamp"; String MSG_KEY_MESSAGE_TYPE = "messageType"; String MSG_KEY_LOCAL = "local"; String MSG_KEY_VERSION = "version"; diff --git a/briar-core/src/main/java/org/briarproject/briar/socialbackup/SocialBackupManagerImpl.java b/briar-core/src/main/java/org/briarproject/briar/socialbackup/SocialBackupManagerImpl.java index ba976348f..e357437ef 100644 --- a/briar-core/src/main/java/org/briarproject/briar/socialbackup/SocialBackupManagerImpl.java +++ b/briar-core/src/main/java/org/briarproject/briar/socialbackup/SocialBackupManagerImpl.java @@ -37,11 +37,18 @@ import org.briarproject.bramble.api.sync.MessageId; import org.briarproject.bramble.api.system.Clock; import org.briarproject.bramble.api.versioning.ClientVersioningManager; import org.briarproject.bramble.api.versioning.ClientVersioningManager.ClientVersioningHook; +import org.briarproject.briar.api.attachment.AttachmentHeader; +import org.briarproject.briar.api.client.MessageTracker; +import org.briarproject.briar.api.conversation.ConversationManager; +import org.briarproject.briar.api.conversation.ConversationMessageHeader; +import org.briarproject.briar.api.conversation.DeletionResult; import org.briarproject.briar.api.socialbackup.BackupExistsException; import org.briarproject.briar.api.socialbackup.BackupMetadata; import org.briarproject.briar.api.socialbackup.DarkCrystal; import org.briarproject.briar.api.socialbackup.Shard; +import org.briarproject.briar.api.socialbackup.ShardMessageHeader; import org.briarproject.briar.api.socialbackup.SocialBackupManager; +import org.briarproject.briar.client.ConversationClientImpl; import java.util.ArrayList; import java.util.Collection; @@ -49,6 +56,7 @@ import java.util.List; import java.util.ListIterator; import java.util.Map; import java.util.Map.Entry; +import java.util.Set; import javax.annotation.Nullable; import javax.inject.Inject; @@ -61,10 +69,11 @@ import static org.briarproject.briar.socialbackup.SocialBackupConstants.GROUP_KE import static org.briarproject.briar.socialbackup.SocialBackupConstants.GROUP_KEY_VERSION; import static org.briarproject.briar.socialbackup.SocialBackupConstants.MSG_KEY_LOCAL; import static org.briarproject.briar.socialbackup.SocialBackupConstants.MSG_KEY_MESSAGE_TYPE; +import static org.briarproject.briar.socialbackup.SocialBackupConstants.MSG_KEY_TIMESTAMP; import static org.briarproject.briar.socialbackup.SocialBackupConstants.MSG_KEY_VERSION; @NotNullByDefault -class SocialBackupManagerImpl extends BdfIncomingMessageHook +class SocialBackupManagerImpl extends ConversationClientImpl implements SocialBackupManager, OpenDatabaseHook, ContactHook, ClientVersioningHook { @@ -100,8 +109,11 @@ class SocialBackupManagerImpl extends BdfIncomingMessageHook ContactManager contactManager, CryptoComponent crypto, DarkCrystal darkCrystal, - Clock clock) { - super(db, clientHelper, metadataParser); + Clock clock, + MessageTracker messageTracker, + ConversationManager conversationManager + ) { + super(db, clientHelper, metadataParser, messageTracker); this.clientVersioningManager = clientVersioningManager; this.transportPropertyManager = transportPropertyManager; this.contactGroupFactory = contactGroupFactory; @@ -257,18 +269,66 @@ class SocialBackupManagerImpl extends BdfIncomingMessageHook BdfDictionary meta = backupMetadataEncoder.encodeBackupMetadata(backupMetadata); - if (!db.containsGroup(txn, localGroup.getId())) db.addGroup(txn, localGroup); + if (!db.containsGroup(txn, localGroup.getId())) + db.addGroup(txn, localGroup); clientHelper.mergeGroupMetadata(txn, localGroup.getId(), meta); } catch (FormatException e) { throw new AssertionError(e); } } - private Group getContactGroup(Contact c) { + public Group getContactGroup(Contact c) { return contactGroupFactory.createContactGroup(CLIENT_ID, MAJOR_VERSION, c); } + @Override + public Collection getMessageHeaders( + Transaction txn, ContactId contactId) throws DbException { + try { + Contact contact = db.getContact(txn, contactId); + GroupId contactGroupId = getContactGroup(contact).getId(); + Map messages = clientHelper + .getMessageMetadataAsDictionary(txn, contactGroupId); + List headers = + new ArrayList<>(); + List attachmentHeaders = new ArrayList<>(); + for (Entry messageEntry : messages + .entrySet()) { + BdfDictionary message = messageEntry.getValue(); + if (message.getLong(MSG_KEY_MESSAGE_TYPE).intValue() == + SHARD.getValue()) { + long timestamp = message.getLong(MSG_KEY_TIMESTAMP); + ShardMessageHeader shardHeader = new ShardMessageHeader( + messageEntry.getKey(), contactGroupId, timestamp, + false, false, false, false, attachmentHeaders); + headers.add(shardHeader); + } + } + return headers; + } catch (FormatException e) { + throw new DbException(e); + } + } + + @Override + public Set getMessageIds(Transaction txn, ContactId contactId) + throws DbException { + return null; + } + + @Override + public DeletionResult deleteAllMessages(Transaction txn, ContactId c) + throws DbException { + return null; + } + + @Override + public DeletionResult deleteMessages(Transaction txn, ContactId c, + Set messageIds) throws DbException { + return null; + } + private void setContactId(Transaction txn, GroupId g, ContactId c) throws DbException { BdfDictionary d = new BdfDictionary();