Skip to content
This repository has been archived by the owner on Nov 14, 2020. It is now read-only.

Commit

Permalink
Refactor formatting headers (terraform-provider-openstack#865)
Browse files Browse the repository at this point in the history
Use a map instead of slice to perform lookups for sensitive headers.
It should perfom better (O(1) on average) since it's a hashmap.
Provide a simple unit test.

Remove github.com/Unknwon/com dependency since is not needed anymore.

Tidy vendored dependencies.

This commit also sets Go version to 1.12 in go.mod.
  • Loading branch information
ozerovandrei committed Sep 13, 2019
1 parent 450150b commit 3ad0a5d
Show file tree
Hide file tree
Showing 47 changed files with 165 additions and 8,485 deletions.
6 changes: 2 additions & 4 deletions go.mod
@@ -1,13 +1,11 @@
module github.com/terraform-providers/terraform-provider-openstack

require (
github.com/Unknwon/com v0.0.0-20151008135407-28b053d5a292
github.com/gophercloud/gophercloud v0.3.1-0.20190807175045-25a84d593c97
github.com/gophercloud/utils v0.0.0-20190313033024-0bcc8e728cb5
github.com/gopherjs/gopherjs v0.0.0-20181103185306-d547d1d9531e // indirect
github.com/hashicorp/terraform v0.12.8
github.com/mitchellh/go-homedir v1.1.0
github.com/smartystreets/assertions v0.0.0-20190116191733-b6c0e53d7304 // indirect
github.com/smartystreets/goconvey v0.0.0-20181108003508-044398e4856c // indirect
github.com/stretchr/testify v1.3.0
)

go 1.12
6 changes: 0 additions & 6 deletions go.sum
Expand Up @@ -147,8 +147,6 @@ github.com/gophercloud/utils v0.0.0-20190128072930-fbb6ab446f01/go.mod h1:wjDF8z
github.com/gophercloud/utils v0.0.0-20190313033024-0bcc8e728cb5 h1:8USoe8m65WcTOYy+MUu+EtLJJysSODnoNDNCEWhDMso=
github.com/gophercloud/utils v0.0.0-20190313033024-0bcc8e728cb5/go.mod h1:SZ9FTKibIotDtCrxAU/evccoyu1yhKST6hgBvwTB5Eg=
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
github.com/gopherjs/gopherjs v0.0.0-20181103185306-d547d1d9531e h1:JKmoR8x90Iww1ks85zJ1lfDGgIiMDuIptTOhJq+zKyg=
github.com/gopherjs/gopherjs v0.0.0-20181103185306-d547d1d9531e/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg=
github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
Expand Down Expand Up @@ -367,11 +365,7 @@ github.com/shurcooL/users v0.0.0-20180125191416-49c67e49c537/go.mod h1:QJTqeLYED
github.com/shurcooL/webdavfs v0.0.0-20170829043945-18c3829fa133/go.mod h1:hKmq5kWdCj2z2KEozexVbfEZIWiTjhE0+UjmZgPqehw=
github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
github.com/smartystreets/assertions v0.0.0-20190116191733-b6c0e53d7304 h1:Jpy1PXuP99tXNrhbq2BaPz9B+jNAvH1JPQQpG/9GCXY=
github.com/smartystreets/assertions v0.0.0-20190116191733-b6c0e53d7304/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
github.com/smartystreets/goconvey v0.0.0-20180222194500-ef6db91d284a/go.mod h1:XDJAKZRPZ1CvBcN2aX5YOUTYGHki24fSF0Iv48Ibg0s=
github.com/smartystreets/goconvey v0.0.0-20181108003508-044398e4856c h1:Ho+uVpkel/udgjbwB5Lktg9BtvJSh2DT0Hi6LPSyI2w=
github.com/smartystreets/goconvey v0.0.0-20181108003508-044398e4856c/go.mod h1:XDJAKZRPZ1CvBcN2aX5YOUTYGHki24fSF0Iv48Ibg0s=
github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM=
github.com/sourcegraph/annotate v0.0.0-20160123013949-f4cad6c6324d/go.mod h1:UdhH50NIW0fCiwBSr0co2m7BnFLdv4fQTgdqdJTHFeE=
github.com/sourcegraph/syntaxhighlight v0.0.0-20170531221838-bd320f5d308e/go.mod h1:HuIsMU8RRBOtsCgI77wP899iHVBQpCmg4ErYMZB+2IA=
Expand Down
4 changes: 2 additions & 2 deletions openstack/types.go
Expand Up @@ -54,7 +54,7 @@ func (lrt *LogRoundTripper) RoundTrip(request *http.Request) (*http.Response, er

if lrt.OsDebug {
log.Printf("[DEBUG] OpenStack Request URL: %s %s", request.Method, request.URL)
log.Printf("[DEBUG] OpenStack Request Headers:\n%s", FormatHeaders(request.Header, "\n"))
log.Printf("[DEBUG] OpenStack Request Headers:\n%s", formatHeaders(request.Header, "\n"))

if request.Body != nil {
request.Body, err = lrt.logRequest(request.Body, request.Header.Get("Content-Type"))
Expand Down Expand Up @@ -86,7 +86,7 @@ func (lrt *LogRoundTripper) RoundTrip(request *http.Request) (*http.Response, er

if lrt.OsDebug {
log.Printf("[DEBUG] OpenStack Response Code: %d", response.StatusCode)
log.Printf("[DEBUG] OpenStack Response Headers:\n%s", FormatHeaders(response.Header, "\n"))
log.Printf("[DEBUG] OpenStack Response Headers:\n%s", formatHeaders(response.Header, "\n"))

response.Body, err = lrt.logResponse(response.Body, response.Header.Get("Content-Type"))
}
Expand Down
51 changes: 30 additions & 21 deletions openstack/util.go
Expand Up @@ -9,7 +9,6 @@ import (
"strings"
"time"

"github.com/Unknwon/com"
"github.com/gophercloud/gophercloud"
"github.com/hashicorp/terraform/helper/resource"
"github.com/hashicorp/terraform/helper/schema"
Expand Down Expand Up @@ -72,32 +71,42 @@ func MapValueSpecs(d *schema.ResourceData) map[string]string {
return m
}

// List of headers that need to be redacted
var REDACT_HEADERS = []string{"x-auth-token", "x-auth-key", "x-service-token",
"x-storage-token", "x-account-meta-temp-url-key", "x-account-meta-temp-url-key-2",
"x-container-meta-temp-url-key", "x-container-meta-temp-url-key-2", "set-cookie",
"x-subject-token"}

// RedactHeaders processes a headers object, returning a redacted list
func RedactHeaders(headers http.Header) (processedHeaders []string) {
for name, header := range headers {
for _, v := range header {
if com.IsSliceContainsStr(REDACT_HEADERS, name) {
processedHeaders = append(processedHeaders, fmt.Sprintf("%v: %v", name, "***"))
} else {
processedHeaders = append(processedHeaders, fmt.Sprintf("%v: %v", name, v))
}
// List of headers that contain sensitive data.
var sensitiveHeaders = map[string]struct{}{
"x-auth-token": {},
"x-auth-key": {},
"x-service-token": {},
"x-storage-token": {},
"x-account-meta-temp-url-key": {},
"x-account-meta-temp-url-key-2": {},
"x-container-meta-temp-url-key": {},
"x-container-meta-temp-url-key-2": {},
"set-cookie": {},
"x-subject-token": {},
}

func hideSensitiveHeadersData(headers http.Header) []string {
result := make([]string, len(headers))
headerIdx := 0
for header, data := range headers {
if _, ok := sensitiveHeaders[strings.ToLower(header)]; ok {
result[headerIdx] = fmt.Sprintf("%s: %s", header, "***")
} else {
result[headerIdx] = fmt.Sprintf("%s: %s", header, strings.Join(data, " "))
}
headerIdx++
}
return

return result
}

// FormatHeaders processes a headers object plus a deliminator, returning a string
func FormatHeaders(headers http.Header, seperator string) string {
redactedHeaders := RedactHeaders(headers)
// formatHeaders converts standard http.Header type to a string with separated headers.
// It will hide data of sensitive headers.
func formatHeaders(headers http.Header, separator string) string {
redactedHeaders := hideSensitiveHeadersData(headers)
sort.Strings(redactedHeaders)

return strings.Join(redactedHeaders, seperator)
return strings.Join(redactedHeaders, separator)
}

func checkForRetryableError(err error) *resource.RetryError {
Expand Down
13 changes: 13 additions & 0 deletions openstack/util_test.go
@@ -1,6 +1,7 @@
package openstack

import (
"net/http"
"testing"

"github.com/stretchr/testify/assert"
Expand Down Expand Up @@ -66,3 +67,15 @@ func TestCompatibleMicroversion(t *testing.T) {
assert.Nil(t, err)
assert.Equal(t, true, actual)
}

func TestFormatHeaders(t *testing.T) {
headers := http.Header{
"X-Auth-Token": []string{"token"},
"User-Agent": []string{"Terraform/x.x.x", "Gophercloud/y.y.y"},
}

expected := "User-Agent: Terraform/x.x.x Gophercloud/y.y.y\nX-Auth-Token: ***"
actual := formatHeaders(headers, "\n")

assert.Equal(t, expected, actual)
}
24 changes: 0 additions & 24 deletions vendor/github.com/Unknwon/com/.gitignore

This file was deleted.

13 changes: 0 additions & 13 deletions vendor/github.com/Unknwon/com/.travis.yml

This file was deleted.

191 changes: 0 additions & 191 deletions vendor/github.com/Unknwon/com/LICENSE

This file was deleted.

0 comments on commit 3ad0a5d

Please sign in to comment.