diff --git a/app/models/app_results.go b/app/models/app_results.go index 9c4a4dab..629a2fd7 100644 --- a/app/models/app_results.go +++ b/app/models/app_results.go @@ -18,6 +18,21 @@ type Buckets struct { CreateTime string `json:"createtime"` } +type ListMultipartUploadsResult struct { + Bucket string `json:"bucket"` + IsTruncated bool `json:"is_truncated"` + KeyMarker string `json:"key_marker"` + MaxUploads int `json:"max_uploads"` + Uploads []MultipartUpload `json:"uploads"` +} + +type MultipartUpload struct { + Initiated string `json:"initiated"` + Key string `json:"object_key"` + StorageClass string `json:"storage_class"` + UploadId string `json:"upload_id"` +} + type Object struct { Key string `json:"key"` Size int64 `json:"size"` @@ -71,3 +86,30 @@ type GetObjectVersionsResult struct { Versions []ObjectVersioning `json:"versions"` Err string `json:"err"` } + +type GetBucketAclResult struct { + Grants []Grant `json:"Grants"` +} + +type Grant struct { + Permission string `json:"permission"` + Grantee Grantee `json:"Grantee"` +} + +type Grantee struct { + Type string `json:"type"` + URI string `json:"uri"` +} + +type GetBucketPolicyResult struct { + ID string `json:"id"` + Version string `json:"version"` + Statements []Statement `json:"statement"` +} + +type Statement struct { + Effect string `json:"effect"` + Actions []Action `json:"action"` +} + +type Action string \ No newline at end of file diff --git a/app/s3cmd.go b/app/s3cmd.go index 4572f5a1..967e1bea 100644 --- a/app/s3cmd.go +++ b/app/s3cmd.go @@ -3,6 +3,7 @@ package app import ( "bytes" "context" + "encoding/json" "errors" "github.com/wailsapp/wails/v2/pkg/runtime" "io" @@ -21,19 +22,19 @@ func (a *App) ListBuckets() ListBucketsResult { res := ListBucketsResult{} buckets, err := a.S3Client.ListBuckets() if err != nil { - runtime.LogErrorf(a.ctx, "ListBuckets err: %s ", err) res.Err = err.Error() return res } - for _, bucket := range buckets.Buckets{ - b := Buckets{ - Bucket: *bucket.Name, - CreateTime: (*bucket.CreationDate).Local().Format("2006-01-02 15:04:05"), - //CreateTime: (*bucket.CreationDate).String(), + if buckets != nil{ + for _, bucket := range buckets.Buckets{ + b := Buckets{ + Bucket: *bucket.Name, + CreateTime: (*bucket.CreationDate).Local().Format("2006-01-02 15:04:05"), + } + res.Buckets = append(res.Buckets, b) + } + return res } - res.Buckets = append(res.Buckets, b) - } - runtime.LogDebug(a.ctx, "ListBuckets success.") return res } @@ -386,3 +387,87 @@ func (a *App) ListObjectVersions(bucketName string, key string) GetObjectVersion } return res } + +func (a *App) GetBucketAcl(bucketName string) GetBucketAclResult{ + out, err := a.S3Client.GetBucketAcl(bucketName) + if err != nil{ + runtime.LogErrorf(a.ctx, "getbucketacl faild: %s", bucketName) + } + res := GetBucketAclResult{} + for _, grant:=range out.Grants{ + grant1 := Grant{ + Permission: *grant.Permission, + Grantee: Grantee{ + Type: *grant.Grantee.Type, + //URI: *grant.Grantee.URI, + }, + } + res.Grants =append(res.Grants, grant1) + } + return res +} + +func(a *App) SetBucketAcl(bucketName, acl string) string{ + err := a.S3Client.SetBucketAcl(bucketName, acl) + if err != nil { + runtime.LogErrorf(a.ctx, "SetBucketACL %s err: %s ", bucketName, err) + return err.Error() + } + return "" +} + +func(a *App) ListMultipartUploads(bucketName string)(out ListMultipartUploadsResult, err error){ + res, err := a.S3Client.ListMultipartUploads(bucketName) + if err != nil{ + return out, err + } + for _, upload := range res.Uploads{ + upload1 := MultipartUpload{ + Initiated: (*upload.Initiated).Local().Format("2006-01-02 15:04:05"), + Key: *upload.Key, + StorageClass: *upload.StorageClass, + UploadId: *upload.UploadId, + } + out.Uploads = append(out.Uploads, upload1) + } + return out, nil +} + +func(a *App) AbortMultipartUpload(bucketName, key, uploadid string)string{ + err := a.S3Client.AbortMultiPartUpload(bucketName, key, uploadid) + if err!= nil{ + return err.Error() + } + return "" +} + +func(a *App) PutBucketPolicy(bucket, id, action string)string{ + policy_e := `{ + "Version": "2012-10-17", + "ID": "`+ id + `", + "Statement": [{ + "Effect": "Allow", + "Principal": {"AWS":"*"}, + "Action": ["s3:`+action+`"], + "Resource": [ + "arn:aws:s3:::` + bucket + `/*" + ] + }] + }` + err := a.S3Client.PutBucketPolicy(bucket, policy_e) + if err != nil { + return err.Error() + } + return "" +} + +func(a *App) GetBucketPolicy(bucket string) (GetBucketPolicyResult, error) { + res := GetBucketPolicyResult{} + out, err := a.S3Client.GetBucketPolicy(bucket) + if err != nil{ + return res, err} + var p GetBucketPolicyResult + err = json.Unmarshal([]byte(*out.Policy), &p) + return p, err +} + diff --git a/app/s3lib/bucket.go b/app/s3lib/bucket.go index 6f69f2a8..d16a7139 100644 --- a/app/s3lib/bucket.go +++ b/app/s3lib/bucket.go @@ -68,12 +68,13 @@ type Bucket struct { } func (s3client *S3Client) ListBuckets() (buckets *s3.ListBucketsOutput, err error) { +//func (s3client *S3Client) ListBuckets() (bucketnames []string, err error) { params := &s3.ListBucketsInput{} - out, err := s3client.Client.ListBuckets(params) + buckets, err = s3client.Client.ListBuckets(params) if err != nil { return nil, err } - return out, nil + return buckets, nil } func (s3client *S3Client) ListObjects(bucketName, marker, prefix string, maxKeys int64, delemiter string) (*s3.ListObjectsOutput, error) { @@ -86,3 +87,73 @@ func (s3client *S3Client) ListObjects(bucketName, marker, prefix string, maxKeys } return s3client.Client.ListObjects(params) } + +func (s3client *S3Client) GetBucketAcl(bucketname string)(*s3.GetBucketAclOutput, error){ + params := &s3.GetBucketAclInput{ + Bucket: aws.String(bucketname), + } + out, err := s3client.Client.GetBucketAcl(params) + return out, err +} + +func (s3client *S3Client) SetBucketAcl(bucketname, acl string) (err error){ + params := &s3.PutBucketAclInput{ + Bucket: aws.String(bucketname), + ACL: aws.String(acl), + } + _, err = s3client.Client.PutBucketAcl(params) + return err +} + +func (s3client *S3Client) SetBucketAclPolicy(bucketname string, acl *s3.AccessControlPolicy)(err error){ + params := &s3.PutBucketAclInput{ + Bucket: aws.String(bucketname), + AccessControlPolicy: acl, + } + _, err = s3client.Client.PutBucketAcl(params) + return err +} + +func (s3client *S3Client) ListMultipartUploads(bucketname string) (ListMultiparts *s3.ListMultipartUploadsOutput, err error) { + params := &s3.ListMultipartUploadsInput{ + Bucket: aws.String(bucketname), + } + + out, err :=s3client.Client.ListMultipartUploads(params) + if err != nil{ + return nil, err + } + return out, nil +} + +func (s3client *S3Client) AbortMultipartUpload(bucketname, key, uploadid string) string{ + params := &s3.AbortMultipartUploadInput{ + Bucket: aws.String(bucketname), + Key: aws.String(key), + UploadId: aws.String(uploadid), + } + _, err := s3client.Client.AbortMultipartUpload(params) + if err != nil{ + return err.Error() + } + return "" +} + +func (s3client *S3Client) PutBucketPolicy(bucketname, policy string) error{ + params := &s3.PutBucketPolicyInput{ + Bucket: aws.String(bucketname), + Policy: aws.String(policy), + } + _, err := s3client.Client.PutBucketPolicy(params) + if err != nil{ + return err + } + return nil +} + +func (s3client *S3Client) GetBucketPolicy(bucketname string)(*s3.GetBucketPolicyOutput, error){ + params := &s3.GetBucketPolicyInput{ + Bucket: aws.String(bucketname)} + out, err := s3client.Client.GetBucketPolicy(params) + return out, err +} \ No newline at end of file diff --git a/frontend/src/components/BucketList.vue b/frontend/src/components/BucketList.vue index 4dc7c81a..9c4a7792 100644 --- a/frontend/src/components/BucketList.vue +++ b/frontend/src/components/BucketList.vue @@ -5,9 +5,27 @@ Create Bucket + + 碎片 + + + 设置acl权限 + + + 简化policy授权 + + + + + - + + + + @@ -23,15 +41,42 @@ + + + + + + + + + + +
- + +
+ diff --git a/frontend/src/components/put-bucket-policy.vue b/frontend/src/components/put-bucket-policy.vue new file mode 100644 index 00000000..c911be82 --- /dev/null +++ b/frontend/src/components/put-bucket-policy.vue @@ -0,0 +1,137 @@ + + +