github.com/khulnasoft-lab/defsec@v1.0.5-0.20230827010352-5e9f46893d95/pkg/scanners/terraform/parser/load_vars.go (about)

     1  package parser
     2  
     3  import (
     4  	"fmt"
     5  	"io/fs"
     6  	"os"
     7  	"path/filepath"
     8  	"strings"
     9  
    10  	"github.com/hashicorp/hcl/v2"
    11  	"github.com/hashicorp/hcl/v2/hclsyntax"
    12  	hcljson "github.com/hashicorp/hcl/v2/json"
    13  	"github.com/zclconf/go-cty/cty"
    14  )
    15  
    16  func loadTFVars(srcFS fs.FS, filenames []string) (map[string]cty.Value, error) {
    17  	combinedVars := make(map[string]cty.Value)
    18  
    19  	for _, env := range os.Environ() {
    20  		split := strings.Split(env, "=")
    21  		key := split[0]
    22  		if !strings.HasPrefix(key, "TF_VAR_") {
    23  			continue
    24  		}
    25  		key = strings.TrimPrefix(key, "TF_VAR_")
    26  		var val string
    27  		if len(split) > 1 {
    28  			val = split[1]
    29  		}
    30  		combinedVars[key] = cty.StringVal(val)
    31  	}
    32  
    33  	for _, filename := range filenames {
    34  		vars, err := loadTFVarsFile(srcFS, filename)
    35  		if err != nil {
    36  			return nil, fmt.Errorf("failed to load tfvars from %s: %w", filename, err)
    37  		}
    38  		for k, v := range vars {
    39  			combinedVars[k] = v
    40  		}
    41  	}
    42  
    43  	return combinedVars, nil
    44  }
    45  
    46  func loadTFVarsFile(srcFS fs.FS, filename string) (map[string]cty.Value, error) {
    47  	inputVars := make(map[string]cty.Value)
    48  	if filename == "" {
    49  		return inputVars, nil
    50  	}
    51  
    52  	src, err := fs.ReadFile(srcFS, filepath.ToSlash(filename))
    53  	if err != nil {
    54  		return nil, err
    55  	}
    56  
    57  	var attrs hcl.Attributes
    58  	if strings.HasSuffix(filename, ".json") {
    59  		variableFile, err := hcljson.Parse(src, filename)
    60  		if err != nil {
    61  			return nil, err
    62  		}
    63  		attrs, err = variableFile.Body.JustAttributes()
    64  		if err != nil {
    65  			return nil, err
    66  		}
    67  	} else {
    68  		variableFile, err := hclsyntax.ParseConfig(src, filename, hcl.Pos{Line: 1, Column: 1})
    69  		if err != nil {
    70  			return nil, err
    71  		}
    72  		attrs, err = variableFile.Body.JustAttributes()
    73  		if err != nil {
    74  			return nil, err
    75  		}
    76  	}
    77  
    78  	for _, attr := range attrs {
    79  		inputVars[attr.Name], _ = attr.Expr.Value(&hcl.EvalContext{})
    80  	}
    81  
    82  	return inputVars, nil
    83  }