]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
Allow swift acls to be deleted. 22465/head
authorMarcus Watts <mwatts@redhat.com>
Wed, 31 Jan 2018 20:46:57 +0000 (15:46 -0500)
committerPrashant D <pdhange@redhat.com>
Fri, 8 Jun 2018 03:29:47 +0000 (23:29 -0400)
The openstack "swift" command deletes acls by submitting an
acl with an empty string.  The existing logic uses c++ strings,
which can't distinguish between an empty string and a non-existant
string.  Additional, the strings are coming from RGWEnv which
supplies C strings not c++.  Using C strings instead makes it
trivial to pass "non-existance" (as a null string).  It also avoids
some type conversion with string copying.

Fixes: http://tracker.ceph.com/issues/22897
Signed-off-by: Marcus Watts <mwatts@redhat.com>
(cherry picked from commit 1fc69243bdfadb1a8c68a9fa5491e32287bc33b4)

src/rgw/rgw_acl_swift.cc
src/rgw/rgw_acl_swift.h
src/rgw/rgw_rest_swift.cc

index 71f32a69528fb3921669a0085c1f47160111c9b2..614bda36fec7edc51f96f52899c75ecab7161491 100644 (file)
@@ -24,10 +24,10 @@ using namespace std;
 
 #define SWIFT_GROUP_ALL_USERS ".r:*"
 
-static int parse_list(const std::string& uid_list,
+static int parse_list(const char* uid_list,
                       std::vector<std::string>& uids)           /* out */
 {
-  char *s = strdup(uid_list.c_str());
+  char *s = strdup(uid_list);
   if (!s) {
     return -ENOMEM;
   }
@@ -177,8 +177,8 @@ int RGWAccessControlPolicy_SWIFT::add_grants(RGWRados* const store,
 int RGWAccessControlPolicy_SWIFT::create(RGWRados* const store,
                                          const rgw_user& id,
                                          const std::string& name,
-                                         const std::string& read_list,
-                                         const std::string& write_list,
+                                         const char* read_list,
+                                         const char* write_list,
                                          uint32_t& rw_mask)
 {
   acl.create_default(id, name);
@@ -186,7 +186,7 @@ int RGWAccessControlPolicy_SWIFT::create(RGWRados* const store,
   owner.set_name(name);
   rw_mask = 0;
 
-  if (read_list.size()) {
+  if (read_list) {
     std::vector<std::string> uids;
     int r = parse_list(read_list, uids);
     if (r < 0) {
@@ -203,7 +203,7 @@ int RGWAccessControlPolicy_SWIFT::create(RGWRados* const store,
     }
     rw_mask |= SWIFT_PERM_READ;
   }
-  if (write_list.size()) {
+  if (write_list) {
     std::vector<std::string> uids;
     int r = parse_list(write_list, uids);
     if (r < 0) {
index 87bdb608f4e2560eaee153469322394b24f50eb8..f5b4558da88662febbfbab8db60c53bddc6b4497 100644 (file)
@@ -28,8 +28,8 @@ public:
   int create(RGWRados *store,
              const rgw_user& id,
              const std::string& name,
-             const std::string& read_list,
-             const std::string& write_list,
+             const char* read_list,
+             const char* write_list,
              uint32_t& rw_mask);
   void filter_merge(uint32_t mask, RGWAccessControlPolicy_SWIFT *policy);
   void to_str(std::string& read, std::string& write);
index 9dd40af9ce5d636b528adb2f8fad54a91b6edd7b..eab2420c2d377e0eb6e2690169cbc60ee4eed42d 100644 (file)
@@ -571,20 +571,12 @@ static int get_swift_container_settings(req_state * const s,
                                         RGWCORSConfiguration * const cors_config,
                                         bool * const has_cors)
 {
-  string read_list, write_list;
-
-  const char * const read_attr = s->info.env->get("HTTP_X_CONTAINER_READ");
-  if (read_attr) {
-    read_list = read_attr;
-  }
-  const char * const write_attr = s->info.env->get("HTTP_X_CONTAINER_WRITE");
-  if (write_attr) {
-    write_list = write_attr;
-  }
+  const char * const read_list = s->info.env->get("HTTP_X_CONTAINER_READ");
+  const char * const write_list = s->info.env->get("HTTP_X_CONTAINER_WRITE");
 
   *has_policy = false;
 
-  if (read_attr || write_attr) {
+  if (read_list || write_list) {
     RGWAccessControlPolicy_SWIFT swift_policy(s->cct);
     const auto r = swift_policy.create(store,
                                        s->user->user_id,