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 ( 7e363a...4705e5 )
by Jackson
11:09 queued 01:09
created

cessKeyId   A

Complexity

Conditions 5

Size

Total Lines 11
Code Lines 8

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 5
eloc 8
nop 0
dl 0
loc 11
rs 9.3333
c 0
b 0
f 0
1
package credentials
2
3
import (
4
	"encoding/json"
5
	"fmt"
6
	"strconv"
7
	"time"
8
9
	"github.com/alibabacloud-go/tea/tea"
10
	"github.com/aliyun/credentials-go/credentials/request"
11
	"github.com/aliyun/credentials-go/credentials/utils"
12
)
13
14
var securityCredURL = "http://100.100.100.200/latest/meta-data/ram/security-credentials/"
15
var securityCredTokenURL = "http://100.100.100.200/latest/api/token"
16
17
const defaultMetadataTokenDuration = int(21600)
18
19
// ECSRAMRoleCredentialsProvider is a kind of credentials provider
20
type ECSRAMRoleCredentialsProvider struct {
21
	*credentialUpdater
22
	RoleName              string
23
	EnableIMDSv2          bool
24
	MetadataTokenDuration int
25
	sessionCredential     *sessionCredential
26
	runtime               *utils.Runtime
27
	metadataToken         string
28
	staleTime             int64
29
}
30
31
type ecsRAMRoleResponse struct {
32
	Code            string `json:"Code" xml:"Code"`
33
	AccessKeyId     string `json:"AccessKeyId" xml:"AccessKeyId"`
34
	AccessKeySecret string `json:"AccessKeySecret" xml:"AccessKeySecret"`
35
	SecurityToken   string `json:"SecurityToken" xml:"SecurityToken"`
36
	Expiration      string `json:"Expiration" xml:"Expiration"`
37
}
38
39
func newEcsRAMRoleCredentialWithEnableIMDSv2(roleName string, enableIMDSv2 bool, metadataTokenDuration int, inAdvanceScale float64, runtime *utils.Runtime) *ECSRAMRoleCredentialsProvider {
40
	credentialUpdater := new(credentialUpdater)
41
	if inAdvanceScale < 1 && inAdvanceScale > 0 {
42
		credentialUpdater.inAdvanceScale = inAdvanceScale
43
	}
44
	return &ECSRAMRoleCredentialsProvider{
45
		RoleName:              roleName,
46
		EnableIMDSv2:          enableIMDSv2,
47
		MetadataTokenDuration: metadataTokenDuration,
48
		credentialUpdater:     credentialUpdater,
49
		runtime:               runtime,
50
	}
51
}
52
53
func (e *ECSRAMRoleCredentialsProvider) GetCredential() (*CredentialModel, error) {
54
	if e.sessionCredential == nil || e.needUpdateCredential() {
55
		err := e.updateCredential()
56
		if err != nil {
57
			return nil, err
58
		}
59
	}
60
	credential := &CredentialModel{
61
		AccessKeyId:     tea.String(e.sessionCredential.AccessKeyId),
62
		AccessKeySecret: tea.String(e.sessionCredential.AccessKeySecret),
63
		SecurityToken:   tea.String(e.sessionCredential.SecurityToken),
64
		Type:            tea.String("ecs_ram_role"),
65
	}
66
	return credential, nil
67
}
68
69
// GetAccessKeyId reutrns  EcsRAMRoleCredential's AccessKeyId
70
// if AccessKeyId is not exist or out of date, the function will update it.
71
func (e *ECSRAMRoleCredentialsProvider) GetAccessKeyId() (*string, error) {
72
	if e.sessionCredential == nil || e.needUpdateCredential() {
73
		err := e.updateCredential()
74
		if err != nil {
75
			if e.credentialExpiration > (int(time.Now().Unix()) - int(e.lastUpdateTimestamp)) {
76
				return &e.sessionCredential.AccessKeyId, nil
77
			}
78
			return tea.String(""), err
79
		}
80
	}
81
	return tea.String(e.sessionCredential.AccessKeyId), nil
82
}
83
84
// GetAccessSecret reutrns  EcsRAMRoleCredential's AccessKeySecret
85
// if AccessKeySecret is not exist or out of date, the function will update it.
86
func (e *ECSRAMRoleCredentialsProvider) GetAccessKeySecret() (*string, error) {
87
	if e.sessionCredential == nil || e.needUpdateCredential() {
88
		err := e.updateCredential()
89
		if err != nil {
90
			if e.credentialExpiration > (int(time.Now().Unix()) - int(e.lastUpdateTimestamp)) {
91
				return &e.sessionCredential.AccessKeySecret, nil
92
			}
93
			return tea.String(""), err
94
		}
95
	}
96
	return tea.String(e.sessionCredential.AccessKeySecret), nil
97
}
98
99
// GetSecurityToken reutrns  EcsRAMRoleCredential's SecurityToken
100
// if SecurityToken is not exist or out of date, the function will update it.
101
func (e *ECSRAMRoleCredentialsProvider) GetSecurityToken() (*string, error) {
102
	if e.sessionCredential == nil || e.needUpdateCredential() {
103
		err := e.updateCredential()
104
		if err != nil {
105
			if e.credentialExpiration > (int(time.Now().Unix()) - int(e.lastUpdateTimestamp)) {
106
				return &e.sessionCredential.SecurityToken, nil
107
			}
108
			return tea.String(""), err
109
		}
110
	}
111
	return tea.String(e.sessionCredential.SecurityToken), nil
112
}
113
114
// GetBearerToken is useless for EcsRAMRoleCredential
115
func (e *ECSRAMRoleCredentialsProvider) GetBearerToken() *string {
116
	return tea.String("")
117
}
118
119
// GetType reutrns  EcsRAMRoleCredential's type
120
func (e *ECSRAMRoleCredentialsProvider) GetType() *string {
121
	return tea.String("ecs_ram_role")
122
}
123
124
func getRoleName() (string, error) {
125
	runtime := utils.NewRuntime(1, 1, "", "")
126
	request := request.NewCommonRequest()
127
	request.URL = securityCredURL
128
	request.Method = "GET"
129
	content, err := doAction(request, runtime)
130
	if err != nil {
131
		return "", err
132
	}
133
	return string(content), nil
134
}
135
136
func (e *ECSRAMRoleCredentialsProvider) getMetadataToken() (err error) {
137
	if e.needToRefresh() {
138
		if e.MetadataTokenDuration <= 0 {
139
			e.MetadataTokenDuration = defaultMetadataTokenDuration
140
		}
141
		tmpTime := time.Now().Unix() + int64(e.MetadataTokenDuration*1000)
142
		request := request.NewCommonRequest()
143
		request.URL = securityCredTokenURL
144
		request.Method = "PUT"
145
		request.Headers["X-aliyun-ecs-metadata-token-ttl-seconds"] = strconv.Itoa(e.MetadataTokenDuration)
146
		content, err := doAction(request, e.runtime)
147
		if err != nil {
148
			return err
149
		}
150
		e.staleTime = tmpTime
151
		e.metadataToken = string(content)
152
	}
153
	return
154
}
155
156
func (e *ECSRAMRoleCredentialsProvider) updateCredential() (err error) {
157
	if e.runtime == nil {
158
		e.runtime = new(utils.Runtime)
159
	}
160
	request := request.NewCommonRequest()
161
	if e.RoleName == "" {
162
		e.RoleName, err = getRoleName()
163
		if err != nil {
164
			return fmt.Errorf("refresh Ecs sts token err: %s", err.Error())
165
		}
166
	}
167
	if e.EnableIMDSv2 {
168
		err = e.getMetadataToken()
169
		if err != nil {
170
			return fmt.Errorf("failed to get token from ECS Metadata Service: %s", err.Error())
171
		}
172
		request.Headers["X-aliyun-ecs-metadata-token"] = e.metadataToken
173
	}
174
	request.URL = securityCredURL + e.RoleName
175
	request.Method = "GET"
176
	content, err := doAction(request, e.runtime)
177
	if err != nil {
178
		return fmt.Errorf("refresh Ecs sts token err: %s", err.Error())
179
	}
180
	var resp *ecsRAMRoleResponse
181
	err = json.Unmarshal(content, &resp)
182
	if err != nil {
183
		return fmt.Errorf("refresh Ecs sts token err: Json Unmarshal fail: %s", err.Error())
184
	}
185
	if resp.Code != "Success" {
186
		return fmt.Errorf("refresh Ecs sts token err: Code is not Success")
187
	}
188
	if resp.AccessKeyId == "" || resp.AccessKeySecret == "" || resp.SecurityToken == "" || resp.Expiration == "" {
189
		return fmt.Errorf("refresh Ecs sts token err: AccessKeyId: %s, AccessKeySecret: %s, SecurityToken: %s, Expiration: %s", resp.AccessKeyId, resp.AccessKeySecret, resp.SecurityToken, resp.Expiration)
190
	}
191
192
	expirationTime, err := time.Parse("2006-01-02T15:04:05Z", resp.Expiration)
193
	e.lastUpdateTimestamp = time.Now().Unix()
194
	e.credentialExpiration = int(expirationTime.Unix() - time.Now().Unix())
195
	e.sessionCredential = &sessionCredential{
196
		AccessKeyId:     resp.AccessKeyId,
197
		AccessKeySecret: resp.AccessKeySecret,
198
		SecurityToken:   resp.SecurityToken,
199
	}
200
201
	return
202
}
203
204
func (e *ECSRAMRoleCredentialsProvider) needToRefresh() (needToRefresh bool) {
205
	needToRefresh = time.Now().Unix() >= e.staleTime
206
	return
207
}
208