From: Colin Patrick McCabe Date: Thu, 26 May 2011 20:28:39 +0000 (-0700) Subject: obysnc: rgw target: validate all users X-Git-Tag: v0.29~22^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=6f704e33980b8b9b0eff6a7fff7244b79f02dda8;p=ceph.git obysnc: rgw target: validate all users Signed-off-by: Colin McCabe --- diff --git a/src/obsync/obsync b/src/obsync/obsync index 0d58719ae0b..eb3255fc7d7 100755 --- a/src/obsync/obsync +++ b/src/obsync/obsync @@ -352,6 +352,13 @@ class AclPolicy(object): self.owner_display_name = "" for k,g in self.grants.items(): g.translate_users(xusers) + def get_all_users(self): + """ Get a list of all user ids referenced in this ACL """ + users = {} + users[ACL_TYPE_CANON_USER + self.owner_id] = 1 + for k,g in self.grants.items(): + users[k] = 1 + return users.keys() def set_owner(self, owner_id): self.owner_id = owner_id self.owner_display_name = "" @@ -828,7 +835,7 @@ rgw:/path/to/ceph/conf:pool:key_prefix. Failed to find the bucket.") self.rados = rados.Rados() self.rados.conf_read_file(self.conf_file_path) self.rados.connect() - if self.owner != None and not self.user_exists(self.owner): + if self.owner != None and not self.user_exists(ACL_TYPE_CANON_USER + self.owner): raise Exception("Unknown owner! DST_OWNER=%s" % self.owner) if (not self.rados.pool_exists(self.rgw_bucket_name)): if (create): @@ -939,18 +946,25 @@ xsi:type=\"CanonicalUser\">%s \ return RgwStoreIterator(it, self) def locate_object(self, obj): return self.obsync_obj_from_rgw(obj.name) - def user_exists(self, user_id): - if (self.user_exists_cache.has_key(user_id)): - return self.user_exists_cache[user_id] - if (self.users_uid_ioctx == None): - # will be closed in __del__ - self.users_uid_ioctx = self.rados.open_ioctx(RGW_USERS_UID_BUCKET_NAME) - try: - self.users_uid_ioctx.stat(user_id) - except rados.ObjectNotFound: - return False - self.user_exists_cache[user_id] = True - return True + def user_exists(self, user): + if (self.user_exists_cache.has_key(user)): + return self.user_exists_cache[user] + if user[:len(ACL_TYPE_CANON_USER)] == ACL_TYPE_CANON_USER: + if (self.users_uid_ioctx == None): + # will be closed in __del__ + self.users_uid_ioctx = self.rados.open_ioctx(RGW_USERS_UID_BUCKET_NAME) + try: + self.users_uid_ioctx.stat(user[len(ACL_TYPE_CANON_USER):]) + except rados.ObjectNotFound: + return False + self.user_exists_cache[user] = True + return True + elif user[:len(ACL_TYPE_EMAIL_USER)] == ACL_TYPE_EMAIL_USER: + raise Exception("rgw target can't handle email users yet.") + elif user[:len(ACL_TYPE_GROUP)] == ACL_TYPE_GROUP: + raise Exception("rgw target can't handle groups yet.") + else: + raise Exception("can't understand user name %s" % user) def upload(self, local_copy, src_acl, obj): global lrgw if (opts.more_verbose): @@ -973,6 +987,10 @@ xsi:type=\"CanonicalUser\">%s \ ap = AclPolicy.create_default(self.owner) else: ap = src_acl.acl_policy + for user in ap.get_all_users(): + if not self.user_exists(user): + raise Exception("You must provide an --xuser entry to translate \ +user %s into something valid for the rgw destination.") xml = ap.to_xml() bin_ = lrgw.acl_xml2bin(xml) self.ioctx.set_xattr(obj.name, "user.rgw.acl", bin_) diff --git a/src/obsync/test-obsync.py b/src/obsync/test-obsync.py index 719d961f90d..bca8e6ccbb9 100755 --- a/src/obsync/test-obsync.py +++ b/src/obsync/test-obsync.py @@ -682,10 +682,12 @@ assert_xattr("%s/user_defined_md2/spork" % tdir, # more rgw target tests if len(opts.pools) > 0: # synchronize from an s3 bucket to an bucket directly - obsync_check(opts.buckets[1], opts.pools[0], ["--delete-after"] + \ - xuser(sconfig, "main", "alt")) + obsync_check(opts.buckets[1], opts.pools[0], ["--delete-after"]) obsync_check(opts.pools[0], "%s/rgw4" % tdir, ["--delete-after", "-c"]) obsync_check(opts.buckets[1], "%s/rgw5" % tdir, ["--delete-after", "-c"]) compare_directories("%s/rgw4" % tdir, "%s/rgw5" % tdir, compare_xattr = True) + # restore proper ownership to the bucket + obsync_check(opts.buckets[1], opts.pools[0], ["--delete-after"] + \ + xuser(sconfig, "alt", "main")) sys.exit(0)