github.com/NaverCloudPlatform/ncloud-sdk-go-v2@v1.6.13/ncloud/credentials/config_file_provider.go (about) 1 package credentials 2 3 import ( 4 "bufio" 5 "errors" 6 "os" 7 "os/user" 8 "path/filepath" 9 "runtime" 10 "strings" 11 ) 12 13 // file example: $HOME/.ncloud/configure 14 type ConfigFileProvider struct { 15 // Path to the ncloud configure file. 16 // The default is the current user's home directory. 17 // Linux/OSX: "$HOME/.ncloud/configure" 18 // Windows: "%USERPROFILE%\.ncloud\configure" 19 Filename string 20 21 // retrieved states if the credentials have been successfully retrieved. 22 retrieved bool 23 } 24 25 func (p *ConfigFileProvider) Name() string { 26 return "ConfigFileProvider" 27 } 28 29 func (p *ConfigFileProvider) Retrieve() (Value, error) { 30 p.retrieved = false 31 credentials, err := p.loadCredentials() 32 if err != nil { 33 return Value{}, err 34 } 35 p.retrieved = true 36 return credentials, nil 37 } 38 39 func (p *ConfigFileProvider) loadCredentials() (Value, error) { 40 usr, err := user.Current() 41 if err != nil { 42 return Value{}, err 43 } 44 45 if usr.HomeDir == "" { 46 return Value{}, errors.New("user home directory not found") 47 } 48 configureFile, err := p.filename() 49 if err != nil { 50 return Value{}, err 51 } 52 53 file, err := os.Open(configureFile) 54 if err != nil { 55 return Value{}, err 56 } 57 defer file.Close() 58 59 scanner := bufio.NewScanner(file) 60 credValue := Value{} 61 for scanner.Scan() { 62 line := scanner.Text() 63 s := strings.Split(line, "=") 64 switch strings.TrimSpace(s[0]) { 65 case "ncloud_access_key_id": 66 credValue.AccessKey = strings.TrimSpace(s[1]) 67 case "ncloud_secret_access_key": 68 credValue.SecretKey = strings.TrimSpace(s[1]) 69 } 70 } 71 if err := scanner.Err(); err != nil { 72 return Value{}, err 73 } 74 75 return credValue, nil 76 } 77 78 func (p *ConfigFileProvider) filename() (string, error) { 79 if len(p.Filename) != 0 { 80 return p.Filename, nil 81 } 82 83 if home := UserHomeDir(); len(home) == 0 { 84 return "", errors.New("user home directory not found") 85 } 86 p.Filename = filepath.Join(UserHomeDir(), ".ncloud", "configure") 87 return p.Filename, nil 88 } 89 90 func UserHomeDir() string { 91 if runtime.GOOS == "windows" { // Windows 92 return os.Getenv("USERPROFILE") 93 } 94 95 // *nix 96 return os.Getenv("HOME") 97 }