easyai-ai-gateway/apps/api/internal/securityevents/secret_store_test.go
chengcheng 9efeb16fd1 feat(ssf): 实现安全事件一键连接与凭据托管
新增数据库驱动的 SecurityEventConnectionManager,复用 RFC 7662 机器 Client,自动完成 Discovery、Push Bearer 生成、Stream 创建、Verification、首次启用、零停机轮换和安全退役。

增加文件与 Kubernetes SecretStore、最小权限 RBAC、动态 Receiver/撤销水位/内省降级,以及系统设置管理页面。已通过全量 Go 测试、go vet、关键包竞态测试、27 个 Web 测试、类型检查、生产构建、Compose 和 Kubernetes dry-run。
2026-07-15 17:25:00 +08:00

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)
}
}