You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

67 lines
1.9 KiB

  1. package s3api
  2. import (
  3. "github.com/seaweedfs/seaweedfs/weed/glog"
  4. "github.com/seaweedfs/seaweedfs/weed/s3api/s3_constants"
  5. "github.com/seaweedfs/seaweedfs/weed/s3api/s3account"
  6. "github.com/seaweedfs/seaweedfs/weed/s3api/s3acl"
  7. "github.com/seaweedfs/seaweedfs/weed/s3api/s3err"
  8. "net/http"
  9. )
  10. func getAccountId(r *http.Request) string {
  11. id := r.Header.Get(s3_constants.AmzAccountId)
  12. if len(id) == 0 {
  13. return s3account.AccountAnonymous.Id
  14. } else {
  15. return id
  16. }
  17. }
  18. func (s3a *S3ApiServer) checkAccessByOwnership(r *http.Request, bucket string) s3err.ErrorCode {
  19. metadata, errCode := s3a.bucketRegistry.GetBucketMetadata(bucket)
  20. if errCode != s3err.ErrNone {
  21. return errCode
  22. }
  23. accountId := getAccountId(r)
  24. if accountId == s3account.AccountAdmin.Id || accountId == *metadata.Owner.ID {
  25. return s3err.ErrNone
  26. }
  27. return s3err.ErrAccessDenied
  28. }
  29. // Check Bucket/BucketAcl Read related access
  30. // includes:
  31. // - HeadBucketHandler
  32. // - GetBucketAclHandler
  33. // - ListObjectsV1Handler
  34. // - ListObjectsV2Handler
  35. func (s3a *S3ApiServer) checkAccessForReadBucket(r *http.Request, bucket, aclAction string) (*BucketMetaData, s3err.ErrorCode) {
  36. bucketMetadata, errCode := s3a.bucketRegistry.GetBucketMetadata(bucket)
  37. if errCode != s3err.ErrNone {
  38. return nil, errCode
  39. }
  40. if bucketMetadata.ObjectOwnership == s3_constants.OwnershipBucketOwnerEnforced {
  41. return bucketMetadata, s3err.ErrNone
  42. }
  43. accountId := s3acl.GetAccountId(r)
  44. if accountId == s3account.AccountAdmin.Id || accountId == *bucketMetadata.Owner.ID {
  45. return bucketMetadata, s3err.ErrNone
  46. }
  47. if len(bucketMetadata.Acl) > 0 {
  48. reqGrants := s3acl.DetermineReqGrants(accountId, aclAction)
  49. for _, bucketGrant := range bucketMetadata.Acl {
  50. for _, reqGrant := range reqGrants {
  51. if s3acl.GrantEquals(bucketGrant, reqGrant) {
  52. return bucketMetadata, s3err.ErrNone
  53. }
  54. }
  55. }
  56. }
  57. glog.V(3).Infof("acl denied! request account id: %s", accountId)
  58. return nil, s3err.ErrAccessDenied
  59. }