From 62ee60df82ebbbddd2790886da5587880a080e50 Mon Sep 17 00:00:00 2001 From: Greyson Parrelli Date: Fri, 29 Oct 2021 11:09:13 -0400 Subject: [PATCH] Add full support for unknown fields in storage service. --- app/build.gradle | 2 +- app/witness-verifications.gradle | 4 +- core-util/witness-verifications.gradle | 4 +- dependencies.gradle | 2 +- .../lib/witness-verifications.gradle | 4 +- donations/app/witness-verifications.gradle | 4 +- donations/lib/witness-verifications.gradle | 4 +- image-editor/app/witness-verifications.gradle | 4 +- image-editor/lib/witness-verifications.gradle | 4 +- .../signalservice/api/util/ProtoUtil.java | 50 ++----------------- .../signalservice/api/util/ProtoUtilTest.java | 2 +- .../service/witness-verifications.gradle | 4 +- paging/lib/witness-verifications.gradle | 4 +- video/witness-verifications.gradle | 4 +- 14 files changed, 28 insertions(+), 68 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 7a4f7fc493..e3c0627b45 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -54,7 +54,7 @@ repositories { protobuf { protoc { - artifact = 'com.google.protobuf:protoc:3.10.0' + artifact = 'com.google.protobuf:protoc:3.11.4' } generateProtoTasks { all().each { task -> diff --git a/app/witness-verifications.gradle b/app/witness-verifications.gradle index 6215faad85..1559838ed3 100644 --- a/app/witness-verifications.gradle +++ b/app/witness-verifications.gradle @@ -420,8 +420,8 @@ dependencyVerification { ['com.google.j2objc:j2objc-annotations:1.3', '21af30c92267bd6122c0e0b4d20cccb6641a37eaf956c6540ec471d584e64a7b'], - ['com.google.protobuf:protobuf-javalite:3.10.0', - '215a94dbe100130295906b531bb72a26965c7ac8fcd9a75bf8054a8ac2abf4b4'], + ['com.google.protobuf:protobuf-javalite:3.11.4', + '8cacea2f7a042dabae295c509dcdbfe32a49aa3708eec6ddb8efd8593aa0b4a3'], ['com.google.zxing:android-integration:3.1.0', '89e56aadf1164bd71e57949163c53abf90af368b51669c0d4a47a163335f95c4'], diff --git a/core-util/witness-verifications.gradle b/core-util/witness-verifications.gradle index ffac9e3c73..f979b69064 100644 --- a/core-util/witness-verifications.gradle +++ b/core-util/witness-verifications.gradle @@ -27,8 +27,8 @@ dependencyVerification { ['androidx.versionedparcelable:versionedparcelable:1.1.1', '57e8d93260d18d5b9007c9eed3c64ad159de90c8609ebfc74a347cbd514535a4'], - ['com.google.protobuf:protobuf-javalite:3.10.0', - '215a94dbe100130295906b531bb72a26965c7ac8fcd9a75bf8054a8ac2abf4b4'], + ['com.google.protobuf:protobuf-javalite:3.11.4', + '8cacea2f7a042dabae295c509dcdbfe32a49aa3708eec6ddb8efd8593aa0b4a3'], ['org.jetbrains.kotlin:kotlin-stdlib-common:1.4.32', 'e1ff6f55ee9e7591dcc633f7757bac25a7edb1cc7f738b37ec652f10f66a4145'], diff --git a/dependencies.gradle b/dependencies.gradle index d3769767fd..e1ca99f2dc 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -51,7 +51,7 @@ dependencyResolutionManagement { alias('material-material').to('com.google.android.material:material:1.3.0') // Google - alias('google-protobuf-javalite').to('com.google.protobuf:protobuf-javalite:3.10.0') + alias('google-protobuf-javalite').to('com.google.protobuf:protobuf-javalite:3.11.4') alias('google-libphonenumber').to('com.googlecode.libphonenumber:libphonenumber:8.12.17') alias('google-play-services-maps').to('com.google.android.gms:play-services-maps:16.1.0') alias('google-play-services-auth').to('com.google.android.gms:play-services-auth:16.0.1') diff --git a/device-transfer/lib/witness-verifications.gradle b/device-transfer/lib/witness-verifications.gradle index b354d8e1a0..9c34aa72d9 100644 --- a/device-transfer/lib/witness-verifications.gradle +++ b/device-transfer/lib/witness-verifications.gradle @@ -78,8 +78,8 @@ dependencyVerification { ['androidx.viewpager:viewpager:1.0.0', '147af4e14a1984010d8f155e5e19d781f03c1d70dfed02a8e0d18428b8fc8682'], - ['com.google.protobuf:protobuf-javalite:3.10.0', - '215a94dbe100130295906b531bb72a26965c7ac8fcd9a75bf8054a8ac2abf4b4'], + ['com.google.protobuf:protobuf-javalite:3.11.4', + '8cacea2f7a042dabae295c509dcdbfe32a49aa3708eec6ddb8efd8593aa0b4a3'], ['org.greenrobot:eventbus:3.0.0', '180d4212467df06f2fbc9c8d8a2984533ac79c87769ad883bc421612f0b4e17c'], diff --git a/donations/app/witness-verifications.gradle b/donations/app/witness-verifications.gradle index 2c81c28b24..b66a3fd8d5 100644 --- a/donations/app/witness-verifications.gradle +++ b/donations/app/witness-verifications.gradle @@ -141,8 +141,8 @@ dependencyVerification { ['com.google.android.material:material:1.3.0', 'cbf1e7d69fc236cdadcbd1ec5f6c0a1a41aca6ad1ef7f8481058956270ab1f0a'], - ['com.google.protobuf:protobuf-javalite:3.10.0', - '215a94dbe100130295906b531bb72a26965c7ac8fcd9a75bf8054a8ac2abf4b4'], + ['com.google.protobuf:protobuf-javalite:3.11.4', + '8cacea2f7a042dabae295c509dcdbfe32a49aa3708eec6ddb8efd8593aa0b4a3'], ['com.squareup.okhttp3:okhttp:3.12.10', '3cb8e21cd3ab10d390448f5a475c960732efab583a09c39f06f866a7ed819ebc'], diff --git a/donations/lib/witness-verifications.gradle b/donations/lib/witness-verifications.gradle index e9e3cc120f..631521db3e 100644 --- a/donations/lib/witness-verifications.gradle +++ b/donations/lib/witness-verifications.gradle @@ -96,8 +96,8 @@ dependencyVerification { ['com.google.android.gms:play-services-wallet:18.1.3', 'e19d1f4650f51ce2202c092cbe174058860b6558cf26c8be37a732eff3ae1864'], - ['com.google.protobuf:protobuf-javalite:3.10.0', - '215a94dbe100130295906b531bb72a26965c7ac8fcd9a75bf8054a8ac2abf4b4'], + ['com.google.protobuf:protobuf-javalite:3.11.4', + '8cacea2f7a042dabae295c509dcdbfe32a49aa3708eec6ddb8efd8593aa0b4a3'], ['com.squareup.okhttp3:okhttp:3.12.10', '3cb8e21cd3ab10d390448f5a475c960732efab583a09c39f06f866a7ed819ebc'], diff --git a/image-editor/app/witness-verifications.gradle b/image-editor/app/witness-verifications.gradle index 77afd866cd..a9fc48b48f 100644 --- a/image-editor/app/witness-verifications.gradle +++ b/image-editor/app/witness-verifications.gradle @@ -135,8 +135,8 @@ dependencyVerification { ['com.google.android.material:material:1.3.0', 'cbf1e7d69fc236cdadcbd1ec5f6c0a1a41aca6ad1ef7f8481058956270ab1f0a'], - ['com.google.protobuf:protobuf-javalite:3.10.0', - '215a94dbe100130295906b531bb72a26965c7ac8fcd9a75bf8054a8ac2abf4b4'], + ['com.google.protobuf:protobuf-javalite:3.11.4', + '8cacea2f7a042dabae295c509dcdbfe32a49aa3708eec6ddb8efd8593aa0b4a3'], ['org.jetbrains.kotlin:kotlin-stdlib-common:1.4.32', 'e1ff6f55ee9e7591dcc633f7757bac25a7edb1cc7f738b37ec652f10f66a4145'], diff --git a/image-editor/lib/witness-verifications.gradle b/image-editor/lib/witness-verifications.gradle index 38d891b589..f53f7fcd66 100644 --- a/image-editor/lib/witness-verifications.gradle +++ b/image-editor/lib/witness-verifications.gradle @@ -78,8 +78,8 @@ dependencyVerification { ['androidx.viewpager:viewpager:1.0.0', '147af4e14a1984010d8f155e5e19d781f03c1d70dfed02a8e0d18428b8fc8682'], - ['com.google.protobuf:protobuf-javalite:3.10.0', - '215a94dbe100130295906b531bb72a26965c7ac8fcd9a75bf8054a8ac2abf4b4'], + ['com.google.protobuf:protobuf-javalite:3.11.4', + '8cacea2f7a042dabae295c509dcdbfe32a49aa3708eec6ddb8efd8593aa0b4a3'], ['org.jetbrains.kotlin:kotlin-stdlib-common:1.4.32', 'e1ff6f55ee9e7591dcc633f7757bac25a7edb1cc7f738b37ec652f10f66a4145'], diff --git a/libsignal/service/src/main/java/org/whispersystems/signalservice/api/util/ProtoUtil.java b/libsignal/service/src/main/java/org/whispersystems/signalservice/api/util/ProtoUtil.java index c062d61c69..82be7efb66 100644 --- a/libsignal/service/src/main/java/org/whispersystems/signalservice/api/util/ProtoUtil.java +++ b/libsignal/service/src/main/java/org/whispersystems/signalservice/api/util/ProtoUtil.java @@ -52,56 +52,16 @@ public final class ProtoUtil { /** * This takes two arguments: A proto model, and the bytes of another proto model of the same type. * This will take the proto model and append onto it any unknown fields from the serialized proto - * model. Why is this useful? Well, if you do {@code myProto.parseFrom(data).toBuilder().build()}, - * you will lose any unknown fields that were in {@code data}. This lets you create a new model - * and plop the unknown fields back on from some other instance. - * - * A notable limitation of the current implementation is, however, that it does not support adding - * back unknown fields to *inner* messages. Unknown fields on inner messages will simply not be - * acknowledged. + * model. */ @SuppressWarnings({"rawtypes", "unchecked"}) public static Proto combineWithUnknownFields(Proto proto, byte[] serializedWithUnknownFields) throws InvalidProtocolBufferException { - if (serializedWithUnknownFields == null) { - return proto; - } - - Proto protoWithUnknownFields = (Proto) proto.getParserForType().parseFrom(serializedWithUnknownFields); - byte[] unknownFields = getUnknownFields(protoWithUnknownFields); - - if (unknownFields == null) { - return proto; - } - - byte[] combined = ByteUtil.combine(proto.toByteArray(), unknownFields); - - return (Proto) proto.getParserForType().parseFrom(combined); - } - - @SuppressWarnings("rawtypes") - private static byte[] getUnknownFields(GeneratedMessageLite proto) { - try { - Field field = GeneratedMessageLite.class.getDeclaredField("unknownFields"); - field.setAccessible(true); - UnknownFieldSetLite unknownFields = (UnknownFieldSetLite) field.get(proto); - - if (unknownFields == null || unknownFields.getSerializedSize() == 0) { - return null; - } - - ByteArrayOutputStream byteStream = new ByteArrayOutputStream(); - CodedOutputStream outputStream = CodedOutputStream.newInstance(byteStream); - - unknownFields.writeTo(outputStream); - outputStream.flush(); - - return byteStream.toByteArray(); - } catch (NoSuchFieldException | IllegalAccessException | IOException e) { - Log.w(TAG, "Failed to retrieve unknown fields.", e); - return null; - } + return (Proto) proto.newBuilderForType() + .mergeFrom(serializedWithUnknownFields) + .mergeFrom(proto) + .build(); } /** diff --git a/libsignal/service/src/test/java/org/whispersystems/signalservice/api/util/ProtoUtilTest.java b/libsignal/service/src/test/java/org/whispersystems/signalservice/api/util/ProtoUtilTest.java index 6480b72881..3d446c6f9d 100644 --- a/libsignal/service/src/test/java/org/whispersystems/signalservice/api/util/ProtoUtilTest.java +++ b/libsignal/service/src/test/java/org/whispersystems/signalservice/api/util/ProtoUtilTest.java @@ -236,6 +236,6 @@ public class ProtoUtilTest { TestInnerMessageWithNewString reparsedTest = TestInnerMessageWithNewString.parseFrom(combined.toByteArray()); Assert.assertEquals("a2", reparsedTest.getInner().getA()); - Assert.assertEquals("", reparsedTest.getInner().getB()); + Assert.assertEquals("b1", reparsedTest.getInner().getB()); } } diff --git a/libsignal/service/witness-verifications.gradle b/libsignal/service/witness-verifications.gradle index 0d7ec77a33..e31418f325 100644 --- a/libsignal/service/witness-verifications.gradle +++ b/libsignal/service/witness-verifications.gradle @@ -12,8 +12,8 @@ dependencyVerification { ['com.fasterxml.jackson.core:jackson-databind:2.9.9.2', 'fb262d42ea2de98044b62d393950a5aa050435fec38bbcadf2325cf7dc41b848'], - ['com.google.protobuf:protobuf-javalite:3.10.0', - '215a94dbe100130295906b531bb72a26965c7ac8fcd9a75bf8054a8ac2abf4b4'], + ['com.google.protobuf:protobuf-javalite:3.11.4', + '8cacea2f7a042dabae295c509dcdbfe32a49aa3708eec6ddb8efd8593aa0b4a3'], ['com.googlecode.libphonenumber:libphonenumber:8.12.17', '729483057ef874b01537da8395d67e23b419d504f8ff29ddf5f69da21bf816ac'], diff --git a/paging/lib/witness-verifications.gradle b/paging/lib/witness-verifications.gradle index aac30f8e95..d9ebca2cd1 100644 --- a/paging/lib/witness-verifications.gradle +++ b/paging/lib/witness-verifications.gradle @@ -120,8 +120,8 @@ dependencyVerification { ['com.google.android.material:material:1.3.0', 'cbf1e7d69fc236cdadcbd1ec5f6c0a1a41aca6ad1ef7f8481058956270ab1f0a'], - ['com.google.protobuf:protobuf-javalite:3.10.0', - '215a94dbe100130295906b531bb72a26965c7ac8fcd9a75bf8054a8ac2abf4b4'], + ['com.google.protobuf:protobuf-javalite:3.11.4', + '8cacea2f7a042dabae295c509dcdbfe32a49aa3708eec6ddb8efd8593aa0b4a3'], ['org.jetbrains.kotlin:kotlin-stdlib-common:1.4.32', 'e1ff6f55ee9e7591dcc633f7757bac25a7edb1cc7f738b37ec652f10f66a4145'], diff --git a/video/witness-verifications.gradle b/video/witness-verifications.gradle index fede72105c..0ebf28e77b 100644 --- a/video/witness-verifications.gradle +++ b/video/witness-verifications.gradle @@ -27,8 +27,8 @@ dependencyVerification { ['androidx.versionedparcelable:versionedparcelable:1.1.1', '57e8d93260d18d5b9007c9eed3c64ad159de90c8609ebfc74a347cbd514535a4'], - ['com.google.protobuf:protobuf-javalite:3.10.0', - '215a94dbe100130295906b531bb72a26965c7ac8fcd9a75bf8054a8ac2abf4b4'], + ['com.google.protobuf:protobuf-javalite:3.11.4', + '8cacea2f7a042dabae295c509dcdbfe32a49aa3708eec6ddb8efd8593aa0b4a3'], ['org.jetbrains.kotlin:kotlin-stdlib-common:1.4.32', 'e1ff6f55ee9e7591dcc633f7757bac25a7edb1cc7f738b37ec652f10f66a4145'],