Skip to content

Commit

Permalink
Move checkHCLKeys into hclutil (hashicorp#4749)
Browse files Browse the repository at this point in the history
  • Loading branch information
calvn authored Jun 12, 2018
1 parent 86924f3 commit c212a86
Show file tree
Hide file tree
Showing 6 changed files with 48 additions and 148 deletions.
30 changes: 2 additions & 28 deletions api/ssh_agent.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import (
"github.com/hashicorp/go-rootcerts"
"github.com/hashicorp/hcl"
"github.com/hashicorp/hcl/hcl/ast"
"github.com/hashicorp/vault/helper/hclutil"
"github.com/mitchellh/mapstructure"
)

Expand Down Expand Up @@ -160,7 +161,7 @@ func ParseSSHHelperConfig(contents string) (*SSHHelperConfig, error) {
"tls_skip_verify",
"tls_server_name",
}
if err := checkHCLKeys(list, valid); err != nil {
if err := hclutil.CheckHCLKeys(list, valid); err != nil {
return nil, multierror.Prefix(err, "ssh_helper:")
}

Expand Down Expand Up @@ -228,30 +229,3 @@ func (c *SSHHelper) Verify(otp string) (*SSHVerifyResponse, error) {
}
return &verifyResp, nil
}

func checkHCLKeys(node ast.Node, valid []string) error {
var list *ast.ObjectList
switch n := node.(type) {
case *ast.ObjectList:
list = n
case *ast.ObjectType:
list = n.List
default:
return fmt.Errorf("cannot check HCL keys of type %T", n)
}

validMap := make(map[string]struct{}, len(valid))
for _, v := range valid {
validMap[v] = struct{}{}
}

var result error
for _, item := range list.Items {
key := item.Keys[0].Token.Value().(string)
if _, ok := validMap[key]; !ok {
result = multierror.Append(result, fmt.Errorf("invalid key %q on line %d", key, item.Assign.Line))
}
}

return result
}
31 changes: 0 additions & 31 deletions command/config.go
Original file line number Diff line number Diff line change
@@ -1,10 +1,6 @@
package command

import (
"fmt"

"github.com/hashicorp/go-multierror"
"github.com/hashicorp/hcl/hcl/ast"
"github.com/hashicorp/vault/command/config"
)

Expand Down Expand Up @@ -56,30 +52,3 @@ func ParseConfig(contents string) (*DefaultConfig, error) {
conf, err := config.ParseConfig(contents)
return (*DefaultConfig)(conf), err
}

func checkHCLKeys(node ast.Node, valid []string) error {
var list *ast.ObjectList
switch n := node.(type) {
case *ast.ObjectList:
list = n
case *ast.ObjectType:
list = n.List
default:
return fmt.Errorf("cannot check HCL keys of type %T", n)
}

validMap := make(map[string]struct{}, len(valid))
for _, v := range valid {
validMap[v] = struct{}{}
}

var result error
for _, item := range list.Items {
key := item.Keys[0].Token.Value().(string)
if _, ok := validMap[key]; !ok {
result = multierror.Append(result, fmt.Errorf("invalid key %q on line %d", key, item.Assign.Line))
}
}

return result
}
31 changes: 2 additions & 29 deletions command/config/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,9 @@ import (
"os"

"github.com/hashicorp/errwrap"
"github.com/hashicorp/go-multierror"
"github.com/hashicorp/hcl"
"github.com/hashicorp/hcl/hcl/ast"
"github.com/hashicorp/vault/helper/hclutil"
"github.com/mitchellh/go-homedir"
)

Expand Down Expand Up @@ -89,7 +89,7 @@ func ParseConfig(contents string) (*DefaultConfig, error) {
valid := []string{
"token_helper",
}
if err := checkHCLKeys(list, valid); err != nil {
if err := hclutil.CheckHCLKeys(list, valid); err != nil {
return nil, err
}

Expand All @@ -99,30 +99,3 @@ func ParseConfig(contents string) (*DefaultConfig, error) {
}
return &c, nil
}

func checkHCLKeys(node ast.Node, valid []string) error {
var list *ast.ObjectList
switch n := node.(type) {
case *ast.ObjectList:
list = n
case *ast.ObjectType:
list = n.List
default:
return fmt.Errorf("cannot check HCL keys of type %T", n)
}

validMap := make(map[string]struct{}, len(valid))
for _, v := range valid {
validMap[v] = struct{}{}
}

var result error
for _, item := range list.Items {
key := item.Keys[0].Token.Value().(string)
if _, ok := validMap[key]; !ok {
result = multierror.Append(result, fmt.Errorf("invalid key %q on line %d", key, item.Assign.Line))
}
}

return result
}
36 changes: 5 additions & 31 deletions command/server/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import (
"github.com/hashicorp/go-multierror"
"github.com/hashicorp/hcl"
"github.com/hashicorp/hcl/hcl/ast"
"github.com/hashicorp/vault/helper/hclutil"
"github.com/hashicorp/vault/helper/parseutil"
)

Expand Down Expand Up @@ -438,7 +439,7 @@ func ParseConfig(d string, logger log.Logger) (*Config, error) {
"disable_clustering",
"disable_sealwrap",
}
if err := checkHCLKeys(list, valid); err != nil {
if err := hclutil.CheckHCLKeys(list, valid); err != nil {
return nil, err
}

Expand Down Expand Up @@ -769,7 +770,7 @@ func parseSeal(result *Config, list *ast.ObjectList, blockName string) error {
return fmt.Errorf("invalid seal type %q", key)
}

if err := checkHCLKeys(item.Val, valid); err != nil {
if err := hclutil.CheckHCLKeys(item.Val, valid); err != nil {
return multierror.Prefix(err, fmt.Sprintf("%s.%s:", blockName, key))
}

Expand Down Expand Up @@ -817,7 +818,7 @@ func parseListeners(result *Config, list *ast.ObjectList) error {
"tls_client_ca_file",
"token",
}
if err := checkHCLKeys(item.Val, valid); err != nil {
if err := hclutil.CheckHCLKeys(item.Val, valid); err != nil {
return multierror.Prefix(err, fmt.Sprintf("listeners.%s:", key))
}

Expand Down Expand Up @@ -867,7 +868,7 @@ func parseTelemetry(result *Config, list *ast.ObjectList) error {
"statsd_address",
"statsite_address",
}
if err := checkHCLKeys(item.Val, valid); err != nil {
if err := hclutil.CheckHCLKeys(item.Val, valid); err != nil {
return multierror.Prefix(err, "telemetry:")
}

Expand All @@ -885,30 +886,3 @@ func parseTelemetry(result *Config, list *ast.ObjectList) error {
}
return nil
}

func checkHCLKeys(node ast.Node, valid []string) error {
var list *ast.ObjectList
switch n := node.(type) {
case *ast.ObjectList:
list = n
case *ast.ObjectType:
list = n.List
default:
return fmt.Errorf("cannot check HCL keys of type %T", n)
}

validMap := make(map[string]struct{}, len(valid))
for _, v := range valid {
validMap[v] = struct{}{}
}

var result error
for _, item := range list.Items {
key := item.Keys[0].Token.Value().(string)
if _, ok := validMap[key]; !ok {
result = multierror.Append(result, fmt.Errorf("invalid key %q on line %d", key, item.Assign.Line))
}
}

return result
}
36 changes: 36 additions & 0 deletions helper/hclutil/hcl.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package hclutil

import (
"fmt"

multierror "github.com/hashicorp/go-multierror"
"github.com/hashicorp/hcl/hcl/ast"
)

// CheckHCLKeys checks whether the keys in the AST list contains any of the valid keys provided.
func CheckHCLKeys(node ast.Node, valid []string) error {
var list *ast.ObjectList
switch n := node.(type) {
case *ast.ObjectList:
list = n
case *ast.ObjectType:
list = n.List
default:
return fmt.Errorf("cannot check HCL keys of type %T", n)
}

validMap := make(map[string]struct{}, len(valid))
for _, v := range valid {
validMap[v] = struct{}{}
}

var result error
for _, item := range list.Items {
key := item.Keys[0].Token.Value().(string)
if _, ok := validMap[key]; !ok {
result = multierror.Append(result, fmt.Errorf("invalid key %q on line %d", key, item.Assign.Line))
}
}

return result
}
32 changes: 3 additions & 29 deletions vault/policy.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import (
"github.com/hashicorp/go-multierror"
"github.com/hashicorp/hcl"
"github.com/hashicorp/hcl/hcl/ast"
"github.com/hashicorp/vault/helper/hclutil"
"github.com/hashicorp/vault/helper/parseutil"
"github.com/mitchellh/copystructure"
)
Expand Down Expand Up @@ -168,7 +169,7 @@ func ParseACLPolicy(rules string) (*Policy, error) {
"name",
"path",
}
if err := checkHCLKeys(list, valid); err != nil {
if err := hclutil.CheckHCLKeys(list, valid); err != nil {
return nil, errwrap.Wrapf("failed to parse policy: {{err}}", err)
}

Expand Down Expand Up @@ -205,7 +206,7 @@ func parsePaths(result *Policy, list *ast.ObjectList) error {
"min_wrapping_ttl",
"max_wrapping_ttl",
}
if err := checkHCLKeys(item.Val, valid); err != nil {
if err := hclutil.CheckHCLKeys(item.Val, valid); err != nil {
return multierror.Prefix(err, fmt.Sprintf("path %q:", key))
}

Expand Down Expand Up @@ -305,30 +306,3 @@ func parsePaths(result *Policy, list *ast.ObjectList) error {
result.Paths = paths
return nil
}

func checkHCLKeys(node ast.Node, valid []string) error {
var list *ast.ObjectList
switch n := node.(type) {
case *ast.ObjectList:
list = n
case *ast.ObjectType:
list = n.List
default:
return fmt.Errorf("cannot check HCL keys of type %T", n)
}

validMap := make(map[string]struct{}, len(valid))
for _, v := range valid {
validMap[v] = struct{}{}
}

var result error
for _, item := range list.Items {
key := item.Keys[0].Token.Value().(string)
if _, ok := validMap[key]; !ok {
result = multierror.Append(result, fmt.Errorf("invalid key %q on line %d", key, item.Assign.Line))
}
}

return result
}

0 comments on commit c212a86

Please sign in to comment.