新增数据库驱动的 SecurityEventConnectionManager,复用 RFC 7662 机器 Client,自动完成 Discovery、Push Bearer 生成、Stream 创建、Verification、首次启用、零停机轮换和安全退役。 增加文件与 Kubernetes SecretStore、最小权限 RBAC、动态 Receiver/撤销水位/内省降级,以及系统设置管理页面。已通过全量 Go 测试、go vet、关键包竞态测试、27 个 Web 测试、类型检查、生产构建、Compose 和 Kubernetes dry-run。
41 lines
1.2 KiB
Go
41 lines
1.2 KiB
Go
package securityevents
|
|
|
|
import (
|
|
"bytes"
|
|
"context"
|
|
"errors"
|
|
"os"
|
|
"path/filepath"
|
|
"testing"
|
|
)
|
|
|
|
func TestFileSecretStoreCreatesProtectedFilesAndNeverAcceptsTraversal(t *testing.T) {
|
|
directory := filepath.Join(t.TempDir(), "ssf")
|
|
secrets, err := NewFileSecretStore(directory)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
value := bytes.Repeat([]byte{0x41}, 32)
|
|
if err := secrets.Put(context.Background(), "ssf-push-connection", value); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
info, err := os.Stat(filepath.Join(directory, "ssf-push-connection"))
|
|
if err != nil || info.Mode().Perm() != 0o600 {
|
|
t.Fatalf("secret mode=%v err=%v", info.Mode().Perm(), err)
|
|
}
|
|
loaded, err := secrets.Get(context.Background(), "ssf-push-connection")
|
|
if err != nil || !bytes.Equal(loaded, value) {
|
|
t.Fatalf("secret mismatch err=%v", err)
|
|
}
|
|
clear(loaded)
|
|
if err := secrets.Put(context.Background(), "../escape", value); err == nil {
|
|
t.Fatal("path traversal reference was accepted")
|
|
}
|
|
if err := secrets.Delete(context.Background(), "ssf-push-connection"); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if _, err := secrets.Get(context.Background(), "ssf-push-connection"); !errors.Is(err, ErrSecretNotFound) {
|
|
t.Fatalf("deleted secret error=%v", err)
|
|
}
|
|
}
|