From bae06daa2e32cf752d7eddfe24f89f1c6d7c3743 Mon Sep 17 00:00:00 2001 From: Xufei Tan Date: Tue, 14 Jan 2025 17:28:09 -0800 Subject: [PATCH] Internal change. PiperOrigin-RevId: 715588205 --- .../java/com/google/protobuf/Descriptors.java | 52 +++++++++++-------- 1 file changed, 31 insertions(+), 21 deletions(-) diff --git a/java/core/src/main/java/com/google/protobuf/Descriptors.java b/java/core/src/main/java/com/google/protobuf/Descriptors.java index b90f902804..c45978155c 100644 --- a/java/core/src/main/java/com/google/protobuf/Descriptors.java +++ b/java/core/src/main/java/com/google/protobuf/Descriptors.java @@ -1624,6 +1624,7 @@ public final class Descriptors { // Caches the result of isSensitive() for performance reasons. private volatile Sensitivity sensitivity = Sensitivity.UNKNOWN; + private volatile boolean isReportable = false; // Possibly initialized during cross-linking. private Type type; @@ -1798,64 +1799,73 @@ public final class Descriptors { } @SuppressWarnings("unchecked") // List guaranteed by protobuf runtime. - private boolean isOptionSensitive(FieldDescriptor field, Object value) { + private List isOptionSensitive(FieldDescriptor field, Object value) { if (field.getType() == Descriptors.FieldDescriptor.Type.ENUM) { if (field.isRepeated()) { for (EnumValueDescriptor v : (List) value) { if (v.getOptions().getDebugRedact()) { - return true; + return Arrays.asList(true, false); } } } else { if (((EnumValueDescriptor) value).getOptions().getDebugRedact()) { - return true; + return Arrays.asList(true, false); } } } else if (field.getJavaType() == Descriptors.FieldDescriptor.JavaType.MESSAGE) { if (field.isRepeated()) { for (Message m : (List) value) { for (Map.Entry entry : m.getAllFields().entrySet()) { - if (isOptionSensitive(entry.getKey(), entry.getValue())) { - return true; + List result = isOptionSensitive(entry.getKey(), entry.getValue()); + if (result.get(0)) { + return result; } } } } else { for (Map.Entry entry : ((Message) value).getAllFields().entrySet()) { - if (isOptionSensitive(entry.getKey(), entry.getValue())) { - return true; + List result = isOptionSensitive(entry.getKey(), entry.getValue()); + if (result.get(0)) { + return result; } } } } - return false; + return Arrays.asList(false, false); } - // Lazily calculates if the field is marked as sensitive. Is only called upon the first - // access of the isSensitive() method. - boolean isSensitive() { + // Lazily calculates if the field is marked as sensitive, and caches results. + private List calculateSensitivityData() { if (sensitivity == Sensitivity.UNKNOWN) { // If the field is directly marked with debug_redact=true, then it is sensitive. synchronized (this) { if (sensitivity == Sensitivity.UNKNOWN) { boolean isSensitive = proto.getOptions().getDebugRedact(); - if (!isSensitive) { - // Check if the FieldOptions contain any enums that are marked as debug_redact=true, - // either directly or indirectly via a message option. - for (Map.Entry entry : - proto.getOptions().getAllFields().entrySet()) { - if (isOptionSensitive(entry.getKey(), entry.getValue())) { - isSensitive = true; - break; - } + // Check if the FieldOptions contain any enums that are marked as debug_redact=true, + // either directly or indirectly via a message option. + for (Map.Entry entry : + proto.getOptions().getAllFields().entrySet()) { + List result = isOptionSensitive(entry.getKey(), entry.getValue()); + isSensitive = isSensitive || result.get(0); + isReportable = result.get(1); + if (isSensitive) { + break; } } sensitivity = isSensitive ? Sensitivity.SENSITIVE : Sensitivity.NOT_SENSITIVE; } } } - return sensitivity == Sensitivity.SENSITIVE; + return Arrays.asList(sensitivity == Sensitivity.SENSITIVE, isReportable); + } + + boolean isSensitive() { + return calculateSensitivityData().get(0); + } + + boolean isReportable() { + return calculateSensitivityData().get(1); } /** See {@link FileDescriptor#resolveAllFeatures}. */