diff options
author | Yehuda Sadeh <yehuda@inktank.com> | 2013-10-22 12:27:51 -0700 |
---|---|---|
committer | Yehuda Sadeh <yehuda@inktank.com> | 2013-10-22 12:27:51 -0700 |
commit | 5cf31bf9e7a0a031fa853274dfd3ef376b27db56 (patch) | |
tree | 69c6e5f35ab87525bbf494c93b60641b1cae75a9 | |
parent | 3445810f1f2254b707879f32842a40d279888c49 (diff) | |
parent | 771b0c58d5581cd56c0952be627f33b632eb7ae3 (diff) | |
download | ceph-5cf31bf9e7a0a031fa853274dfd3ef376b27db56.tar.gz |
Merge branch 'wip-6606' into next
Reviewed-by: Sage Weil <sage@inktank.com>
-rw-r--r-- | src/rgw/rgw_common.cc | 3 | ||||
-rw-r--r-- | src/rgw/rgw_common.h | 3 | ||||
-rw-r--r-- | src/rgw/rgw_log.cc | 8 | ||||
-rw-r--r-- | src/rgw/rgw_op.cc | 6 | ||||
-rw-r--r-- | src/rgw/rgw_op.h | 5 | ||||
-rw-r--r-- | src/rgw/rgw_rest.cc | 5 | ||||
-rw-r--r-- | src/rgw/rgw_rest_metadata.cc | 4 | ||||
-rw-r--r-- | src/rgw/rgw_rest_s3.cc | 46 | ||||
-rw-r--r-- | src/rgw/rgw_rest_swift.cc | 64 |
9 files changed, 72 insertions, 72 deletions
diff --git a/src/rgw/rgw_common.cc b/src/rgw/rgw_common.cc index c872314fe4e..0b2d0035992 100644 --- a/src/rgw/rgw_common.cc +++ b/src/rgw/rgw_common.cc @@ -135,7 +135,6 @@ req_state::req_state(CephContext *_cct, class RGWEnv *e) : cct(_cct), cio(NULL), object_acl = NULL; expect_cont = false; - bucket_name = NULL; object = NULL; header_ended = false; @@ -149,7 +148,6 @@ req_state::req_state(CephContext *_cct, class RGWEnv *e) : cct(_cct), cio(NULL), perm_mask = 0; content_length = 0; object = NULL; - bucket_name = NULL; has_bad_meta = false; length = NULL; copy_source = NULL; @@ -164,7 +162,6 @@ req_state::~req_state() { delete bucket_acl; delete object_acl; free((void *)object); - free((void *)bucket_name); } struct str_len { diff --git a/src/rgw/rgw_common.h b/src/rgw/rgw_common.h index baf60001a8b..b3d39e57c2d 100644 --- a/src/rgw/rgw_common.h +++ b/src/rgw/rgw_common.h @@ -819,12 +819,13 @@ struct req_state { uint32_t perm_mask; utime_t header_time; - const char *bucket_name; const char *object; rgw_bucket bucket; string bucket_name_str; string object_str; + string src_bucket_name; + string src_object; ACLOwner bucket_owner; ACLOwner owner; diff --git a/src/rgw/rgw_log.cc b/src/rgw/rgw_log.cc index 7b75441efce..9398dd04d73 100644 --- a/src/rgw/rgw_log.cc +++ b/src/rgw/rgw_log.cc @@ -171,7 +171,7 @@ static void log_usage(struct req_state *s, const string& op_name) string user; - if (s->bucket_name) + if (!s->bucket_name_str.empty()) user = s->bucket_owner.get_id(); else user = s->user.user_id; @@ -267,7 +267,7 @@ int rgw_log_op(RGWRados *store, struct req_state *s, const string& op_name, OpsL if (!s->enable_ops_log) return 0; - if (!s->bucket_name) { + if (s->bucket_name_str.empty()) { ldout(s->cct, 5) << "nothing to log for operation" << dendl; return -EINVAL; } @@ -280,9 +280,9 @@ int rgw_log_op(RGWRados *store, struct req_state *s, const string& op_name, OpsL } else { bucket_id = s->bucket.bucket_id; } - entry.bucket = s->bucket_name; + entry.bucket = s->bucket_name_str; - if (check_utf8(s->bucket_name, entry.bucket.size()) != 0) { + if (check_utf8(s->bucket_name_str.c_str(), entry.bucket.size()) != 0) { ldout(s->cct, 5) << "not logging op on bucket with non-utf8 name" << dendl; return 0; } diff --git a/src/rgw/rgw_op.cc b/src/rgw/rgw_op.cc index 2e07e3fcde6..aa7ff9bb3f5 100644 --- a/src/rgw/rgw_op.cc +++ b/src/rgw/rgw_op.cc @@ -339,7 +339,7 @@ static int rgw_build_policies(RGWRados *store, struct req_state *s, bool only_bu s->local_source = store->region.equals(region); } } - + if (s->bucket_name_str.size()) { s->bucket_exists = true; if (s->bucket_instance_id.empty()) { @@ -1212,7 +1212,7 @@ void RGWDeleteBucket::execute() { ret = -EINVAL; - if (!s->bucket_name) + if (s->bucket_name_str.empty()) return; RGWObjVersionTracker ot; @@ -1706,8 +1706,6 @@ bool RGWCopyObj::parse_copy_location(const char *src, string& bucket_name, strin url_decode(url_src, dec_src); src = dec_src.c_str(); - ldout(s->cct, 15) << "decoded obj=" << src << dendl; - if (*src == '/') ++src; string str(src); diff --git a/src/rgw/rgw_op.h b/src/rgw/rgw_op.h index eee5ea99065..41ee2e88f9b 100644 --- a/src/rgw/rgw_op.h +++ b/src/rgw/rgw_op.h @@ -460,9 +460,6 @@ protected: int init_common(); -protected: - bool parse_copy_location(const char *src, string& bucket_name, string& object); - public: RGWCopyObj() { if_mod = NULL; @@ -482,6 +479,8 @@ public: last_ofs = 0; } + static bool parse_copy_location(const char *src, string& bucket_name, string& object); + virtual void init(RGWRados *store, struct req_state *s, RGWHandler *h) { RGWOp::init(store, s, h); dest_policy.set_ctx(s->cct); diff --git a/src/rgw/rgw_rest.cc b/src/rgw/rgw_rest.cc index 4aa1d401211..30cb0d9b66e 100644 --- a/src/rgw/rgw_rest.cc +++ b/src/rgw/rgw_rest.cc @@ -906,7 +906,7 @@ int RGWListBucketMultiparts_ObjStore::get_params() int RGWDeleteMultiObj_ObjStore::get_params() { - bucket_name = s->bucket_name; + bucket_name = s->bucket_name_str; if (bucket_name.empty()) { ret = -EINVAL; @@ -1060,6 +1060,7 @@ int RGWHandler_ObjStore::read_permissions(RGWOp *op_obj) break; case OP_PUT: case OP_POST: + case OP_COPY: /* is it a 'multi-object delete' request? */ if (s->info.request_params == "delete") { only_bucket = true; @@ -1077,8 +1078,6 @@ int RGWHandler_ObjStore::read_permissions(RGWOp *op_obj) case OP_DELETE: only_bucket = true; break; - case OP_COPY: // op itself will read and verify the permissions - return 0; case OP_OPTIONS: only_bucket = true; break; diff --git a/src/rgw/rgw_rest_metadata.cc b/src/rgw/rgw_rest_metadata.cc index fc1d6ded166..5036235ebd2 100644 --- a/src/rgw/rgw_rest_metadata.cc +++ b/src/rgw/rgw_rest_metadata.cc @@ -33,8 +33,8 @@ static inline void frame_metadata_key(req_state *s, string& out) { string metadata_key; string section; - if (s->bucket_name) { - section = s->bucket_name; + if (!s->bucket_name_str.empty()) { + section = s->bucket_name_str; } else { section = key; key.clear(); diff --git a/src/rgw/rgw_rest_s3.cc b/src/rgw/rgw_rest_s3.cc index 83874dd42c4..8ea21d452e6 100644 --- a/src/rgw/rgw_rest_s3.cc +++ b/src/rgw/rgw_rest_s3.cc @@ -250,7 +250,7 @@ void RGWListBucket_ObjStore_S3::send_response() s->formatter->open_object_section_in_ns("ListBucketResult", "http://s3.amazonaws.com/doc/2006-03-01/"); - s->formatter->dump_string("Name", s->bucket_name); + s->formatter->dump_string("Name", s->bucket_name_str); if (!prefix.empty()) s->formatter->dump_string("Prefix", prefix); s->formatter->dump_string("Marker", marker); @@ -1154,7 +1154,7 @@ void RGWPostObj_ObjStore_S3::send_response() string etag_url; - url_escape(s->bucket_name, bucket); + url_escape(s->bucket_name_str, bucket); url_escape(s->object_str, key); url_escape(etag_str, etag_url); @@ -1204,8 +1204,8 @@ done: s->formatter->open_object_section("PostResponse"); if (g_conf->rgw_dns_name.length()) s->formatter->dump_format("Location", "%s/%s", s->info.script_uri.c_str(), s->object_str.c_str()); - s->formatter->dump_string("Bucket", s->bucket_name); - s->formatter->dump_string("Key", s->object_str.c_str()); + s->formatter->dump_string("Bucket", s->bucket_name_str); + s->formatter->dump_string("Key", s->object_str); s->formatter->close_section(); } s->err.message = err_msg; @@ -1254,18 +1254,8 @@ int RGWCopyObj_ObjStore_S3::get_params() if_match = s->info.env->get("HTTP_X_AMZ_COPY_IF_MATCH"); if_nomatch = s->info.env->get("HTTP_X_AMZ_COPY_IF_NONE_MATCH"); - const char *req_src = s->copy_source; - if (!req_src) { - ldout(s->cct, 0) << "copy source is NULL" << dendl; - return -EINVAL; - } - - ret = parse_copy_location(req_src, src_bucket_name, src_object); - if (!ret) { - ldout(s->cct, 0) << "failed to parse copy location" << dendl; - return -EINVAL; - } - + src_bucket_name = s->src_bucket_name; + src_object = s->src_object; dest_bucket_name = s->bucket.name; dest_object = s->object_str; @@ -1529,7 +1519,7 @@ void RGWInitMultipart_ObjStore_S3::send_response() dump_start(s); s->formatter->open_object_section_in_ns("InitiateMultipartUploadResult", "http://s3.amazonaws.com/doc/2006-03-01/"); - s->formatter->dump_string("Bucket", s->bucket_name); + s->formatter->dump_string("Bucket", s->bucket_name_str); s->formatter->dump_string("Key", s->object); s->formatter->dump_string("UploadId", upload_id); s->formatter->close_section(); @@ -1548,8 +1538,8 @@ void RGWCompleteMultipart_ObjStore_S3::send_response() s->formatter->open_object_section_in_ns("CompleteMultipartUploadResult", "http://s3.amazonaws.com/doc/2006-03-01/"); if (g_conf->rgw_dns_name.length()) - s->formatter->dump_format("Location", "%s.%s", s->bucket_name, g_conf->rgw_dns_name.c_str()); - s->formatter->dump_string("Bucket", s->bucket_name); + s->formatter->dump_format("Location", "%s.%s", s->bucket_name_str.c_str(), g_conf->rgw_dns_name.c_str()); + s->formatter->dump_string("Bucket", s->bucket_name_str); s->formatter->dump_string("Key", s->object); s->formatter->dump_string("ETag", etag); s->formatter->close_section(); @@ -1586,7 +1576,7 @@ void RGWListMultipart_ObjStore_S3::send_response() for (i = 0, test_iter = iter; test_iter != parts.end() && i < max_parts; ++test_iter, ++i) { cur_max = test_iter->first; } - s->formatter->dump_string("Bucket", s->bucket_name); + s->formatter->dump_string("Bucket", s->bucket_name_str); s->formatter->dump_string("Key", s->object); s->formatter->dump_string("UploadId", upload_id); s->formatter->dump_string("StorageClass", "STANDARD"); @@ -1634,7 +1624,7 @@ void RGWListBucketMultiparts_ObjStore_S3::send_response() return; s->formatter->open_object_section("ListMultipartUploadsResult"); - s->formatter->dump_string("Bucket", s->bucket_name); + s->formatter->dump_string("Bucket", s->bucket_name_str); if (!prefix.empty()) s->formatter->dump_string("ListMultipartUploadsResult.Prefix", prefix); string& key_marker = marker.get_key(); @@ -1920,9 +1910,8 @@ int RGWHandler_ObjStore_S3::init_from_header(struct req_state *s, int default_fo first = req; } - if (!s->bucket_name) { + if (s->bucket_name_str.empty()) { s->bucket_name_str = first; - s->bucket_name = strdup(s->bucket_name_str.c_str()); if (pos >= 0) { string encoded_obj_str = req.substr(pos+1); @@ -1999,7 +1988,7 @@ int RGWHandler_ObjStore_S3::validate_bucket_name(const string& bucket, bool rela int RGWHandler_ObjStore_S3::init(RGWRados *store, struct req_state *s, RGWClientIO *cio) { - dout(10) << "s->object=" << (s->object ? s->object : "<NULL>") << " s->bucket=" << (s->bucket_name ? s->bucket_name : "<NULL>") << dendl; + dout(10) << "s->object=" << (s->object ? s->object : "<NULL>") << " s->bucket=" << (!s->bucket_name_str.empty() ? s->bucket_name_str : "<NULL>") << dendl; bool relaxed_names = s->cct->_conf->rgw_relaxed_s3_bucket_names; int ret = validate_bucket_name(s->bucket_name_str, relaxed_names); @@ -2016,6 +2005,13 @@ int RGWHandler_ObjStore_S3::init(RGWRados *store, struct req_state *s, RGWClient s->has_acl_header = s->info.env->exists_prefix("HTTP_X_AMZ_GRANT"); s->copy_source = s->info.env->get("HTTP_X_AMZ_COPY_SOURCE"); + if (s->copy_source) { + ret = RGWCopyObj::parse_copy_location(s->copy_source, s->src_bucket_name, s->src_object); + if (!ret) { + ldout(s->cct, 0) << "failed to parse copy location" << dendl; + return -EINVAL; + } + } s->dialect = "s3"; @@ -2269,7 +2265,7 @@ RGWHandler *RGWRESTMgr_S3::get_handler(struct req_state *s) if (ret < 0) return NULL; - if (!s->bucket_name) + if (s->bucket_name_str.empty()) return new RGWHandler_ObjStore_Service_S3; if (!s->object) diff --git a/src/rgw/rgw_rest_swift.cc b/src/rgw/rgw_rest_swift.cc index 651c4635d37..95d54aef3f9 100644 --- a/src/rgw/rgw_rest_swift.cc +++ b/src/rgw/rgw_rest_swift.cc @@ -451,28 +451,10 @@ int RGWCopyObj_ObjStore_SWIFT::get_params() if_match = s->info.env->get("HTTP_COPY_IF_MATCH"); if_nomatch = s->info.env->get("HTTP_COPY_IF_NONE_MATCH"); - if (s->op == OP_COPY) { - const char *req_dest = s->info.env->get("HTTP_DESTINATION"); - if (!req_dest) - return -ERR_BAD_URL; - - ret = parse_copy_location(req_dest, dest_bucket_name, dest_object); - if (!ret) - return -ERR_BAD_URL; - src_bucket_name = s->bucket_name; - src_object = s->object_str; - } else { - const char *req_src = s->copy_source; - if (!req_src) - return -ERR_BAD_URL; - - ret = parse_copy_location(req_src, src_bucket_name, src_object); - if (!ret) - return -ERR_BAD_URL; - - dest_bucket_name = s->bucket_name; - dest_object = s->object_str; - } + src_bucket_name = s->src_bucket_name; + src_object = s->src_object; + dest_bucket_name = s->bucket_name_str; + dest_object = s->object_str; return 0; } @@ -701,7 +683,7 @@ RGWOp *RGWHandler_ObjStore_Obj_SWIFT::op_put() if (is_acl_op()) { return new RGWPutACLs_ObjStore_SWIFT; } - if (!s->copy_source) + if (s->src_bucket_name.empty()) return new RGWPutObj_ObjStore_SWIFT; else return new RGWCopyObj_ObjStore_SWIFT; @@ -857,8 +839,6 @@ int RGWHandler_ObjStore_SWIFT::init_from_header(struct req_state *s) return 0; s->bucket_name_str = first; - s->bucket_name = strdup(s->bucket_name_str.c_str()); - s->info.effective_uri = "/" + s->bucket_name_str; @@ -873,7 +853,7 @@ int RGWHandler_ObjStore_SWIFT::init_from_header(struct req_state *s) int RGWHandler_ObjStore_SWIFT::init(RGWRados *store, struct req_state *s, RGWClientIO *cio) { - dout(10) << "s->object=" << (s->object ? s->object : "<NULL>") << " s->bucket=" << (s->bucket_name ? s->bucket_name : "<NULL>") << dendl; + dout(10) << "s->object=" << (s->object ? s->object : "<NULL>") << " s->bucket=" << (!s->bucket_name_str.empty() ? s->bucket_name_str : "<NULL>") << dendl; int ret = validate_bucket_name(s->bucket_name_str.c_str()); if (ret) @@ -883,9 +863,39 @@ int RGWHandler_ObjStore_SWIFT::init(RGWRados *store, struct req_state *s, RGWCli return ret; s->copy_source = s->info.env->get("HTTP_X_COPY_FROM"); + if (s->copy_source) { + bool result = RGWCopyObj::parse_copy_location(s->copy_source, s->src_bucket_name, s->src_object); + if (!result) + return -ERR_BAD_URL; + } s->dialect = "swift"; + if (s->op == OP_COPY) { + const char *req_dest = s->info.env->get("HTTP_DESTINATION"); + if (!req_dest) + return -ERR_BAD_URL; + + string dest_bucket_name; + string dest_object; + bool result = RGWCopyObj::parse_copy_location(req_dest, dest_bucket_name, dest_object); + if (!result) + return -ERR_BAD_URL; + + if (dest_bucket_name != s->bucket_name_str) { + ret = validate_bucket_name(dest_bucket_name.c_str()); + if (ret < 0) + return ret; + } + + /* convert COPY operation into PUT */ + s->src_bucket_name = s->bucket_name_str; + s->src_object = s->object_str; + s->bucket_name_str = dest_bucket_name; + s->object_str = dest_object; + s->op = OP_PUT; + } + return RGWHandler_ObjStore::init(store, s, cio); } @@ -896,7 +906,7 @@ RGWHandler *RGWRESTMgr_SWIFT::get_handler(struct req_state *s) if (ret < 0) return NULL; - if (!s->bucket_name) + if (s->bucket_name_str.empty()) return new RGWHandler_ObjStore_Service_SWIFT; if (!s->object) return new RGWHandler_ObjStore_Bucket_SWIFT; |