From 3688b0b17a116fa16f10d60249ebcdb5f8011321 Mon Sep 17 00:00:00 2001 From: ameba23 Date: Wed, 31 Mar 2021 16:01:22 +0200 Subject: [PATCH] Encoding and decoding for returned social backups --- .../BackupPayloadEncoderImpl.java | 5 ++-- .../socialbackup/MessageEncoderImpl.java | 24 ++++++++++++++- .../briar/socialbackup/MessageParserImpl.java | 16 +++++++++- .../SocialBackupExchangeManagerImpl.java | 4 +-- .../socialbackup/SocialBackupManagerImpl.java | 29 ++++++++++++++++--- .../socialbackup/SocialBackupModule.java | 4 +-- 6 files changed, 70 insertions(+), 12 deletions(-) diff --git a/briar-core/src/main/java/org/briarproject/briar/socialbackup/BackupPayloadEncoderImpl.java b/briar-core/src/main/java/org/briarproject/briar/socialbackup/BackupPayloadEncoderImpl.java index 6ab55af71..db7f9000e 100644 --- a/briar-core/src/main/java/org/briarproject/briar/socialbackup/BackupPayloadEncoderImpl.java +++ b/briar-core/src/main/java/org/briarproject/briar/socialbackup/BackupPayloadEncoderImpl.java @@ -30,13 +30,14 @@ class BackupPayloadEncoderImpl implements BackupPayloadEncoder { private final ClientHelper clientHelper; private final Provider cipherProvider; private final SecureRandom secureRandom; - private final MessageEncoder messageEncoder; + private final org.briarproject.briar.api.socialbackup.MessageEncoder + messageEncoder; @Inject BackupPayloadEncoderImpl(ClientHelper clientHelper, Provider cipherProvider, SecureRandom secureRandom, - MessageEncoder messageEncoder) { + org.briarproject.briar.api.socialbackup.MessageEncoder messageEncoder) { this.clientHelper = clientHelper; this.cipherProvider = cipherProvider; this.secureRandom = secureRandom; diff --git a/briar-core/src/main/java/org/briarproject/briar/socialbackup/MessageEncoderImpl.java b/briar-core/src/main/java/org/briarproject/briar/socialbackup/MessageEncoderImpl.java index e61ce8638..6629699c5 100644 --- a/briar-core/src/main/java/org/briarproject/briar/socialbackup/MessageEncoderImpl.java +++ b/briar-core/src/main/java/org/briarproject/briar/socialbackup/MessageEncoderImpl.java @@ -4,17 +4,22 @@ import org.briarproject.bramble.api.FormatException; import org.briarproject.bramble.api.client.ClientHelper; import org.briarproject.bramble.api.data.BdfList; import org.briarproject.bramble.api.nullsafety.NotNullByDefault; +import org.briarproject.briar.api.socialbackup.BackupPayload; +import org.briarproject.briar.api.socialbackup.ReturnShardPayload; import org.briarproject.briar.api.socialbackup.Shard; import javax.annotation.concurrent.Immutable; import javax.inject.Inject; +import dagger.Reusable; + import static org.briarproject.briar.socialbackup.MessageType.BACKUP; import static org.briarproject.briar.socialbackup.MessageType.SHARD; @Immutable @NotNullByDefault -class MessageEncoderImpl implements MessageEncoder { +class MessageEncoderImpl implements + org.briarproject.briar.api.socialbackup.MessageEncoder { private final ClientHelper clientHelper; @@ -43,6 +48,23 @@ class MessageEncoderImpl implements MessageEncoder { return encodeBody(body); } + public byte[] encodeReturnShardPayload(ReturnShardPayload returnShardPayload) { + Shard shard = returnShardPayload.getShard(); + BdfList shardList = BdfList.of( + SHARD.getValue(), + shard.getSecretId(), + shard.getShard() + ); + org.briarproject.briar.api.socialbackup.BackupPayload backupPayload = returnShardPayload.getBackupPayload(); + + BdfList body = BdfList.of( + shardList, + returnShardPayload.getBackupPayload().getBytes() + ); + + return encodeBody(body); + } + private byte[] encodeBody(BdfList body) { try { return clientHelper.toByteArray(body); diff --git a/briar-core/src/main/java/org/briarproject/briar/socialbackup/MessageParserImpl.java b/briar-core/src/main/java/org/briarproject/briar/socialbackup/MessageParserImpl.java index e881da164..924c0ed6f 100644 --- a/briar-core/src/main/java/org/briarproject/briar/socialbackup/MessageParserImpl.java +++ b/briar-core/src/main/java/org/briarproject/briar/socialbackup/MessageParserImpl.java @@ -3,14 +3,19 @@ package org.briarproject.briar.socialbackup; import org.briarproject.bramble.api.FormatException; import org.briarproject.bramble.api.data.BdfList; import org.briarproject.bramble.api.nullsafety.NotNullByDefault; +import org.briarproject.briar.api.socialbackup.BackupPayload; +import org.briarproject.briar.api.socialbackup.ReturnShardPayload; import org.briarproject.briar.api.socialbackup.Shard; import javax.annotation.concurrent.Immutable; import javax.inject.Inject; +import static org.briarproject.bramble.util.ValidationUtils.checkSize; + @Immutable @NotNullByDefault -class MessageParserImpl implements MessageParser { +class MessageParserImpl implements + org.briarproject.briar.api.socialbackup.MessageParser { @Inject MessageParserImpl() { @@ -30,4 +35,13 @@ class MessageParserImpl implements MessageParser { // Message type, backup payload return new org.briarproject.briar.api.socialbackup.BackupPayload(body.getRaw(1)); } + + @Override + public ReturnShardPayload parseReturnShardPayload(BdfList body) + throws FormatException { + checkSize(body, 2); + Shard shard = parseShardMessage(body.getList(0)); + org.briarproject.briar.api.socialbackup.BackupPayload backupPayload = new BackupPayload(body.getRaw(1)); + return new ReturnShardPayload(shard, backupPayload); + } } diff --git a/briar-core/src/main/java/org/briarproject/briar/socialbackup/SocialBackupExchangeManagerImpl.java b/briar-core/src/main/java/org/briarproject/briar/socialbackup/SocialBackupExchangeManagerImpl.java index 8f4f90619..f991b520b 100644 --- a/briar-core/src/main/java/org/briarproject/briar/socialbackup/SocialBackupExchangeManagerImpl.java +++ b/briar-core/src/main/java/org/briarproject/briar/socialbackup/SocialBackupExchangeManagerImpl.java @@ -115,7 +115,7 @@ class SocialBackupExchangeManagerImpl implements SocialBackupExchangeManager { @Override public void sendReturnShard(DuplexTransportConnection conn, SecretKey masterKey, - boolean verified) throws IOException, DbException { + boolean verified, ReturnShardPayload returnShardPayload) throws IOException, DbException { boolean alice = true; // Get the transport connection's input and output streams InputStream in = conn.getReader().getInputStream(); @@ -243,7 +243,7 @@ class SocialBackupExchangeManagerImpl implements SocialBackupExchangeManager { ReturnShardPayload returnShardPayload, long timestamp) throws IOException { // BdfList authorList = clientHelper.toList(author); - BdfDictionary props = clientHelper.toDictionary(properties); +// BdfDictionary props = clientHelper.toDictionary(properties); Shard shard = returnShardPayload.getShard(); BdfList shardList = BdfList.of(shard.getSecretId(), shard.getShard()); BdfList payload = BdfList.of(shardList, 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 9786a7833..b58dbef83 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 @@ -45,6 +45,7 @@ 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.ReturnShardPayload; import org.briarproject.briar.api.socialbackup.Shard; import org.briarproject.briar.api.socialbackup.BackupPayload; import org.briarproject.briar.api.socialbackup.ShardMessageHeader; @@ -86,8 +87,10 @@ class SocialBackupManagerImpl extends ConversationClientImpl private final BackupMetadataParser backupMetadataParser; private final BackupMetadataEncoder backupMetadataEncoder; private final BackupPayloadEncoder backupPayloadEncoder; - private final MessageParser messageParser; - private final MessageEncoder messageEncoder; + private final org.briarproject.briar.api.socialbackup.MessageParser + messageParser; + private final org.briarproject.briar.api.socialbackup.MessageEncoder + messageEncoder; private final IdentityManager identityManager; private final ContactManager contactManager; private final CryptoComponent crypto; @@ -106,8 +109,8 @@ class SocialBackupManagerImpl extends ConversationClientImpl BackupMetadataParser backupMetadataParser, BackupMetadataEncoder backupMetadataEncoder, BackupPayloadEncoder backupPayloadEncoder, - MessageParser messageParser, - MessageEncoder messageEncoder, + org.briarproject.briar.api.socialbackup.MessageParser messageParser, + org.briarproject.briar.api.socialbackup.MessageEncoder messageEncoder, IdentityManager identityManager, ContactManager contactManager, CryptoComponent crypto, @@ -231,6 +234,11 @@ class SocialBackupManagerImpl extends ConversationClientImpl return false; } + public ReturnShardPayload getReturnShardPayload(Transaction txn, ContactId contactId) throws DbException { + GroupId groupId = getContactGroup(db.getContact(txn, contactId)).getId(); + return new ReturnShardPayload(getRemoteShard(txn, groupId), getRemoteBackup(txn, groupId)); + } + public boolean amCustodian(Transaction txn, ContactId contactId) { try { GroupId groupId = getContactGroup(db.getContact(txn, contactId)).getId(); @@ -488,6 +496,19 @@ class SocialBackupManagerImpl extends ConversationClientImpl } } + @Nullable + private BackupPayload getRemoteBackup(Transaction txn, GroupId g) + throws DbException { + try { + Pair prev = + findMessage(txn, g, BACKUP, false); + if (prev == null) return null; + BdfList body = clientHelper.getMessageAsList(txn, prev.getFirst()); + return messageParser.parseBackupMessage(body); + } catch (FormatException e) { + throw new DbException(e); + } + } private void updateBackup(Transaction txn, List contactData) throws DbException { BackupMetadata backupMetadata = requireNonNull(getBackupMetadata(txn)); diff --git a/briar-core/src/main/java/org/briarproject/briar/socialbackup/SocialBackupModule.java b/briar-core/src/main/java/org/briarproject/briar/socialbackup/SocialBackupModule.java index 8614da8d3..2d9e3a960 100644 --- a/briar-core/src/main/java/org/briarproject/briar/socialbackup/SocialBackupModule.java +++ b/briar-core/src/main/java/org/briarproject/briar/socialbackup/SocialBackupModule.java @@ -82,12 +82,12 @@ public class SocialBackupModule { } @Provides - MessageEncoder messageEncoder(MessageEncoderImpl messageEncoder) { + org.briarproject.briar.api.socialbackup.MessageEncoder messageEncoder(MessageEncoderImpl messageEncoder) { return messageEncoder; } @Provides - MessageParser messageParser(MessageParserImpl messageParser) { + org.briarproject.briar.api.socialbackup.MessageParser messageParser(MessageParserImpl messageParser) { return messageParser; } }