From 79fe9003784d0bf69eaa910366c77ad94ad978fa Mon Sep 17 00:00:00 2001 From: Megan Marsh Date: Fri, 2 Feb 2018 09:57:36 -0800 Subject: [PATCH] Revert "Merge pull request #5376 from DanHam/ps-escapes" Revert so that we can merge a different branch that's had more recent work instead This reverts commit ba518637d49380955f4bd2f0e6009888037fa82e, reversing changes made to e56849c6056220b8dd555f841f7e0a5028b25af0. --- fix/fixer.go | 2 - fix/fixer_powershell_escapes.go | 73 ---------------------- provisioner/powershell/provisioner.go | 34 ++-------- provisioner/powershell/provisioner_test.go | 19 ------ 4 files changed, 4 insertions(+), 124 deletions(-) delete mode 100644 fix/fixer_powershell_escapes.go diff --git a/fix/fixer.go b/fix/fixer.go index d5622b299..5ca0b3a18 100644 --- a/fix/fixer.go +++ b/fix/fixer.go @@ -34,7 +34,6 @@ func init() { "amazon-shutdown_behavior": new(FixerAmazonShutdownBehavior), "amazon-enhanced-networking": new(FixerAmazonEnhancedNetworking), "docker-email": new(FixerDockerEmail), - "powershell-escapes": new(FixerPowerShellEscapes), } FixerOrder = []string{ @@ -52,6 +51,5 @@ func init() { "amazon-shutdown_behavior", "amazon-enhanced-networking", "docker-email", - "powershell-escapes", } } diff --git a/fix/fixer_powershell_escapes.go b/fix/fixer_powershell_escapes.go deleted file mode 100644 index 9da9ae91f..000000000 --- a/fix/fixer_powershell_escapes.go +++ /dev/null @@ -1,73 +0,0 @@ -package fix - -import ( - "github.com/mitchellh/mapstructure" - "strings" -) - -// FixerPowerShellEscapes removes the PowerShell escape character from user -// environment variables and elevated username and password strings -type FixerPowerShellEscapes struct{} - -func (FixerPowerShellEscapes) Fix(input map[string]interface{}) (map[string]interface{}, error) { - type template struct { - Provisioners []interface{} - } - - var psUnescape = strings.NewReplacer( - "`$", "$", - "`\"", "\"", - "``", "`", - "`'", "'", - ) - - // Decode the input into our structure, if we can - var tpl template - if err := mapstructure.WeakDecode(input, &tpl); err != nil { - return nil, err - } - - for i, raw := range tpl.Provisioners { - var provisioners map[string]interface{} - if err := mapstructure.Decode(raw, &provisioners); err != nil { - // Ignore errors, could be a non-map - continue - } - - if ok := provisioners["type"] == "powershell"; !ok { - continue - } - - if _, ok := provisioners["elevated_user"]; ok { - provisioners["elevated_user"] = psUnescape.Replace(provisioners["elevated_user"].(string)) - } - if _, ok := provisioners["elevated_password"]; ok { - provisioners["elevated_password"] = psUnescape.Replace(provisioners["elevated_password"].(string)) - } - if raw, ok := provisioners["environment_vars"]; ok { - var env_vars []string - if err := mapstructure.Decode(raw, &env_vars); err != nil { - continue - } - env_vars_unescaped := make([]interface{}, len(env_vars)) - for j, env_var := range env_vars { - env_vars_unescaped[j] = psUnescape.Replace(env_var) - } - // Replace with unescaped environment variables - provisioners["environment_vars"] = env_vars_unescaped - } - - // Write all changes back to template - tpl.Provisioners[i] = provisioners - } - - if len(tpl.Provisioners) > 0 { - input["provisioners"] = tpl.Provisioners - } - - return input, nil -} - -func (FixerPowerShellEscapes) Synopsis() string { - return `Removes PowerShell escapes from user env vars and elevated username and password strings` -} diff --git a/provisioner/powershell/provisioner.go b/provisioner/powershell/provisioner.go index 41b38ed6d..3d2f16f85 100644 --- a/provisioner/powershell/provisioner.go +++ b/provisioner/powershell/provisioner.go @@ -24,13 +24,6 @@ import ( var retryableSleep = 2 * time.Second -var psEscape = strings.NewReplacer( - "$", "`$", - "\"", "`\"", - "`", "``", - "'", "`'", -) - type Config struct { common.PackerConfig `mapstructure:",squash"` @@ -366,13 +359,7 @@ func (p *Provisioner) createFlattenedEnvVars(elevated bool) (flattened string) { // Split vars into key/value components for _, envVar := range p.config.Vars { keyValue := strings.SplitN(envVar, "=", 2) - // Escape chars special to PS in each env var value - escapedEnvVarValue := psEscape.Replace(keyValue[1]) - if escapedEnvVarValue != keyValue[1] { - log.Printf("Env var %s converted to %s after escaping chars special to PS", keyValue[1], - escapedEnvVarValue) - } - envVars[keyValue[0]] = escapedEnvVarValue + envVars[keyValue[0]] = keyValue[1] } // Create a list of env var keys in sorted order @@ -493,26 +480,13 @@ func (p *Provisioner) generateElevatedRunner(command string) (uploadedPath strin } escapedCommand := buffer.String() log.Printf("Command [%s] converted to [%s] for use in XML string", command, escapedCommand) - buffer.Reset() - // Escape chars special to PowerShell in the ElevatedUser string - escapedElevatedUser := psEscape.Replace(p.config.ElevatedUser) - if escapedElevatedUser != p.config.ElevatedUser { - log.Printf("Elevated user %s converted to %s after escaping chars special to PowerShell", - p.config.ElevatedUser, escapedElevatedUser) - } - - // Escape chars special to PowerShell in the ElevatedPassword string - escapedElevatedPassword := psEscape.Replace(p.config.ElevatedPassword) - if escapedElevatedPassword != p.config.ElevatedPassword { - log.Printf("Elevated password %s converted to %s after escaping chars special to PowerShell", - p.config.ElevatedPassword, escapedElevatedPassword) - } + buffer.Reset() // Generate command err = elevatedTemplate.Execute(&buffer, elevatedOptions{ - User: escapedElevatedUser, - Password: escapedElevatedPassword, + User: p.config.ElevatedUser, + Password: p.config.ElevatedPassword, TaskName: taskName, TaskDescription: "Packer elevated task", LogFile: logFile, diff --git a/provisioner/powershell/provisioner_test.go b/provisioner/powershell/provisioner_test.go index 2791601fa..749564d4d 100644 --- a/provisioner/powershell/provisioner_test.go +++ b/provisioner/powershell/provisioner_test.go @@ -518,12 +518,6 @@ func TestProvisioner_createFlattenedElevatedEnvVars_windows(t *testing.T) { {"FOO=bar", "BAZ=qux"}, // Multiple user env vars {"FOO=bar=baz"}, // User env var with value containing equals {"FOO==bar"}, // User env var with value starting with equals - // Test escaping of characters special to PowerShell - {"FOO=bar$baz"}, // User env var with value containing dollar - {"FOO=bar\"baz"}, // User env var with value containing a double quote - {"FOO=bar'baz"}, // User env var with value containing a single quote - {"FOO=bar`baz"}, // User env var with value containing a backtick - } expected := []string{ `$env:PACKER_BUILDER_TYPE="iso"; $env:PACKER_BUILD_NAME="vmware"; `, @@ -531,10 +525,6 @@ func TestProvisioner_createFlattenedElevatedEnvVars_windows(t *testing.T) { `$env:BAZ="qux"; $env:FOO="bar"; $env:PACKER_BUILDER_TYPE="iso"; $env:PACKER_BUILD_NAME="vmware"; `, `$env:FOO="bar=baz"; $env:PACKER_BUILDER_TYPE="iso"; $env:PACKER_BUILD_NAME="vmware"; `, `$env:FOO="=bar"; $env:PACKER_BUILDER_TYPE="iso"; $env:PACKER_BUILD_NAME="vmware"; `, - "$env:FOO=\"bar`$baz\"; $env:PACKER_BUILDER_TYPE=\"iso\"; $env:PACKER_BUILD_NAME=\"vmware\"; ", - "$env:FOO=\"bar`\"baz\"; $env:PACKER_BUILDER_TYPE=\"iso\"; $env:PACKER_BUILD_NAME=\"vmware\"; ", - "$env:FOO=\"bar`'baz\"; $env:PACKER_BUILDER_TYPE=\"iso\"; $env:PACKER_BUILD_NAME=\"vmware\"; ", - "$env:FOO=\"bar``baz\"; $env:PACKER_BUILDER_TYPE=\"iso\"; $env:PACKER_BUILD_NAME=\"vmware\"; ", } p := new(Provisioner) @@ -563,11 +553,6 @@ func TestProvisioner_createFlattenedEnvVars_windows(t *testing.T) { {"FOO=bar", "BAZ=qux"}, // Multiple user env vars {"FOO=bar=baz"}, // User env var with value containing equals {"FOO==bar"}, // User env var with value starting with equals - // Test escaping of characters special to PowerShell - {"FOO=bar$baz"}, // User env var with value containing dollar - {"FOO=bar\"baz"}, // User env var with value containing a double quote - {"FOO=bar'baz"}, // User env var with value containing a single quote - {"FOO=bar`baz"}, // User env var with value containing a backtick } expected := []string{ `$env:PACKER_BUILDER_TYPE="iso"; $env:PACKER_BUILD_NAME="vmware"; `, @@ -575,10 +560,6 @@ func TestProvisioner_createFlattenedEnvVars_windows(t *testing.T) { `$env:BAZ="qux"; $env:FOO="bar"; $env:PACKER_BUILDER_TYPE="iso"; $env:PACKER_BUILD_NAME="vmware"; `, `$env:FOO="bar=baz"; $env:PACKER_BUILDER_TYPE="iso"; $env:PACKER_BUILD_NAME="vmware"; `, `$env:FOO="=bar"; $env:PACKER_BUILDER_TYPE="iso"; $env:PACKER_BUILD_NAME="vmware"; `, - "$env:FOO=\"bar`$baz\"; $env:PACKER_BUILDER_TYPE=\"iso\"; $env:PACKER_BUILD_NAME=\"vmware\"; ", - "$env:FOO=\"bar`\"baz\"; $env:PACKER_BUILDER_TYPE=\"iso\"; $env:PACKER_BUILD_NAME=\"vmware\"; ", - "$env:FOO=\"bar`'baz\"; $env:PACKER_BUILDER_TYPE=\"iso\"; $env:PACKER_BUILD_NAME=\"vmware\"; ", - "$env:FOO=\"bar``baz\"; $env:PACKER_BUILDER_TYPE=\"iso\"; $env:PACKER_BUILD_NAME=\"vmware\"; ", } p := new(Provisioner)