From 4ebb1eef6d83afcfce3be19bfe99c21b045908ca Mon Sep 17 00:00:00 2001 From: Mathias Bergqvist Date: Mon, 4 May 2026 21:26:50 +0200 Subject: [PATCH] feat(allowlist): owner allowlist enforcement --- internal/allowlist/allowlist.go | 25 +++++++++++++++++++++++++ internal/allowlist/allowlist_test.go | 16 ++++++++++++++++ 2 files changed, 41 insertions(+) create mode 100644 internal/allowlist/allowlist.go create mode 100644 internal/allowlist/allowlist_test.go diff --git a/internal/allowlist/allowlist.go b/internal/allowlist/allowlist.go new file mode 100644 index 0000000..6e76435 --- /dev/null +++ b/internal/allowlist/allowlist.go @@ -0,0 +1,25 @@ +package allowlist + +import "fmt" + +type Allowlist struct { + owners map[string]struct{} +} + +func New(owners []string) *Allowlist { + m := make(map[string]struct{}, len(owners)) + for _, o := range owners { + m[o] = struct{}{} + } + return &Allowlist{owners: m} +} + +func (a *Allowlist) Check(owner string) error { + if owner == "" { + return fmt.Errorf("owner required") + } + if _, ok := a.owners[owner]; !ok { + return fmt.Errorf("owner %q not in allowlist", owner) + } + return nil +} diff --git a/internal/allowlist/allowlist_test.go b/internal/allowlist/allowlist_test.go new file mode 100644 index 0000000..1a7a880 --- /dev/null +++ b/internal/allowlist/allowlist_test.go @@ -0,0 +1,16 @@ +package allowlist_test + +import ( + "testing" + + "gitea.d-ma.be/mathias/gitea-mcp/internal/allowlist" + "github.com/stretchr/testify/assert" +) + +func TestAllowlistCheck(t *testing.T) { + a := allowlist.New([]string{"mathias", "acme"}) + assert.NoError(t, a.Check("mathias")) + assert.NoError(t, a.Check("acme")) + assert.Error(t, a.Check("evil")) + assert.Error(t, a.Check("")) +}