From ae8efc2f64e4bdc8c9cb98e261e60f5c08f4488a Mon Sep 17 00:00:00 2001 From: Pierre-Olivier Mercier Date: Thu, 21 May 2026 18:52:32 +0800 Subject: [PATCH] Validate from_address option via net/mail at the host Reject malformed addresses up-front instead of letting them surface as a runtime SMTP failure during Collect. --- checker/provider.go | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/checker/provider.go b/checker/provider.go index 2cf6a50..d66de34 100644 --- a/checker/provider.go +++ b/checker/provider.go @@ -2,6 +2,9 @@ package checker import ( "encoding/json" + "fmt" + "net/mail" + "strings" "time" sdk "git.happydns.org/checker-sdk-go/checker" @@ -21,6 +24,27 @@ func (p *happyDeliverProvider) Definition() *sdk.CheckerDefinition { return Definition() } +// ValidateOptions runs on the host before Collect so bad options are rejected +// up-front rather than surfacing as a runtime SMTP failure. +func (p *happyDeliverProvider) ValidateOptions(opts sdk.CheckerOptions) error { + raw, ok := opts["from_address"] + if !ok { + return nil + } + s, ok := raw.(string) + if !ok { + return fmt.Errorf("from_address must be a string") + } + s = strings.TrimSpace(s) + if s == "" { + return nil + } + if _, err := mail.ParseAddress(s); err != nil { + return fmt.Errorf("invalid from_address: %w", err) + } + return nil +} + func (p *happyDeliverProvider) ExtractMetrics(ctx sdk.ReportContext, collectedAt time.Time) ([]sdk.CheckMetric, error) { var data HappyDeliverData if err := json.Unmarshal(ctx.Data(), &data); err != nil {