plugin: always canonicalize plugin names

Reported by Joe Doyle of Trail of Bits.
This commit is contained in:
Filippo Valsorda
2026-08-29 19:30:10 +02:00
parent 572b47c3e7
commit bebcffc2f3
3 changed files with 27 additions and 3 deletions
+1 -1
View File
@@ -193,7 +193,7 @@ func NewIdentityWithoutData(name string, ui *ClientUI) (*Identity, error) {
return nil, fmt.Errorf("invalid plugin name: %q", name)
}
return &Identity{
name: name, encoding: s, ui: ui,
name: strings.ToLower(name), encoding: s, ui: ui,
}, nil
}
+20
View File
@@ -84,6 +84,26 @@ func TestIdentityV1NegativeIndex(t *testing.T) {
}
}
func TestPluginNameCase(t *testing.T) {
p, err := New("MixedCase")
if err != nil {
t.Fatal(err)
}
if p.Name() != "mixedcase" {
t.Errorf("Plugin.Name = %q", p.Name())
}
id, err := NewIdentityWithoutData("MixedCase", &ClientUI{})
if err != nil {
t.Fatal(err)
}
if id.Name() != "mixedcase" {
t.Errorf("Identity.Name = %q", id.Name())
}
if _, err := New("\u212a"); err == nil {
t.Error("New accepted a non-ASCII name")
}
}
func TestLabels(t *testing.T) {
if runtime.GOOS == "windows" {
t.Skip("Windows support is TODO")
+6 -2
View File
@@ -16,6 +16,7 @@ import (
"os"
"slices"
"strconv"
"strings"
"filippo.io/age"
"filippo.io/age/internal/format"
@@ -44,11 +45,14 @@ type Plugin struct {
broken bool
}
// New creates a new Plugin with the given name.
// New creates a new Plugin with the given case-insensitive name.
//
// For example, a plugin named "frood" would be invoked as "age-plugin-frood".
func New(name string) (*Plugin, error) {
return &Plugin{name: name, stdin: os.Stdin,
if !validPluginName(name) {
return nil, fmt.Errorf("invalid plugin name: %q", name)
}
return &Plugin{name: strings.ToLower(name), stdin: os.Stdin,
stdout: os.Stdout, stderr: os.Stderr}, nil
}