You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

133 lines
4.2 KiB

package credential
import (
"fmt"
"github.com/seaweedfs/seaweedfs/weed/glog"
"github.com/seaweedfs/seaweedfs/weed/util"
)
// CredentialConfig represents the credential configuration from credential.toml
type CredentialConfig struct {
Store string
Config util.Configuration
Prefix string
}
// LoadCredentialConfiguration loads credential configuration from credential.toml
// Returns the store type, configuration, and prefix for credential management
func LoadCredentialConfiguration() (*CredentialConfig, error) {
// Try to load credential.toml configuration
loaded := util.LoadConfiguration("credential", false)
if !loaded {
glog.V(1).Info("No credential.toml found, credential store disabled")
return nil, nil
}
viper := util.GetViper()
// Find which credential store is enabled
var enabledStore string
var storePrefix string
// Get available store types from registered stores
storeTypes := GetAvailableStores()
for _, storeType := range storeTypes {
key := fmt.Sprintf("credential.%s.enabled", string(storeType))
if viper.GetBool(key) {
if enabledStore != "" {
return nil, fmt.Errorf("multiple credential stores enabled: %s and %s. Only one store can be enabled", enabledStore, string(storeType))
}
enabledStore = string(storeType)
storePrefix = fmt.Sprintf("credential.%s.", string(storeType))
}
}
if enabledStore == "" {
glog.V(1).Info("No credential store enabled in credential.toml")
return nil, nil
}
glog.V(0).Infof("Loaded credential configuration: store=%s", enabledStore)
return &CredentialConfig{
Store: enabledStore,
Config: viper,
Prefix: storePrefix,
}, nil
}
// GetCredentialStoreConfig extracts credential store configuration from command line flags
// This is used when credential store is configured via command line instead of credential.toml
func GetCredentialStoreConfig(store string, config util.Configuration, prefix string) *CredentialConfig {
if store == "" {
return nil
}
return &CredentialConfig{
Store: store,
Config: config,
Prefix: prefix,
}
}
// MergeCredentialConfig merges command line credential config with credential.toml config
// Command line flags take priority over credential.toml
func MergeCredentialConfig(cmdLineStore string, cmdLineConfig util.Configuration, cmdLinePrefix string) (*CredentialConfig, error) {
// If command line credential store is specified, use it
if cmdLineStore != "" {
glog.V(0).Infof("Using command line credential configuration: store=%s", cmdLineStore)
return GetCredentialStoreConfig(cmdLineStore, cmdLineConfig, cmdLinePrefix), nil
}
// Otherwise, try to load from credential.toml
config, err := LoadCredentialConfiguration()
if err != nil {
return nil, err
}
if config == nil {
glog.V(1).Info("No credential store configured")
}
return config, nil
}
// NewCredentialManagerWithDefaults creates a credential manager with fallback to defaults
// If explicitStore is provided, it will be used regardless of credential.toml
// If explicitStore is empty, it tries credential.toml first, then defaults to "filer_etc"
func NewCredentialManagerWithDefaults(explicitStore CredentialStoreTypeName) (*CredentialManager, error) {
var storeName CredentialStoreTypeName
var config util.Configuration
var prefix string
// If explicit store is provided, use it
if explicitStore != "" {
storeName = explicitStore
config = nil
prefix = ""
glog.V(0).Infof("Using explicit credential store: %s", storeName)
} else {
// Try to load from credential.toml first
if credConfig, err := LoadCredentialConfiguration(); err == nil && credConfig != nil {
storeName = CredentialStoreTypeName(credConfig.Store)
config = credConfig.Config
prefix = credConfig.Prefix
glog.V(0).Infof("Loaded credential configuration from credential.toml: store=%s", storeName)
} else {
// Default to filer_etc store
storeName = StoreTypeFilerEtc
config = nil
prefix = ""
glog.V(1).Info("No credential.toml found, defaulting to filer_etc store")
}
}
// Create the credential manager
credentialManager, err := NewCredentialManager(storeName, config, prefix)
if err != nil {
return nil, fmt.Errorf("failed to initialize credential manager with store '%s': %v", storeName, err)
}
return credentialManager, nil
}