Smail/backend/hooks/registry.go
smail f60d3b0880
Some checks are pending
Security Checks / security (push) Waiting to run
整理前后端与测试构建目录并完善配置和安全引导
统一 frontend、backend、test、test-log 和 out 目录,更新构建、部署及测试入口;纳入配置管理兼容与首次安全引导修复;排除本机配置、密钥和测试产物。
2026-09-05 19:19:52 +08:00

86 lines
1.7 KiB
Go

package hooks
import (
"sort"
"sync"
"git.pcux.cn/xuans/Smail/hooks/framework"
)
var hookListMu sync.RWMutex
func validHookName(name string) bool {
if len(name) == 0 || len(name) > 64 {
return false
}
for _, char := range name {
if (char >= 'a' && char <= 'z') || (char >= 'A' && char <= 'Z') || (char >= '0' && char <= '9') || char == '_' || char == '-' {
continue
}
return false
}
return true
}
func ResetHooks() {
hookListMu.Lock()
HookList = make(map[string]framework.EmailHook)
hookListMu.Unlock()
}
func RegisterHook(name string, hook framework.EmailHook) bool {
if !validHookName(name) || hook == nil {
return false
}
hookListMu.Lock()
defer hookListMu.Unlock()
if HookList == nil {
HookList = make(map[string]framework.EmailHook)
}
if _, exists := HookList[name]; exists {
return false
}
HookList[name] = hook
return true
}
func GetHook(name string) (framework.EmailHook, bool) {
hookListMu.RLock()
hook, ok := HookList[name]
hookListMu.RUnlock()
return hook, ok
}
func HookNames() []string {
hookListMu.RLock()
names := make([]string, 0, len(HookList))
for name := range HookList {
names = append(names, name)
}
hookListMu.RUnlock()
sort.Strings(names)
return names
}
func Snapshot() []framework.EmailHook {
hookListMu.RLock()
hooks := make([]framework.EmailHook, 0, len(HookList))
for _, hook := range HookList {
if hook != nil {
hooks = append(hooks, hook)
}
}
hookListMu.RUnlock()
return hooks
}
func RemoveHooksByPlugin(pluginName string) {
hookListMu.Lock()
for hookName, hook := range HookList {
if sender, ok := hook.(*HookSender); ok && sender.name == pluginName {
delete(HookList, hookName)
}
}
hookListMu.Unlock()
}