s->iam_policy, s->iam_identity_policies, s->session_policies, op);
}
-// Authorize anyone permitted by the bucket policy, identity policies, session policies and the bucket owner
-// unless explicitly denied by the policy.
-
-int verify_bucket_owner_or_policy(const DoutPrefixProvider* dpp,
- req_state* const s, const uint64_t op)
-{
- constexpr bool account_root = false; // just match owner below
- const auto arn = ARN(s->bucket->get_key());
- const auto effect = evaluate_iam_policies(
- dpp, s->env, *s->auth.identity, account_root, op, arn,
- s->iam_policy, s->iam_identity_policies, s->session_policies);
- if (effect == Effect::Deny) {
- return -EACCES;
- }
- if (effect == Effect::Allow) {
- return 0;
- }
- if (s->auth.identity->is_owner_of(s->bucket_owner.id)) {
- ldpp_dout(dpp, 10) << __func__ << ": granted to bucket owner" << dendl;
- return 0;
- }
- return -EACCES;
-}
-
static inline bool check_deferred_bucket_only_acl(const DoutPrefixProvider* dpp,
struct perm_state_base * const s,
if (has_s3_resource_tag)
rgw_iam_add_buckettags(this, s);
- return verify_bucket_owner_or_policy(this, s, rgw::IAM::s3PutBucketTagging);
+ if (!verify_bucket_permission(this, s, rgw::IAM::s3PutBucketTagging)) {
+ return -EACCES;
+ }
+
+ return 0;
}
void RGWPutBucketTags::execute(optional_yield y)
if (has_s3_resource_tag)
rgw_iam_add_buckettags(this, s);
- return verify_bucket_owner_or_policy(this, s, rgw::IAM::s3PutBucketTagging);
+ if (!verify_bucket_permission(this, s, rgw::IAM::s3PutBucketTagging)) {
+ return -EACCES;
+ }
+
+ return 0;
}
void RGWDeleteBucketTags::execute(optional_yield y)
auto [has_s3_existing_tag, has_s3_resource_tag] = rgw_check_policy_condition(this, s, false);
if (has_s3_resource_tag)
rgw_iam_add_buckettags(this, s);
- return verify_bucket_owner_or_policy(this, s, rgw::IAM::s3PutReplicationConfiguration);
+
+ if (!verify_bucket_permission(this, s, rgw::IAM::s3PutReplicationConfiguration)) {
+ return -EACCES;
+ }
+
+ return 0;
}
void RGWPutBucketReplication::execute(optional_yield y) {
if (has_s3_resource_tag)
rgw_iam_add_buckettags(this, s);
- return verify_bucket_owner_or_policy(this, s, rgw::IAM::s3DeleteReplicationConfiguration);
+ if (!verify_bucket_permission(this, s, rgw::IAM::s3DeleteReplicationConfiguration)) {
+ return -EACCES;
+ }
+
+ return 0;
}
void RGWDeleteBucketReplication::execute(optional_yield y)
if (has_s3_resource_tag)
rgw_iam_add_buckettags(this, s);
- return verify_bucket_owner_or_policy(this, s, rgw::IAM::s3GetBucketVersioning);
+ if (!verify_bucket_permission(this, s, rgw::IAM::s3GetBucketVersioning)) {
+ return -EACCES;
+ }
+
+ return 0;
}
void RGWGetBucketVersioning::pre_exec()
if (has_s3_resource_tag)
rgw_iam_add_buckettags(this, s);
- return verify_bucket_owner_or_policy(this, s, rgw::IAM::s3PutBucketVersioning);
+ if (!verify_bucket_permission(this, s, rgw::IAM::s3PutBucketVersioning)) {
+ return -EACCES;
+ }
+
+ return 0;
}
void RGWSetBucketVersioning::pre_exec()
if (has_s3_resource_tag)
rgw_iam_add_buckettags(this, s);
- return verify_bucket_owner_or_policy(this, s, rgw::IAM::s3GetBucketWebsite);
+ if (!verify_bucket_permission(this, s, rgw::IAM::s3GetBucketWebsite)) {
+ return -EACCES;
+ }
+
+ return 0;
}
void RGWGetBucketWebsite::pre_exec()
if (has_s3_resource_tag)
rgw_iam_add_buckettags(this, s);
- return verify_bucket_owner_or_policy(this, s, rgw::IAM::s3PutBucketWebsite);
+ if (!verify_bucket_permission(this, s, rgw::IAM::s3PutBucketWebsite)) {
+ return -EACCES;
+ }
+
+ return 0;
}
void RGWSetBucketWebsite::pre_exec()
if (has_s3_resource_tag)
rgw_iam_add_buckettags(this, s);
- return verify_bucket_owner_or_policy(this, s, rgw::IAM::s3DeleteBucketWebsite);
+ if (!verify_bucket_permission(this, s, rgw::IAM::s3DeleteBucketWebsite)) {
+ return -EACCES;
+ }
+
+ return 0;
}
void RGWDeleteBucketWebsite::pre_exec()
if (has_s3_resource_tag)
rgw_iam_add_buckettags(this, s);
- return verify_bucket_owner_or_policy(this, s, rgw::IAM::s3GetBucketLogging);
+ if (!verify_bucket_permission(this, s, rgw::IAM::s3GetBucketLogging)) {
+ return -EACCES;
+ }
+
+ return 0;
}
int RGWGetBucketLocation::verify_permission(optional_yield y)
if (has_s3_resource_tag)
rgw_iam_add_buckettags(this, s);
- return verify_bucket_owner_or_policy(this, s, rgw::IAM::s3GetBucketLocation);
+ if (!verify_bucket_permission(this, s, rgw::IAM::s3GetBucketLocation)) {
+ return -EACCES;
+ }
+
+ return 0;
}
static int get_account_max_buckets(const DoutPrefixProvider* dpp,
if (has_s3_resource_tag)
rgw_iam_add_buckettags(this, s);
- return verify_bucket_owner_or_policy(this, s, rgw::IAM::s3GetBucketCORS);
+ if (!verify_bucket_permission(this, s, rgw::IAM::s3GetBucketCORS)) {
+ return -EACCES;
+ }
+
+ return 0;
}
void RGWGetCORS::execute(optional_yield y)
if (has_s3_resource_tag)
rgw_iam_add_buckettags(this, s);
- return verify_bucket_owner_or_policy(this, s, rgw::IAM::s3PutBucketCORS);
+ if (!verify_bucket_permission(this, s, rgw::IAM::s3PutBucketCORS)) {
+ return -EACCES;
+ }
+
+ return 0;
}
void RGWPutCORS::execute(optional_yield y)
rgw_iam_add_buckettags(this, s);
// No separate delete permission
- return verify_bucket_owner_or_policy(this, s, rgw::IAM::s3PutBucketCORS);
+ if (!verify_bucket_permission(this, s, rgw::IAM::s3PutBucketCORS)) {
+ return -EACCES;
+ }
+
+ return 0;
}
void RGWDeleteCORS::execute(optional_yield y)
if (has_s3_resource_tag)
rgw_iam_add_buckettags(this, s);
- return verify_bucket_owner_or_policy(this, s, rgw::IAM::s3GetBucketRequestPayment);
+ if (!verify_bucket_permission(this, s, rgw::IAM::s3GetBucketRequestPayment)) {
+ return -EACCES;
+ }
+
+ return 0;
}
void RGWGetRequestPayment::pre_exec()
if (has_s3_resource_tag)
rgw_iam_add_buckettags(this, s);
- return verify_bucket_owner_or_policy(this, s, rgw::IAM::s3PutBucketRequestPayment);
+ if (!verify_bucket_permission(this, s, rgw::IAM::s3PutBucketRequestPayment)) {
+ return -EACCES;
+ }
+
+ return 0;
}
void RGWSetRequestPayment::pre_exec()
if (has_s3_resource_tag)
rgw_iam_add_buckettags(this, s);
- return verify_bucket_owner_or_policy(this, s, rgw::IAM::s3PutBucketObjectLockConfiguration);
+ if (!verify_bucket_permission(this, s, rgw::IAM::s3PutBucketObjectLockConfiguration)) {
+ return -EACCES;
+ }
+
+ return 0;
}
void RGWPutBucketObjectLock::execute(optional_yield y)
if (has_s3_resource_tag)
rgw_iam_add_buckettags(this, s);
- return verify_bucket_owner_or_policy(this, s, rgw::IAM::s3GetBucketObjectLockConfiguration);
+ if (!verify_bucket_permission(this, s, rgw::IAM::s3GetBucketObjectLockConfiguration)) {
+ return -EACCES;
+ }
+
+ return 0;
}
void RGWGetBucketObjectLock::execute(optional_yield y)