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
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							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 | |
| }
 |