mirror of
https://github.com/docker/docker-credential-helpers.git
synced 2026-06-14 00:11:28 +05:30
37c4a6b158
the "golang.org/x/sys/execabs" package was introduced to address a security issue on Windows, and changing the default behavior of os/exec was considered a breaking change. go1.19 applied the behavior that was previously implemented in the execabs package; from the release notes: https://go.dev/doc/go1.19#os-exec-path > Command and LookPath no longer allow results from a PATH search to be found > relative to the current directory. This removes a common source of security > problems but may also break existing programs that depend on using, say, > exec.Command("prog") to run a binary named prog (or, on Windows, prog.exe) > in the current directory. See the os/exec package documentation for information > about how best to update such programs. > > On Windows, Command and LookPath now respect the NoDefaultCurrentDirectoryInExePath > environment variable, making it possible to disable the default implicit search > of “.” in PATH lookups on Windows systems. With those changes, we no longer need to use the execabs package, and we can switch back to os/exec. Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
57 lines
1.5 KiB
Go
57 lines
1.5 KiB
Go
package client
|
|
|
|
import (
|
|
"fmt"
|
|
"io"
|
|
"os"
|
|
"os/exec"
|
|
)
|
|
|
|
// Program is an interface to execute external programs.
|
|
type Program interface {
|
|
Output() ([]byte, error)
|
|
Input(in io.Reader)
|
|
}
|
|
|
|
// ProgramFunc is a type of function that initializes programs based on arguments.
|
|
type ProgramFunc func(args ...string) Program
|
|
|
|
// NewShellProgramFunc creates programs that are executed in a Shell.
|
|
func NewShellProgramFunc(name string) ProgramFunc {
|
|
return NewShellProgramFuncWithEnv(name, nil)
|
|
}
|
|
|
|
// NewShellProgramFuncWithEnv creates programs that are executed in a Shell with environment variables
|
|
func NewShellProgramFuncWithEnv(name string, env *map[string]string) ProgramFunc {
|
|
return func(args ...string) Program {
|
|
return &Shell{cmd: createProgramCmdRedirectErr(name, args, env)}
|
|
}
|
|
}
|
|
|
|
func createProgramCmdRedirectErr(commandName string, args []string, env *map[string]string) *exec.Cmd {
|
|
programCmd := exec.Command(commandName, args...)
|
|
programCmd.Env = os.Environ()
|
|
if env != nil {
|
|
for k, v := range *env {
|
|
programCmd.Env = append(programCmd.Env, fmt.Sprintf("%s=%s", k, v))
|
|
}
|
|
}
|
|
programCmd.Stderr = os.Stderr
|
|
return programCmd
|
|
}
|
|
|
|
// Shell invokes shell commands to talk with a remote credentials helper.
|
|
type Shell struct {
|
|
cmd *exec.Cmd
|
|
}
|
|
|
|
// Output returns responses from the remote credentials helper.
|
|
func (s *Shell) Output() ([]byte, error) {
|
|
return s.cmd.Output()
|
|
}
|
|
|
|
// Input sets the input to send to a remote credentials helper.
|
|
func (s *Shell) Input(in io.Reader) {
|
|
s.cmd.Stdin = in
|
|
}
|