diff --git a/internal/config/config_helpers.go b/internal/config/config_helpers.go index 581ce65..bed61c1 100644 --- a/internal/config/config_helpers.go +++ b/internal/config/config_helpers.go @@ -9,3 +9,13 @@ func (cfg *Config) FindAction(actionTitle string) *Action { return nil } + +func (action *Action) FindArg(name string) *ActionArgument { + for _, arg := range action.Arguments { + if arg.Name == name { + return &arg + } + } + + return nil +} diff --git a/internal/config/config_helpers_test.go b/internal/config/config_helpers_test.go new file mode 100644 index 0000000..c57c587 --- /dev/null +++ b/internal/config/config_helpers_test.go @@ -0,0 +1,33 @@ +package config + +import ( + "github.com/stretchr/testify/assert" + "testing" +) + +func TestFindAction(t *testing.T) { + c := DefaultConfig() + + a1 := Action{} + a1.Title = "a1" + c.Actions = append(c.Actions, a1) + + a2 := Action{ + Title: "a2", + Arguments: []ActionArgument{ + { + Name: "Blat", + }, + }, + } + + c.Actions = append(c.Actions, a2) + + assert.NotNil(t, c.FindAction("a1"), "Find action a1") + + assert.NotNil(t, c.FindAction("a2"), "Find action a2") + assert.NotNil(t, c.FindAction("a2").FindArg("Blat"), "Find action argument") + assert.Nil(t, c.FindAction("a2").FindArg("Blatey Cake"), "Find non-existant action argument") + + assert.Nil(t, c.FindAction("waffles"), "Find non-existant action") +} diff --git a/internal/config/emoji.go b/internal/config/emoji.go index 4611070..cf6f166 100644 --- a/internal/config/emoji.go +++ b/internal/config/emoji.go @@ -1,6 +1,7 @@ package config var emojis = map[string]string{ + "": "😀", // default icon "poop": "💩", "smile": "😀", "ping": "📡", diff --git a/internal/config/sanitize_test.go b/internal/config/sanitize_test.go new file mode 100644 index 0000000..9ec7123 --- /dev/null +++ b/internal/config/sanitize_test.go @@ -0,0 +1,39 @@ +package config + +import ( + "github.com/stretchr/testify/assert" + "testing" +) + +func TestSanitizeConfig(t *testing.T) { + c := DefaultConfig() + + a := Action{ + Title: "Mr Waffles", + Arguments: []ActionArgument{ + ActionArgument{ + Name: "Carrots", + Choices: []ActionArgumentChoice{ + { + Value: "Waffle", + }, + }, + }, + { + Name: "foobar", + }, + }, + } + + c.Actions = append(c.Actions, a) + + Sanitize(c) + + a2 := c.FindAction("Mr Waffles") + + assert.NotNil(t, a2, "Found action after adding it") + assert.Equal(t, 3, a2.Timeout, "Default timeout is set") + assert.Equal(t, "😀", a2.Icon, "Default icon is a smiley") + assert.Equal(t, "Carrots", a2.Arguments[0].Title, "Arg title is set to name") + assert.Equal(t, "Waffle", a2.Arguments[0].Choices[0].Title, "Choice title is set to name") +} diff --git a/internal/executor/executor.go b/internal/executor/executor.go index 25954ee..68ff257 100644 --- a/internal/executor/executor.go +++ b/internal/executor/executor.go @@ -85,7 +85,6 @@ func (s StepFindAction) Exec(req *ExecutionRequest) bool { }).Warnf("Action not found") req.logEntry.Stderr = "Action not found" - req.logEntry.ExitCode = -1337 return false } @@ -107,6 +106,9 @@ func (e *Executor) ExecRequest(req *ExecutionRequest) *pb.StartActionResponse { req.logEntry = &InternalLogEntry{ Datetime: time.Now().Format("2006-01-02 15:04:05"), ActionTitle: req.ActionName, + Stdout: "", + Stderr: "", + ExitCode: -1337, // If an Action is not actually executed, this is the default exit code. } for _, step := range e.chainOfCommand { @@ -163,8 +165,6 @@ func (e StepParseArgs) Exec(req *ExecutionRequest) bool { req.finalParsedCommand, err = parseActionArguments(req.action.Shell, req.Arguments, req.action) if err != nil { - req.logEntry.ExitCode = -1337 - req.logEntry.Stderr = "" req.logEntry.Stdout = err.Error() log.Warnf(err.Error()) @@ -236,7 +236,7 @@ func parseActionArguments(rawShellCommand string, values map[string]string, acti } func typecheckActionArgument(name string, value string, action *config.Action) error { - arg := findArg(name, action) + arg := action.FindArg(name) if arg == nil { return errors.New("Action arg not defined: " + name) @@ -262,8 +262,6 @@ func typecheckChoice(value string, arg *config.ActionArgument) error { func TypeSafetyCheck(name string, value string, typ string) error { pattern, found := typecheckRegex[typ] - log.Infof("%v %v", pattern, typ) - if !found { return errors.New("Arg type not implemented " + typ) } @@ -282,13 +280,3 @@ func TypeSafetyCheck(name string, value string, typ string) error { return nil } - -func findArg(name string, action *config.Action) *config.ActionArgument { - for _, arg := range action.Arguments { - if arg.Name == name { - return &arg - } - } - - return nil -} diff --git a/internal/executor/executor_test.go b/internal/executor/executor_test.go new file mode 100644 index 0000000..cfb90ea --- /dev/null +++ b/internal/executor/executor_test.go @@ -0,0 +1,70 @@ +package executor + +import ( + "github.com/stretchr/testify/assert" + "testing" + + acl "github.com/jamesread/OliveTin/internal/acl" + config "github.com/jamesread/OliveTin/internal/config" +) + +func TestSanitizeUnsafe(t *testing.T) { + assert.Nil(t, TypeSafetyCheck("", "_zomg_ c:/ haxxor ' bobby tables && rm -rf ", "very_dangerous_raw_string")) +} + +func testingExecutor() (*Executor, *config.Config) { + e := DefaultExecutor() + + cfg := config.DefaultConfig() + + a1 := config.Action{ + Title: "Do some tickles", + Shell: "echo 'Tickling {{ person }}'", + Arguments: []config.ActionArgument{ + config.ActionArgument{ + Name: "person", + Type: "ascii", + }, + }, + } + + cfg.Actions = append(cfg.Actions, a1) + config.Sanitize(cfg) + + return e, cfg +} + +func TestCreateExecutorAndExec(t *testing.T) { + e, cfg := testingExecutor() + + req := ExecutionRequest{ + ActionName: "Do some tickles", + User: &acl.User{Username: "Mr Tickle"}, + Cfg: cfg, + Arguments: map[string]string{ + "person": "yourself", + }, + } + + e.ExecRequest(&req) + + assert.NotNil(t, e, "Create an executor") + + assert.NotNil(t, e.ExecRequest(&req), "Execute a request") + assert.Equal(t, int32(0), req.logEntry.ExitCode, "Exit code is zero") +} + +func TestExecNonExistant(t *testing.T) { + e, cfg := testingExecutor() + + req := ExecutionRequest{ + ActionName: "Waffles", + logEntry: &InternalLogEntry{}, + Cfg: cfg, + } + + e.ExecRequest(&req) + + assert.Equal(t, int32(-1337), req.logEntry.ExitCode, "Log entry is set to an internal error code") + assert.Equal(t, "", req.logEntry.ActionIcon, "Log entry icon wasnt found") +} diff --git a/internal/httpservers/webuiServer_test.go b/internal/httpservers/webuiServer_test.go index bc2acd9..94ea73c 100644 --- a/internal/httpservers/webuiServer_test.go +++ b/internal/httpservers/webuiServer_test.go @@ -2,8 +2,8 @@ package httpservers import ( "github.com/stretchr/testify/assert" - "testing" "os" + "testing" ) func TestGetWebuiDir(t *testing.T) {