summaryrefslogtreecommitdiff
path: root/go/internal/command/fallback
diff options
context:
space:
mode:
authorPatrick Bajao <ebajao@gitlab.com>2019-08-02 16:10:17 +0800
committerPatrick Bajao <ebajao@gitlab.com>2019-08-02 16:10:17 +0800
commit3b6f9f7583755e041e76142d7caf7716937907fa (patch)
treeed7f7281633d97933e4465a2ac0f86d62c9a216e /go/internal/command/fallback
parent592823d5e25006331b361b36cc61df7802fc1938 (diff)
downloadgitlab-shell-3b6f9f7583755e041e76142d7caf7716937907fa.tar.gz
This struct is responsible for determining the name and root dir of the executable. The `RootDir` property will be used to find the config. The `Name` property will be used to determine what `Command` and `CommandArgs` to be built.
Diffstat (limited to 'go/internal/command/fallback')
-rw-r--r--go/internal/command/fallback/fallback.go36
-rw-r--r--go/internal/command/fallback/fallback_test.go33
2 files changed, 41 insertions, 28 deletions
diff --git a/go/internal/command/fallback/fallback.go b/go/internal/command/fallback/fallback.go
index 81baaf5..781eda1 100644
--- a/go/internal/command/fallback/fallback.go
+++ b/go/internal/command/fallback/fallback.go
@@ -1,33 +1,57 @@
package fallback
import (
+ "errors"
"fmt"
"os"
"path/filepath"
"syscall"
"gitlab.com/gitlab-org/gitlab-shell/go/internal/command/commandargs"
+ "gitlab.com/gitlab-org/gitlab-shell/go/internal/executable"
)
type Command struct {
- RootDir string
- Args commandargs.CommandArgs
+ Executable *executable.Executable
+ RootDir string
+ Args commandargs.CommandArgs
}
var (
// execFunc is overridden in tests
- execFunc = syscall.Exec
+ execFunc = syscall.Exec
+ whitelist = []string{
+ executable.GitlabShell,
+ executable.AuthorizedKeysCheck,
+ executable.AuthorizedPrincipalsCheck,
+ }
)
func (c *Command) Execute() error {
- rubyCmd := filepath.Join(c.RootDir, "bin", c.fallbackProgram())
+ if !c.isWhitelisted() {
+ return errors.New("Failed to execute unknown executable")
+ }
+
+ rubyCmd := c.fallbackProgram()
// Ensure rubyArgs[0] is the full path to gitlab-shell-ruby
- rubyArgs := append([]string{rubyCmd}, c.Args.Arguments()...)
+ rubyArgs := append([]string{rubyCmd}, c.Args.GetArguments()...)
return execFunc(rubyCmd, rubyArgs, os.Environ())
}
+func (c *Command) isWhitelisted() bool {
+ for _, item := range whitelist {
+ if c.Executable.Name == item {
+ return true
+ }
+ }
+
+ return false
+}
+
func (c *Command) fallbackProgram() string {
- return fmt.Sprintf("%s-ruby", c.Args.Executable())
+ fileName := fmt.Sprintf("%s-ruby", c.Executable.Name)
+
+ return filepath.Join(c.RootDir, "bin", fileName)
}
diff --git a/go/internal/command/fallback/fallback_test.go b/go/internal/command/fallback/fallback_test.go
index 669aad1..7485084 100644
--- a/go/internal/command/fallback/fallback_test.go
+++ b/go/internal/command/fallback/fallback_test.go
@@ -8,6 +8,7 @@ import (
"github.com/stretchr/testify/require"
"gitlab.com/gitlab-org/gitlab-shell/go/internal/command/commandargs"
+ "gitlab.com/gitlab-org/gitlab-shell/go/internal/executable"
)
type fakeExec struct {
@@ -20,26 +21,8 @@ type fakeExec struct {
Env []string
}
-type FakeCommandArgs struct {
- executable commandargs.Executable
- arguments []string
-}
-
-func (f *FakeCommandArgs) Parse() error {
- // Do nothing as no need to parse anything
- return nil
-}
-
-func (f *FakeCommandArgs) Executable() commandargs.Executable {
- return f.executable
-}
-
-func (f *FakeCommandArgs) Arguments() []string {
- return f.arguments
-}
-
var (
- fakeArgs = &FakeCommandArgs{executable: commandargs.GitlabShell, arguments: []string{"foo", "bar"}}
+ fakeArgs = &commandargs.GenericArgs{Arguments: []string{"foo", "bar"}}
)
func (f *fakeExec) Exec(filename string, args []string, env []string) error {
@@ -62,7 +45,7 @@ func (f *fakeExec) Cleanup() {
}
func TestExecuteExecsCommandSuccesfully(t *testing.T) {
- cmd := &Command{RootDir: "/tmp", Args: fakeArgs}
+ cmd := &Command{Executable: &executable.Executable{Name: executable.GitlabShell}, RootDir: "/tmp", Args: fakeArgs}
// Override the exec func
fake := &fakeExec{}
@@ -76,8 +59,14 @@ func TestExecuteExecsCommandSuccesfully(t *testing.T) {
require.Equal(t, fake.Env, os.Environ())
}
+func TestExecuteExecsUnknownExecutable(t *testing.T) {
+ cmd := &Command{Executable: &executable.Executable{Name: "unknown"}, RootDir: "/test"}
+
+ require.Error(t, cmd.Execute())
+}
+
func TestExecuteExecsCommandOnError(t *testing.T) {
- cmd := &Command{RootDir: "/test", Args: fakeArgs}
+ cmd := &Command{Executable: &executable.Executable{Name: executable.GitlabShell}, RootDir: "/test", Args: fakeArgs}
// Override the exec func
fake := &fakeExec{Error: errors.New("Test error")}
@@ -89,7 +78,7 @@ func TestExecuteExecsCommandOnError(t *testing.T) {
}
func TestExecuteGivenNonexistentCommand(t *testing.T) {
- cmd := &Command{RootDir: "/tmp/does/not/exist", Args: fakeArgs}
+ cmd := &Command{Executable: &executable.Executable{Name: executable.GitlabShell}, RootDir: "/tmp/does/not/exist", Args: fakeArgs}
require.Error(t, cmd.Execute())
}