aboutsummaryrefslogtreecommitdiff
path: root/weed/credential/config_loader.go
blob: 959f1cfb4430ba6590521323cacb010fde57cab0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
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
}