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 @@