#include "cls/user/cls_user_types.h"
#include "cls/rgw/cls_rgw_types.h"
#include "include/rados/librados.hpp"
+#include "rgw_public_access.h"
namespace ceph {
class Formatter;
rgw::IAM::Environment env;
boost::optional<rgw::IAM::Policy> iam_policy;
+ boost::optional<rgw::IAM::PublicAccessConfiguration> bucket_access_conf;
vector<rgw::IAM::Policy> iam_user_policies;
/* Is the request made by an user marked as a system one?
return -EINVAL;
}
}
+
+ if(s->bucket_exists) {
+ s->bucket_access_conf = get_public_access_conf_from_attr(s->bucket_attrs);
+ }
}
/* handle user ACL only for those APIs which support it */
}
}
- auto access_conf = get_public_access_conf_from_attr(s->bucket_attrs);
- if (access_conf && access_conf->block_public_acls()) {
+ if (s->bucket_access_conf && s->bucket_access_conf->block_public_acls()) {
if (s->canned_acl.compare("public-read") ||
s->canned_acl.compare("public-read-write") ||
s->canned_acl.compare("authenticated-read"))
*_dout << dendl;
}
- if (auto access_conf = get_public_access_conf_from_attr(s->bucket_attrs);
- access_conf && access_conf->block_public_acls() && new_policy.IsPublic()) {
+ if (s->bucket_access_conf &&
+ s->bucket_access_conf->block_public_acls() &&
+ new_policy.IsPublic()) {
op_ret = -EACCES;
return;
}
try {
const Policy p(s->cct, s->bucket_tenant, data);
auto attrs = s->bucket_attrs;
- if (auto access_conf = get_public_access_conf_from_attr(attrs);
- access_conf && access_conf->block_public_policy() && rgw::IAM::IsPublic(p))
- {
- op_ret = -EACCES;
- return;
+ if (s->bucket_access_conf &&
+ s->bucket_access_conf->block_public_policy() &&
+ rgw::IAM::IsPublic(p)) {
+ op_ret = -EACCES;
+ return;
}
op_ret = retry_raced_bucket_write(store->getRados(), s, [&p, this, &attrs] {