42 lines
1.2 KiB
Go
42 lines
1.2 KiB
Go
package plugins
|
|
|
|
import (
|
|
"path/filepath"
|
|
"strings"
|
|
"testing"
|
|
)
|
|
|
|
func TestBuildFileACL(t *testing.T) {
|
|
acl := buildFileACL(PluginNeeds{Files: []PluginFileNeed{
|
|
{Bucket: "downloads", Access: []string{"read", "list"}},
|
|
}})
|
|
if !acl["downloads"]["read"] || !acl["downloads"]["list"] {
|
|
t.Fatalf("expected read/list permissions: %#v", acl)
|
|
}
|
|
if acl["downloads"]["write"] {
|
|
t.Fatalf("did not expect write permission")
|
|
}
|
|
}
|
|
|
|
func TestWriteWASMOutputStatusCodes(t *testing.T) {
|
|
status := statusTooSmall
|
|
if wasmStatus(statusTooSmall) != uint64(uint32(status)) {
|
|
t.Fatalf("negative status should be encoded as wasm i32")
|
|
}
|
|
}
|
|
|
|
func TestResolvePluginBucketPathRejectsTraversal(t *testing.T) {
|
|
target, status := resolvePluginBucketPath("demo", "pluginData", ".."+string(filepath.Separator)+"escape.txt")
|
|
if status != statusOK {
|
|
t.Fatalf("expected cleaned pluginData path, got status %d", status)
|
|
}
|
|
if strings.Contains(target, "..") {
|
|
t.Fatalf("expected traversal to be cleaned, got %q", target)
|
|
}
|
|
|
|
_, status = resolvePluginBucketPath("demo", "downloads", string(filepath.Separator)+"absolute.txt")
|
|
if status != statusDenied {
|
|
t.Fatalf("expected absolute path to be denied for scoped bucket, got %d", status)
|
|
}
|
|
}
|