@@ -6,12 +6,14 @@ package storage
6
6
import (
7
7
"context"
8
8
"net/http"
9
+ "net/http/httptest"
9
10
"os"
10
11
"testing"
11
12
12
13
"code.gitea.io/gitea/modules/setting"
13
14
14
15
"github.com/minio/minio-go/v7"
16
+ "github.com/minio/minio-go/v7/pkg/credentials"
15
17
"github.com/stretchr/testify/assert"
16
18
)
17
19
@@ -92,3 +94,110 @@ func TestS3StorageBadRequest(t *testing.T) {
92
94
_ , err := NewStorage (setting .MinioStorageType , cfg )
93
95
assert .ErrorContains (t , err , message )
94
96
}
97
+
98
+ func TestMinioCredentials (t * testing.T ) {
99
+ const (
100
+ ExpectedAccessKey = "ExampleAccessKeyID"
101
+ ExpectedSecretAccessKey = "ExampleSecretAccessKeyID"
102
+ )
103
+
104
+ t .Run ("Static Credentials" , func (t * testing.T ) {
105
+ cfg := setting.MinioStorageConfig {
106
+ AccessKeyID : ExpectedAccessKey ,
107
+ SecretAccessKey : ExpectedSecretAccessKey ,
108
+ }
109
+ creds := buildMinioCredentials (cfg , credentials .DefaultIAMRoleEndpoint )
110
+ v , err := creds .Get ()
111
+
112
+ assert .NoError (t , err )
113
+ assert .Equal (t , ExpectedAccessKey , v .AccessKeyID )
114
+ assert .Equal (t , ExpectedSecretAccessKey , v .SecretAccessKey )
115
+ })
116
+
117
+ t .Run ("Chain" , func (t * testing.T ) {
118
+ cfg := setting.MinioStorageConfig {}
119
+
120
+ t .Run ("EnvMinio" , func (t * testing.T ) {
121
+ t .Setenv ("MINIO_ACCESS_KEY" , ExpectedAccessKey + "Minio" )
122
+ t .Setenv ("MINIO_SECRET_KEY" , ExpectedSecretAccessKey + "Minio" )
123
+
124
+ creds := buildMinioCredentials (cfg , credentials .DefaultIAMRoleEndpoint )
125
+ v , err := creds .Get ()
126
+
127
+ assert .NoError (t , err )
128
+ assert .Equal (t , ExpectedAccessKey + "Minio" , v .AccessKeyID )
129
+ assert .Equal (t , ExpectedSecretAccessKey + "Minio" , v .SecretAccessKey )
130
+ })
131
+
132
+ t .Run ("EnvAWS" , func (t * testing.T ) {
133
+ t .Setenv ("AWS_ACCESS_KEY" , ExpectedAccessKey + "AWS" )
134
+ t .Setenv ("AWS_SECRET_KEY" , ExpectedSecretAccessKey + "AWS" )
135
+
136
+ creds := buildMinioCredentials (cfg , credentials .DefaultIAMRoleEndpoint )
137
+ v , err := creds .Get ()
138
+
139
+ assert .NoError (t , err )
140
+ assert .Equal (t , ExpectedAccessKey + "AWS" , v .AccessKeyID )
141
+ assert .Equal (t , ExpectedSecretAccessKey + "AWS" , v .SecretAccessKey )
142
+ })
143
+
144
+ t .Run ("FileMinio" , func (t * testing.T ) {
145
+ t .Setenv ("MINIO_SHARED_CREDENTIALS_FILE" , "testdata/minio.json" )
146
+ // prevent loading any actual credentials files from the user
147
+ t .Setenv ("AWS_SHARED_CREDENTIALS_FILE" , "testdata/fake" )
148
+
149
+ creds := buildMinioCredentials (cfg , credentials .DefaultIAMRoleEndpoint )
150
+ v , err := creds .Get ()
151
+
152
+ assert .NoError (t , err )
153
+ assert .Equal (t , ExpectedAccessKey + "MinioFile" , v .AccessKeyID )
154
+ assert .Equal (t , ExpectedSecretAccessKey + "MinioFile" , v .SecretAccessKey )
155
+ })
156
+
157
+ t .Run ("FileAWS" , func (t * testing.T ) {
158
+ // prevent loading any actual credentials files from the user
159
+ t .Setenv ("MINIO_SHARED_CREDENTIALS_FILE" , "testdata/fake.json" )
160
+ t .Setenv ("AWS_SHARED_CREDENTIALS_FILE" , "testdata/aws_credentials" )
161
+
162
+ creds := buildMinioCredentials (cfg , credentials .DefaultIAMRoleEndpoint )
163
+ v , err := creds .Get ()
164
+
165
+ assert .NoError (t , err )
166
+ assert .Equal (t , ExpectedAccessKey + "AWSFile" , v .AccessKeyID )
167
+ assert .Equal (t , ExpectedSecretAccessKey + "AWSFile" , v .SecretAccessKey )
168
+ })
169
+
170
+ t .Run ("IAM" , func (t * testing.T ) {
171
+ // prevent loading any actual credentials files from the user
172
+ t .Setenv ("MINIO_SHARED_CREDENTIALS_FILE" , "testdata/fake.json" )
173
+ t .Setenv ("AWS_SHARED_CREDENTIALS_FILE" , "testdata/fake" )
174
+
175
+ // Spawn a server to emulate the EC2 Instance Metadata
176
+ server := httptest .NewServer (http .HandlerFunc (func (w http.ResponseWriter , r * http.Request ) {
177
+ // The request first will be to get the IMDSv2 token
178
+ if r .URL .Path == "/latest/api/token" && r .Method == "PUT" {
179
+ w .Write ([]byte ("fakeimdstoken" ))
180
+ return
181
+ }
182
+
183
+ // The second will be to get the role
184
+ if r .URL .Path == "/latest/meta-data/iam/security-credentials/" {
185
+ w .Write ([]byte ("FakeRole\n " ))
186
+ return
187
+ }
188
+
189
+ // The third actually gets credentials in JSON format for the role
190
+ w .Write ([]byte (`{"Code":"Success","AccessKeyId":"ExampleAccessKeyIDIAM","SecretAccessKey":"ExampleSecretAccessKeyIDIAM"}` ))
191
+ }))
192
+ defer server .Close ()
193
+
194
+ // Use the provided EC2 Instance Metadata server
195
+ creds := buildMinioCredentials (cfg , server .URL )
196
+ v , err := creds .Get ()
197
+
198
+ assert .NoError (t , err )
199
+ assert .Equal (t , ExpectedAccessKey + "IAM" , v .AccessKeyID )
200
+ assert .Equal (t , ExpectedSecretAccessKey + "IAM" , v .SecretAccessKey )
201
+ })
202
+ })
203
+ }
0 commit comments