List and delete accounts with last-admin and Administrators-group guards, and expose editable network settings via the configuration UI.
95 lines
2.7 KiB
Go
95 lines
2.7 KiB
Go
package settings
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"os"
|
|
)
|
|
|
|
// KeyFromEnv reads and decodes CLUSTERCANVAS_CONFIG_KEY (base64, 16/24/32 bytes).
|
|
func KeyFromEnv() ([]byte, error) {
|
|
rawKey := os.Getenv(ConfigKeyEnvVar)
|
|
if rawKey == "" {
|
|
return nil, fmt.Errorf("%s is not set", ConfigKeyEnvVar)
|
|
}
|
|
return decodeKey(rawKey)
|
|
}
|
|
|
|
// LoadSecrets decrypts secrets.enc from dir using key.
|
|
func LoadSecrets(dir string, key []byte) (Secrets, error) {
|
|
var secrets Secrets
|
|
if err := loadEncryptedJSON(dir, SecretsFileName, key, &secrets); err != nil {
|
|
return Secrets{}, err
|
|
}
|
|
return secrets, nil
|
|
}
|
|
|
|
// SaveSecrets encrypts secrets and writes secrets.enc to dir with mode 0600.
|
|
func SaveSecrets(dir string, secrets Secrets, key []byte) error {
|
|
return saveEncryptedJSON(dir, SecretsFileName, key, secrets)
|
|
}
|
|
|
|
// LoadPasswords decrypts passwords.enc from dir using key.
|
|
func LoadPasswords(dir string, key []byte) (PasswordStore, error) {
|
|
var store PasswordStore
|
|
if err := loadEncryptedJSON(dir, PasswordsFileName, key, &store); err != nil {
|
|
return PasswordStore{}, err
|
|
}
|
|
if store.Users == nil {
|
|
store.Users = []UserCredential{}
|
|
}
|
|
return store, nil
|
|
}
|
|
|
|
// LoadPasswordsOrEmpty returns an empty store when passwords.enc is missing.
|
|
func LoadPasswordsOrEmpty(dir string, key []byte) (PasswordStore, error) {
|
|
store, err := LoadPasswords(dir, key)
|
|
if err != nil {
|
|
if errors.Is(err, os.ErrNotExist) {
|
|
return PasswordStore{Users: []UserCredential{}}, nil
|
|
}
|
|
return PasswordStore{}, err
|
|
}
|
|
return store, nil
|
|
}
|
|
|
|
// SavePasswords encrypts the password store and writes passwords.enc.
|
|
func SavePasswords(dir string, store PasswordStore, key []byte) error {
|
|
if store.Users == nil {
|
|
store.Users = []UserCredential{}
|
|
}
|
|
return saveEncryptedJSON(dir, PasswordsFileName, key, store)
|
|
}
|
|
|
|
// LoadSessions decrypts sessions.enc from dir using key.
|
|
func LoadSessions(dir string, key []byte) (SessionStore, error) {
|
|
var store SessionStore
|
|
if err := loadEncryptedJSON(dir, SessionsFileName, key, &store); err != nil {
|
|
return SessionStore{}, err
|
|
}
|
|
if store.Sessions == nil {
|
|
store.Sessions = []SessionRecord{}
|
|
}
|
|
return store, nil
|
|
}
|
|
|
|
// LoadSessionsOrEmpty returns an empty store when sessions.enc is missing.
|
|
func LoadSessionsOrEmpty(dir string, key []byte) (SessionStore, error) {
|
|
store, err := LoadSessions(dir, key)
|
|
if err != nil {
|
|
if errors.Is(err, os.ErrNotExist) {
|
|
return SessionStore{Sessions: []SessionRecord{}}, nil
|
|
}
|
|
return SessionStore{}, err
|
|
}
|
|
return store, nil
|
|
}
|
|
|
|
// SaveSessions encrypts the session store and writes sessions.enc.
|
|
func SaveSessions(dir string, store SessionStore, key []byte) error {
|
|
if store.Sessions == nil {
|
|
store.Sessions = []SessionRecord{}
|
|
}
|
|
return saveEncryptedJSON(dir, SessionsFileName, key, store)
|
|
}
|