acl.go 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  1. package tos
  2. import (
  3. "bytes"
  4. "context"
  5. "encoding/json"
  6. "fmt"
  7. "io"
  8. "net/http"
  9. )
  10. // PutObjectAcl AclGrant, AclRules can not set both.
  11. //
  12. // Deprecated: ues PutObjectACL of ClientV2 instead
  13. func (bkt *Bucket) PutObjectAcl(ctx context.Context, input *PutObjectAclInput, options ...Option) (*PutObjectAclOutput, error) {
  14. if err := isValidKey(input.Key); err != nil {
  15. return nil, err
  16. }
  17. var content io.Reader
  18. if input.AclRules != nil {
  19. data, err := json.Marshal(input.AclRules)
  20. if err != nil {
  21. return nil, fmt.Errorf("tos: marshal BucketAcl Ruels err: %s", err.Error())
  22. }
  23. content = bytes.NewReader(data)
  24. }
  25. builder := bkt.client.newBuilder(bkt.name, input.Key, options...).
  26. WithQuery("acl", "").
  27. WithQuery("versionId", input.VersionID)
  28. if grant := input.AclGrant; grant != nil {
  29. builder.WithHeader(HeaderACL, grant.ACL).
  30. WithHeader(HeaderGrantFullControl, grant.GrantFullControl).
  31. WithHeader(HeaderGrantRead, grant.GrantRead).
  32. WithHeader(HeaderGrantReadAcp, grant.GrantReadAcp).
  33. WithHeader(HeaderGrantWriteAcp, grant.GrantWriteAcp)
  34. }
  35. res, err := builder.WithRetry(OnRetryFromStart, StatusCodeClassifier{}).Request(ctx, http.MethodPut, content, bkt.client.roundTripper(http.StatusOK))
  36. if err != nil {
  37. return nil, err
  38. }
  39. defer res.Close()
  40. return &PutObjectAclOutput{RequestInfo: res.RequestInfo()}, nil
  41. }
  42. // PutObjectACL put object ACL
  43. func (cli *ClientV2) PutObjectACL(ctx context.Context, input *PutObjectACLInput) (*PutObjectACLOutput, error) {
  44. if err := isValidKey(input.Key); err != nil {
  45. return nil, err
  46. }
  47. if len(input.ACL) != 0 {
  48. if err := isValidACL(input.ACL); err != nil {
  49. return nil, err
  50. }
  51. }
  52. var content io.Reader
  53. if len(input.Grants) != 0 {
  54. for _, grants := range input.Grants {
  55. if err := isValidGrantee(grants.GranteeV2.Type); len(grants.GranteeV2.Type) != 0 && err != nil {
  56. return nil, err
  57. }
  58. if err := isValidCannedType(grants.GranteeV2.Canned); len(grants.GranteeV2.Canned) != 0 && err != nil {
  59. return nil, err
  60. }
  61. if err := isValidPermission(grants.Permission); len(grants.Permission) != 0 && err != nil {
  62. return nil, err
  63. }
  64. }
  65. data, err := json.Marshal(&accessControlList{
  66. Owner: input.Owner,
  67. Grants: input.Grants,
  68. BucketOwnerEntrusted: input.BucketOwnerEntrusted,
  69. })
  70. if err != nil {
  71. return nil, InvalidMarshal
  72. }
  73. content = bytes.NewReader(data)
  74. }
  75. builder := cli.newBuilder(input.Bucket, input.Key).
  76. WithQuery("acl", "").
  77. WithParams(*input)
  78. res, err := builder.WithRetry(OnRetryFromStart, StatusCodeClassifier{}).Request(ctx, http.MethodPut, content, cli.roundTripper(http.StatusOK))
  79. if err != nil {
  80. return nil, err
  81. }
  82. defer res.Close()
  83. return &PutObjectACLOutput{
  84. PutObjectAclOutput{RequestInfo: res.RequestInfo()},
  85. }, nil
  86. }
  87. // GetObjectAcl get object ACL
  88. // objectKey: the name of object
  89. // Options: WithVersionID the version of the object
  90. //
  91. // Deprecated: use GetObjectACL of ClientV2 instead
  92. func (bkt *Bucket) GetObjectAcl(ctx context.Context, objectKey string, options ...Option) (*GetObjectAclOutput, error) {
  93. if err := isValidKey(objectKey); err != nil {
  94. return nil, err
  95. }
  96. res, err := bkt.client.newBuilder(bkt.name, objectKey, options...).
  97. WithQuery("acl", "").
  98. WithRetry(OnRetryFromStart, StatusCodeClassifier{}).
  99. Request(ctx, http.MethodGet, nil, bkt.client.roundTripper(http.StatusOK))
  100. if err != nil {
  101. return nil, err
  102. }
  103. defer res.Close()
  104. out := GetObjectAclOutput{RequestInfo: res.RequestInfo()}
  105. if err = marshalOutput(out.RequestID, res.Body, &out); err != nil {
  106. return nil, err
  107. }
  108. out.VersionID = res.Header.Get(HeaderVersionID)
  109. return &out, nil
  110. }
  111. // GetObjectACL get object ACL
  112. func (cli *ClientV2) GetObjectACL(ctx context.Context, input *GetObjectACLInput) (*GetObjectACLOutput, error) {
  113. if err := isValidBucketName(input.Bucket, cli.isCustomDomain); err != nil {
  114. return nil, err
  115. }
  116. if err := isValidKey(input.Key); err != nil {
  117. return nil, err
  118. }
  119. res, err := cli.newBuilder(input.Bucket, input.Key).
  120. WithQuery("acl", "").
  121. WithParams(*input).
  122. WithRetry(nil, StatusCodeClassifier{}).
  123. Request(ctx, http.MethodGet, nil, cli.roundTripper(http.StatusOK))
  124. if err != nil {
  125. return nil, err
  126. }
  127. defer res.Close()
  128. out := GetObjectACLOutput{RequestInfo: res.RequestInfo()}
  129. if err = marshalOutput(out.RequestID, res.Body, &out); err != nil {
  130. return nil, err
  131. }
  132. out.VersionID = res.Header.Get(HeaderVersionID)
  133. return &out, nil
  134. }
  135. func (cli *ClientV2) GetBucketACL(ctx context.Context, input *GetBucketACLInput) (*GetBucketACLOutput, error) {
  136. if input == nil {
  137. return nil, InputIsNilClientError
  138. }
  139. if err := isValidBucketName(input.Bucket, cli.isCustomDomain); err != nil {
  140. return nil, err
  141. }
  142. res, err := cli.newBuilder(input.Bucket, "").
  143. WithQuery("acl", "").
  144. WithRetry(nil, StatusCodeClassifier{}).
  145. Request(ctx, http.MethodGet, nil, cli.roundTripper(http.StatusOK))
  146. if err != nil {
  147. return nil, err
  148. }
  149. defer res.Close()
  150. output := GetBucketACLOutput{RequestInfo: res.RequestInfo()}
  151. marshalRes := bucketACL{}
  152. if err = marshalOutput(output.RequestID, res.Body, &marshalRes); err != nil {
  153. return nil, err
  154. }
  155. output.Grants = marshalRes.GrantList
  156. output.Owner = marshalRes.Owner
  157. return &output, nil
  158. }
  159. func (cli *ClientV2) PutBucketACL(ctx context.Context, input *PutBucketACLInput) (*PutBucketACLOutput, error) {
  160. if input == nil {
  161. return nil, InputIsNilClientError
  162. }
  163. if err := isValidBucketName(input.Bucket, cli.isCustomDomain); err != nil {
  164. return nil, err
  165. }
  166. reqBuilder := cli.newBuilder(input.Bucket, "").
  167. WithQuery("acl", "").
  168. WithRetry(OnRetryFromStart, StatusCodeClassifier{}).
  169. WithParams(*input)
  170. var reqData io.Reader
  171. if input.Owner.ID != "" && len(input.Grants) != 0 {
  172. data, contentMD5, err := marshalInput("PutBucketACLInput", bucketACL{
  173. Owner: input.Owner,
  174. GrantList: input.Grants,
  175. })
  176. if err != nil {
  177. return nil, err
  178. }
  179. _ = reqBuilder.WithHeader(HeaderContentMD5, contentMD5)
  180. reqData = bytes.NewReader(data)
  181. }
  182. res, err := reqBuilder.Request(ctx, http.MethodPut, reqData, cli.roundTripper(http.StatusOK))
  183. if err != nil {
  184. return nil, err
  185. }
  186. defer res.Close()
  187. output := PutBucketACLOutput{RequestInfo: res.RequestInfo()}
  188. return &output, nil
  189. }