Skip to content

Commit

Permalink
Merge pull request #1732 from hashicorp/pre0.6.1-restore-compat
Browse files Browse the repository at this point in the history
Restore compatibility with pre-0.6.1 servers for CLI/Go API calls
  • Loading branch information
jefferai committed Aug 15, 2016
2 parents 6eca449 + 92cb23f commit 5eaab9f
Show file tree
Hide file tree
Showing 6 changed files with 75 additions and 100 deletions.
39 changes: 18 additions & 21 deletions api/sys_audit.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,21 +22,12 @@ func (c *Sys) AuditHash(path string, input string) (string, error) {
}
defer resp.Body.Close()

secret, err := ParseSecret(resp.Body)
if err != nil {
return "", err
}

if secret == nil || secret.Data == nil || len(secret.Data) == 0 {
return "", nil
}

type d struct {
Hash string
Hash string `json:"hash"`
}

var result d
err = mapstructure.Decode(secret.Data, &result)
err = resp.DecodeJSON(&result)
if err != nil {
return "", err
}
Expand All @@ -52,26 +43,32 @@ func (c *Sys) ListAudit() (map[string]*Audit, error) {
}
defer resp.Body.Close()

secret, err := ParseSecret(resp.Body)
var result map[string]interface{}
err = resp.DecodeJSON(&result)
if err != nil {
return nil, err
}

if secret == nil || secret.Data == nil || len(secret.Data) == 0 {
return nil, nil
}

result := map[string]*Audit{}
for k, v := range secret.Data {
mounts := map[string]*Audit{}
for k, v := range result {
switch v.(type) {
case map[string]interface{}:
default:
continue
}
var res Audit
err = mapstructure.Decode(v, &res)
if err != nil {
return nil, err
}
result[k] = &res
// Not a mount, some other api.Secret data
if res.Type == "" {
continue
}
mounts[k] = &res
}

return result, err
return mounts, nil
}

func (c *Sys) EnableAudit(
Expand Down Expand Up @@ -106,7 +103,7 @@ func (c *Sys) DisableAudit(path string) error {
}

// Structures for the requests/resposne are all down here. They aren't
// individually documentd because the map almost directly to the raw HTTP API
// individually documented because the map almost directly to the raw HTTP API
// documentation. Please refer to that documentation for more details.

type Audit struct {
Expand Down
24 changes: 15 additions & 9 deletions api/sys_auth.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,26 +14,32 @@ func (c *Sys) ListAuth() (map[string]*AuthMount, error) {
}
defer resp.Body.Close()

secret, err := ParseSecret(resp.Body)
var result map[string]interface{}
err = resp.DecodeJSON(&result)
if err != nil {
return nil, err
}

if secret == nil || secret.Data == nil || len(secret.Data) == 0 {
return nil, nil
}

result := map[string]*AuthMount{}
for k, v := range secret.Data {
mounts := map[string]*AuthMount{}
for k, v := range result {
switch v.(type) {
case map[string]interface{}:
default:
continue
}
var res AuthMount
err = mapstructure.Decode(v, &res)
if err != nil {
return nil, err
}
result[k] = &res
// Not a mount, some other api.Secret data
if res.Type == "" {
continue
}
mounts[k] = &res
}

return result, err
return mounts, nil
}

func (c *Sys) EnableAuth(path, authType, desc string) error {
Expand Down
9 changes: 3 additions & 6 deletions api/sys_capabilities.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,17 +28,14 @@ func (c *Sys) Capabilities(token, path string) ([]string, error) {
}
defer resp.Body.Close()

secret, err := ParseSecret(resp.Body)
var result map[string]interface{}
err = resp.DecodeJSON(&result)
if err != nil {
return nil, err
}

if secret == nil || secret.Data == nil || len(secret.Data) == 0 {
return nil, nil
}

var capabilities []string
capabilitiesRaw := secret.Data["capabilities"].([]interface{})
capabilitiesRaw := result["capabilities"].([]interface{})
for _, capability := range capabilitiesRaw {
capabilities = append(capabilities, capability.(string))
}
Expand Down
35 changes: 16 additions & 19 deletions api/sys_mounts.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,26 +15,32 @@ func (c *Sys) ListMounts() (map[string]*MountOutput, error) {
}
defer resp.Body.Close()

secret, err := ParseSecret(resp.Body)
var result map[string]interface{}
err = resp.DecodeJSON(&result)
if err != nil {
return nil, err
}

if secret == nil || secret.Data == nil || len(secret.Data) == 0 {
return nil, nil
}

result := map[string]*MountOutput{}
for k, v := range secret.Data {
mounts := map[string]*MountOutput{}
for k, v := range result {
switch v.(type) {
case map[string]interface{}:
default:
continue
}
var res MountOutput
err = mapstructure.Decode(v, &res)
if err != nil {
return nil, err
}
result[k] = &res
// Not a mount, some other api.Secret data
if res.Type == "" {
continue
}
mounts[k] = &res
}

return result, nil
return mounts, nil
}

func (c *Sys) Mount(path string, mountInfo *MountInput) error {
Expand Down Expand Up @@ -104,17 +110,8 @@ func (c *Sys) MountConfig(path string) (*MountConfigOutput, error) {
}
defer resp.Body.Close()

secret, err := ParseSecret(resp.Body)
if err != nil {
return nil, err
}

if secret == nil || secret.Data == nil || len(secret.Data) == 0 {
return nil, nil
}

var result MountConfigOutput
err = mapstructure.Decode(secret.Data, &result)
err = resp.DecodeJSON(&result)
if err != nil {
return nil, err
}
Expand Down
41 changes: 18 additions & 23 deletions api/sys_policy.go
Original file line number Diff line number Diff line change
@@ -1,10 +1,6 @@
package api

import (
"fmt"

"github.com/mitchellh/mapstructure"
)
import "fmt"

func (c *Sys) ListPolicies() ([]string, error) {
r := c.c.NewRequest("GET", "/v1/sys/policy")
Expand All @@ -14,22 +10,25 @@ func (c *Sys) ListPolicies() ([]string, error) {
}
defer resp.Body.Close()

secret, err := ParseSecret(resp.Body)
var result map[string]interface{}
err = resp.DecodeJSON(&result)
if err != nil {
return nil, err
}

if secret == nil || secret.Data == nil || len(secret.Data) == 0 {
return nil, nil
var ok bool
if _, ok = result["policies"]; !ok {
return nil, fmt.Errorf("policies not found in response")
}

var result listPoliciesResp
err = mapstructure.Decode(secret.Data, &result)
if err != nil {
return nil, err
listRaw := result["policies"].([]interface{})
var policies []string

for _, val := range listRaw {
policies = append(policies, val.(string))
}

return result.Policies, err
return policies, err
}

func (c *Sys) GetPolicy(name string) (string, error) {
Expand All @@ -45,22 +44,18 @@ func (c *Sys) GetPolicy(name string) (string, error) {
return "", err
}

secret, err := ParseSecret(resp.Body)
var result map[string]interface{}
err = resp.DecodeJSON(&result)
if err != nil {
return "", err
}

if secret == nil || secret.Data == nil || len(secret.Data) == 0 {
return "", nil
}

var result getPoliciesResp
err = mapstructure.Decode(secret.Data, &result)
if err != nil {
return "", err
var ok bool
if _, ok = result["rules"]; !ok {
return "", fmt.Errorf("rules not found in response")
}

return result.Rules, err
return result["rules"].(string), nil
}

func (c *Sys) PutPolicy(name, rules string) error {
Expand Down
27 changes: 5 additions & 22 deletions api/sys_rotate.go
Original file line number Diff line number Diff line change
@@ -1,10 +1,6 @@
package api

import (
"time"

"github.com/mitchellh/mapstructure"
)
import "time"

func (c *Sys) Rotate() error {
r := c.c.NewRequest("POST", "/v1/sys/rotate")
Expand All @@ -23,25 +19,12 @@ func (c *Sys) KeyStatus() (*KeyStatus, error) {
}
defer resp.Body.Close()

secret, err := ParseSecret(resp.Body)
if err != nil {
return nil, err
}

if secret == nil || secret.Data == nil || len(secret.Data) == 0 {
return nil, nil
}

var result KeyStatus
err = mapstructure.Decode(secret.Data, &result)
if err != nil {
return nil, err
}

return &result, err
result := new(KeyStatus)
err = resp.DecodeJSON(result)
return result, err
}

type KeyStatus struct {
Term int
Term int `json:"term"`
InstallTime time.Time `json:"install_time"`
}

0 comments on commit 5eaab9f

Please sign in to comment.