1
|
|
|
package providers |
2
|
|
|
|
3
|
|
|
import ( |
4
|
|
|
"os" |
5
|
|
|
"path" |
6
|
|
|
"testing" |
7
|
|
|
|
8
|
|
|
httputil "github.com/aliyun/credentials-go/credentials/internal/http" |
9
|
|
|
"github.com/aliyun/credentials-go/credentials/internal/utils" |
10
|
|
|
"github.com/stretchr/testify/assert" |
11
|
|
|
"gopkg.in/ini.v1" |
12
|
|
|
) |
13
|
|
|
|
14
|
|
|
var inistr = ` |
15
|
|
|
[default] |
16
|
|
|
enable = true |
17
|
|
|
type = access_key |
18
|
|
|
access_key_id = foo |
19
|
|
|
access_key_secret = bar |
20
|
|
|
|
21
|
|
|
[notype] |
22
|
|
|
access_key_id = foo |
23
|
|
|
access_key_secret = bar |
24
|
|
|
|
25
|
|
|
[noak] |
26
|
|
|
type = access_key |
27
|
|
|
access_key_secret = bar |
28
|
|
|
|
29
|
|
|
[emptyak] |
30
|
|
|
type = access_key |
31
|
|
|
access_key_id = |
32
|
|
|
access_key_secret = bar |
33
|
|
|
|
34
|
|
|
[ecs] |
35
|
|
|
type = ecs_ram_role |
36
|
|
|
role_name = EcsRamRoleTest |
37
|
|
|
|
38
|
|
|
[noecs] |
39
|
|
|
type = ecs_ram_role |
40
|
|
|
|
41
|
|
|
[emptyecs] |
42
|
|
|
type = ecs_ram_role |
43
|
|
|
role_name = |
44
|
|
|
|
45
|
|
|
[ram] |
46
|
|
|
type = ram_role_arn |
47
|
|
|
access_key_id = foo |
48
|
|
|
access_key_secret = bar |
49
|
|
|
role_arn = role_arn |
50
|
|
|
role_session_name = session_name |
51
|
|
|
policy = {"Statement": [{"Action": ["*"],"Effect": "Allow","Resource": ["*"]}],"Version":"1"} |
52
|
|
|
|
53
|
|
|
[noram] |
54
|
|
|
type = ram_role_arn |
55
|
|
|
access_key_secret = bar |
56
|
|
|
role_arn = role_arn |
57
|
|
|
role_session_name = session_name |
58
|
|
|
|
59
|
|
|
[emptyram] |
60
|
|
|
type = ram_role_arn |
61
|
|
|
access_key_id = |
62
|
|
|
access_key_secret = bar |
63
|
|
|
role_arn = role_arn |
64
|
|
|
role_session_name = session_name |
65
|
|
|
|
66
|
|
|
[rsa] |
67
|
|
|
type = rsa_key_pair |
68
|
|
|
public_key_id = publicKeyId |
69
|
|
|
private_key_file = ./pk.pem |
70
|
|
|
|
71
|
|
|
[norsa] |
72
|
|
|
type = rsa_key_pair |
73
|
|
|
public_key_id = publicKeyId |
74
|
|
|
|
75
|
|
|
[emptyrsa] |
76
|
|
|
type = rsa_key_pair |
77
|
|
|
public_key_id = publicKeyId |
78
|
|
|
private_key_file = |
79
|
|
|
|
80
|
|
|
[error_rsa] |
81
|
|
|
type = rsa_key_pair |
82
|
|
|
public_key_id = publicKeyId |
83
|
|
|
private_key_file = ./pk_error.pem |
84
|
|
|
|
85
|
|
|
[error_type] |
86
|
|
|
type = error_type |
87
|
|
|
public_key_id = publicKeyId |
88
|
|
|
private_key_file = ./pk_error.pem |
89
|
|
|
` |
90
|
|
|
|
91
|
|
|
func TestProfileCredentialsProviderBuilder(t *testing.T) { |
92
|
|
|
rollback := utils.Memory("ALIBABA_CLOUD_PROFILE") |
93
|
|
|
defer rollback() |
94
|
|
|
|
95
|
|
|
// profile name from specified |
96
|
|
|
provider, err := NewProfileCredentialsProviderBuilder().WithProfileName("custom").Build() |
97
|
|
|
assert.Nil(t, err) |
98
|
|
|
assert.Equal(t, "custom", provider.profileName) |
99
|
|
|
|
100
|
|
|
// profile name from env |
101
|
|
|
os.Setenv("ALIBABA_CLOUD_PROFILE", "profile_from_env") |
102
|
|
|
provider, err = NewProfileCredentialsProviderBuilder().Build() |
103
|
|
|
assert.Nil(t, err) |
104
|
|
|
|
105
|
|
|
assert.Equal(t, "profile_from_env", provider.profileName) |
106
|
|
|
|
107
|
|
|
// profile name from default |
108
|
|
|
os.Setenv("ALIBABA_CLOUD_PROFILE", "") |
109
|
|
|
provider, err = NewProfileCredentialsProviderBuilder().Build() |
110
|
|
|
assert.Nil(t, err) |
111
|
|
|
assert.Equal(t, "default", provider.profileName) |
112
|
|
|
} |
113
|
|
|
|
114
|
|
|
func TestProfileCredentialsProvider_getCredentialsProvider(t *testing.T) { |
115
|
|
|
provider, err := NewProfileCredentialsProviderBuilder().WithProfileName("custom").Build() |
116
|
|
|
assert.Nil(t, err) |
117
|
|
|
_, err = provider.getCredentialsProvider(ini.Empty()) |
118
|
|
|
assert.NotNil(t, err) |
119
|
|
|
assert.EqualError(t, err, "ERROR: Can not load sectionsection \"custom\" does not exist") |
120
|
|
|
|
121
|
|
|
file, err := ini.Load([]byte(inistr)) |
122
|
|
|
assert.Nil(t, err) |
123
|
|
|
assert.NotNil(t, file) |
124
|
|
|
|
125
|
|
|
// no type |
126
|
|
|
provider, err = NewProfileCredentialsProviderBuilder().WithProfileName("notype").Build() |
127
|
|
|
assert.Nil(t, err) |
128
|
|
|
_, err = provider.getCredentialsProvider(file) |
129
|
|
|
assert.NotNil(t, err) |
130
|
|
|
assert.EqualError(t, err, "ERROR: Can not find credential typeerror when getting key of section \"notype\": key \"type\" not exists") |
131
|
|
|
|
132
|
|
|
// no ak |
133
|
|
|
provider, err = NewProfileCredentialsProviderBuilder().WithProfileName("noak").Build() |
134
|
|
|
assert.Nil(t, err) |
135
|
|
|
_, err = provider.getCredentialsProvider(file) |
136
|
|
|
assert.NotNil(t, err) |
137
|
|
|
assert.EqualError(t, err, "ERROR: Failed to get value") |
138
|
|
|
|
139
|
|
|
// value is empty |
140
|
|
|
provider, err = NewProfileCredentialsProviderBuilder().WithProfileName("emptyak").Build() |
141
|
|
|
assert.Nil(t, err) |
142
|
|
|
_, err = provider.getCredentialsProvider(file) |
143
|
|
|
assert.NotNil(t, err) |
144
|
|
|
assert.EqualError(t, err, "ERROR: Value can't be empty") |
145
|
|
|
|
146
|
|
|
// static ak provider |
147
|
|
|
provider, err = NewProfileCredentialsProviderBuilder().Build() |
148
|
|
|
assert.Nil(t, err) |
149
|
|
|
cp, err := provider.getCredentialsProvider(file) |
150
|
|
|
assert.Nil(t, err) |
151
|
|
|
akcp, ok := cp.(*StaticAKCredentialsProvider) |
152
|
|
|
assert.True(t, ok) |
153
|
|
|
cc, err := akcp.GetCredentials() |
154
|
|
|
assert.Nil(t, err) |
155
|
|
|
assert.Equal(t, &Credentials{AccessKeyId: "foo", AccessKeySecret: "bar", SecurityToken: "", ProviderName: "static_ak"}, cc) |
156
|
|
|
|
157
|
|
|
// ecs_ram_role without rolename |
158
|
|
|
provider, err = NewProfileCredentialsProviderBuilder().WithProfileName("noecs").Build() |
159
|
|
|
assert.Nil(t, err) |
160
|
|
|
_, err = provider.getCredentialsProvider(file) |
161
|
|
|
assert.EqualError(t, err, "ERROR: Failed to get value") |
162
|
|
|
|
163
|
|
|
// ecs_ram_role with rolename |
164
|
|
|
provider, err = NewProfileCredentialsProviderBuilder().WithProfileName("ecs").Build() |
165
|
|
|
assert.Nil(t, err) |
166
|
|
|
cp, err = provider.getCredentialsProvider(file) |
167
|
|
|
assert.Nil(t, err) |
168
|
|
|
_, ok = cp.(*ECSRAMRoleCredentialsProvider) |
169
|
|
|
assert.True(t, ok) |
170
|
|
|
|
171
|
|
|
// ram role arn without keys |
172
|
|
|
provider, err = NewProfileCredentialsProviderBuilder().WithProfileName("noram").Build() |
173
|
|
|
assert.Nil(t, err) |
174
|
|
|
_, err = provider.getCredentialsProvider(file) |
175
|
|
|
assert.EqualError(t, err, "ERROR: Failed to get value") |
176
|
|
|
|
177
|
|
|
// ram role arn without values |
178
|
|
|
provider, err = NewProfileCredentialsProviderBuilder().WithProfileName("emptyram").Build() |
179
|
|
|
assert.Nil(t, err) |
180
|
|
|
_, err = provider.getCredentialsProvider(file) |
181
|
|
|
assert.EqualError(t, err, "ERROR: Value can't be empty") |
182
|
|
|
|
183
|
|
|
// normal ram role arn |
184
|
|
|
provider, err = NewProfileCredentialsProviderBuilder().WithProfileName("ram").Build() |
185
|
|
|
assert.Nil(t, err) |
186
|
|
|
cp, err = provider.getCredentialsProvider(file) |
187
|
|
|
assert.Nil(t, err) |
188
|
|
|
_, ok = cp.(*RAMRoleARNCredentialsProvider) |
189
|
|
|
assert.True(t, ok) |
190
|
|
|
|
191
|
|
|
// unsupported type |
192
|
|
|
provider, err = NewProfileCredentialsProviderBuilder().WithProfileName("error_type").Build() |
193
|
|
|
assert.Nil(t, err) |
194
|
|
|
_, err = provider.getCredentialsProvider(file) |
195
|
|
|
assert.EqualError(t, err, "ERROR: Failed to get credential") |
196
|
|
|
} |
197
|
|
|
|
198
|
|
|
func TestProfileCredentialsProviderGetCredentials(t *testing.T) { |
199
|
|
|
originHttpDo := httpDo |
200
|
|
|
defer func() { httpDo = originHttpDo }() |
201
|
|
|
rollback := utils.Memory("ALIBABA_CLOUD_CREDENTIALS_FILE") |
202
|
|
|
defer func() { |
203
|
|
|
getHomePath = utils.GetHomePath |
204
|
|
|
rollback() |
205
|
|
|
}() |
206
|
|
|
|
207
|
|
|
// testcase: empty home |
208
|
|
|
getHomePath = func() string { |
209
|
|
|
return "" |
210
|
|
|
} |
211
|
|
|
provider, err := NewProfileCredentialsProviderBuilder().WithProfileName("custom").Build() |
212
|
|
|
assert.Nil(t, err) |
213
|
|
|
_, err = provider.GetCredentials() |
214
|
|
|
assert.EqualError(t, err, "cannot found home dir") |
215
|
|
|
|
216
|
|
|
// testcase: invalid home |
217
|
|
|
getHomePath = func() string { |
218
|
|
|
return "/path/invalid/home/dir" |
219
|
|
|
} |
220
|
|
|
|
221
|
|
|
provider, err = NewProfileCredentialsProviderBuilder().WithProfileName("custom").Build() |
222
|
|
|
assert.Nil(t, err) |
223
|
|
|
_, err = provider.GetCredentials() |
224
|
|
|
assert.EqualError(t, err, "ERROR: Can not open fileopen /path/invalid/home/dir/.alibabacloud/credentials: no such file or directory") |
225
|
|
|
|
226
|
|
|
// testcase: specify credentials file with env |
227
|
|
|
os.Setenv("ALIBABA_CLOUD_CREDENTIALS_FILE", "/path/to/credentials.invalid") |
228
|
|
|
provider, err = NewProfileCredentialsProviderBuilder().WithProfileName("custom").Build() |
229
|
|
|
assert.Nil(t, err) |
230
|
|
|
_, err = provider.GetCredentials() |
231
|
|
|
assert.EqualError(t, err, "ERROR: Can not open fileopen /path/to/credentials.invalid: no such file or directory") |
232
|
|
|
os.Unsetenv("ALIBABA_CLOUD_CREDENTIALS_FILE") |
233
|
|
|
|
234
|
|
|
// get from credentials file |
235
|
|
|
getHomePath = func() string { |
236
|
|
|
wd, _ := os.Getwd() |
237
|
|
|
return path.Join(wd, "fixtures") |
238
|
|
|
} |
239
|
|
|
|
240
|
|
|
provider, err = NewProfileCredentialsProviderBuilder().WithProfileName("custom").Build() |
241
|
|
|
assert.Nil(t, err) |
242
|
|
|
_, err = provider.GetCredentials() |
243
|
|
|
assert.EqualError(t, err, "ERROR: Can not load sectionsection \"custom\" does not exist") |
244
|
|
|
|
245
|
|
|
provider, err = NewProfileCredentialsProviderBuilder().Build() |
246
|
|
|
assert.Nil(t, err) |
247
|
|
|
cc, err := provider.GetCredentials() |
248
|
|
|
assert.Nil(t, err) |
249
|
|
|
assert.Equal(t, &Credentials{AccessKeyId: "foo", AccessKeySecret: "bar", SecurityToken: "", ProviderName: "profile/static_ak"}, cc) |
250
|
|
|
|
251
|
|
|
// get credentials again |
252
|
|
|
cc, err = provider.GetCredentials() |
253
|
|
|
assert.Nil(t, err) |
254
|
|
|
assert.Equal(t, &Credentials{AccessKeyId: "foo", AccessKeySecret: "bar", SecurityToken: "", ProviderName: "profile/static_ak"}, cc) |
255
|
|
|
|
256
|
|
|
httpDo = func(req *httputil.Request) (res *httputil.Response, err error) { |
257
|
|
|
res = &httputil.Response{ |
258
|
|
|
StatusCode: 200, |
259
|
|
|
Body: []byte(`{"Credentials": {"AccessKeyId":"akid","AccessKeySecret":"aksecret","Expiration":"2021-10-20T04:27:09Z","SecurityToken":"ststoken"}}`), |
260
|
|
|
} |
261
|
|
|
return |
262
|
|
|
} |
263
|
|
|
provider, err = NewProfileCredentialsProviderBuilder().WithProfileName("ram").Build() |
264
|
|
|
assert.Nil(t, err) |
265
|
|
|
cc, err = provider.GetCredentials() |
266
|
|
|
assert.Nil(t, err) |
267
|
|
|
assert.Equal(t, "akid", cc.AccessKeyId) |
268
|
|
|
assert.Equal(t, "aksecret", cc.AccessKeySecret) |
269
|
|
|
assert.Equal(t, "ststoken", cc.SecurityToken) |
270
|
|
|
assert.Equal(t, "profile/ram_role_arn/static_ak", cc.ProviderName) |
271
|
|
|
|
272
|
|
|
provider.innerProvider = new(testProvider) |
273
|
|
|
cc, err = provider.GetCredentials() |
274
|
|
|
assert.Nil(t, err) |
275
|
|
|
assert.Equal(t, "test", cc.AccessKeyId) |
276
|
|
|
assert.Equal(t, "test", cc.AccessKeySecret) |
277
|
|
|
assert.Equal(t, "profile/test", cc.ProviderName) |
278
|
|
|
|
279
|
|
|
provider.innerProvider = new(testErrorProvider) |
280
|
|
|
_, err = provider.GetCredentials() |
281
|
|
|
assert.Equal(t, "error", err.Error()) |
282
|
|
|
} |
283
|
|
|
|