From 4d1d522943bac8f4c32e696ea590320d058f33c3 Mon Sep 17 00:00:00 2001 From: Yehuda Sadeh Date: Thu, 23 Feb 2012 14:59:10 -0800 Subject: [PATCH] rgw: show swift ACLs --- src/rgw/rgw_acl_swift.cc | 27 +++++++++++++++++++++++++-- src/rgw/rgw_acl_swift.h | 1 + src/rgw/rgw_rest_swift.cc | 14 +++++++++++++- 3 files changed, 39 insertions(+), 3 deletions(-) diff --git a/src/rgw/rgw_acl_swift.cc b/src/rgw/rgw_acl_swift.cc index e8559d7577b47..c8a217f9821dc 100644 --- a/src/rgw/rgw_acl_swift.cc +++ b/src/rgw/rgw_acl_swift.cc @@ -9,6 +9,9 @@ using namespace std; +#define SWIFT_PERM_READ RGW_PERM_READ +#define SWIFT_PERM_WRITE RGW_PERM_WRITE + static int parse_list(string& uid_list, vector& uids) { char *s = strdup(uid_list.c_str()); @@ -58,7 +61,7 @@ bool RGWAccessControlPolicy_SWIFT::create(string& id, string& name, string& read return false; } - add_grants(uids, RGW_PERM_READ); + add_grants(uids, SWIFT_PERM_READ); } if (write_list.size()) { vector uids; @@ -68,8 +71,28 @@ bool RGWAccessControlPolicy_SWIFT::create(string& id, string& name, string& read return false; } - add_grants(uids, RGW_PERM_WRITE); + add_grants(uids, SWIFT_PERM_WRITE); } return true; } +void RGWAccessControlPolicy_SWIFT::to_str(string& read, string& write) +{ + multimap& m = acl.get_grant_map(); + multimap::iterator iter; + + for (iter = m.begin(); iter != m.end(); ++iter) { + ACLGrant& grant = iter->second; + int perm = grant.get_permission().get_permissions(); + if (perm & SWIFT_PERM_READ) { + if (!read.empty()) + read.append(", "); + read.append(grant.get_id()); + } else if (perm & SWIFT_PERM_WRITE) { + if (!write.empty()) + write.append(", "); + write.append(grant.get_id()); + } + } +} + diff --git a/src/rgw/rgw_acl_swift.h b/src/rgw/rgw_acl_swift.h index 09dc21b45af06..4135d2f5ca363 100644 --- a/src/rgw/rgw_acl_swift.h +++ b/src/rgw/rgw_acl_swift.h @@ -19,6 +19,7 @@ public: void add_grants(vector& uids, int perm); bool create(string& id, string& name, string& read_list, string& write_list); + void to_str(string& read, string& write); }; #endif diff --git a/src/rgw/rgw_rest_swift.cc b/src/rgw/rgw_rest_swift.cc index f7562553261a8..66fe8a5e0e1b6 100644 --- a/src/rgw/rgw_rest_swift.cc +++ b/src/rgw/rgw_rest_swift.cc @@ -192,6 +192,18 @@ static void dump_container_metadata(struct req_state *s, RGWBucketEnt& bucket) CGI_PRINTF(s,"X-Container-Bytes-Used: %s\n", buf); snprintf(buf, sizeof(buf), "%lld", (long long)bucket.size_rounded); CGI_PRINTF(s,"X-Container-Bytes-Used-Actual: %s\n", buf); + + if (!s->object) { + RGWAccessControlPolicy_SWIFT *swift_policy = static_cast(s->bucket_acl); + string read_acl, write_acl; + swift_policy->to_str(read_acl, write_acl); + if (read_acl.size()) { + CGI_PRINTF(s, "X-Container-Read: %s\r\n", read_acl.c_str()); + } + if (write_acl.size()) { + CGI_PRINTF(s, "X-Container-Write: %s\r\n", write_acl.c_str()); + } + } } static void dump_account_metadata(struct req_state *s, uint32_t buckets_count, @@ -440,7 +452,7 @@ int RGWGetObj_REST_SWIFT::send_response(void *handle) const char *name = iter->first.c_str(); if (strncmp(name, RGW_ATTR_META_PREFIX, sizeof(RGW_ATTR_META_PREFIX)-1) == 0) { name += sizeof(RGW_ATTR_META_PREFIX) - 1; - CGI_PRINTF(s,"X-%s-Meta-%s: %s\r\n", (s->object ? "Object" : "Container"), name, iter->second.c_str()); + CGI_PRINTF(s, "X-%s-Meta-%s: %s\r\n", (s->object ? "Object" : "Container"), name, iter->second.c_str()); } else if (!content_type && strcmp(name, RGW_ATTR_CONTENT_TYPE) == 0) { content_type = iter->second.c_str(); } -- 2.39.5