GitHub Access Token became invalid

It seems like the GitHub access token used for retrieving details about this repository from GitHub became invalid. This might prevent certain types of inspections from being run (in particular, everything related to pull requests).
Please ask an admin of your repository to re-new the access token on this website.
Passed
Push — master ( 47c2ea...25ec51 )
by
unknown
05:34
created

derBuilder.WithDurationSeconds   A

Complexity

Conditions 1

Size

Total Lines 3
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 3
nop 1
dl 0
loc 3
rs 10
c 0
b 0
f 0
1
package providers
2
3
import (
4
	"encoding/json"
5
	"errors"
6
	"fmt"
7
	"net/http"
8
	"net/url"
9
	"os"
10
	"strconv"
11
	"strings"
12
	"time"
13
14
	httputil "github.com/aliyun/credentials-go/credentials/internal/http"
15
	"github.com/aliyun/credentials-go/credentials/internal/utils"
16
)
17
18
type assumedRoleUser struct {
19
}
20
21
type credentials struct {
22
	SecurityToken   *string `json:"SecurityToken"`
23
	Expiration      *string `json:"Expiration"`
24
	AccessKeySecret *string `json:"AccessKeySecret"`
25
	AccessKeyId     *string `json:"AccessKeyId"`
26
}
27
28
type assumeRoleResponse struct {
29
	RequestID       *string          `json:"RequestId"`
30
	AssumedRoleUser *assumedRoleUser `json:"AssumedRoleUser"`
31
	Credentials     *credentials     `json:"Credentials"`
32
}
33
34
type sessionCredentials struct {
35
	AccessKeyId     string
36
	AccessKeySecret string
37
	SecurityToken   string
38
	Expiration      string
39
}
40
41
type HttpOptions struct {
42
	Proxy          string
43
	ConnectTimeout int
44
	ReadTimeout    int
45
}
46
47
type RAMRoleARNCredentialsProvider struct {
48
	// for previous credentials
49
	accessKeyId         string
50
	accessKeySecret     string
51
	securityToken       string
52
	credentialsProvider CredentialsProvider
53
54
	roleArn         string
55
	roleSessionName string
56
	durationSeconds int
57
	policy          string
58
	externalId      string
59
	// for sts endpoint
60
	stsRegionId string
61
	enableVpc   bool
62
	stsEndpoint string
63
	// for http options
64
	httpOptions *HttpOptions
65
	// inner
66
	expirationTimestamp int64
67
	lastUpdateTimestamp int64
68
	sessionCredentials  *sessionCredentials
69
}
70
71
type RAMRoleARNCredentialsProviderBuilder struct {
72
	provider *RAMRoleARNCredentialsProvider
73
}
74
75
func NewRAMRoleARNCredentialsProviderBuilder() *RAMRoleARNCredentialsProviderBuilder {
76
	return &RAMRoleARNCredentialsProviderBuilder{
77
		provider: &RAMRoleARNCredentialsProvider{},
78
	}
79
}
80
81
func (builder *RAMRoleARNCredentialsProviderBuilder) WithAccessKeyId(accessKeyId string) *RAMRoleARNCredentialsProviderBuilder {
82
	builder.provider.accessKeyId = accessKeyId
83
	return builder
84
}
85
86
func (builder *RAMRoleARNCredentialsProviderBuilder) WithAccessKeySecret(accessKeySecret string) *RAMRoleARNCredentialsProviderBuilder {
87
	builder.provider.accessKeySecret = accessKeySecret
88
	return builder
89
}
90
91
func (builder *RAMRoleARNCredentialsProviderBuilder) WithSecurityToken(securityToken string) *RAMRoleARNCredentialsProviderBuilder {
92
	builder.provider.securityToken = securityToken
93
	return builder
94
}
95
96
func (builder *RAMRoleARNCredentialsProviderBuilder) WithCredentialsProvider(credentialsProvider CredentialsProvider) *RAMRoleARNCredentialsProviderBuilder {
97
	builder.provider.credentialsProvider = credentialsProvider
98
	return builder
99
}
100
101
func (builder *RAMRoleARNCredentialsProviderBuilder) WithRoleArn(roleArn string) *RAMRoleARNCredentialsProviderBuilder {
102
	builder.provider.roleArn = roleArn
103
	return builder
104
}
105
106
func (builder *RAMRoleARNCredentialsProviderBuilder) WithStsRegionId(regionId string) *RAMRoleARNCredentialsProviderBuilder {
107
	builder.provider.stsRegionId = regionId
108
	return builder
109
}
110
111
func (builder *RAMRoleARNCredentialsProviderBuilder) WithEnableVpc(enableVpc bool) *RAMRoleARNCredentialsProviderBuilder {
112
	builder.provider.enableVpc = enableVpc
113
	return builder
114
}
115
116
func (builder *RAMRoleARNCredentialsProviderBuilder) WithStsEndpoint(endpoint string) *RAMRoleARNCredentialsProviderBuilder {
117
	builder.provider.stsEndpoint = endpoint
118
	return builder
119
}
120
121
func (builder *RAMRoleARNCredentialsProviderBuilder) WithRoleSessionName(roleSessionName string) *RAMRoleARNCredentialsProviderBuilder {
122
	builder.provider.roleSessionName = roleSessionName
123
	return builder
124
}
125
126
func (builder *RAMRoleARNCredentialsProviderBuilder) WithPolicy(policy string) *RAMRoleARNCredentialsProviderBuilder {
127
	builder.provider.policy = policy
128
	return builder
129
}
130
131
func (builder *RAMRoleARNCredentialsProviderBuilder) WithExternalId(externalId string) *RAMRoleARNCredentialsProviderBuilder {
132
	builder.provider.externalId = externalId
133
	return builder
134
}
135
136
func (builder *RAMRoleARNCredentialsProviderBuilder) WithDurationSeconds(durationSeconds int) *RAMRoleARNCredentialsProviderBuilder {
137
	builder.provider.durationSeconds = durationSeconds
138
	return builder
139
}
140
141
func (builder *RAMRoleARNCredentialsProviderBuilder) WithHttpOptions(httpOptions *HttpOptions) *RAMRoleARNCredentialsProviderBuilder {
142
	builder.provider.httpOptions = httpOptions
143
	return builder
144
}
145
146
func (builder *RAMRoleARNCredentialsProviderBuilder) Build() (provider *RAMRoleARNCredentialsProvider, err error) {
147
	if builder.provider.credentialsProvider == nil {
148
		if builder.provider.accessKeyId != "" && builder.provider.accessKeySecret != "" && builder.provider.securityToken != "" {
149
			builder.provider.credentialsProvider, err = NewStaticSTSCredentialsProviderBuilder().
150
				WithAccessKeyId(builder.provider.accessKeyId).
151
				WithAccessKeySecret(builder.provider.accessKeySecret).
152
				WithSecurityToken(builder.provider.securityToken).
153
				Build()
154
			if err != nil {
155
				return
156
			}
157
		} else if builder.provider.accessKeyId != "" && builder.provider.accessKeySecret != "" {
158
			builder.provider.credentialsProvider, err = NewStaticAKCredentialsProviderBuilder().
159
				WithAccessKeyId(builder.provider.accessKeyId).
160
				WithAccessKeySecret(builder.provider.accessKeySecret).
161
				Build()
162
			if err != nil {
163
				return
164
			}
165
		} else {
166
			err = errors.New("must specify a previous credentials provider to assume role")
167
		}
168
		return
169
	}
170
171
	if builder.provider.roleArn == "" {
172
		if roleArn := os.Getenv("ALIBABA_CLOUD_ROLE_ARN"); roleArn != "" {
173
			builder.provider.roleArn = roleArn
174
		} else {
175
			err = errors.New("the RoleArn is empty")
176
			return
177
		}
178
	}
179
180
	if builder.provider.roleSessionName == "" {
181
		if roleSessionName := os.Getenv("ALIBABA_CLOUD_ROLE_SESSION_NAME"); roleSessionName != "" {
182
			builder.provider.roleSessionName = roleSessionName
183
		} else {
184
			builder.provider.roleSessionName = "credentials-go-" + strconv.FormatInt(time.Now().UnixNano()/1000, 10)
185
		}
186
	}
187
188
	// duration seconds
189
	if builder.provider.durationSeconds == 0 {
190
		// default to 3600
191
		builder.provider.durationSeconds = 3600
192
	}
193
194
	if builder.provider.durationSeconds < 900 {
195
		err = errors.New("session duration should be in the range of 900s - max session duration")
196
		return
197
	}
198
199
	// sts endpoint
200
	if builder.provider.stsEndpoint == "" {
201
		if !builder.provider.enableVpc {
202
			builder.provider.enableVpc = strings.ToLower(os.Getenv("ALIBABA_CLOUD_VPC_ENDPOINT_ENABLED")) == "true"
203
		}
204
		prefix := "sts"
205
		if builder.provider.enableVpc {
206
			prefix = "sts-vpc"
207
		}
208
		if builder.provider.stsRegionId != "" {
209
			builder.provider.stsEndpoint = fmt.Sprintf("%s.%s.aliyuncs.com", prefix, builder.provider.stsRegionId)
210
		} else if region := os.Getenv("ALIBABA_CLOUD_STS_REGION"); region != "" {
211
			builder.provider.stsEndpoint = fmt.Sprintf("%s.%s.aliyuncs.com", prefix, region)
212
		} else {
213
			builder.provider.stsEndpoint = "sts.aliyuncs.com"
214
		}
215
	}
216
217
	provider = builder.provider
218
	return
219
}
220
221
func (provider *RAMRoleARNCredentialsProvider) getCredentials(cc *Credentials) (session *sessionCredentials, err error) {
222
	method := "POST"
223
	req := &httputil.Request{
224
		Method:   method,
225
		Protocol: "https",
226
		Host:     provider.stsEndpoint,
227
		Headers:  map[string]string{},
228
	}
229
230
	queries := make(map[string]string)
231
	queries["Version"] = "2015-04-01"
232
	queries["Action"] = "AssumeRole"
233
	queries["Format"] = "JSON"
234
	queries["Timestamp"] = utils.GetTimeInFormatISO8601()
235
	queries["SignatureMethod"] = "HMAC-SHA1"
236
	queries["SignatureVersion"] = "1.0"
237
	queries["SignatureNonce"] = utils.GetNonce()
238
	queries["AccessKeyId"] = cc.AccessKeyId
239
240
	if cc.SecurityToken != "" {
241
		queries["SecurityToken"] = cc.SecurityToken
242
	}
243
244
	bodyForm := make(map[string]string)
245
	bodyForm["RoleArn"] = provider.roleArn
246
	if provider.policy != "" {
247
		bodyForm["Policy"] = provider.policy
248
	}
249
	if provider.externalId != "" {
250
		bodyForm["ExternalId"] = provider.externalId
251
	}
252
	bodyForm["RoleSessionName"] = provider.roleSessionName
253
	bodyForm["DurationSeconds"] = strconv.Itoa(provider.durationSeconds)
254
	req.Form = bodyForm
255
256
	// caculate signature
257
	signParams := make(map[string]string)
258
	for key, value := range queries {
259
		signParams[key] = value
260
	}
261
	for key, value := range bodyForm {
262
		signParams[key] = value
263
	}
264
265
	stringToSign := utils.GetURLFormedMap(signParams)
266
	stringToSign = strings.Replace(stringToSign, "+", "%20", -1)
267
	stringToSign = strings.Replace(stringToSign, "*", "%2A", -1)
268
	stringToSign = strings.Replace(stringToSign, "%7E", "~", -1)
269
	stringToSign = url.QueryEscape(stringToSign)
270
	stringToSign = method + "&%2F&" + stringToSign
271
	secret := cc.AccessKeySecret + "&"
272
	queries["Signature"] = utils.ShaHmac1(stringToSign, secret)
273
274
	req.Queries = queries
275
276
	// set headers
277
	req.Headers["Accept-Encoding"] = "identity"
278
	req.Headers["Content-Type"] = "application/x-www-form-urlencoded"
279
	req.Headers["x-acs-credentials-provider"] = cc.ProviderName
280
281
	if provider.httpOptions != nil {
282
		req.ConnectTimeout = time.Duration(provider.httpOptions.ConnectTimeout) * time.Second
283
		req.ReadTimeout = time.Duration(provider.httpOptions.ReadTimeout) * time.Second
284
		req.Proxy = provider.httpOptions.Proxy
285
	}
286
287
	res, err := httpDo(req)
288
	if err != nil {
289
		return
290
	}
291
292
	if res.StatusCode != http.StatusOK {
293
		err = errors.New("refresh session token failed: " + string(res.Body))
294
		return
295
	}
296
	var data assumeRoleResponse
297
	err = json.Unmarshal(res.Body, &data)
298
	if err != nil {
299
		err = fmt.Errorf("refresh RoleArn sts token err, json.Unmarshal fail: %s", err.Error())
300
		return
301
	}
302
	if data.Credentials == nil {
303
		err = fmt.Errorf("refresh RoleArn sts token err, fail to get credentials")
304
		return
305
	}
306
307
	if data.Credentials.AccessKeyId == nil || data.Credentials.AccessKeySecret == nil || data.Credentials.SecurityToken == nil {
308
		err = fmt.Errorf("refresh RoleArn sts token err, fail to get credentials")
309
		return
310
	}
311
312
	session = &sessionCredentials{
313
		AccessKeyId:     *data.Credentials.AccessKeyId,
314
		AccessKeySecret: *data.Credentials.AccessKeySecret,
315
		SecurityToken:   *data.Credentials.SecurityToken,
316
		Expiration:      *data.Credentials.Expiration,
317
	}
318
	return
319
}
320
321
func (provider *RAMRoleARNCredentialsProvider) needUpdateCredential() (result bool) {
322
	if provider.expirationTimestamp == 0 {
323
		return true
324
	}
325
326
	return provider.expirationTimestamp-time.Now().Unix() <= 180
327
}
328
329
func (provider *RAMRoleARNCredentialsProvider) GetCredentials() (cc *Credentials, err error) {
330
	if provider.sessionCredentials == nil || provider.needUpdateCredential() {
331
		// 获取前置凭证
332
		previousCredentials, err1 := provider.credentialsProvider.GetCredentials()
333
		if err1 != nil {
334
			return nil, err1
335
		}
336
		sessionCredentials, err2 := provider.getCredentials(previousCredentials)
337
		if err2 != nil {
338
			return nil, err2
339
		}
340
341
		expirationTime, err := time.Parse("2006-01-02T15:04:05Z", sessionCredentials.Expiration)
342
		if err != nil {
343
			return nil, err
344
		}
345
346
		provider.expirationTimestamp = expirationTime.Unix()
347
		provider.lastUpdateTimestamp = time.Now().Unix()
348
		provider.sessionCredentials = sessionCredentials
349
	}
350
351
	cc = &Credentials{
352
		AccessKeyId:     provider.sessionCredentials.AccessKeyId,
353
		AccessKeySecret: provider.sessionCredentials.AccessKeySecret,
354
		SecurityToken:   provider.sessionCredentials.SecurityToken,
355
		ProviderName:    fmt.Sprintf("%s/%s", provider.GetProviderName(), provider.credentialsProvider.GetProviderName()),
356
	}
357
	return
358
}
359
360
func (provider *RAMRoleARNCredentialsProvider) GetProviderName() string {
361
	return "ram_role_arn"
362
}
363