Refactor secrets management

This commit is contained in:
seydx
2025-09-30 15:35:32 +02:00
parent 0c5a2bf02b
commit 670370056c
2 changed files with 64 additions and 26 deletions
+19 -25
View File
@@ -3,34 +3,23 @@ package app
import ( import (
"sync" "sync"
"github.com/AlexxIT/go2rtc/pkg/secrets"
"github.com/AlexxIT/go2rtc/pkg/yaml" "github.com/AlexxIT/go2rtc/pkg/yaml"
) )
var ( var (
secrets = make(map[string]*Secret) secretsMap = make(map[string]*Secret)
secretsMu sync.Mutex secretsMu sync.Mutex
) )
type Secrets interface { // SecretsManager implements secrets.SecretsManager interface
Get(key string) any type SecretsManager struct{}
Set(key string, value any)
Marshal(v any) ([]byte, error)
Unmarshal(v any) error
Save() error
}
type Secret struct { func (m *SecretsManager) NewSecret(name string, values interface{}) (secrets.Secret, error) {
Secrets
Name string
Values map[string]string
}
func NewSecret(name string, values interface{}) (*Secret, error) {
secretsMu.Lock() secretsMu.Lock()
defer secretsMu.Unlock() defer secretsMu.Unlock()
if s, exists := secrets[name]; exists { if s, exists := secretsMap[name]; exists {
return s, nil return s, nil
} }
@@ -45,15 +34,21 @@ func NewSecret(name string, values interface{}) (*Secret, error) {
return nil, err return nil, err
} }
secrets[name] = s secretsMap[name] = s
return s, nil return s, nil
} }
func GetSecret(name string) *Secret { func (m *SecretsManager) GetSecret(name string) secrets.Secret {
secretsMu.Lock() secretsMu.Lock()
defer secretsMu.Unlock() defer secretsMu.Unlock()
return secrets[name] return secretsMap[name]
}
// Secret implements secrets.Secret interface
type Secret struct {
Name string
Values map[string]string
} }
func (s *Secret) Get(key string) any { func (s *Secret) Get(key string) any {
@@ -112,7 +107,7 @@ func (s *Secret) Unmarshal(value any) error {
func (s *Secret) Save() error { func (s *Secret) Save() error {
secretsMu.Lock() secretsMu.Lock()
defer secretsMu.Unlock() defer secretsMu.Unlock()
return saveSecret(s.Name, s.Values) return PatchConfig([]string{"secrets", s.Name}, s.Values)
} }
func initSecrets() { func initSecrets() {
@@ -130,13 +125,12 @@ func initSecrets() {
defer secretsMu.Unlock() defer secretsMu.Unlock()
for name, values := range cfg.Secrets { for name, values := range cfg.Secrets {
secrets[name] = &Secret{ secretsMap[name] = &Secret{
Name: name, Name: name,
Values: values, Values: values,
} }
} }
}
func saveSecret(name string, secretValues map[string]string) error { // Register
return PatchConfig([]string{"secrets", name}, secretValues) secrets.SetManager(&SecretsManager{})
} }
+44
View File
@@ -0,0 +1,44 @@
package secrets
import (
"errors"
"sync"
)
type SecretsManager interface {
NewSecret(name string, defaultValues interface{}) (Secret, error)
GetSecret(name string) Secret
}
type Secret interface {
Get(key string) any
Set(key string, value string)
Marshal() (interface{}, error)
Unmarshal(value any) error
Save() error
}
var manager SecretsManager
var once sync.Once
func SetManager(m SecretsManager) {
once.Do(func() {
manager = m
})
}
// NewSecret creates or retrieves a secret
func NewSecret(name string, defaultValues interface{}) (Secret, error) {
if manager == nil {
return nil, errors.New("secrets manager not initialized")
}
return manager.NewSecret(name, defaultValues)
}
// GetSecret retrieves an existing secret
func GetSecret(name string) Secret {
if manager == nil {
return nil
}
return manager.GetSecret(name)
}