Encoding and decoding for returned social backups

This commit is contained in:
ameba23
2021-03-31 16:01:22 +02:00
parent 4f42ce9a01
commit 3688b0b17a
6 changed files with 70 additions and 12 deletions

View File

@@ -30,13 +30,14 @@ class BackupPayloadEncoderImpl implements BackupPayloadEncoder {
private final ClientHelper clientHelper; private final ClientHelper clientHelper;
private final Provider<AuthenticatedCipher> cipherProvider; private final Provider<AuthenticatedCipher> cipherProvider;
private final SecureRandom secureRandom; private final SecureRandom secureRandom;
private final MessageEncoder messageEncoder; private final org.briarproject.briar.api.socialbackup.MessageEncoder
messageEncoder;
@Inject @Inject
BackupPayloadEncoderImpl(ClientHelper clientHelper, BackupPayloadEncoderImpl(ClientHelper clientHelper,
Provider<AuthenticatedCipher> cipherProvider, Provider<AuthenticatedCipher> cipherProvider,
SecureRandom secureRandom, SecureRandom secureRandom,
MessageEncoder messageEncoder) { org.briarproject.briar.api.socialbackup.MessageEncoder messageEncoder) {
this.clientHelper = clientHelper; this.clientHelper = clientHelper;
this.cipherProvider = cipherProvider; this.cipherProvider = cipherProvider;
this.secureRandom = secureRandom; this.secureRandom = secureRandom;

View File

@@ -4,17 +4,22 @@ import org.briarproject.bramble.api.FormatException;
import org.briarproject.bramble.api.client.ClientHelper; import org.briarproject.bramble.api.client.ClientHelper;
import org.briarproject.bramble.api.data.BdfList; import org.briarproject.bramble.api.data.BdfList;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault; 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 org.briarproject.briar.api.socialbackup.Shard;
import javax.annotation.concurrent.Immutable; import javax.annotation.concurrent.Immutable;
import javax.inject.Inject; import javax.inject.Inject;
import dagger.Reusable;
import static org.briarproject.briar.socialbackup.MessageType.BACKUP; import static org.briarproject.briar.socialbackup.MessageType.BACKUP;
import static org.briarproject.briar.socialbackup.MessageType.SHARD; import static org.briarproject.briar.socialbackup.MessageType.SHARD;
@Immutable @Immutable
@NotNullByDefault @NotNullByDefault
class MessageEncoderImpl implements MessageEncoder { class MessageEncoderImpl implements
org.briarproject.briar.api.socialbackup.MessageEncoder {
private final ClientHelper clientHelper; private final ClientHelper clientHelper;
@@ -43,6 +48,23 @@ class MessageEncoderImpl implements MessageEncoder {
return encodeBody(body); 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) { private byte[] encodeBody(BdfList body) {
try { try {
return clientHelper.toByteArray(body); return clientHelper.toByteArray(body);

View File

@@ -3,14 +3,19 @@ package org.briarproject.briar.socialbackup;
import org.briarproject.bramble.api.FormatException; import org.briarproject.bramble.api.FormatException;
import org.briarproject.bramble.api.data.BdfList; import org.briarproject.bramble.api.data.BdfList;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault; 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 org.briarproject.briar.api.socialbackup.Shard;
import javax.annotation.concurrent.Immutable; import javax.annotation.concurrent.Immutable;
import javax.inject.Inject; import javax.inject.Inject;
import static org.briarproject.bramble.util.ValidationUtils.checkSize;
@Immutable @Immutable
@NotNullByDefault @NotNullByDefault
class MessageParserImpl implements MessageParser { class MessageParserImpl implements
org.briarproject.briar.api.socialbackup.MessageParser {
@Inject @Inject
MessageParserImpl() { MessageParserImpl() {
@@ -30,4 +35,13 @@ class MessageParserImpl implements MessageParser {
// Message type, backup payload // Message type, backup payload
return new org.briarproject.briar.api.socialbackup.BackupPayload(body.getRaw(1)); 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);
}
} }

View File

@@ -115,7 +115,7 @@ class SocialBackupExchangeManagerImpl implements SocialBackupExchangeManager {
@Override @Override
public void sendReturnShard(DuplexTransportConnection conn, public void sendReturnShard(DuplexTransportConnection conn,
SecretKey masterKey, SecretKey masterKey,
boolean verified) throws IOException, DbException { boolean verified, ReturnShardPayload returnShardPayload) throws IOException, DbException {
boolean alice = true; boolean alice = true;
// Get the transport connection's input and output streams // Get the transport connection's input and output streams
InputStream in = conn.getReader().getInputStream(); InputStream in = conn.getReader().getInputStream();
@@ -243,7 +243,7 @@ class SocialBackupExchangeManagerImpl implements SocialBackupExchangeManager {
ReturnShardPayload returnShardPayload, ReturnShardPayload returnShardPayload,
long timestamp) throws IOException { long timestamp) throws IOException {
// BdfList authorList = clientHelper.toList(author); // BdfList authorList = clientHelper.toList(author);
BdfDictionary props = clientHelper.toDictionary(properties); // BdfDictionary props = clientHelper.toDictionary(properties);
Shard shard = returnShardPayload.getShard(); Shard shard = returnShardPayload.getShard();
BdfList shardList = BdfList.of(shard.getSecretId(), shard.getShard()); BdfList shardList = BdfList.of(shard.getSecretId(), shard.getShard());
BdfList payload = BdfList.of(shardList, BdfList payload = BdfList.of(shardList,

View File

@@ -45,6 +45,7 @@ import org.briarproject.briar.api.conversation.DeletionResult;
import org.briarproject.briar.api.socialbackup.BackupExistsException; import org.briarproject.briar.api.socialbackup.BackupExistsException;
import org.briarproject.briar.api.socialbackup.BackupMetadata; import org.briarproject.briar.api.socialbackup.BackupMetadata;
import org.briarproject.briar.api.socialbackup.DarkCrystal; 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.Shard;
import org.briarproject.briar.api.socialbackup.BackupPayload; import org.briarproject.briar.api.socialbackup.BackupPayload;
import org.briarproject.briar.api.socialbackup.ShardMessageHeader; import org.briarproject.briar.api.socialbackup.ShardMessageHeader;
@@ -86,8 +87,10 @@ class SocialBackupManagerImpl extends ConversationClientImpl
private final BackupMetadataParser backupMetadataParser; private final BackupMetadataParser backupMetadataParser;
private final BackupMetadataEncoder backupMetadataEncoder; private final BackupMetadataEncoder backupMetadataEncoder;
private final BackupPayloadEncoder backupPayloadEncoder; private final BackupPayloadEncoder backupPayloadEncoder;
private final MessageParser messageParser; private final org.briarproject.briar.api.socialbackup.MessageParser
private final MessageEncoder messageEncoder; messageParser;
private final org.briarproject.briar.api.socialbackup.MessageEncoder
messageEncoder;
private final IdentityManager identityManager; private final IdentityManager identityManager;
private final ContactManager contactManager; private final ContactManager contactManager;
private final CryptoComponent crypto; private final CryptoComponent crypto;
@@ -106,8 +109,8 @@ class SocialBackupManagerImpl extends ConversationClientImpl
BackupMetadataParser backupMetadataParser, BackupMetadataParser backupMetadataParser,
BackupMetadataEncoder backupMetadataEncoder, BackupMetadataEncoder backupMetadataEncoder,
BackupPayloadEncoder backupPayloadEncoder, BackupPayloadEncoder backupPayloadEncoder,
MessageParser messageParser, org.briarproject.briar.api.socialbackup.MessageParser messageParser,
MessageEncoder messageEncoder, org.briarproject.briar.api.socialbackup.MessageEncoder messageEncoder,
IdentityManager identityManager, IdentityManager identityManager,
ContactManager contactManager, ContactManager contactManager,
CryptoComponent crypto, CryptoComponent crypto,
@@ -231,6 +234,11 @@ class SocialBackupManagerImpl extends ConversationClientImpl
return false; 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) { public boolean amCustodian(Transaction txn, ContactId contactId) {
try { try {
GroupId groupId = getContactGroup(db.getContact(txn, contactId)).getId(); 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<MessageId, BdfDictionary> 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> contactData) private void updateBackup(Transaction txn, List<ContactData> contactData)
throws DbException { throws DbException {
BackupMetadata backupMetadata = requireNonNull(getBackupMetadata(txn)); BackupMetadata backupMetadata = requireNonNull(getBackupMetadata(txn));

View File

@@ -82,12 +82,12 @@ public class SocialBackupModule {
} }
@Provides @Provides
MessageEncoder messageEncoder(MessageEncoderImpl messageEncoder) { org.briarproject.briar.api.socialbackup.MessageEncoder messageEncoder(MessageEncoderImpl messageEncoder) {
return messageEncoder; return messageEncoder;
} }
@Provides @Provides
MessageParser messageParser(MessageParserImpl messageParser) { org.briarproject.briar.api.socialbackup.MessageParser messageParser(MessageParserImpl messageParser) {
return messageParser; return messageParser;
} }
} }