]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
librgw: split RGWUserInfo from struct req_state
authorMatt Benjamin <mbenjamin@redhat.com>
Mon, 5 Oct 2015 19:42:35 +0000 (15:42 -0400)
committerMatt Benjamin <mbenjamin@redhat.com>
Fri, 12 Feb 2016 17:04:43 +0000 (12:04 -0500)
The immediate purpose is to permit auth caching in RGWLib, but
it seems likely that this will be useful for general req_state
de-bloatification.

For now, all request processing paths put a RGWUserInfo on the
stack, so the lifetime of the object is unchanged from when it was
an expanded member.  A later change will introduce caching of
the objects.

Signed-off-by: Matt Benjamin <mbenjamin@redhat.com>
15 files changed:
src/rgw/librgw.cc
src/rgw/rgw_common.cc
src/rgw/rgw_common.h
src/rgw/rgw_file.h
src/rgw/rgw_log.cc
src/rgw/rgw_op.cc
src/rgw/rgw_process.cc
src/rgw/rgw_rest.cc
src/rgw/rgw_rest_log.h
src/rgw/rgw_rest_opstate.h
src/rgw/rgw_rest_replica_log.h
src/rgw/rgw_rest_s3.cc
src/rgw/rgw_rest_swift.cc
src/rgw/rgw_rest_user.cc
src/rgw/rgw_swift.cc

index 3e42d2b10c4dfb00591638ec7192a525bf138565..7108bd28089b4c871da673d047e6eb6e09f339bb 100644 (file)
@@ -200,8 +200,10 @@ int RGWLibProcess::process_request(RGWLibRequest* req, RGWLibIO* io)
    */
   rgw_env.set("HTTP_HOST", "10.1.1.220" /* XXXX: fix me */);
 
+  RGWUserInfo userinfo;
+
   /* XXX and -then- bloat up req_state with string copies from it */
-  struct req_state rstate(req->cct, &rgw_env);
+  struct req_state rstate(req->cct, &rgw_env, &userinfo);
   struct req_state *s = &rstate;
 
   // XXX fix this
@@ -238,8 +240,8 @@ int RGWLibProcess::process_request(RGWLibRequest* req, RGWLibIO* io)
   }
 #endif
 
-  if (s->user.suspended) {
-    dout(10) << "user is suspended, uid=" << s->user.user_id << dendl;
+  if (s->user->suspended) {
+    dout(10) << "user is suspended, uid=" << s->user->user_id << dendl;
     abort_req(s, op, -ERR_USER_SUSPENDED);
     goto done;
   }
index 80b6c1bd4ace6bbefb51f3434a870ed24fee360b..fec4ad7857d0d2ccfd44a2a1142634222c86a632 100644 (file)
@@ -144,9 +144,9 @@ void req_info::rebuild_from(req_info& src)
 }
 
 
-req_state::req_state(CephContext *_cct, class RGWEnv *e) : cct(_cct), cio(NULL), op(OP_UNKNOWN),
-                                                          has_acl_header(false),
-                                                           os_auth_token(NULL), info(_cct, e)
+req_state::req_state(CephContext* _cct, RGWEnv* e, RGWUserInfo* u)
+  : cct(_cct), cio(NULL), op(OP_UNKNOWN), user(u), has_acl_header(false),
+    os_auth_token(NULL), info(_cct, e)
 {
   enable_ops_log = e->conf->enable_ops_log;
   enable_usage_log = e->conf->enable_usage_log;
@@ -709,7 +709,7 @@ bool verify_requester_payer_permission(struct req_state *s)
   if (!s->bucket_info.requester_pays)
     return true;
 
-  if (s->bucket_info.owner == s->user.user_id)
+  if (s->bucket_info.owner == s->user->user_id)
     return true;
 
   const char *request_payer = s->info.env->get("HTTP_X_AMZ_REQUEST_PAYER");
@@ -741,7 +741,7 @@ bool verify_bucket_permission(struct req_state * const s,
   if (!verify_requester_payer_permission(s))
     return false;
 
-  return bucket_acl->verify_permission(s->user.user_id, perm, perm);
+  return bucket_acl->verify_permission(s->user->user_id, perm, perm);
 }
 
 bool verify_bucket_permission(struct req_state * const s, const int perm)
@@ -774,7 +774,8 @@ bool verify_object_permission(struct req_state * const s,
   if (!object_acl)
     return false;
 
-  bool ret = object_acl->verify_permission(s->user.user_id, s->perm_mask, perm);
+  bool ret = object_acl->verify_permission(s->user->user_id, s->perm_mask,
+                                         perm);
   if (ret)
     return true;
 
@@ -794,7 +795,8 @@ bool verify_object_permission(struct req_state * const s,
     return false;
   /* we already verified the user mask above, so we pass swift_perm as the mask here,
      otherwise the mask might not cover the swift permissions bits */
-  return bucket_acl->verify_permission(s->user.user_id, swift_perm, swift_perm);
+  return bucket_acl->verify_permission(s->user->user_id, swift_perm,
+                                     swift_perm);
 }
 
 bool verify_object_permission(struct req_state *s, int perm)
index 26f0249bb08b74b2a02eccbba0c541ff43a8a949..88c82fc03f9d6a56fdc0ba3d23436488992b9a0e 100644 (file)
@@ -1118,7 +1118,8 @@ struct req_state {
 
   bool has_bad_meta;
 
-  RGWUserInfo user; 
+  RGWUserInfo *user;
+
   RGWAccessControlPolicy *bucket_acl;
   RGWAccessControlPolicy *object_acl;
 
@@ -1146,7 +1147,7 @@ struct req_state {
   string req_id;
   string trans_id;
 
-  req_state(CephContext *_cct, class RGWEnv* e);
+  req_state(CephContext* _cct, RGWEnv* e, RGWUserInfo* u);
   ~req_state();
 };
 
index 8c3b480e179ed21b47437c99db0bd1d371c74014..05bf789c2817810553b1013ad534b7f4cc74b66a 100644 (file)
@@ -80,8 +80,8 @@ public:
     s->info.domain = ""; /* XXX ? */
 
     /* XXX fake user_id (will fix) */
-    s->user.user_id = user_id;
-    s->user.display_name = user_id;
+    s->user->user_id = user_id;
+    s->user->display_name = user_id;
 
     return 0;
   }
@@ -142,8 +142,8 @@ public:
     s->info.domain = ""; /* XXX ? */
 
     /* XXX fake user_id and perms (will fix) */
-    s->user.user_id = user_id;
-    s->user.display_name = user_id;
+    s->user->user_id = user_id;
+    s->user->display_name = user_id;
     s->perm_mask = RGW_PERM_READ;
 
     return 0;
index cea03e66265183bb81f847aadfd56ebdaa8acc1b..9f4934945bea09170c52e330487832a51b3ecdb0 100644 (file)
@@ -182,7 +182,7 @@ static void log_usage(struct req_state *s, const string& op_name)
   if (!s->bucket_name.empty())
     user = s->bucket_owner.get_id();
   else
-    user = s->user.user_id;
+    user = s->user->user_id;
 
   string id = user.to_str();
   rgw_usage_log_entry entry(id, s->bucket.name);
@@ -315,7 +315,7 @@ int rgw_log_op(RGWRados *store, struct req_state *s, const string& op_name, OpsL
   set_param_str(s, "REQUEST_URI", entry.uri);
   set_param_str(s, "REQUEST_METHOD", entry.op);
 
-  entry.user = s->user.user_id.to_str();
+  entry.user = s->user->user_id.to_str();
   if (s->object_acl)
     entry.object_owner = s->object_acl->get_owner().get_id();
   entry.bucket_owner = s->bucket_owner.get_id();
index 7d46b62d3960cb7d27592018dc3048a7dcb566a5..7ae0a6cdf2685b3a648abc9ff009058c3b82d3e0 100644 (file)
@@ -322,8 +322,9 @@ static int read_policy(RGWRados *store, struct req_state *s,
     if (ret < 0)
       return ret;
     rgw_user& owner = bucket_policy.get_owner().get_id();
-    if (!s->system_request && owner.compare(s->user.user_id) != 0 &&
-        !bucket_policy.verify_permission(s->user.user_id, s->perm_mask, RGW_PERM_READ))
+    if (!s->system_request && owner.compare(s->user->user_id) != 0 &&
+        !bucket_policy.verify_permission(s->user->user_id, s->perm_mask,
+                                       RGW_PERM_READ))
       ret = -EACCES;
     else
       ret = -ENOENT;
@@ -399,7 +400,7 @@ int rgw_build_bucket_policies(RGWRados* store, struct req_state* s)
       rgw_obj_key no_obj;
       ret = read_policy(store, s, s->bucket_info, s->bucket_attrs, s->bucket_acl, s->bucket, no_obj);
     } else {
-      s->bucket_acl->create_default(s->user.user_id, s->user.display_name);
+      s->bucket_acl->create_default(s->user->user_id, s->user->display_name);
       ret = -ERR_NO_SUCH_BUCKET;
     }
 
@@ -481,13 +482,15 @@ int RGWOp::verify_op_mask()
 {
   uint32_t required_mask = op_mask();
 
-  ldout(s->cct, 20) << "required_mask= " << required_mask << " user.op_mask=" << s->user.op_mask << dendl;
+  ldout(s->cct, 20) << "required_mask= " << required_mask
+                   << " user.op_mask=" << s->user->op_mask << dendl;
 
-  if ((s->user.op_mask & required_mask) != required_mask) {
+  if ((s->user->op_mask & required_mask) != required_mask) {
     return -EPERM;
   }
 
-  if (!s->system_request && (required_mask & RGW_OP_TYPE_MODIFY) && !store->zone.is_master)  {
+  if (!s->system_request && (required_mask & RGW_OP_TYPE_MODIFY) &&
+      !store->zone.is_master)  {
     ldout(s->cct, 5) << "NOTICE: modify request to a non-master zone by a non-system user, permission denied"  << dendl;
     return -EPERM;
   }
@@ -502,7 +505,7 @@ int RGWOp::init_quota()
     return 0;
 
   /* init quota related stuff */
-  if (!(s->user.op_mask & RGW_OP_TYPE_MODIFY)) {
+  if (!(s->user->op_mask & RGW_OP_TYPE_MODIFY)) {
     return 0;
   }
 
@@ -514,8 +517,8 @@ int RGWOp::init_quota()
   RGWUserInfo owner_info;
   RGWUserInfo *uinfo;
 
-  if (s->user.user_id == s->bucket_owner.get_id()) {
-    uinfo = &s->user;
+  if (s->user->user_id == s->bucket_owner.get_id()) {
+    uinfo = s->user;
   } else {
     int r = rgw_get_user_info_by_uid(store, s->bucket_info.owner, owner_info);
     if (r < 0)
@@ -944,10 +947,12 @@ int RGWGetObj::handle_user_manifest(const char *prefix)
     RGWBucketInfo bucket_info;
     map<string, bufferlist> bucket_attrs;
     RGWObjectCtx obj_ctx(store);
-    int r = store->get_bucket_info(obj_ctx, s->user.user_id.tenant, bucket_name,
-                                   bucket_info, NULL, &bucket_attrs);
+    int r = store->get_bucket_info(obj_ctx, s->user->user_id.tenant,
+                                 bucket_name, bucket_info, NULL,
+                                 &bucket_attrs);
     if (r < 0) {
-      ldout(s->cct, 0) << "could not get bucket info for bucket=" << bucket_name << dendl;
+      ldout(s->cct, 0) << "could not get bucket info for bucket="
+                      << bucket_name << dendl;
       return r;
     }
     bucket = bucket_info.bucket;
@@ -1031,10 +1036,11 @@ int RGWGetObj::handle_slo_manifest(bufferlist& bl)
         RGWBucketInfo bucket_info;
         map<string, bufferlist> bucket_attrs;
         RGWObjectCtx obj_ctx(store);
-        int r = store->get_bucket_info(obj_ctx, s->user.user_id.tenant,
+        int r = store->get_bucket_info(obj_ctx, s->user->user_id.tenant,
               bucket_name, bucket_info, NULL, &bucket_attrs);
         if (r < 0) {
-          ldout(s->cct, 0) << "could not get bucket info for bucket=" << bucket_name << dendl;
+          ldout(s->cct, 0) << "could not get bucket info for bucket="
+                          << bucket_name << dendl;
           return r;
         }
         bucket = bucket_info.bucket;
@@ -1300,7 +1306,7 @@ void RGWListBuckets::execute()
   }
 
   if (supports_account_metadata()) {
-    op_ret = rgw_get_user_attrs_by_uid(store, s->user.user_id, attrs);
+    op_ret = rgw_get_user_attrs_by_uid(store, s->user->user_id, attrs);
     if (op_ret < 0) {
       goto send_end;
     }
@@ -1315,14 +1321,14 @@ void RGWListBuckets::execute()
       read_count = max_buckets;
     }
 
-    op_ret = rgw_read_user_buckets(store, s->user.user_id, buckets,
+    op_ret = rgw_read_user_buckets(store, s->user->user_id, buckets,
                                   marker, end_marker, read_count,
                                   should_get_stats(), 0);
-
     if (op_ret < 0) {
       /* hmm.. something wrong here.. the user was authenticated, so it
          should exist */
-      ldout(s->cct, 10) << "WARNING: failed on rgw_get_user_buckets uid=" << s->user.user_id << dendl;
+      ldout(s->cct, 10) << "WARNING: failed on rgw_get_user_buckets uid="
+                       << s->user->user_id << dendl;
       break;
     }
     map<string, RGWBucketEnt>& m = buckets.get_buckets();
@@ -1374,12 +1380,13 @@ void RGWStatAccount::execute()
   do {
     RGWUserBuckets buckets;
 
-    op_ret = rgw_read_user_buckets(store, s->user.user_id, buckets,
+    op_ret = rgw_read_user_buckets(store, s->user->user_id, buckets,
                                   marker, string(), max_buckets, false);
     if (op_ret < 0) {
       /* hmm.. something wrong here.. the user was authenticated, so it
          should exist */
-      ldout(s->cct, 10) << "WARNING: failed on rgw_get_user_buckets uid=" << s->user.user_id << dendl;
+      ldout(s->cct, 10) << "WARNING: failed on rgw_get_user_buckets uid="
+                       << s->user->user_id << dendl;
       break;
     } else {
       map<string, RGWBucketEnt>& m = buckets.get_buckets();
@@ -1401,7 +1408,7 @@ void RGWStatAccount::execute()
 
 int RGWGetBucketVersioning::verify_permission()
 {
-  if (s->user.user_id.compare(s->bucket_owner.get_id()) != 0)
+  if (s->user->user_id.compare(s->bucket_owner.get_id()) != 0)
     return -EACCES;
 
   return 0;
@@ -1420,7 +1427,7 @@ void RGWGetBucketVersioning::execute()
 
 int RGWSetBucketVersioning::verify_permission()
 {
-  if (s->user.user_id.compare(s->bucket_owner.get_id()) != 0)
+  if (s->user->user_id.compare(s->bucket_owner.get_id()) != 0)
     return -EACCES;
 
   return 0;
@@ -1455,7 +1462,7 @@ void RGWSetBucketVersioning::execute()
 
 int RGWGetBucketWebsite::verify_permission()
 {
-  if (s->user.user_id.compare(s->bucket_owner.get_id()) != 0)
+  if (s->user->user_id.compare(s->bucket_owner.get_id()) != 0)
     return -EACCES;
 
   return 0;
@@ -1475,7 +1482,7 @@ void RGWGetBucketWebsite::execute()
 
 int RGWSetBucketWebsite::verify_permission()
 {
-  if (s->user.user_id.compare(s->bucket_owner.get_id()) != 0)
+  if (s->user->user_id.compare(s->bucket_owner.get_id()) != 0)
     return -EACCES;
 
   return 0;
@@ -1505,7 +1512,7 @@ void RGWSetBucketWebsite::execute()
 
 int RGWDeleteBucketWebsite::verify_permission()
 {
-  if (s->user.user_id.compare(s->bucket_owner.get_id()) != 0)
+  if (s->user->user_id.compare(s->bucket_owner.get_id()) != 0)
     return -EACCES;
 
   return 0;
@@ -1626,7 +1633,7 @@ void RGWListBucket::execute()
 
 int RGWGetBucketLogging::verify_permission()
 {
-  if (s->user.user_id.compare(s->bucket_owner.get_id()) != 0)
+  if (s->user->user_id.compare(s->bucket_owner.get_id()) != 0)
     return -EACCES;
 
   return 0;
@@ -1634,7 +1641,7 @@ int RGWGetBucketLogging::verify_permission()
 
 int RGWGetBucketLocation::verify_permission()
 {
-  if (s->user.user_id.compare(s->bucket_owner.get_id()) != 0)
+  if (s->user->user_id.compare(s->bucket_owner.get_id()) != 0)
     return -EACCES;
 
   return 0;
@@ -1642,25 +1649,28 @@ int RGWGetBucketLocation::verify_permission()
 
 int RGWCreateBucket::verify_permission()
 {
-  if (!rgw_user_is_authenticated(s->user))
+  if (!rgw_user_is_authenticated(*(s->user)))
     return -EACCES;
 
-  if (s->user.user_id.tenant != s->bucket_tenant) {
-    ldout(s->cct, 10) << "user cannot create a bucket in a different tenant (user_id.tenant=" << s->user.user_id.tenant << " requested=" << s->bucket_tenant << ")" << dendl;
+  if (s->user->user_id.tenant != s->bucket_tenant) {
+    ldout(s->cct, 10)
+      << "user cannot create a bucket in a different tenant (user_id.tenant="
+      << s->user->user_id.tenant << " requested=" << s->bucket_tenant << ")"
+      << dendl;
     return -EACCES;
   }
 
-  if (s->user.max_buckets) {
+  if (s->user->max_buckets) {
     RGWUserBuckets buckets;
     string marker;
-    op_ret = rgw_read_user_buckets(store, s->user.user_id, buckets,
-                                  marker, string(), s->user.max_buckets,
+    op_ret = rgw_read_user_buckets(store, s->user->user_id, buckets,
+                                  marker, string(), s->user->max_buckets,
                                   false);
     if (op_ret < 0)
       return op_ret;
 
     map<string, RGWBucketEnt>& m = buckets.get_buckets();
-    if (m.size() >= s->user.max_buckets) {
+    if (m.size() >= s->user->max_buckets) {
       return -ERR_TOO_MANY_BUCKETS;
     }
   }
@@ -1668,7 +1678,9 @@ int RGWCreateBucket::verify_permission()
   return 0;
 }
 
-static int forward_request_to_master(struct req_state *s, obj_version *objv, RGWRados *store, bufferlist& in_data, JSONParser *jp)
+static int forward_request_to_master(struct req_state *s, obj_version *objv,
+                                   RGWRados *store, bufferlist& in_data,
+                                   JSONParser *jp)
 {
   if (!store->rest_master_conn) {
     ldout(s->cct, 0) << "rest connection is invalid" << dendl;
@@ -1676,9 +1688,11 @@ static int forward_request_to_master(struct req_state *s, obj_version *objv, RGW
   }
   ldout(s->cct, 0) << "sending create_bucket request to master region" << dendl;
   bufferlist response;
-  string uid_str = s->user.user_id.to_str();
+  string uid_str = s->user->user_id.to_str();
 #define MAX_REST_RESPONSE (128 * 1024) // we expect a very small response
-  int ret = store->rest_master_conn->forward(uid_str, s->info, objv, MAX_REST_RESPONSE, &in_data, &response);
+  int ret = store->rest_master_conn->forward(uid_str, s->info, objv,
+                                           MAX_REST_RESPONSE, &in_data,
+                                           &response);
   if (ret < 0)
     return ret;
 
@@ -1719,7 +1733,8 @@ void RGWCreateBucket::execute()
     return;
   }
 
-  /* we need to make sure we read bucket info, it's not read before for this specific request */
+  /* we need to make sure we read bucket info, it's not read before for this
+   * specific request */
   RGWObjectCtx& obj_ctx = *static_cast<RGWObjectCtx *>(s->obj_ctx);
   op_ret = store->get_bucket_info(obj_ctx, s->bucket_tenant, s->bucket_name,
                                  s->bucket_info, NULL, &s->bucket_attrs);
@@ -1727,13 +1742,13 @@ void RGWCreateBucket::execute()
     return;
   s->bucket_exists = (op_ret != -ENOENT);
 
-  s->bucket_owner.set_id(s->user.user_id);
-  s->bucket_owner.set_name(s->user.display_name);
+  s->bucket_owner.set_id(s->user->user_id);
+  s->bucket_owner.set_name(s->user->display_name);
   if (s->bucket_exists) {
-    int r = get_policy_from_attr(s->cct, store, s->obj_ctx, s->bucket_info, s->bucket_attrs,
-                                 &old_policy, obj);
+    int r = get_policy_from_attr(s->cct, store, s->obj_ctx, s->bucket_info,
+                               s->bucket_attrs, &old_policy, obj);
     if (r >= 0)  {
-      if (old_policy.get_owner().get_id().compare(s->user.user_id) != 0) {
+      if (old_policy.get_owner().get_id().compare(s->user->user_id) != 0) {
         op_ret = -EEXIST;
         return;
       }
@@ -1777,10 +1792,10 @@ void RGWCreateBucket::execute()
   if (s->bucket_exists) {
     string selected_placement_rule;
     rgw_bucket bucket;
-    op_ret = store->select_bucket_placement(s->user, region_name,
-                                           placement_rule,
-                                           s->bucket_tenant, s->bucket_name,
-                                           bucket, &selected_placement_rule);
+    op_ret = store->select_bucket_placement(*(s->user), region_name,
+                                           placement_rule, s->bucket_tenant,
+                                           s->bucket_name, bucket,
+                                           &selected_placement_rule);
     if (selected_placement_rule != s->bucket_info.placement_rule) {
       op_ret = -EEXIST;
       return;
@@ -1797,11 +1812,11 @@ void RGWCreateBucket::execute()
   }
   s->bucket.tenant = s->bucket_tenant; /* ignored if bucket exists */
   s->bucket.name = s->bucket_name;
-  op_ret = store->create_bucket(s->user, s->bucket, region_name, placement_rule,
-                               attrs, info, pobjv, &ep_objv, creation_time,
-                               pmaster_bucket, true);
-  /* continue if EEXIST and create_bucket will fail below.  this way we can recover
-   * from a partial create by retrying it. */
+  op_ret = store->create_bucket(*(s->user), s->bucket, region_name,
+                               placement_rule, attrs, info, pobjv, &ep_objv,
+                               creation_time, pmaster_bucket, true);
+  /* continue if EEXIST and create_bucket will fail below.  this way we can
+   * recover from a partial create by retrying it. */
   ldout(s->cct, 20) << "rgw_create_bucket returned ret=" << op_ret << " bucket=" << s->bucket << dendl;
 
   if (op_ret && op_ret != -EEXIST)
@@ -1816,18 +1831,18 @@ void RGWCreateBucket::execute()
      * If all is ok then update the user's list of buckets.
      * Otherwise inform client about a name conflict.
      */
-    if (info.owner.compare(s->user.user_id) != 0) {
+    if (info.owner.compare(s->user->user_id) != 0) {
       op_ret = -EEXIST;
       return;
     }
     s->bucket = info.bucket;
   }
 
-  op_ret = rgw_link_bucket(store, s->user.user_id, s->bucket,
+  op_ret = rgw_link_bucket(store, s->user->user_id, s->bucket,
                           info.creation_time, false);
   if (op_ret && !existed && op_ret != -EEXIST) {
     /* if it exists (or previously existed), don't remove it! */
-    op_ret = rgw_unlink_bucket(store, s->user.user_id, s->bucket.tenant,
+    op_ret = rgw_unlink_bucket(store, s->user->user_id, s->bucket.tenant,
                               s->bucket.name);
     if (op_ret < 0) {
       ldout(s->cct, 0) << "WARNING: failed to unlink bucket: ret=" << op_ret
@@ -1885,7 +1900,7 @@ void RGWDeleteBucket::execute()
 
   op_ret = store->delete_bucket(s->bucket, ot);
   if (op_ret == 0) {
-    op_ret = rgw_unlink_bucket(store, s->user.user_id, s->bucket.tenant,
+    op_ret = rgw_unlink_bucket(store, s->user->user_id, s->bucket.tenant,
                               s->bucket.name, false);
     if (op_ret < 0) {
       ldout(s->cct, 0) << "WARNING: failed to unlink bucket: ret=" << op_ret
@@ -2580,9 +2595,10 @@ static void prepare_add_del_attrs(const map<string, bufferlist>& orig_attrs,
   }
 }
 
-int RGWPutMetadataAccount::handle_temp_url_update(const map<int, string>& temp_url_keys) {
+int RGWPutMetadataAccount::handle_temp_url_update(
+  const map<int, string>& temp_url_keys) {
   RGWUserAdminOpState user_op;
-  user_op.set_user_id(s->user.user_id);
+  user_op.set_user_id(s->user->user_id);
 
   map<int, string>::const_iterator iter;
   for (iter = temp_url_keys.begin(); iter != temp_url_keys.end(); ++iter) {
@@ -2609,7 +2625,7 @@ int RGWPutMetadataAccount::handle_temp_url_update(const map<int, string>& temp_u
 
 int RGWPutMetadataAccount::verify_permission()
 {
-  if (!rgw_user_is_authenticated(s->user)) {
+  if (!rgw_user_is_authenticated(*(s->user))) {
     return -EACCES;
   }
   // if ((s->perm_mask & RGW_PERM_WRITE) == 0) {
@@ -2660,7 +2676,8 @@ void RGWPutMetadataAccount::execute()
   }
 
   rgw_get_request_metadata(s->cct, s->info, attrs, false);
-  rgw_get_user_attrs_by_uid(store, s->user.user_id, orig_attrs, &acct_op_tracker);
+  rgw_get_user_attrs_by_uid(store, s->user->user_id, orig_attrs,
+                           &acct_op_tracker);
   prepare_add_del_attrs(orig_attrs, rmattr_names, attrs, rmattrs);
   populate_with_generic_attrs(s, attrs);
 
@@ -2675,7 +2692,7 @@ void RGWPutMetadataAccount::execute()
   }
 
   /* XXX tenant needed? */
-  op_ret = rgw_store_user_attrs(store, s->user.user_id.id, attrs, &rmattrs,
+  op_ret = rgw_store_user_attrs(store, s->user->user_id.id, attrs, &rmattrs,
                                &acct_op_tracker);
   if (op_ret < 0) {
     return;
@@ -3011,7 +3028,8 @@ int RGWCopyObj::verify_permission()
       return op_ret;
 
     if (!s->system_request && /* system request overrides permission checks */
-        !src_policy.verify_permission(s->user.user_id, s->perm_mask, RGW_PERM_READ))
+        !src_policy.verify_permission(s->user->user_id, s->perm_mask,
+                                     RGW_PERM_READ))
       return -EACCES;
   }
 
@@ -3042,7 +3060,8 @@ int RGWCopyObj::verify_permission()
     return op_ret;
 
   if (!s->system_request && /* system request overrides permission checks */
-      !dest_bucket_policy.verify_permission(s->user.user_id, s->perm_mask, RGW_PERM_WRITE))
+      !dest_bucket_policy.verify_permission(s->user->user_id, s->perm_mask,
+                                           RGW_PERM_WRITE))
     return -EACCES;
 
   op_ret = init_dest_policy();
@@ -3126,7 +3145,7 @@ void RGWCopyObj::execute()
   encode_delete_at_attr(delete_at, attrs);
 
   op_ret = store->copy_obj(obj_ctx,
-                          s->user.user_id,
+                          s->user->user_id,
                           client_id,
                           op_id,
                           &s->info,
@@ -3298,7 +3317,7 @@ void RGWPutACLs::execute()
 
 int RGWGetCORS::verify_permission()
 {
-  if (s->user.user_id.compare(s->bucket_owner.get_id()) != 0)
+  if (s->user->user_id.compare(s->bucket_owner.get_id()) != 0)
     return -EACCES;
 
   return 0;
@@ -3319,7 +3338,7 @@ void RGWGetCORS::execute()
 
 int RGWPutCORS::verify_permission()
 {
-  if (s->user.user_id.compare(s->bucket_owner.get_id()) != 0)
+  if (s->user->user_id.compare(s->bucket_owner.get_id()) != 0)
     return -EACCES;
 
   return 0;
@@ -3349,7 +3368,7 @@ void RGWPutCORS::execute()
 
 int RGWDeleteCORS::verify_permission()
 {
-  if (s->user.user_id.compare(s->bucket_owner.get_id()) != 0)
+  if (s->user->user_id.compare(s->bucket_owner.get_id()) != 0)
     return -EACCES;
 
   return 0;
@@ -3477,7 +3496,7 @@ void RGWGetRequestPayment::execute()
 
 int RGWSetRequestPayment::verify_permission()
 {
-  if (s->user.user_id.compare(s->bucket_owner.get_id()) != 0)
+  if (s->user->user_id.compare(s->bucket_owner.get_id()) != 0)
     return -EACCES;
 
   return 0;
@@ -4250,8 +4269,8 @@ bool RGWBulkDelete::Deleter::delete_single(const acct_path_t& path)
 
   RGWBucketInfo binfo;
   map<string, bufferlist> battrs;
-  int ret = store->get_bucket_info(obj_ctx, s->user.user_id.tenant,
-                                  path.bucket_name, binfo, NULL, &battrs);
+  int ret = store->get_bucket_info(obj_ctx, s->user->user_id.tenant,
+                                 path.bucket_name, binfo, NULL, &battrs);
   if (ret < 0) {
     goto binfo_fail;
   }
index 3c1321128da7647d8aa3a2028329fa37da4d7d56..0fb2890c9088545c44f68e251a103a51437e496b 100644 (file)
@@ -47,9 +47,10 @@ int process_request(RGWRados* store, RGWREST* rest, RGWRequest* req,
 
   RGWEnv& rgw_env = client_io->get_env();
 
-  struct req_state rstate(g_ceph_context, &rgw_env);
+  RGWUserInfo userinfo;
 
-  struct req_state* s = &rstate;
+  struct req_state rstate(g_ceph_context, &rgw_env, &userinfo);
+  struct req_state *s = &rstate;
 
   RGWObjectCtx rados_ctx(store, s);
   s->obj_ctx = &rados_ctx;
@@ -99,8 +100,8 @@ int process_request(RGWRados* store, RGWREST* rest, RGWRequest* req,
     goto done;
   }
 
-  if (s->user.suspended) {
-    dout(10) << "user is suspended, uid=" << s->user.user_id << dendl;
+  if (s->user->suspended) {
+    dout(10) << "user is suspended, uid=" << s->user->user_id << dendl;
     abort_early(s, op, -ERR_USER_SUSPENDED, handler);
     goto done;
   }
index 0c4be38d9aa7e18bd2eebb652e8b88547759def2..1f734ed5f638d93c4cf2598c931a415564f21a53 100644 (file)
@@ -588,7 +588,7 @@ void end_header(struct req_state* s, RGWOp* op, const char *content_type,
   dump_trans_id(s);
 
   if ((!s->err.is_err()) &&
-      (s->bucket_info.owner != s->user.user_id) &&
+      (s->bucket_info.owner != s->user->user_id) &&
       (s->bucket_info.requester_pays)) {
     STREAM_IO(s)->print("x-amz-request-charged: requester\r\n");
   }
@@ -1250,7 +1250,7 @@ void RGWRESTOp::send_response()
 
 int RGWRESTOp::verify_permission()
 {
-  return check_caps(s->user.caps);
+  return check_caps(s->user->caps);
 }
 
 RGWOp* RGWHandler_REST::get_op(RGWRados* store)
index e1df68b6a2c521f60d833adda8930c5161651327..a7a0b841d0b77dc944f174cde83148b110566eda 100644 (file)
@@ -27,7 +27,7 @@ public:
     return caps.check_cap("bilog", RGW_CAP_READ);
   }
   int verify_permission() {
-    return check_caps(s->user.caps);
+    return check_caps(s->user->caps);
   }
   virtual void send_response();
   virtual void send_response(list<rgw_bi_log_entry>& entries, string& marker);
@@ -50,7 +50,7 @@ public:
     return caps.check_cap("bilog", RGW_CAP_READ);
   }
   int verify_permission() {
-    return check_caps(s->user.caps);
+    return check_caps(s->user->caps);
   }
   virtual void send_response();
   void execute();
@@ -85,7 +85,7 @@ public:
     return caps.check_cap("mdlog", RGW_CAP_READ);
   }
   int verify_permission() {
-    return check_caps(s->user.caps);
+    return check_caps(s->user->caps);
   }
   void execute();
   virtual void send_response();
@@ -104,7 +104,7 @@ public:
     return caps.check_cap("mdlog", RGW_CAP_READ);
   }
   int verify_permission() {
-    return check_caps(s->user.caps);
+    return check_caps(s->user->caps);
   }
   void execute();
   virtual void send_response();
@@ -123,7 +123,7 @@ public:
     return caps.check_cap("mdlog", RGW_CAP_READ);
   }
   int verify_permission() {
-    return check_caps(s->user.caps);
+    return check_caps(s->user->caps);
   }
   void execute();
   virtual void send_response();
@@ -186,7 +186,7 @@ public:
     return caps.check_cap("datalog", RGW_CAP_READ);
   }
   int verify_permission() {
-    return check_caps(s->user.caps);
+    return check_caps(s->user->caps);
   }
   void execute();
   virtual void send_response();
@@ -205,7 +205,7 @@ public:
     return caps.check_cap("datalog", RGW_CAP_READ);
   }
   int verify_permission() {
-    return check_caps(s->user.caps);
+    return check_caps(s->user->caps);
   }
   void execute();
   virtual void send_response();
@@ -224,7 +224,7 @@ public:
     return caps.check_cap("datalog", RGW_CAP_READ);
   }
   int verify_permission() {
-    return check_caps(s->user.caps);
+    return check_caps(s->user->caps);
   }
   void execute();
   virtual void send_response();
index 92814f4e027e62e8bfbf40550f2079a2b8e42963..1a8076c6876292139cb9f3105af6b8c872d0255e 100644 (file)
@@ -25,7 +25,7 @@ public:
     return caps.check_cap("opstate", RGW_CAP_READ);
   }
   int verify_permission() {
-    return check_caps(s->user.caps);
+    return check_caps(s->user->caps);
   }
   void execute();
   virtual void send_response();
index 4be951178b1f370ca76792e468fd0193933dc800..76ccc3fcb7caee4b45d677ccd4cf214645aaeccd 100644 (file)
@@ -29,7 +29,7 @@ public:
     return caps.check_cap(obj_type.c_str(), RGW_CAP_READ);
   }
   int verify_permission() {
-    return check_caps(s->user.caps);
+    return check_caps(s->user->caps);
   }
   void execute();
   virtual void send_response();
@@ -91,7 +91,7 @@ public:
     return caps.check_cap("bilog", RGW_CAP_READ);
   }
   int verify_permission() {
-    return check_caps(s->user.caps);
+    return check_caps(s->user->caps);
   }
   void execute();
   virtual void send_response();
index dada6488fca53e3978411ebd13b6c0b512311061..be535c73c34b33988ddc0f61ca6457825f292ba8 100644 (file)
@@ -234,7 +234,7 @@ void RGWListBuckets_ObjStore_S3::send_response_begin(bool has_buckets)
 
   if (! op_ret) {
     list_all_buckets_start(s);
-    dump_owner(s, s->user.user_id, s->user.display_name);
+    dump_owner(s, s->user->user_id, s->user->display_name);
     s->formatter->open_array_section("Buckets");
     sent_data = true;
   }
@@ -1431,7 +1431,8 @@ int RGWPostObj_ObjStore_S3::get_policy()
       return r;
     }
 
-    s->user = user_info;
+    // deep copy
+    *(s->user) = user_info;
     s->owner.set_id(user_info.user_id);
     s->owner.set_name(user_info.display_name);
   } else {
@@ -2162,8 +2163,8 @@ void RGWListBucketMultiparts_ObjStore_S3::send_response()
       s->formatter->open_array_section("Upload");
       s->formatter->dump_string("Key", mp.get_key());
       s->formatter->dump_string("UploadId", mp.get_upload_id());
-      dump_owner(s, s->user.user_id, s->user.display_name, "Initiator");
-      dump_owner(s, s->user.user_id, s->user.display_name);
+      dump_owner(s, s->user->user_id, s->user->display_name, "Initiator");
+      dump_owner(s, s->user->user_id, s->user->display_name);
       s->formatter->dump_string("StorageClass", "STANDARD");
       time_t mtime = iter->obj.mtime.sec();
       dump_time(s, "Initiated", &mtime);
@@ -2482,7 +2483,6 @@ int RGWHandler_REST_S3::init_from_header(struct req_state* s,
   if (s->init_state.url_bucket.empty()) {
     // Save bucket to tide us over until token is parsed.
     s->init_state.url_bucket = first;
-
     if (pos >= 0) {
       string encoded_obj_str = req.substr(pos+1);
       s->object = rgw_obj_key(encoded_obj_str, s->info.args.get("versionId"));
@@ -2498,7 +2498,8 @@ int RGWHandler_REST_S3::postauth_init()
   struct req_init_state *t = &s->init_state;
   bool relaxed_names = s->cct->_conf->rgw_relaxed_s3_bucket_names;
 
-  rgw_parse_url_bucket(t->url_bucket, s->user.user_id.tenant, s->bucket_tenant, s->bucket_name);
+  rgw_parse_url_bucket(t->url_bucket, s->user->user_id.tenant,
+                     s->bucket_tenant, s->bucket_name);
 
   dout(10) << "s->object=" << (!s->object.empty() ? s->object : rgw_obj_key("<NULL>"))
            << " s->bucket=" << rgw_make_bucket_entry_name(s->bucket_tenant, s->bucket_name) << dendl;
@@ -2515,7 +2516,8 @@ int RGWHandler_REST_S3::postauth_init()
     return ret;
 
   if (!t->src_bucket.empty()) {
-    rgw_parse_url_bucket(t->src_bucket, s->user.user_id.tenant, s->src_tenant_name, s->src_bucket_name);
+    rgw_parse_url_bucket(t->src_bucket, s->user->user_id.tenant,
+                       s->src_tenant_name, s->src_bucket_name);
     ret = validate_tenant_name(s->src_tenant_name);
     if (ret)
       return ret;
@@ -2693,7 +2695,7 @@ int RGW_Auth_S3_Keystone_ValidateToken::validate_s3token(
 
 static void init_anon_user(struct req_state *s)
 {
-  rgw_get_anon_user(s->user);
+  rgw_get_anon_user(*(s->user));
   s->perm_mask = RGW_PERM_FULL_CONTROL;
 }
 
@@ -2782,15 +2784,14 @@ int RGW_Auth_S3::authorize(RGWRados *store, struct req_state *s)
          return -ERR_REQUEST_TIME_SKEWED;
        }
 
-
-       s->user.user_id = keystone_validator.response.token.tenant.id;
-        s->user.display_name
+       s->user->user_id = keystone_validator.response.token.tenant.id;
+        s->user->display_name
          = keystone_validator.response.token.tenant.name; // wow.
 
         rgw_user uid(keystone_validator.response.token.tenant.id);
         /* try to store user if it not already exists */
-        if (rgw_get_user_info_by_uid(store, uid, s->user) < 0) {
-          int ret = rgw_store_user_info(store, s->user, NULL, NULL, 0, true);
+        if (rgw_get_user_info_by_uid(store, uid, *(s->user)) < 0) {
+          int ret = rgw_store_user_info(store, *(s->user), NULL, NULL, 0, true);
           if (ret < 0)
             dout(10) << "NOTICE: failed to store new user's info: ret="
                     << ret << dendl;
@@ -2809,14 +2810,13 @@ int RGW_Auth_S3::authorize(RGWRados *store, struct req_state *s)
   /* now try rados backend, but only if keystone did not succeed */
   if (keystone_result < 0) {
     /* get the user info */
-    if (rgw_get_user_info_by_access_key(store, auth_id, s->user) < 0) {
+    if (rgw_get_user_info_by_access_key(store, auth_id, *(s->user)) < 0) {
       dout(5) << "error reading user info, uid=" << auth_id
              << " can't authenticate" << dendl;
       return -ERR_INVALID_ACCESS_KEY;
     }
 
     /* now verify signature */
-
     string auth_hdr;
     if (!rgw_create_s3_canonical_header(s->info, &s->header_time, auth_hdr,
                                        qsr)) {
@@ -2839,8 +2839,8 @@ int RGW_Auth_S3::authorize(RGWRados *store, struct req_state *s)
     }
 
     map<string, RGWAccessKey>::iterator iter =
-      s->user.access_keys.find(auth_id);
-    if (iter == s->user.access_keys.end()) {
+      s->user->access_keys.find(auth_id);
+    if (iter == s->user->access_keys.end()) {
       dout(0) << "ERROR: access key not encoded in user info" << dendl;
       return -EPERM;
     }
@@ -2848,8 +2848,8 @@ int RGW_Auth_S3::authorize(RGWRados *store, struct req_state *s)
 
     if (!k.subuser.empty()) {
       map<string, RGWSubUser>::iterator uiter =
-       s->user.subusers.find(k.subuser);
-      if (uiter == s->user.subusers.end()) {
+       s->user->subusers.find(k.subuser);
+      if (uiter == s->user->subusers.end()) {
        dout(0) << "NOTICE: could not find subuser: " << k.subuser << dendl;
        return -EPERM;
       }
@@ -2872,7 +2872,7 @@ int RGW_Auth_S3::authorize(RGWRados *store, struct req_state *s)
       return -ERR_SIGNATURE_NO_MATCH;
     }
 
-    if (s->user.system) {
+    if (s->user->system) {
       s->system_request = true;
       dout(20) << "system request" << dendl;
       s->info.args.set_system();
@@ -2885,15 +2885,15 @@ int RGW_Auth_S3::authorize(RGWRados *store, struct req_state *s)
           ldout(s->cct, 0) << "User lookup failed!" << dendl;
           return -ENOENT;
         }
-        s->user = effective_user;
+        *(s->user) = effective_user;
       }
     }
 
   } /* if keystone_result < 0 */
 
   // populate the owner info
-  s->owner.set_id(s->user.user_id);
-  s->owner.set_name(s->user.display_name);
+  s->owner.set_id(s->user->user_id);
+  s->owner.set_name(s->user->display_name);
 
   return  0;
 }
index e409fd8b157c2c4a7a4ba95613bd1c1ed832fa45..0f9fd2faf9d879c9e27242be0494d2ab5621b79e 100644 (file)
@@ -74,14 +74,14 @@ static void dump_account_metadata(struct req_state * const s,
   /* Dump TempURL-related stuff */
   if (s->perm_mask == RGW_PERM_FULL_CONTROL) {
     map<int, string>::iterator iter;
-    iter = s->user.temp_url_keys.find(0);
-    if (iter != s->user.temp_url_keys.end() && !iter->second.empty()) {
+    iter = s->user->temp_url_keys.find(0);
+    if (iter != s->user->temp_url_keys.end() && !iter->second.empty()) {
       STREAM_IO(s)->print("X-Account-Meta-Temp-Url-Key: %s\r\n",
                          iter->second.c_str());
     }
 
-    iter = s->user.temp_url_keys.find(1);
-    if (iter != s->user.temp_url_keys.end() && !iter->second.empty()) {
+    iter = s->user->temp_url_keys.find(1);
+    if (iter != s->user->temp_url_keys.end() && !iter->second.empty()) {
       STREAM_IO(s)->print("X-Account-Meta-Temp-Url-Key-2: %s\r\n",
                          iter->second.c_str());
     }
@@ -128,7 +128,7 @@ void RGWListBuckets_ObjStore_SWIFT::send_response_begin(bool has_buckets)
   if (! op_ret) {
     dump_start(s);
     s->formatter->open_array_section_with_attrs("account",
-            FormatterAttrs("name", s->user.display_name.c_str(), NULL));
+            FormatterAttrs("name", s->user->display_name.c_str(), NULL));
 
     sent_data = true;
   }
@@ -372,15 +372,15 @@ static void dump_container_metadata(struct req_state *s, RGWBucketEnt& bucket)
 void RGWStatAccount_ObjStore_SWIFT::execute()
 {
   RGWStatAccount_ObjStore::execute();
-
-  op_ret = rgw_get_user_attrs_by_uid(store, s->user.user_id, attrs);
+  op_ret = rgw_get_user_attrs_by_uid(store, s->user->user_id, attrs);
 }
 
 void RGWStatAccount_ObjStore_SWIFT::send_response()
 {
   if (op_ret >= 0) {
     op_ret = STATUS_NO_CONTENT;
-    dump_account_metadata(s, buckets_count, buckets_objcount, buckets_size, buckets_size_rounded, attrs);
+    dump_account_metadata(s, buckets_count, buckets_objcount, buckets_size,
+                         buckets_size_rounded, attrs);
   }
 
   set_req_state_err(s, op_ret);
@@ -423,7 +423,7 @@ static int get_swift_container_settings(req_state *s, RGWRados *store, RGWAccess
 
   if (read_attr || write_attr) {
     RGWAccessControlPolicy_SWIFT swift_policy(s->cct);
-    int r = swift_policy.create(store, s->user.user_id, s->user.display_name, read_list, write_list);
+    int r = swift_policy.create(store, s->user->user_id, s->user->display_name, read_list, write_list);
     if (r < 0)
       return r;
 
@@ -465,7 +465,7 @@ int RGWCreateBucket_ObjStore_SWIFT::get_params()
   }
 
   if (!has_policy) {
-    policy.create_default(s->user.user_id, s->user.display_name);
+    policy.create_default(s->user->user_id, s->user->display_name);
   }
 
   location_constraint = store->region.api_name;
@@ -566,7 +566,7 @@ int RGWPutObj_ObjStore_SWIFT::get_params()
     }
   }
 
-  policy.create_default(s->user.user_id, s->user.display_name);
+  policy.create_default(s->user->user_id, s->user->display_name);
 
   int r = get_delete_at_param(s, &delete_at);
   if (r < 0) {
@@ -898,7 +898,7 @@ static void dump_object_metadata(struct req_state * const s,
 
 int RGWCopyObj_ObjStore_SWIFT::init_dest_policy()
 {
-  dest_policy.create_default(s->user.user_id, s->user.display_name);
+  dest_policy.create_default(s->user->user_id, s->user->display_name);
 
   return 0;
 }
@@ -966,7 +966,7 @@ void RGWCopyObj_ObjStore_SWIFT::dump_copy_info()
 
   /* Dump X-Copied-From-Account */
   string account_name;
-  url_encode(s->user.user_id.id, account_name); // XXX tenant
+  url_encode(s->user->user_id.id, account_name); // XXX tenant
   STREAM_IO(s)->print("X-Copied-From-Account: %s\r\n", account_name.c_str());
 
   /* Dump X-Copied-From-Last-Modified. */
@@ -1285,7 +1285,7 @@ int RGWHandler_REST_SWIFT::authorize()
   if ((!s->os_auth_token && s->info.args.get("temp_url_sig").empty()) ||
       (s->op == OP_OPTIONS)) {
     /* anonymous access */
-    rgw_get_anon_user(s->user);
+    rgw_get_anon_user(*(s->user));
     s->perm_mask = RGW_PERM_FULL_CONTROL;
     return 0;
   }
@@ -1302,7 +1302,7 @@ int RGWHandler_REST_SWIFT::postauth_init()
   struct req_init_state* t = &s->init_state;
 
   /* XXX Stub this until Swift Auth sets account into URL. */
-  s->bucket_tenant = s->user.user_id.tenant;
+  s->bucket_tenant = s->user->user_id.tenant;
   s->bucket_name = t->url_bucket;
 
   dout(10) << "s->object=" <<
@@ -1327,7 +1327,7 @@ int RGWHandler_REST_SWIFT::postauth_init()
      * We don't allow cross-tenant copy at present. It requires account
      * names in the URL for Swift.
      */
-    s->src_tenant_name = s->user.user_id.tenant;
+    s->src_tenant_name = s->user->user_id.tenant;
     s->src_bucket_name = t->src_bucket;
 
     ret = validate_bucket_name(s->src_bucket_name);
index 46132b0582a35d3c1b4222f8ee26b760798fe4ef..e8528e32c873badcdc33c9e3a4b0180a4882aeb4 100644 (file)
@@ -92,7 +92,7 @@ void RGWOp_User_Create::execute()
   RESTArgs::get_bool(s, "system", false, &system);
   RESTArgs::get_bool(s, "exclusive", false, &exclusive);
 
-  if (!s->user.system && system) {
+  if (!s->user->system && system) {
     ldout(s->cct, 0) << "cannot set system flag by non-system user" << dendl;
     http_ret = -EINVAL;
     return;
@@ -192,7 +192,7 @@ void RGWOp_User_Modify::execute()
 
   RESTArgs::get_bool(s, "system", false, &system);
 
-  if (!s->user.system && system) {
+  if (!s->user->system && system) {
     ldout(s->cct, 0) << "cannot set system flag by non-system user" << dendl;
     http_ret = -EINVAL;
     return;
index 76eda3c76ec6616f9e9d660d0af075d9ce61231e..c3adedf07017a6fa41836ea83619689ec31905ff 100644 (file)
@@ -578,11 +578,11 @@ int authenticate_temp_url(RGWRados *store, req_state *s)
     return -EPERM;
 
   dout(20) << "temp url user (bucket owner): " << bucket_info.owner << dendl;
-  if (rgw_get_user_info_by_uid(store, bucket_info.owner, s->user) < 0) {
+  if (rgw_get_user_info_by_uid(store, bucket_info.owner, *(s->user)) < 0) {
     return -EPERM;
   }
 
-  if (s->user.temp_url_keys.empty()) {
+  if (s->user->temp_url_keys.empty()) {
     dout(5) << "user does not have temp url key set, aborting" << dendl;
     return -EPERM;
   }
@@ -611,7 +611,7 @@ int authenticate_temp_url(RGWRados *store, req_state *s)
   dout(20) << "temp url signature (plain text): " << str << dendl;
 
   map<int, string>::iterator iter;
-  for (iter = s->user.temp_url_keys.begin(); iter != s->user.temp_url_keys.end(); ++iter) {
+  for (iter = s->user->temp_url_keys.begin(); iter != s->user->temp_url_keys.end(); ++iter) {
     string& temp_url_key = iter->second;
 
     if (temp_url_key.empty())
@@ -650,8 +650,8 @@ bool RGWSwift::verify_swift_token(RGWRados *store, req_state *s)
       subuser = s->swift_user.substr(pos + 1);
     }
     s->perm_mask = 0;
-    map<string, RGWSubUser>::iterator iter = s->user.subusers.find(subuser);
-    if (iter != s->user.subusers.end()) {
+    map<string, RGWSubUser>::iterator iter = s->user->subusers.find(subuser);
+    if (iter != s->user->subusers.end()) {
       RGWSubUser& subuser_ = iter->second;
       s->perm_mask = subuser_.perm_mask;
     }
@@ -671,7 +671,8 @@ bool RGWSwift::do_verify_swift_token(RGWRados *store, req_state *s)
   }
 
   if (strncmp(s->os_auth_token, "AUTH_rgwtk", 10) == 0) {
-    int ret = rgw_swift_verify_signed_token(s->cct, store, s->os_auth_token, s->user, &s->swift_user);
+    int ret = rgw_swift_verify_signed_token(s->cct, store, s->os_auth_token,
+                                           *(s->user), &s->swift_user);
     if (ret < 0)
       return false;
 
@@ -685,7 +686,7 @@ bool RGWSwift::do_verify_swift_token(RGWRados *store, req_state *s)
   int ret;
 
   if (supports_keystone()) {
-    ret = validate_keystone_token(store, s->os_auth_token, &info, s->user);
+    ret = validate_keystone_token(store, s->os_auth_token, &info, *(s->user));
     return (ret >= 0);
   }
 
@@ -705,12 +706,12 @@ bool RGWSwift::do_verify_swift_token(RGWRados *store, req_state *s)
 
   ldout(cct, 10) << "swift user=" << s->swift_user << dendl;
 
-  if (rgw_get_user_info_by_swift(store, swift_user, s->user) < 0) {
+  if (rgw_get_user_info_by_swift(store, swift_user, *(s->user)) < 0) {
     ldout(cct, 0) << "NOTICE: couldn't map swift user" << dendl;
     return false;
   }
 
-  ldout(cct, 10) << "user_id=" << s->user.user_id << dendl;
+  ldout(cct, 10) << "user_id=" << s->user->user_id << dendl;
 
   return true;
 }