Refactor secrets management
This commit is contained in:
+19
-25
@@ -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{})
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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)
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user