From 113e2ab8745b839322930e138e2da73f2c374ae4 Mon Sep 17 00:00:00 2001 From: Qu Xuan Date: Wed, 10 Mar 2021 20:23:58 +0800 Subject: [PATCH] fix: qcloud bucket refer --- cmd/climc/shell/compute/buckets.go | 6 +++++- pkg/apis/compute/bucket.go | 12 +++++++---- pkg/cloudprovider/objectstore.go | 11 ++++++---- pkg/compute/models/buckets.go | 14 ++++++++---- pkg/multicloud/aliyun/bucket.go | 16 +++++++++++--- pkg/multicloud/objectstore/shell.go | 13 +++++++++--- pkg/multicloud/qcloud/bucket.go | 33 +++++++++++++---------------- 7 files changed, 68 insertions(+), 37 deletions(-) diff --git a/cmd/climc/shell/compute/buckets.go b/cmd/climc/shell/compute/buckets.go index 3c09a1d61b..18d36d999c 100644 --- a/cmd/climc/shell/compute/buckets.go +++ b/cmd/climc/shell/compute/buckets.go @@ -452,11 +452,15 @@ func init() { DomainList []string // 是否允许空referer 访问 AllowEmptyRefer bool `help:"all empty refer access"` + Enabled bool + RerererType string `help:"Referer type" choices:"Black-List|White-List"` } R(&BucketSetRefererOption{}, "bucket-set-referer", "Set bucket referer", func(s *mcclient.ClientSession, args *BucketSetRefererOption) error { conf := api.BucketRefererConf{ - WhiteList: args.DomainList, + Enabled: args.Enabled, AllowEmptyRefer: args.AllowEmptyRefer, + RefererType: args.RerererType, + DomainList: args.DomainList, } result, err := modules.Buckets.PerformAction(s, args.ID, "set-referer", jsonutils.Marshal(conf)) if err != nil { diff --git a/pkg/apis/compute/bucket.go b/pkg/apis/compute/bucket.go index cb7ec12349..8361c01f74 100644 --- a/pkg/apis/compute/bucket.go +++ b/pkg/apis/compute/bucket.go @@ -320,12 +320,16 @@ func (input *BucketCORSRules) Validate() error { } type BucketRefererConf struct { - // 白名单域名列表 - WhiteList []string - // 黑名单域名列表 - BlackList []string + // Referer Type + // enmu: Black-List, White-List + RefererType string + // 域名列表 + DomainList []string // 是否允许空referer 访问 AllowEmptyRefer bool + + // 是否开启 + Enabled bool `json:"enabled"` } func (input *BucketRefererConf) Validate() error { diff --git a/pkg/cloudprovider/objectstore.go b/pkg/cloudprovider/objectstore.go index c70960c16e..0e8dd573c1 100644 --- a/pkg/cloudprovider/objectstore.go +++ b/pkg/cloudprovider/objectstore.go @@ -110,12 +110,15 @@ type SBucketCORSRule struct { } type SBucketRefererConf struct { - // 白名单域名列表 - WhiteList []string - // 黑名单域名列表 - BlackList []string + // 域名列表 + DomainList []string + // 域名列表 + // enmu: Black-List, White-List + RefererType string // 是否允许空referer 访问 AllowEmptyRefer bool + + Enabled bool } type SBucketPolicyStatement struct { diff --git a/pkg/compute/models/buckets.go b/pkg/compute/models/buckets.go index 93b4df3112..68b66cf650 100644 --- a/pkg/compute/models/buckets.go +++ b/pkg/compute/models/buckets.go @@ -1521,8 +1521,11 @@ func (bucket *SBucket) PerformSetReferer( if err != nil { return nil, errors.Wrap(err, "GetIBucket") } + conf := cloudprovider.SBucketRefererConf{ - WhiteList: input.WhiteList, + Enabled: input.Enabled, + DomainList: input.DomainList, + RefererType: input.RefererType, AllowEmptyRefer: input.AllowEmptyRefer, } @@ -1557,9 +1560,12 @@ func (bucket *SBucket) GetDetailsReferer( if err != nil { return conf, httperrors.NewInternalServerError("iBucket.GetRefer error %s", err) } - conf.WhiteList = referConf.WhiteList - conf.BlackList = referConf.BlackList - conf.AllowEmptyRefer = referConf.AllowEmptyRefer + conf.Enabled = referConf.Enabled + if conf.Enabled { + conf.DomainList = referConf.DomainList + conf.RefererType = referConf.RefererType + conf.AllowEmptyRefer = referConf.AllowEmptyRefer + } return conf, nil } diff --git a/pkg/multicloud/aliyun/bucket.go b/pkg/multicloud/aliyun/bucket.go index bc227a3264..647f4bcd38 100644 --- a/pkg/multicloud/aliyun/bucket.go +++ b/pkg/multicloud/aliyun/bucket.go @@ -628,9 +628,17 @@ func (b *SBucket) SetReferer(conf cloudprovider.SBucketRefererConf) error { if err != nil { return errors.Wrap(err, "GetOssClient") } - err = osscli.SetBucketReferer(b.Name, conf.WhiteList, conf.AllowEmptyRefer) + if !conf.Enabled { + return errors.Wrapf(cloudprovider.ErrNotSupported, "Disable Refer") + } + + if conf.RefererType == "Black-List" { + return errors.Wrapf(cloudprovider.ErrNotSupported, "Black List") + } + + err = osscli.SetBucketReferer(b.Name, conf.DomainList, conf.AllowEmptyRefer) if err != nil { - return errors.Wrapf(err, "osscli.SetBucketReferer(%s,%s,%t)", b.Name, conf.WhiteList, conf.AllowEmptyRefer) + return errors.Wrapf(err, "osscli.SetBucketReferer(%s,%s,%t)", b.Name, conf.DomainList, conf.AllowEmptyRefer) } return nil } @@ -646,7 +654,9 @@ func (b *SBucket) GetReferer() (cloudprovider.SBucketRefererConf, error) { return result, errors.Wrapf(err, "osscli.GetBucketReferer(%s)", b.Name) } result = cloudprovider.SBucketRefererConf{ - WhiteList: refererResult.RefererList, + Enabled: true, + RefererType: "White-List", + DomainList: refererResult.RefererList, AllowEmptyRefer: refererResult.AllowEmptyReferer, } return result, nil diff --git a/pkg/multicloud/objectstore/shell.go b/pkg/multicloud/objectstore/shell.go index aaf593eda9..3596e81ec8 100644 --- a/pkg/multicloud/objectstore/shell.go +++ b/pkg/multicloud/objectstore/shell.go @@ -560,10 +560,12 @@ func S3Shell() { }) type BucketSetRefererOption struct { - BUCKET string `help:"name of bucket to put object"` - DomainList []string + BUCKET string `help:"name of bucket to put object"` + RefererType string `help:"referer type" choices:"Black-List|White-List" default:"Black-List"` + DomainList []string // 是否允许空refer 访问 AllowEmptyRefer bool `help:"all empty refer access"` + Disable bool } shellutils.R(&BucketSetRefererOption{}, "bucket-set-referer", "Set bucket referer", func(cli cloudprovider.ICloudRegion, args *BucketSetRefererOption) error { bucket, err := cli.GetIBucketById(args.BUCKET) @@ -571,8 +573,13 @@ func S3Shell() { return err } conf := cloudprovider.SBucketRefererConf{ - WhiteList: args.DomainList, + DomainList: args.DomainList, + RefererType: args.RefererType, AllowEmptyRefer: args.AllowEmptyRefer, + Enabled: true, + } + if args.Disable { + conf.Enabled = false } err = bucket.SetReferer(conf) if err != nil { diff --git a/pkg/multicloud/qcloud/bucket.go b/pkg/multicloud/qcloud/bucket.go index 2cd0458345..d61ae17d1c 100644 --- a/pkg/multicloud/qcloud/bucket.go +++ b/pkg/multicloud/qcloud/bucket.go @@ -694,20 +694,23 @@ func (b *SBucket) SetReferer(conf cloudprovider.SBucketRefererConf) error { if err != nil { return errors.Wrap(err, "b.region.GetCosClient") } + + if !conf.Enabled { + _, err = coscli.Bucket.PutReferer(context.Background(), nil) + return errors.Wrap(err, "Disable Refer") + } + opts := cos.BucketPutRefererOptions{ Status: "Enabled", - RefererType: "White-List", EmptyReferConfiguration: "Deny", + RefererType: conf.RefererType, + DomainList: conf.DomainList, } if conf.AllowEmptyRefer { opts.EmptyReferConfiguration = "Allow" } - opts.DomainList = conf.WhiteList - if len(opts.DomainList) == 0 { - opts.Status = "Disabled" - opts.DomainList = []string{"*"} - } + _, err = coscli.Bucket.PutReferer(context.Background(), &opts) if err != nil { return errors.Wrap(err, "coscli.Bucket.PutReferer") @@ -720,23 +723,17 @@ func (b *SBucket) GetReferer() (cloudprovider.SBucketRefererConf, error) { if err != nil { return result, errors.Wrap(err, "b.region.GetCosClient") } + referResult, _, err := coscli.Bucket.GetReferer(context.Background()) if err != nil { return result, errors.Wrap(err, " coscli.Bucket.GetReferer") } - if referResult.EmptyReferConfiguration == "Allow" { - result.AllowEmptyRefer = true - } - if referResult.Status == "Disabled" { - result.AllowEmptyRefer = true - return result, nil - } - result.WhiteList = referResult.DomainList - if referResult.RefererType == "Black-List" { - result.WhiteList = nil - result.BlackList = referResult.DomainList - } + result.AllowEmptyRefer = (referResult.EmptyReferConfiguration == "Allow") + result.Enabled = (referResult.Status == "Enabled") + result.RefererType = referResult.RefererType + result.DomainList = referResult.DomainList + return result, nil }