release_config: Inheritance should honor Redacted
If a release config inherits one where a flag is redacted, the flag
should remain redacted unless it is assigned a value.
Bug: b/375044525
Test: manual
Change-Id: Ib1737ef07bd2990b751686d53754648e124e24d4
diff --git a/cmd/release_config/build_flag/main.go b/cmd/release_config/build_flag/main.go
index 46efce7..5d103cc 100644
--- a/cmd/release_config/build_flag/main.go
+++ b/cmd/release_config/build_flag/main.go
@@ -90,6 +90,9 @@
if !ok {
return "", fmt.Errorf("%s not found in %s", name, config.Name)
}
+ if fa.Redacted {
+ return "==REDACTED==", nil
+ }
return rc_lib.MarshalValue(fa.Value), nil
}
diff --git a/cmd/release_config/release_config_lib/flag_artifact.go b/cmd/release_config/release_config_lib/flag_artifact.go
index bb321da..cb13fdc 100644
--- a/cmd/release_config/release_config_lib/flag_artifact.go
+++ b/cmd/release_config/release_config_lib/flag_artifact.go
@@ -84,8 +84,10 @@
func (fas *FlagArtifacts) SortedFlagNames() []string {
var names []string
- for k, _ := range *fas {
- names = append(names, k)
+ for k, v := range *fas {
+ if !v.Redacted {
+ names = append(names, k)
+ }
}
slices.Sort(names)
return names
@@ -183,15 +185,20 @@
// error: any error encountered
func (fa *FlagArtifact) UpdateValue(flagValue FlagValue) error {
name := *flagValue.proto.Name
- fa.Traces = append(fa.Traces, &rc_proto.Tracepoint{Source: proto.String(flagValue.path), Value: flagValue.proto.Value})
- if flagValue.proto.GetRedacted() {
- fa.Redacted = true
+ redacted := flagValue.proto.GetRedacted()
+ if redacted {
+ fa.Redact()
+ flagValue.proto.Value = fa.Value
fmt.Printf("Redacting flag %s in %s\n", name, flagValue.path)
- return nil
+ } else {
+ // If we are assigning a value, then the flag is no longer redacted.
+ fa.Redacted = false
}
+ fa.Traces = append(fa.Traces, &rc_proto.Tracepoint{Source: proto.String(flagValue.path), Value: flagValue.proto.Value})
if fa.Value.GetObsolete() {
return fmt.Errorf("Attempting to set obsolete flag %s. Trace=%v", name, fa.Traces)
}
+
var newValue *rc_proto.Value
switch val := flagValue.proto.Value.Val.(type) {
case *rc_proto.Value_StringValue:
@@ -213,6 +220,11 @@
return nil
}
+func (fa *FlagArtifact) Redact() {
+ fa.Redacted = true
+ fa.Value = &rc_proto.Value{Val: &rc_proto.Value_StringValue{StringValue: "*REDACTED*"}}
+}
+
// Marshal the FlagArtifact into a flag_artifact message.
func (fa *FlagArtifact) Marshal() (*rc_proto.FlagArtifact, error) {
if fa.Redacted {
diff --git a/cmd/release_config/release_config_lib/release_config.go b/cmd/release_config/release_config_lib/release_config.go
index ee71336..3c834cc 100644
--- a/cmd/release_config/release_config_lib/release_config.go
+++ b/cmd/release_config/release_config_lib/release_config.go
@@ -21,7 +21,6 @@
"path/filepath"
"regexp"
"slices"
- "sort"
"strings"
rc_proto "android/soong/cmd/release_config/release_config_proto"
@@ -107,6 +106,9 @@
if !ok {
return fmt.Errorf("Could not inherit flag %s from %s", name, iConfig.Name)
}
+ if fa.Redacted {
+ myFa.Redact()
+ }
if name == "RELEASE_ACONFIG_VALUE_SETS" {
// If there is a value assigned, add the trace.
if len(fa.Value.GetStringValue()) > 0 {
@@ -166,6 +168,13 @@
}
myInherits = append(myInherits, inherit)
myInheritsSet[inherit] = true
+ // TODO: there are some configs that rely on vgsbr being
+ // present on branches where it isn't. Once the broken configs
+ // are fixed, we can be more strict. In the meantime, they
+ // will wind up inheriting `trunk_stable` instead of the
+ // non-existent (alias) that they reference today. Once fixed,
+ // this becomes:
+ // iConfig, err := configs.GetReleaseConfigStrict(inherit)
iConfig, err := configs.GetReleaseConfig(inherit)
if err != nil {
return err
@@ -261,9 +270,6 @@
if err := fa.UpdateValue(*value); err != nil {
return err
}
- if fa.Redacted {
- delete(config.FlagArtifacts, name)
- }
}
}
// Now remove any duplicates from the actual value of RELEASE_ACONFIG_VALUE_SETS
@@ -313,6 +319,10 @@
if err != nil {
return err
}
+ // Redacted flags return nil when rendered.
+ if artifact == nil {
+ continue
+ }
for _, container := range v.FlagDeclaration.Containers {
if _, ok := config.PartitionBuildFlags[container]; !ok {
config.PartitionBuildFlags[container] = &rc_proto.FlagArtifacts{}
@@ -325,12 +335,7 @@
OtherNames: config.OtherNames,
Flags: func() []*rc_proto.FlagArtifact {
ret := []*rc_proto.FlagArtifact{}
- flagNames := []string{}
- for k := range config.FlagArtifacts {
- flagNames = append(flagNames, k)
- }
- sort.Strings(flagNames)
- for _, flagName := range flagNames {
+ for _, flagName := range config.FlagArtifacts.SortedFlagNames() {
flag := config.FlagArtifacts[flagName]
ret = append(ret, &rc_proto.FlagArtifact{
FlagDeclaration: flag.FlagDeclaration,
@@ -365,7 +370,7 @@
}
}
for _, rcName := range extraAconfigReleaseConfigs {
- rc, err := configs.GetReleaseConfig(rcName)
+ rc, err := configs.GetReleaseConfigStrict(rcName)
if err != nil {
return err
}
diff --git a/cmd/release_config/release_config_lib/release_configs.go b/cmd/release_config/release_config_lib/release_configs.go
index 831ec02..f947b7f 100644
--- a/cmd/release_config/release_config_lib/release_configs.go
+++ b/cmd/release_config/release_config_lib/release_configs.go
@@ -410,6 +410,14 @@
}
func (configs *ReleaseConfigs) GetReleaseConfig(name string) (*ReleaseConfig, error) {
+ return configs.getReleaseConfig(name, configs.allowMissing)
+}
+
+func (configs *ReleaseConfigs) GetReleaseConfigStrict(name string) (*ReleaseConfig, error) {
+ return configs.getReleaseConfig(name, false)
+}
+
+func (configs *ReleaseConfigs) getReleaseConfig(name string, allow_missing bool) (*ReleaseConfig, error) {
trace := []string{name}
for target, ok := configs.Aliases[name]; ok; target, ok = configs.Aliases[name] {
name = *target
@@ -418,7 +426,7 @@
if config, ok := configs.ReleaseConfigs[name]; ok {
return config, nil
}
- if configs.allowMissing {
+ if allow_missing {
if config, ok := configs.ReleaseConfigs["trunk_staging"]; ok {
return config, nil
}
@@ -467,7 +475,7 @@
dirName := filepath.Dir(contrib.path)
for k, names := range contrib.FlagValueDirs {
for _, rcName := range names {
- if config, err := configs.GetReleaseConfig(rcName); err == nil {
+ if config, err := configs.getReleaseConfig(rcName, false); err == nil {
rcPath := filepath.Join(dirName, "release_configs", fmt.Sprintf("%s.textproto", config.Name))
if _, err := os.Stat(rcPath); err != nil {
errors = append(errors, fmt.Sprintf("%s exists but %s does not contribute to %s",