if (ret < 0) {
if (s->system_request) {
dout(2) << "overriding permissions due to system operation" << dendl;
+ } else if (s->auth_identity->is_admin_of(s->user->user_id)) {
+ dout(2) << "overriding permissions due to admin operation" << dendl;
} else {
abort_req(s, op, ret);
goto done;
if (ret < 0) {
if (s->system_request) {
dout(2) << "overriding permissions due to system operation" << dendl;
+ } else if (s->auth_identity->is_admin_of(s->user->user_id)) {
+ dout(2) << "overriding permissions due to admin operation" << dendl;
} else {
abort_req(s, op, ret);
goto done;
new RGWDummyIdentityApplier(s->cct,
s->user->user_id,
s->perm_mask,
+ /* System user has admin permissions by default - it's supposed to pass
+ * through any security check. */
s->system_request));
}
RGWAccessControlPolicy *bucket_acl;
RGWAccessControlPolicy *object_acl;
+ /* Is the request made by an user marked as a system one?
+ * Being system user means we also have the admin status. */
bool system_request;
/* aws4 auth support */
return ret;
}
- rgw_user& owner = bucket_policy.get_owner().get_id();
- if (!s->system_request && owner.compare(s->user->user_id) != 0 &&
+ const rgw_user& bucket_owner = bucket_policy.get_owner().get_id();
+ if (bucket_owner.compare(s->user->user_id) != 0 &&
+ !s->auth_identity->is_admin_of(bucket_owner) &&
!bucket_policy.verify_permission(*s->auth_identity, s->perm_mask,
RGW_PERM_READ)) {
ret = -EACCES;
return op_ret;
}
- if (!s->system_request && /* admin request overrides permission checks */
- !src_policy.verify_permission(*s->auth_identity, s->perm_mask, RGW_PERM_READ)) {
+ /* admin request overrides permission checks */
+ if (!s->auth_identity->is_admin_of(src_policy.get_owner().get_id()) &&
+ !src_policy.verify_permission(*s->auth_identity, s->perm_mask,
+ RGW_PERM_READ)) {
return -EACCES;
}
}
return op_ret;
}
- if (!s->system_request && /* system request overrides permission checks */
+ /* admin request overrides permission checks */
+ if (!s->auth_identity->is_admin_of(dest_policy.get_owner().get_id()) &&
!dest_bucket_policy.verify_permission(*s->auth_identity, s->perm_mask,
RGW_PERM_WRITE)) {
return -EACCES;
if (ret < 0) {
if (s->system_request) {
dout(2) << "overriding permissions due to system operation" << dendl;
+ } else if (s->auth_identity->is_admin_of(s->user->user_id)) {
+ dout(2) << "overriding permissions due to admin operation" << dendl;
} else {
abort_early(s, op, ret, handler);
goto done;