Skip to content

Commit

Permalink
csi: Fix parsing of '=' in secrets at command line and HTTP (#15670)
Browse files Browse the repository at this point in the history
The command line flag parsing and the HTTP header parsing for CSI secrets
incorrectly split at more than one '=' rune, making it impossible to use secrets
that included that rune.
  • Loading branch information
tgross committed Jan 3, 2023
1 parent 089e680 commit e23b3a3
Show file tree
Hide file tree
Showing 7 changed files with 17 additions and 18 deletions.
3 changes: 3 additions & 0 deletions .changelog/15670.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
```release-note:bug
csi: Fixed a bug where secrets that include '=' were incorrectly rejected
```
5 changes: 2 additions & 3 deletions command/agent/csi_endpoint.go
Original file line number Diff line number Diff line change
Expand Up @@ -409,9 +409,8 @@ func parseCSISecrets(req *http.Request) structs.CSISecrets {
secrets := map[string]string{}
secretkvs := strings.Split(secretsHeader, ",")
for _, secretkv := range secretkvs {
kv := strings.Split(secretkv, "=")
if len(kv) == 2 {
secrets[kv[0]] = kv[1]
if key, value, found := strings.Cut(secretkv, "="); found {
secrets[key] = value
}
}
if len(secrets) == 0 {
Expand Down
2 changes: 2 additions & 0 deletions command/agent/csi_endpoint_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,8 @@ func TestHTTP_CSIParseSecrets(t *testing.T) {
structs.CSISecrets(map[string]string{"one": "overwrite"})},
{"one=value_one,two=value_two",
structs.CSISecrets(map[string]string{"one": "value_one", "two": "value_two"})},
{"one=value_one=two,two=value_two",
structs.CSISecrets(map[string]string{"one": "value_one=two", "two": "value_two"})},
}
for _, tc := range testCases {
req, _ := http.NewRequest("GET", "/v1/plugin/csi/foo", nil)
Expand Down
5 changes: 2 additions & 3 deletions command/volume_delete.go
Original file line number Diff line number Diff line change
Expand Up @@ -104,9 +104,8 @@ func (c *VolumeDeleteCommand) Run(args []string) int {

secrets := api.CSISecrets{}
for _, kv := range secretsArgs {
s := strings.Split(kv, "=")
if len(s) == 2 {
secrets[s[0]] = s[1]
if key, value, found := strings.Cut(kv, "="); found {
secrets[key] = value
} else {
c.Ui.Error("Secret must be in the format: -secret key=value")
return 1
Expand Down
10 changes: 4 additions & 6 deletions command/volume_snapshot_create.go
Original file line number Diff line number Diff line change
Expand Up @@ -117,9 +117,8 @@ func (c *VolumeSnapshotCreateCommand) Run(args []string) int {

secrets := api.CSISecrets{}
for _, kv := range secretsArgs {
s := strings.Split(kv, "=")
if len(s) == 2 {
secrets[s[0]] = s[1]
if key, value, found := strings.Cut(kv, "="); found {
secrets[key] = value
} else {
c.Ui.Error("Secret must be in the format: -secret key=value")
return 1
Expand All @@ -128,9 +127,8 @@ func (c *VolumeSnapshotCreateCommand) Run(args []string) int {

params := map[string]string{}
for _, kv := range parametersArgs {
p := strings.Split(kv, "=")
if len(p) == 2 {
params[p[0]] = p[1]
if key, value, found := strings.Cut(kv, "="); found {
params[key] = value
}
}

Expand Down
5 changes: 2 additions & 3 deletions command/volume_snapshot_delete.go
Original file line number Diff line number Diff line change
Expand Up @@ -94,9 +94,8 @@ func (c *VolumeSnapshotDeleteCommand) Run(args []string) int {

secrets := api.CSISecrets{}
for _, kv := range secretsArgs {
s := strings.Split(kv, "=")
if len(s) == 2 {
secrets[s[0]] = s[1]
if key, value, found := strings.Cut(kv, "="); found {
secrets[key] = value
} else {
c.Ui.Error("Secret must be in the format: -secret key=value")
return 1
Expand Down
5 changes: 2 additions & 3 deletions command/volume_snapshot_list.go
Original file line number Diff line number Diff line change
Expand Up @@ -140,9 +140,8 @@ func (c *VolumeSnapshotListCommand) Run(args []string) int {

secrets := api.CSISecrets{}
for _, kv := range secretsArgs {
s := strings.Split(kv, "=")
if len(s) == 2 {
secrets[s[0]] = s[1]
if key, value, found := strings.Cut(kv, "="); found {
secrets[key] = value
} else {
c.Ui.Error("Secret must be in the format: -secret key=value")
return 1
Expand Down

0 comments on commit e23b3a3

Please sign in to comment.