From b31cdf15a20c29f6301f02a3ba4ef97b9d99e48c Mon Sep 17 00:00:00 2001 From: James Read Date: Sun, 13 Oct 2024 19:40:16 +0100 Subject: [PATCH] feature: Email argument type (#433) * feature: Email argument type * bugfix: Fix error if additional links is null --- internal/executor/arguments.go | 16 ++++++ webui.dev/js/ArgumentForm.js | 95 ++++++++++++++++++---------------- webui.dev/main.js | 2 +- 3 files changed, 68 insertions(+), 45 deletions(-) diff --git a/internal/executor/arguments.go b/internal/executor/arguments.go index 5f4640d..f525c0e 100644 --- a/internal/executor/arguments.go +++ b/internal/executor/arguments.go @@ -6,6 +6,7 @@ import ( log "github.com/sirupsen/logrus" "errors" + "net/mail" "net/url" "regexp" "strings" @@ -137,10 +138,13 @@ func typecheckChoiceEntity(value string, arg *config.ActionArgument) error { // TypeSafetyCheck checks argument values match a specific type. The types are // defined in typecheckRegex, and, you guessed it, uses regex to check for allowed // characters. +//gocyclo:ignore func TypeSafetyCheck(name string, value string, argumentType string) error { switch argumentType { case "password": return nil + case "email": + return typeSafetyCheckEmail(name, value) case "url": return typeSafetyCheckUrl(name, value) case "datetime": @@ -150,6 +154,18 @@ func TypeSafetyCheck(name string, value string, argumentType string) error { return typeSafetyCheckRegex(name, value, argumentType) } +func typeSafetyCheckEmail(name string, value string) error { + _, err := mail.ParseAddress(value) + + log.Errorf("Email check: %v, %v", err, value) + + if err != nil { + return err + } + + return nil +} + func typeSafetyCheckDatetime(name string, value string) error { _, err := time.Parse("2006-01-02T15:04:05", value) diff --git a/webui.dev/js/ArgumentForm.js b/webui.dev/js/ArgumentForm.js index 0601408..d226028 100644 --- a/webui.dev/js/ArgumentForm.js +++ b/webui.dev/js/ArgumentForm.js @@ -120,54 +120,61 @@ class ArgumentForm extends window.HTMLElement { for (const choice of arg.choices) { domEl.appendChild(this.createSelectOption(choice)) } - } else if (arg.type === 'confirmation') { - this.domBtnStart.disabled = true - - domEl = document.createElement('input') - domEl.setAttribute('type', 'checkbox') - domEl.onchange = () => { - this.domBtnStart.disabled = false - domEl.disabled = true - } - } else if (arg.type === 'datetime') { - domEl = document.createElement('input') - domEl.setAttribute('type', 'datetime-local') - domEl.setAttribute('step', '1') - } else if (arg.type === 'password') { - domEl = document.createElement('input') - domEl.setAttribute('type', 'password') } else { - domEl = document.createElement('input') + switch (arg.type) { + case 'confirmation': + this.domBtnStart.disabled = true - if (arg.type.startsWith('regex:')) { - domEl.setAttribute('pattern', arg.type.replace('regex:', '')) - } - - domEl.onchange = () => { - const validateArgumentTypeArgs = { - value: domEl.value, - type: arg.type - } - - window.fetch(window.restBaseUrl + 'ValidateArgumentType', { - method: 'POST', - headers: { - 'Content-Type': 'application/json' - }, - body: JSON.stringify(validateArgumentTypeArgs) - }).then((res) => { - if (res.ok) { - return res.json() - } else { - throw new Error(res.statusText) + domEl = document.createElement('input') + domEl.setAttribute('type', 'checkbox') + domEl.onchange = () => { + this.domBtnStart.disabled = false + domEl.disabled = true } - }).then((json) => { - if (json.valid) { - domEl.setCustomValidity('') - } else { - domEl.setCustomValidity(json.description) + break + case 'datetime': + domEl = document.createElement('input') + domEl.setAttribute('type', 'datetime-local') + domEl.setAttribute('step', '1') + break + case 'password': + case 'email': + domEl = document.createElement('input') + domEl.setAttribute('type', arg.type) + break + default: + domEl = document.createElement('input') + + if (arg.type.startsWith('regex:')) { + domEl.setAttribute('pattern', arg.type.replace('regex:', '')) + } + + domEl.onchange = () => { + const validateArgumentTypeArgs = { + value: domEl.value, + type: arg.type + } + + window.fetch(window.restBaseUrl + 'ValidateArgumentType', { + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify(validateArgumentTypeArgs) + }).then((res) => { + if (res.ok) { + return res.json() + } else { + throw new Error(res.statusText) + } + }).then((json) => { + if (json.valid) { + domEl.setCustomValidity('') + } else { + domEl.setCustomValidity(json.description) + } + }) } - }) } } diff --git a/webui.dev/main.js b/webui.dev/main.js index 13697f6..f05bb36 100644 --- a/webui.dev/main.js +++ b/webui.dev/main.js @@ -134,7 +134,7 @@ function processWebuiSettingsJson (settings) { } function processAdditionaLinks (links) { - if (links === undefined) { + if (links === null) { return }