@@ -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,103 @@ 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 client will actually make 3 requests here,
178
+ // first will be to get the IMDSv2 token, second to
179
+ // get the role, and third for the actual
180
+ // credentials. However, we can return credentials
181
+ // every request since we're not emulating a full
182
+ // IMDSv2 flow.
183
+ w .Write ([]byte (`{"Code":"Success","AccessKeyId":"ExampleAccessKeyIDIAM","SecretAccessKey":"ExampleSecretAccessKeyIDIAM"}` ))
184
+ }))
185
+ defer server .Close ()
186
+
187
+ // Use the provided EC2 Instance Metadata server
188
+ creds := buildMinioCredentials (cfg , server .URL )
189
+ v , err := creds .Get ()
190
+
191
+ assert .NoError (t , err )
192
+ assert .Equal (t , ExpectedAccessKey + "IAM" , v .AccessKeyID )
193
+ assert .Equal (t , ExpectedSecretAccessKey + "IAM" , v .SecretAccessKey )
194
+ })
195
+ })
196
+ }
0 commit comments