| // Copyright (c) The OpenTofu Authors | |
| // SPDX-License-Identifier: MPL-2.0 | |
| // Copyright (c) 2023 HashiCorp, Inc. | |
| // SPDX-License-Identifier: MPL-2.0 | |
| package validation | |
| import ( | |
| "fmt" | |
| "log" | |
| "github.com/hashicorp/hcl/v2" | |
| "github.com/opentofu/opentofu/internal/configs/configschema" | |
| "github.com/opentofu/opentofu/internal/tfdiags" | |
| "github.com/zclconf/go-cty/cty" | |
| ) | |
| // WriteOnlyAttributes checks that the write-only attributes are not returned back with an actual value. | |
| // This particular validation does not require to return the diags right away, but we can leave the | |
| // flow move on. | |
| // The diagnostics generated by this validation ensure that the provider works correctly | |
| // and there is no issue in the provider SDK when it comes to the write-only attributes. | |
| // Returning those with actual values can create unknown behavior leading to possible confidential | |
| // information exposure. | |
| // NOTE: Keep this in sync with the equivalent in internal/plugin/validation/write_only.go | |
| func WriteOnlyAttributes(schema *configschema.Block, v cty.Value, resAddr string) (diags tfdiags.Diagnostics) { | |
| if !schema.ContainsWriteOnly() { | |
| return diags | |
| } | |
| paths := schema.WriteOnlyPaths(v, nil) | |
| for _, path := range paths { | |
| pathAsString := tfdiags.FormatCtyPath(path) | |
| pathVal, err := path.Apply(v) | |
| if err != nil { | |
| log.Printf("[WARN] Error when tried to get the path (%s) value from the given object: %s", pathAsString, err) | |
| continue | |
| } | |
| if pathVal.IsNull() { | |
| continue | |
| } | |
| diags = diags.Append(&hcl.Diagnostic{ | |
| Severity: hcl.DiagError, | |
| Summary: "Invalid provider response", | |
| Detail: fmt.Sprintf("Resource type %q returned an actual value for the write-only attribute %q while it is meant to be nil. This is an issue in the provider SDK.", resAddr, pathAsString), | |
| }) | |
| } | |
| return diags | |
| } |