feature: #71 URL argument type!

This commit is contained in:
jamesread 2022-10-19 13:26:22 +01:00
parent fb70cf7dfe
commit 08a1ac2591
2 changed files with 29 additions and 5 deletions

View File

@ -10,6 +10,7 @@ import (
"context" "context"
"errors" "errors"
"os/exec" "os/exec"
"net/url"
"regexp" "regexp"
"strings" "strings"
"time" "time"
@ -279,11 +280,19 @@ func typecheckChoice(value string, arg *config.ActionArgument) error {
// TypeSafetyCheck checks argument values match a specific type. The types are // TypeSafetyCheck checks argument values match a specific type. The types are
// defined in typecheckRegex, and, you guessed it, uses regex to check for allowed // defined in typecheckRegex, and, you guessed it, uses regex to check for allowed
// characters. // characters.
func TypeSafetyCheck(name string, value string, typ string) error { func TypeSafetyCheck(name string, value string, argumentType string) error {
pattern, found := typecheckRegex[typ] if argumentType == "url" {
return typeSafetyCheckUrl(name, value)
}
return typeSafetyCheckRegex(name, value, argumentType)
}
func typeSafetyCheckRegex(name string, value string, argumentType string) error {
pattern, found := typecheckRegex[argumentType]
if !found { if !found {
return errors.New("argument type not implemented " + typ) return errors.New("argument type not implemented " + argumentType)
} }
matches, _ := regexp.MatchString(pattern, value) matches, _ := regexp.MatchString(pattern, value)
@ -291,12 +300,18 @@ func TypeSafetyCheck(name string, value string, typ string) error {
if !matches { if !matches {
log.WithFields(log.Fields{ log.WithFields(log.Fields{
"name": name, "name": name,
"type": typ,
"value": value, "value": value,
"type": argumentType,
}).Warn("Arg type check safety failure") }).Warn("Arg type check safety failure")
return errors.New("invalid argument, doesn't match " + typ) return errors.New("invalid argument, doesn't match " + argumentType)
} }
return nil return nil
} }
func typeSafetyCheckUrl(name string, value string) error {
_, err := url.ParseRequestURI(value)
return err
}

View File

@ -161,3 +161,12 @@ func TestArgumentNotProvided(t *testing.T) {
assert.Equal(t, "", out) assert.Equal(t, "", out)
assert.Equal(t, err.Error(), "Required arg not provided: personName") assert.Equal(t, err.Error(), "Required arg not provided: personName")
} }
func TestTypeSafetyCheckUrl(t *testing.T) {
assert.Nil(t, TypeSafetyCheck("test1", "http://google.com", "url"), "Test URL: google.com")
assert.Nil(t, TypeSafetyCheck("test2", "http://technowax.net:80?foo=bar", "url"), "Test URL: technowax.net with query arguments")
assert.Nil(t, TypeSafetyCheck("test3", "http://localhost:80?foo=bar", "url"), "Test URL: localhost with query arguments")
assert.NotNil(t, TypeSafetyCheck("test4", "http://lo host:80", "url"), "Test a badly formed URL")
assert.NotNil(t, TypeSafetyCheck("test5", "12345", "url"), "Test a badly formed URL")
assert.NotNil(t, TypeSafetyCheck("test6", "_!23;", "url"), "Test a badly formed URL")
}