2021-04-06 16:43:08 +08:00
|
|
|
package iamapi
|
|
|
|
|
|
|
|
import (
|
|
|
|
"encoding/xml"
|
2022-03-29 17:21:59 +08:00
|
|
|
"net/http"
|
|
|
|
"net/http/httptest"
|
|
|
|
"testing"
|
|
|
|
|
2021-04-06 16:43:08 +08:00
|
|
|
"github.com/aws/aws-sdk-go/aws"
|
|
|
|
"github.com/aws/aws-sdk-go/aws/session"
|
|
|
|
"github.com/aws/aws-sdk-go/service/iam"
|
|
|
|
"github.com/chrislusf/seaweedfs/weed/pb/iam_pb"
|
|
|
|
"github.com/gorilla/mux"
|
2021-04-11 02:57:45 +08:00
|
|
|
"github.com/jinzhu/copier"
|
2021-04-06 16:43:08 +08:00
|
|
|
"github.com/stretchr/testify/assert"
|
|
|
|
)
|
|
|
|
|
|
|
|
var GetS3ApiConfiguration func(s3cfg *iam_pb.S3ApiConfiguration) (err error)
|
|
|
|
var PutS3ApiConfiguration func(s3cfg *iam_pb.S3ApiConfiguration) (err error)
|
2021-04-11 02:57:45 +08:00
|
|
|
var GetPolicies func(policies *Policies) (err error)
|
|
|
|
var PutPolicies func(policies *Policies) (err error)
|
|
|
|
|
|
|
|
var s3config = iam_pb.S3ApiConfiguration{}
|
|
|
|
var policiesFile = Policies{Policies: make(map[string]PolicyDocument)}
|
|
|
|
var ias = IamApiServer{s3ApiConfig: iamS3ApiConfigureMock{}}
|
2021-04-06 16:43:08 +08:00
|
|
|
|
|
|
|
type iamS3ApiConfigureMock struct{}
|
|
|
|
|
|
|
|
func (iam iamS3ApiConfigureMock) GetS3ApiConfiguration(s3cfg *iam_pb.S3ApiConfiguration) (err error) {
|
2021-04-11 02:57:45 +08:00
|
|
|
_ = copier.Copy(&s3cfg.Identities, &s3config.Identities)
|
2021-04-06 16:43:08 +08:00
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (iam iamS3ApiConfigureMock) PutS3ApiConfiguration(s3cfg *iam_pb.S3ApiConfiguration) (err error) {
|
2021-04-11 02:57:45 +08:00
|
|
|
_ = copier.Copy(&s3config.Identities, &s3cfg.Identities)
|
2021-04-06 16:43:08 +08:00
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
2021-04-11 02:57:45 +08:00
|
|
|
func (iam iamS3ApiConfigureMock) GetPolicies(policies *Policies) (err error) {
|
|
|
|
_ = copier.Copy(&policies, &policiesFile)
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (iam iamS3ApiConfigureMock) PutPolicies(policies *Policies) (err error) {
|
|
|
|
_ = copier.Copy(&policiesFile, &policies)
|
|
|
|
return nil
|
|
|
|
}
|
2021-04-06 16:43:08 +08:00
|
|
|
|
|
|
|
func TestCreateUser(t *testing.T) {
|
|
|
|
userName := aws.String("Test")
|
|
|
|
params := &iam.CreateUserInput{UserName: userName}
|
|
|
|
req, _ := iam.New(session.New()).CreateUserRequest(params)
|
|
|
|
_ = req.Build()
|
|
|
|
out := CreateUserResponse{}
|
|
|
|
response, err := executeRequest(req.HTTPRequest, out)
|
|
|
|
assert.Equal(t, nil, err)
|
|
|
|
assert.Equal(t, http.StatusOK, response.Code)
|
|
|
|
//assert.Equal(t, out.XMLName, "lol")
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestListUsers(t *testing.T) {
|
|
|
|
params := &iam.ListUsersInput{}
|
|
|
|
req, _ := iam.New(session.New()).ListUsersRequest(params)
|
|
|
|
_ = req.Build()
|
|
|
|
out := ListUsersResponse{}
|
|
|
|
response, err := executeRequest(req.HTTPRequest, out)
|
|
|
|
assert.Equal(t, nil, err)
|
|
|
|
assert.Equal(t, http.StatusOK, response.Code)
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestListAccessKeys(t *testing.T) {
|
|
|
|
svc := iam.New(session.New())
|
|
|
|
params := &iam.ListAccessKeysInput{}
|
|
|
|
req, _ := svc.ListAccessKeysRequest(params)
|
|
|
|
_ = req.Build()
|
|
|
|
out := ListAccessKeysResponse{}
|
|
|
|
response, err := executeRequest(req.HTTPRequest, out)
|
|
|
|
assert.Equal(t, nil, err)
|
|
|
|
assert.Equal(t, http.StatusOK, response.Code)
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestGetUser(t *testing.T) {
|
|
|
|
userName := aws.String("Test")
|
|
|
|
params := &iam.GetUserInput{UserName: userName}
|
|
|
|
req, _ := iam.New(session.New()).GetUserRequest(params)
|
|
|
|
_ = req.Build()
|
|
|
|
out := GetUserResponse{}
|
|
|
|
response, err := executeRequest(req.HTTPRequest, out)
|
|
|
|
assert.Equal(t, nil, err)
|
2021-04-11 02:57:45 +08:00
|
|
|
assert.Equal(t, http.StatusOK, response.Code)
|
2021-04-06 16:43:08 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
// Todo flat statement
|
|
|
|
func TestCreatePolicy(t *testing.T) {
|
|
|
|
params := &iam.CreatePolicyInput{
|
|
|
|
PolicyName: aws.String("S3-read-only-example-bucket"),
|
|
|
|
PolicyDocument: aws.String(`
|
|
|
|
{
|
|
|
|
"Version": "2012-10-17",
|
|
|
|
"Statement": [
|
|
|
|
{
|
|
|
|
"Effect": "Allow",
|
|
|
|
"Action": [
|
|
|
|
"s3:Get*",
|
|
|
|
"s3:List*"
|
|
|
|
],
|
|
|
|
"Resource": [
|
|
|
|
"arn:aws:s3:::EXAMPLE-BUCKET",
|
|
|
|
"arn:aws:s3:::EXAMPLE-BUCKET/*"
|
|
|
|
]
|
|
|
|
}
|
|
|
|
]
|
|
|
|
}`),
|
|
|
|
}
|
|
|
|
req, _ := iam.New(session.New()).CreatePolicyRequest(params)
|
|
|
|
_ = req.Build()
|
|
|
|
out := CreatePolicyResponse{}
|
|
|
|
response, err := executeRequest(req.HTTPRequest, out)
|
|
|
|
assert.Equal(t, nil, err)
|
|
|
|
assert.Equal(t, http.StatusOK, response.Code)
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestPutUserPolicy(t *testing.T) {
|
|
|
|
userName := aws.String("Test")
|
|
|
|
params := &iam.PutUserPolicyInput{
|
|
|
|
UserName: userName,
|
|
|
|
PolicyName: aws.String("S3-read-only-example-bucket"),
|
|
|
|
PolicyDocument: aws.String(
|
|
|
|
`{
|
|
|
|
"Version": "2012-10-17",
|
|
|
|
"Statement": [
|
|
|
|
{
|
|
|
|
"Effect": "Allow",
|
|
|
|
"Action": [
|
|
|
|
"s3:Get*",
|
|
|
|
"s3:List*"
|
|
|
|
],
|
|
|
|
"Resource": [
|
|
|
|
"arn:aws:s3:::EXAMPLE-BUCKET",
|
|
|
|
"arn:aws:s3:::EXAMPLE-BUCKET/*"
|
|
|
|
]
|
|
|
|
}
|
|
|
|
]
|
|
|
|
}`),
|
|
|
|
}
|
|
|
|
req, _ := iam.New(session.New()).PutUserPolicyRequest(params)
|
|
|
|
_ = req.Build()
|
|
|
|
out := PutUserPolicyResponse{}
|
|
|
|
response, err := executeRequest(req.HTTPRequest, out)
|
|
|
|
assert.Equal(t, nil, err)
|
|
|
|
assert.Equal(t, http.StatusOK, response.Code)
|
|
|
|
}
|
|
|
|
|
2021-04-11 02:57:45 +08:00
|
|
|
func TestGetUserPolicy(t *testing.T) {
|
|
|
|
userName := aws.String("Test")
|
|
|
|
params := &iam.GetUserPolicyInput{UserName: userName, PolicyName: aws.String("S3-read-only-example-bucket")}
|
|
|
|
req, _ := iam.New(session.New()).GetUserPolicyRequest(params)
|
|
|
|
_ = req.Build()
|
|
|
|
out := GetUserPolicyResponse{}
|
|
|
|
response, err := executeRequest(req.HTTPRequest, out)
|
|
|
|
assert.Equal(t, nil, err)
|
|
|
|
assert.Equal(t, http.StatusOK, response.Code)
|
|
|
|
}
|
|
|
|
|
2022-03-29 17:21:59 +08:00
|
|
|
func TestUpdateUser(t *testing.T) {
|
2021-04-11 02:57:45 +08:00
|
|
|
userName := aws.String("Test")
|
2022-03-29 17:21:59 +08:00
|
|
|
newUserName := aws.String("Test-New")
|
|
|
|
params := &iam.UpdateUserInput{NewUserName: newUserName, UserName: userName}
|
|
|
|
req, _ := iam.New(session.New()).UpdateUserRequest(params)
|
|
|
|
_ = req.Build()
|
|
|
|
out := UpdateUserResponse{}
|
|
|
|
response, err := executeRequest(req.HTTPRequest, out)
|
|
|
|
assert.Equal(t, nil, err)
|
|
|
|
assert.Equal(t, http.StatusOK, response.Code)
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestDeleteUser(t *testing.T) {
|
|
|
|
userName := aws.String("Test-New")
|
2021-04-11 02:57:45 +08:00
|
|
|
params := &iam.DeleteUserInput{UserName: userName}
|
|
|
|
req, _ := iam.New(session.New()).DeleteUserRequest(params)
|
|
|
|
_ = req.Build()
|
|
|
|
out := DeleteUserResponse{}
|
|
|
|
response, err := executeRequest(req.HTTPRequest, out)
|
|
|
|
assert.Equal(t, nil, err)
|
|
|
|
assert.Equal(t, http.StatusOK, response.Code)
|
|
|
|
}
|
|
|
|
|
2021-04-06 16:43:08 +08:00
|
|
|
func executeRequest(req *http.Request, v interface{}) (*httptest.ResponseRecorder, error) {
|
|
|
|
rr := httptest.NewRecorder()
|
|
|
|
apiRouter := mux.NewRouter().SkipClean(true)
|
2021-04-11 02:57:45 +08:00
|
|
|
apiRouter.Path("/").Methods("POST").HandlerFunc(ias.DoActions)
|
2021-04-06 16:43:08 +08:00
|
|
|
apiRouter.ServeHTTP(rr, req)
|
|
|
|
return rr, xml.Unmarshal(rr.Body.Bytes(), &v)
|
|
|
|
}
|