#ifndef CEPH_RGW_USER_H #define CEPH_RGW_USER_H #include #include "include/types.h" #include "rgw_common.h" #include "rgw_tools.h" using namespace std; #define RGW_USER_ANON_ID "anonymous" /** * A string wrapper that includes encode/decode functions * for easily accessing a UID in all forms */ struct RGWUID { string user_id; void encode(bufferlist& bl) const { ::encode(user_id, bl); } void decode(bufferlist::iterator& bl) { ::decode(user_id, bl); } }; WRITE_CLASS_ENCODER(RGWUID) /** * Get the anonymous (ie, unauthenticated) user info. */ extern void rgw_get_anon_user(RGWUserInfo& info); /** * verify that user is an actual user, and not the anonymous user */ extern bool rgw_user_is_authenticated(RGWUserInfo& info); /** * Save the given user information to storage. * Returns: 0 on success, -ERR# on failure. */ extern int rgw_store_user_info(RGWRados *store, RGWUserInfo& info, bool exclusive); /** * Given an email, finds the user info associated with it. * returns: 0 on success, -ERR# on failure (including nonexistence) */ extern int rgw_get_user_info_by_uid(RGWRados *store, string& user_id, RGWUserInfo& info); /** * Given an swift username, finds the user info associated with it. * returns: 0 on success, -ERR# on failure (including nonexistence) */ extern int rgw_get_user_info_by_email(RGWRados *store, string& email, RGWUserInfo& info); /** * Given an swift username, finds the user info associated with it. * returns: 0 on success, -ERR# on failure (including nonexistence) */ extern int rgw_get_user_info_by_swift(RGWRados *store, string& swift_name, RGWUserInfo& info); /** * Given an access key, finds the user info associated with it. * returns: 0 on success, -ERR# on failure (including nonexistence) */ extern int rgw_get_user_info_by_access_key(RGWRados *store, string& access_key, RGWUserInfo& info); /** * Given an RGWUserInfo, deletes the user and its bucket ACLs. */ extern int rgw_delete_user(RGWRados *store, RGWUserInfo& user); /** * Store a list of the user's buckets, with associated functinos. */ class RGWUserBuckets { map buckets; public: RGWUserBuckets() {} void encode(bufferlist& bl) const { ::encode(buckets, bl); } void decode(bufferlist::iterator& bl) { ::decode(buckets, bl); } /** * Check if the user owns a bucket by the given name. */ bool owns(string& name) { map::iterator iter; iter = buckets.find(name); return (iter != buckets.end()); } /** * Add a (created) bucket to the user's bucket list. */ void add(RGWBucketEnt& bucket) { buckets[bucket.bucket.name] = bucket; } /** * Remove a bucket from the user's list by name. */ void remove(string& name) { map::iterator iter; iter = buckets.find(name); if (iter != buckets.end()) { buckets.erase(iter); } } /** * Get the user's buckets as a map. */ map& get_buckets() { return buckets; } /** * Cleanup data structure */ void clear() { buckets.clear(); } size_t count() { return buckets.size(); } }; WRITE_CLASS_ENCODER(RGWUserBuckets) /** * Get all the buckets owned by a user and fill up an RGWUserBuckets with them. * Returns: 0 on success, -ERR# on failure. */ extern int rgw_read_user_buckets(RGWRados *store, string user_id, RGWUserBuckets& buckets, bool need_stats); /** * Store the set of buckets associated with a user. * This completely overwrites any previously-stored list, so be careful! * Returns 0 on success, -ERR# otherwise. */ extern int rgw_write_buckets_attr(RGWRados *store, string user_id, RGWUserBuckets& buckets); extern int rgw_add_bucket(RGWRados *store, string user_id, rgw_bucket& bucket); extern int rgw_remove_user_bucket_info(RGWRados *store, string user_id, rgw_bucket& bucket); /* * remove the different indexes */ extern int rgw_remove_key_index(RGWRados *store, RGWAccessKey& access_key); extern int rgw_remove_uid_index(RGWRados *store, string& uid); extern int rgw_remove_email_index(RGWRados *store, string& email); extern int rgw_remove_swift_name_index(RGWRados *store, string& swift_name); #endif