Skip to content

Commit 5eb2ce1

Browse files
authored
Merge pull request #72 from agin719/fixup
add policy and IsNoSuchKeyError function
2 parents 87ff3bc + 3fded96 commit 5eb2ce1

File tree

5 files changed

+222
-0
lines changed

5 files changed

+222
-0
lines changed

bucket_policy.go

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
package cos
2+
3+
import (
4+
"bytes"
5+
"context"
6+
"encoding/json"
7+
"net/http"
8+
"strings"
9+
)
10+
11+
type BucketStatement struct {
12+
Principal map[string][]string `json:"principal,omitempty"`
13+
Action []string `json:"action,omitempty"`
14+
Effect string `json:"effect,omitempty"`
15+
Resource []string `json:"resource,omitempty"`
16+
Condition map[string]map[string]interface{} `json:"condition,omitempty"`
17+
}
18+
19+
type BucketPutPolicyOptions struct {
20+
Statement []BucketStatement `json:"statement,omitempty"`
21+
Version string `json:"version,omitempty"`
22+
Principal map[string][]string `json:"principal,omitempty"`
23+
}
24+
25+
type BucketGetPolicyResult BucketPutPolicyOptions
26+
27+
func (s *BucketService) PutPolicy(ctx context.Context, opt *BucketPutPolicyOptions) (*Response, error) {
28+
var f *strings.Reader
29+
if opt != nil {
30+
bs, err := json.Marshal(opt)
31+
if err != nil {
32+
return nil, err
33+
}
34+
body := string(bs)
35+
f = strings.NewReader(body)
36+
}
37+
sendOpt := &sendOptions{
38+
baseURL: s.client.BaseURL.BucketURL,
39+
uri: "/?policy",
40+
method: http.MethodPut,
41+
body: f,
42+
}
43+
resp, err := s.client.send(ctx, sendOpt)
44+
return resp, err
45+
}
46+
47+
func (s *BucketService) GetPolicy(ctx context.Context) (*BucketGetPolicyResult, *Response, error) {
48+
var bs bytes.Buffer
49+
var res BucketGetPolicyResult
50+
sendOpt := &sendOptions{
51+
baseURL: s.client.BaseURL.BucketURL,
52+
uri: "/?policy",
53+
method: http.MethodGet,
54+
result: &bs,
55+
}
56+
resp, err := s.client.send(ctx, sendOpt)
57+
if err == nil {
58+
err = json.Unmarshal(bs.Bytes(), &res)
59+
}
60+
return &res, resp, err
61+
}
62+
63+
func (s *BucketService) DeletePolicy(ctx context.Context) (*Response, error) {
64+
sendOpt := &sendOptions{
65+
baseURL: s.client.BaseURL.BucketURL,
66+
uri: "/?policy",
67+
method: http.MethodDelete,
68+
}
69+
resp, err := s.client.send(ctx, sendOpt)
70+
return resp, err
71+
}

error.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,3 +47,17 @@ func checkResponse(r *http.Response) error {
4747
}
4848
return errorResponse
4949
}
50+
51+
func IsNoSuchKeyError(e error) bool {
52+
if e == nil {
53+
return false
54+
}
55+
err, ok := e.(*ErrorResponse)
56+
if !ok {
57+
return false
58+
}
59+
if err.Response != nil && err.Response.StatusCode == 404 && err.Code == "NoSuchKey" {
60+
return true
61+
}
62+
return false
63+
}

example/bucket/delPolicy.go

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package main
2+
3+
import (
4+
"context"
5+
"net/http"
6+
"net/url"
7+
"os"
8+
9+
"github.com/tencentyun/cos-go-sdk-v5"
10+
"github.com/tencentyun/cos-go-sdk-v5/debug"
11+
)
12+
13+
func main() {
14+
u, _ := url.Parse("https://test-1259654469.cos.ap-guangzhou.myqcloud.com")
15+
b := &cos.BaseURL{
16+
BucketURL: u,
17+
}
18+
c := cos.NewClient(b, &http.Client{
19+
Transport: &cos.AuthorizationTransport{
20+
SecretID: os.Getenv("COS_SECRETID"),
21+
SecretKey: os.Getenv("COS_SECRETKEY"),
22+
Transport: &debug.DebugRequestTransport{
23+
RequestHeader: true,
24+
RequestBody: true,
25+
ResponseHeader: true,
26+
ResponseBody: true,
27+
},
28+
},
29+
})
30+
31+
_, err := c.Bucket.DeletePolicy(context.Background())
32+
if err != nil {
33+
panic(err)
34+
}
35+
}

example/bucket/getPolicy.go

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package main
2+
3+
import (
4+
"context"
5+
"encoding/json"
6+
"fmt"
7+
"net/http"
8+
"net/url"
9+
"os"
10+
11+
"github.com/tencentyun/cos-go-sdk-v5"
12+
"github.com/tencentyun/cos-go-sdk-v5/debug"
13+
)
14+
15+
func main() {
16+
u, _ := url.Parse("https://test-1259654469.cos.ap-guangzhou.myqcloud.com")
17+
b := &cos.BaseURL{
18+
BucketURL: u,
19+
}
20+
c := cos.NewClient(b, &http.Client{
21+
Transport: &cos.AuthorizationTransport{
22+
SecretID: os.Getenv("COS_SECRETID"),
23+
SecretKey: os.Getenv("COS_SECRETKEY"),
24+
Transport: &debug.DebugRequestTransport{
25+
RequestHeader: true,
26+
RequestBody: true,
27+
ResponseHeader: true,
28+
ResponseBody: true,
29+
},
30+
},
31+
})
32+
33+
res, _, err := c.Bucket.GetPolicy(context.Background())
34+
if err != nil {
35+
panic(err)
36+
}
37+
bs, err := json.Marshal(res)
38+
fmt.Println(string(bs))
39+
}

example/bucket/putPolicy.go

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
package main
2+
3+
import (
4+
"context"
5+
"net/http"
6+
"net/url"
7+
"os"
8+
9+
"github.com/tencentyun/cos-go-sdk-v5"
10+
"github.com/tencentyun/cos-go-sdk-v5/debug"
11+
)
12+
13+
func main() {
14+
u, _ := url.Parse("https://test-1259654469.cos.ap-guangzhou.myqcloud.com")
15+
b := &cos.BaseURL{
16+
BucketURL: u,
17+
}
18+
c := cos.NewClient(b, &http.Client{
19+
Transport: &cos.AuthorizationTransport{
20+
SecretID: os.Getenv("COS_SECRETID"),
21+
SecretKey: os.Getenv("COS_SECRETKEY"),
22+
Transport: &debug.DebugRequestTransport{
23+
RequestHeader: true,
24+
RequestBody: true,
25+
ResponseHeader: true,
26+
ResponseBody: true,
27+
},
28+
},
29+
})
30+
31+
opt := &cos.BucketPutPolicyOptions{
32+
Version: "2.0",
33+
Statement: []cos.BucketStatement{
34+
{
35+
Principal: map[string][]string{
36+
"qcs": []string{
37+
"qcs::cam::uin/100000000001:uin/100000000011", //替换成您想授予权限的账户uin
38+
},
39+
},
40+
Action: []string{
41+
"name/cos:GetObject",
42+
},
43+
Effect: "allow",
44+
Resource: []string{
45+
//这里改成允许的路径前缀,可以根据自己网站的用户登录态判断允许上传的具体路径,例子: a.jpg 或者 a/* 或者 * (使用通配符*存在重大安全风险, 请谨慎评估使用)
46+
"qcs::cos:ap-guangzhou:uid/1259654469:test-1259654469/exampleobject",
47+
},
48+
Condition: map[string]map[string]interface{}{
49+
"ip_not_equal": map[string]interface{}{
50+
"qcs:ip": []string{
51+
"192.168.1.1",
52+
},
53+
},
54+
},
55+
},
56+
},
57+
}
58+
59+
_, err := c.Bucket.PutPolicy(context.Background(), opt)
60+
if err != nil {
61+
panic(err)
62+
}
63+
}

0 commit comments

Comments
 (0)