63 lines
1.8 KiB
Go
63 lines
1.8 KiB
Go
package manifest
|
|
|
|
import (
|
|
"crypto/ed25519"
|
|
"encoding/base64"
|
|
"encoding/json"
|
|
"testing"
|
|
)
|
|
|
|
func validManifest() Manifest {
|
|
var m Manifest
|
|
m.SchemaVersion = 1
|
|
m.PluginID = "qiu.subscription-admin"
|
|
m.Name = "Subscription Admin"
|
|
m.Version = "0.1.0"
|
|
m.CoreAPIBaseline = "sub2api-0.1.183"
|
|
m.Capabilities = []string{"subscription.admin.v1"}
|
|
m.TestedCoreVersions = []string{"0.1.183"}
|
|
m.Backend.HealthPath = "/healthz"
|
|
m.Backend.ReadinessPath = "/readyz"
|
|
m.Backend.ListenEnv = "PLUGIN_PORT"
|
|
m.UI.Entrypoint = "ui/index.html"
|
|
m.UI.Menu.ID = m.PluginID
|
|
m.UI.Menu.Label = "订阅管理"
|
|
m.UI.Menu.Visibility = "admin"
|
|
m.UI.Menu.SortOrder = 200
|
|
m.Publisher.KeyID = "test-key"
|
|
m.CoreAPIAllowlist = RequiredAllowlist()
|
|
return m
|
|
}
|
|
|
|
func TestValidateManifest(t *testing.T) {
|
|
if err := Validate(validManifest()); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
m := validManifest()
|
|
m.CoreAPIAllowlist = append(m.CoreAPIAllowlist, "GET /api/v1/admin/users")
|
|
if err := Validate(m); err == nil {
|
|
t.Fatal("expected exact allowlist validation failure")
|
|
}
|
|
}
|
|
|
|
func TestVerifySignature(t *testing.T) {
|
|
publicKey, privateKey, err := ed25519.GenerateKey(nil)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
manifestBytes := []byte(`{"schema_version":1}`)
|
|
signature := Signature{Algorithm: "ed25519", KeyID: "test-key", Signature: base64.StdEncoding.EncodeToString(ed25519.Sign(privateKey, manifestBytes))}
|
|
signatureBytes, err := json.Marshal(signature)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
publicKeyBytes := []byte(base64.StdEncoding.EncodeToString(publicKey))
|
|
if err := VerifySignature(manifestBytes, signatureBytes, publicKeyBytes); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
manifestBytes[0] = '{'
|
|
if err := VerifySignature([]byte(`{"schema_version":2}`), signatureBytes, publicKeyBytes); err == nil {
|
|
t.Fatal("expected tamper failure")
|
|
}
|
|
}
|