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  }