]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw_admin.cc: Prevent clobbering the index when linking a bucket.
authorcaleb miles <caleb.miles@inktank.com>
Tue, 28 Aug 2012 17:41:42 +0000 (10:41 -0700)
committerYehuda Sadeh <yehuda@inktank.com>
Wed, 29 Aug 2012 19:45:13 +0000 (12:45 -0700)
Prevent the 'bucket link' command from overwriting the index of an
existing bucket. Corrects bug 2935:

http://tracker.newdream.net/issues/2935

Signed-off-by: caleb miles <caleb.miles@inktank.com>
src/rgw/rgw_admin.cc

index 36eddaf49ac917b2c8e7dbf51b9e96fa500c6b6c..561d4a4aef72bd0e2449c2b2c51a6c1607663501 100644 (file)
@@ -1178,15 +1178,35 @@ int main(int argc, char **argv)
       //cout << "bucket is linked to user '" << owner.get_id() << "'.. unlinking" << std::endl;
       r = rgw_remove_user_bucket_info(owner.get_id(), bucket);
       if (r < 0) {
-       cerr << "could not unlink policy from user '" << owner.get_id() << "'" << std::endl;
-       return r;
+        cerr << "could not unlink policy from user '" << owner.get_id() << "'" << std::endl;
+        return r;
       }
-    }
 
-    r = create_bucket(bucket_name.c_str(), uid_str, info.display_name, info.auid);
-    if (r < 0)
+      // now update the user for the bucket...
+      if (info.display_name.empty()) {
+        cerr << "WARNING: user " << info.user_id << " has no display name set" << std::endl;
+      } else {
+        policy.create_default(info.user_id, info.display_name);
+
+        // ...and encode the acl
+        aclbl.clear();
+        policy.encode(aclbl);
+
+        r = rgwstore->set_attr(NULL, obj, RGW_ATTR_ACL, aclbl);
+        if (r < 0)
+          return r;
+
+        r = rgw_add_bucket(info.user_id, bucket);
+        if (r < 0)
+          return r;
+      }
+    } else {
+      // the bucket seems not to exist, so we should probably create it...
+      r = create_bucket(bucket_name.c_str(), uid_str, info.display_name, info.auid);
+      if (r < 0)
         cerr << "error linking bucket to user: r=" << r << std::endl;
-    return -r;
+      return -r;
+    }
   }
 
   if (opt_cmd == OPT_BUCKET_UNLINK) {