From: Radoslaw Zarzynski Date: Wed, 5 Apr 2017 19:00:23 +0000 (+0200) Subject: rgw: fully respect Swift's negative, HTTP referer-based ACLs. X-Git-Tag: v12.1.0~156^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=7e1615e2ef9ae5567f0af462d3b25de9746df020;p=ceph.git rgw: fully respect Swift's negative, HTTP referer-based ACLs. Fixes: http://tracker.ceph.com/issues/18841 Signed-off-by: Radoslaw Zarzynski --- diff --git a/src/rgw/rgw_acl.cc b/src/rgw/rgw_acl.cc index b4b8f8970a5..0f246706abb 100644 --- a/src/rgw/rgw_acl.cc +++ b/src/rgw/rgw_acl.cc @@ -24,6 +24,12 @@ void RGWAccessControlList::_add_grant(ACLGrant *grant) switch (type.get_type()) { case ACL_TYPE_REFERER: referer_list.emplace_back(grant->get_referer(), perm.get_permissions()); + + /* We're specially handling the Swift's .r:* as the S3 API has a similar + * concept and thus we can have a small portion of compatibility here. */ + if (grant->get_referer() == RGW_REFERER_WILDCARD) { + acl_group_map[ACL_GROUP_ALL_USERS] |= perm.get_permissions(); + } break; case ACL_TYPE_GROUP: acl_group_map[grant->get_group()] |= perm.get_permissions(); diff --git a/src/rgw/rgw_acl.h b/src/rgw/rgw_acl.h index c1711e7597f..ed149afff46 100644 --- a/src/rgw/rgw_acl.h +++ b/src/rgw/rgw_acl.h @@ -29,6 +29,8 @@ using namespace std; #define RGW_PERM_ALL_S3 RGW_PERM_FULL_CONTROL #define RGW_PERM_INVALID 0xFF00 +static constexpr char RGW_REFERER_WILDCARD[] = "*"; + enum ACLGranteeTypeEnum { /* numbers are encoded, should not change */ ACL_TYPE_CANON_USER = 0, @@ -223,6 +225,10 @@ struct ACLReferer { return false; } + if ("*" == url_spec) { + return true; + } + if (http_host->compare(url_spec) == 0) { return true; } diff --git a/src/rgw/rgw_acl_swift.cc b/src/rgw/rgw_acl_swift.cc index 78b60124ba6..6e9fe014e28 100644 --- a/src/rgw/rgw_acl_swift.cc +++ b/src/rgw/rgw_acl_swift.cc @@ -90,11 +90,7 @@ static boost::optional referrer_to_grant(std::string url_spec, is_negative = false; } - /* We're specially handling the .r:* as the S3 API has a similar concept - * and thus we can have a small portion of compatibility here. */ - if (url_spec == "*") { - grant.set_group(ACL_GROUP_ALL_USERS, is_negative ? 0 : perm); - } else { + if (url_spec != RGW_REFERER_WILDCARD) { if ('*' == url_spec[0]) { url_spec = url_spec.substr(1); boost::algorithm::trim(url_spec); @@ -103,10 +99,13 @@ static boost::optional referrer_to_grant(std::string url_spec, if (url_spec.empty() || url_spec == ".") { return boost::none; } - - grant.set_referer(url_spec, is_negative ? 0 : perm); + } else { + /* Please be aware we're specially handling the .r:* in _add_grant() + * of RGWAccessControlList as the S3 API has a similar concept, and + * thus we can have a small portion of compatibility. */ } + grant.set_referer(url_spec, is_negative ? 0 : perm); return grant; } catch (std::out_of_range) { return boost::none;