]> git.immae.eu Git - github/fretlink/terraform-provider-statuscake.git/blob - vendor/github.com/aws/aws-sdk-go/aws/credentials/shared_credentials_provider.go
Transfer of provider code
[github/fretlink/terraform-provider-statuscake.git] / vendor / github.com / aws / aws-sdk-go / aws / credentials / shared_credentials_provider.go
1 package credentials
2
3 import (
4 "fmt"
5 "os"
6
7 "github.com/go-ini/ini"
8
9 "github.com/aws/aws-sdk-go/aws/awserr"
10 "github.com/aws/aws-sdk-go/internal/shareddefaults"
11 )
12
13 // SharedCredsProviderName provides a name of SharedCreds provider
14 const SharedCredsProviderName = "SharedCredentialsProvider"
15
16 var (
17 // ErrSharedCredentialsHomeNotFound is emitted when the user directory cannot be found.
18 ErrSharedCredentialsHomeNotFound = awserr.New("UserHomeNotFound", "user home directory not found.", nil)
19 )
20
21 // A SharedCredentialsProvider retrieves credentials from the current user's home
22 // directory, and keeps track if those credentials are expired.
23 //
24 // Profile ini file example: $HOME/.aws/credentials
25 type SharedCredentialsProvider struct {
26 // Path to the shared credentials file.
27 //
28 // If empty will look for "AWS_SHARED_CREDENTIALS_FILE" env variable. If the
29 // env value is empty will default to current user's home directory.
30 // Linux/OSX: "$HOME/.aws/credentials"
31 // Windows: "%USERPROFILE%\.aws\credentials"
32 Filename string
33
34 // AWS Profile to extract credentials from the shared credentials file. If empty
35 // will default to environment variable "AWS_PROFILE" or "default" if
36 // environment variable is also not set.
37 Profile string
38
39 // retrieved states if the credentials have been successfully retrieved.
40 retrieved bool
41 }
42
43 // NewSharedCredentials returns a pointer to a new Credentials object
44 // wrapping the Profile file provider.
45 func NewSharedCredentials(filename, profile string) *Credentials {
46 return NewCredentials(&SharedCredentialsProvider{
47 Filename: filename,
48 Profile: profile,
49 })
50 }
51
52 // Retrieve reads and extracts the shared credentials from the current
53 // users home directory.
54 func (p *SharedCredentialsProvider) Retrieve() (Value, error) {
55 p.retrieved = false
56
57 filename, err := p.filename()
58 if err != nil {
59 return Value{ProviderName: SharedCredsProviderName}, err
60 }
61
62 creds, err := loadProfile(filename, p.profile())
63 if err != nil {
64 return Value{ProviderName: SharedCredsProviderName}, err
65 }
66
67 p.retrieved = true
68 return creds, nil
69 }
70
71 // IsExpired returns if the shared credentials have expired.
72 func (p *SharedCredentialsProvider) IsExpired() bool {
73 return !p.retrieved
74 }
75
76 // loadProfiles loads from the file pointed to by shared credentials filename for profile.
77 // The credentials retrieved from the profile will be returned or error. Error will be
78 // returned if it fails to read from the file, or the data is invalid.
79 func loadProfile(filename, profile string) (Value, error) {
80 config, err := ini.Load(filename)
81 if err != nil {
82 return Value{ProviderName: SharedCredsProviderName}, awserr.New("SharedCredsLoad", "failed to load shared credentials file", err)
83 }
84 iniProfile, err := config.GetSection(profile)
85 if err != nil {
86 return Value{ProviderName: SharedCredsProviderName}, awserr.New("SharedCredsLoad", "failed to get profile", err)
87 }
88
89 id, err := iniProfile.GetKey("aws_access_key_id")
90 if err != nil {
91 return Value{ProviderName: SharedCredsProviderName}, awserr.New("SharedCredsAccessKey",
92 fmt.Sprintf("shared credentials %s in %s did not contain aws_access_key_id", profile, filename),
93 err)
94 }
95
96 secret, err := iniProfile.GetKey("aws_secret_access_key")
97 if err != nil {
98 return Value{ProviderName: SharedCredsProviderName}, awserr.New("SharedCredsSecret",
99 fmt.Sprintf("shared credentials %s in %s did not contain aws_secret_access_key", profile, filename),
100 nil)
101 }
102
103 // Default to empty string if not found
104 token := iniProfile.Key("aws_session_token")
105
106 return Value{
107 AccessKeyID: id.String(),
108 SecretAccessKey: secret.String(),
109 SessionToken: token.String(),
110 ProviderName: SharedCredsProviderName,
111 }, nil
112 }
113
114 // filename returns the filename to use to read AWS shared credentials.
115 //
116 // Will return an error if the user's home directory path cannot be found.
117 func (p *SharedCredentialsProvider) filename() (string, error) {
118 if len(p.Filename) != 0 {
119 return p.Filename, nil
120 }
121
122 if p.Filename = os.Getenv("AWS_SHARED_CREDENTIALS_FILE"); len(p.Filename) != 0 {
123 return p.Filename, nil
124 }
125
126 if home := shareddefaults.UserHomeDir(); len(home) == 0 {
127 // Backwards compatibility of home directly not found error being returned.
128 // This error is too verbose, failure when opening the file would of been
129 // a better error to return.
130 return "", ErrSharedCredentialsHomeNotFound
131 }
132
133 p.Filename = shareddefaults.SharedCredentialsFilename()
134
135 return p.Filename, nil
136 }
137
138 // profile returns the AWS shared credentials profile. If empty will read
139 // environment variable "AWS_PROFILE". If that is not set profile will
140 // return "default".
141 func (p *SharedCredentialsProvider) profile() string {
142 if p.Profile == "" {
143 p.Profile = os.Getenv("AWS_PROFILE")
144 }
145 if p.Profile == "" {
146 p.Profile = "default"
147 }
148
149 return p.Profile
150 }