diff --git a/source/common/protobuf/utility.cc b/source/common/protobuf/utility.cc index 543e8cf7a99f2..d611a3a69318b 100644 --- a/source/common/protobuf/utility.cc +++ b/source/common/protobuf/utility.cc @@ -774,11 +774,15 @@ bool redactOpaque(Protobuf::Message* message, bool ancestor_is_sensitive, const auto* reflection = message->GetReflection(); const auto* type_url_field_descriptor = opaque_descriptor->FindFieldByName("type_url"); const auto* value_field_descriptor = opaque_descriptor->FindFieldByName("value"); - ASSERT(type_url_field_descriptor != nullptr && value_field_descriptor != nullptr && - reflection->HasField(*message, type_url_field_descriptor)); - if (!reflection->HasField(*message, value_field_descriptor)) { + ASSERT(type_url_field_descriptor != nullptr && value_field_descriptor != nullptr); + if (!reflection->HasField(*message, type_url_field_descriptor) && + !reflection->HasField(*message, value_field_descriptor)) { return true; } + if (!reflection->HasField(*message, type_url_field_descriptor) || + !reflection->HasField(*message, value_field_descriptor)) { + return false; + } // Try to find a descriptor for `type_url` in the pool and instantiate a new message of the // correct concrete type. diff --git a/test/common/protobuf/utility_test.cc b/test/common/protobuf/utility_test.cc index 92480788872d5..070b6cecb46b0 100644 --- a/test/common/protobuf/utility_test.cc +++ b/test/common/protobuf/utility_test.cc @@ -986,6 +986,19 @@ type_url: type.googleapis.com/envoy.test.Sensitive EXPECT_TRUE(TestUtility::protoEqual(expected, actual)); } +TEST_F(ProtobufUtilityTest, RedactTypedStructWithNoTypeUrl) { + udpa::type::v1::TypedStruct actual; + TestUtility::loadFromYaml(R"EOF( +value: + sensitive_string: This field is sensitive, but we have no way of knowing. +)EOF", + actual); + + udpa::type::v1::TypedStruct expected = actual; + MessageUtil::redact(actual); + EXPECT_TRUE(TestUtility::protoEqual(expected, actual)); +} + // Messages packed into `TypedStruct` with unknown type URLs are skipped. TEST_F(ProtobufUtilityTest, RedactTypedStructWithUnknownTypeUrl) { udpa::type::v1::TypedStruct actual; @@ -1001,6 +1014,20 @@ type_url: type.googleapis.com/envoy.unknown.Message EXPECT_TRUE(TestUtility::protoEqual(expected, actual)); } +TEST_F(ProtobufUtilityTest, RedactEmptyTypeUrlTypedStruct) { + udpa::type::v1::TypedStruct actual; + udpa::type::v1::TypedStruct expected = actual; + MessageUtil::redact(actual); + EXPECT_TRUE(TestUtility::protoEqual(expected, actual)); +} + +TEST_F(ProtobufUtilityTest, RedactEmptyTypeUrlAny) { + ProtobufWkt::Any actual; + MessageUtil::redact(actual); + ProtobufWkt::Any expected = actual; + EXPECT_TRUE(TestUtility::protoEqual(expected, actual)); +} + // Deeply-nested opaque protos (`Any` and `TypedStruct`), which are reified using the // `DynamicMessageFactory`, should be redacted correctly. TEST_F(ProtobufUtilityTest, RedactDeeplyNestedOpaqueProtos) {