return 0;
}
-bool RGWPostObj_ObjStore::part_str(const std::string& name,
+bool RGWPostObj_ObjStore::part_str(parts_collection_t& parts,
+ const std::string& name,
std::string* val)
{
const auto iter = parts.find(name);
return true;
}
-bool RGWPostObj_ObjStore::part_bl(const std::string& name,
+bool RGWPostObj_ObjStore::part_bl(parts_collection_t& parts,
+ const std::string& name,
ceph::bufferlist* pbl)
{
const auto iter = parts.find(name);
};
protected:
+ using parts_collection_t = \
+ std::map<std::string, post_form_part, const ltstr_nocase>;
+
std::string err_msg;
ceph::bufferlist in_data;
- std::map<std::string, post_form_part, const ltstr_nocase> parts;
int read_with_boundary(ceph::bufferlist& bl,
uint64_t max,
int read_form_part_header(struct post_form_part *part,
bool *done);
- bool part_str(const string& name, string *val);
- bool part_bl(const string& name, bufferlist *pbl);
+
+ int get_params() override;
static int parse_part_field(const std::string& line,
std::string& field_name, /* out */
static void parse_boundary_params(const std::string& params_str,
std::string& first,
std::map<std::string, std::string>& params);
- int get_params() override;
+
+ static bool part_str(parts_collection_t& parts,
+ const std::string& name,
+ std::string *val);
+
+ static bool part_bl(parts_collection_t& parts,
+ const std::string& name,
+ ceph::bufferlist *pbl);
public:
RGWPostObj_ObjStore() {}
} while (!done);
string object_str;
- if (!part_str("key", &object_str)) {
+ if (!part_str(parts, "key", &object_str)) {
err_msg = "Key not specified";
return -EINVAL;
}
env.add_var("key", s->object.name);
- part_str("Content-Type", &content_type);
+ part_str(parts, "Content-Type", &content_type);
env.add_var("Content-Type", content_type);
map<string, struct post_form_part, ltstr_nocase>::iterator piter =
int RGWPostObj_ObjStore_S3::get_policy()
{
- if (part_bl("policy", &s->auth.s3_postobj_creds.encoded_policy)) {
-
+ if (part_bl(parts, "policy", &s->auth.s3_postobj_creds.encoded_policy)) {
// check that the signature matches the encoded policy
- if (! part_str("AWSAccessKeyId", &s->auth.s3_postobj_creds.access_key)) {
+ if (!part_str(parts, "AWSAccessKeyId",
+ &s->auth.s3_postobj_creds.access_key)) {
ldout(s->cct, 0) << "No S3 access key found!" << dendl;
err_msg = "Missing access key";
return -EINVAL;
}
- string received_signature_str;
- if (! part_str("signature", &s->auth.s3_postobj_creds.signature)) {
+
+ if (!part_str(parts, "signature", &s->auth.s3_postobj_creds.signature)) {
ldout(s->cct, 0) << "No signature found!" << dendl;
err_msg = "Missing signature";
return -EINVAL;
}
string canned_acl;
- part_str("acl", &canned_acl);
+ part_str(parts, "acl", &canned_acl);
RGWAccessControlPolicy_S3 s3policy(s->cct);
ldout(s->cct, 20) << "canned_acl=" << canned_acl << dendl;
if (op_ret == 0 && parts.count("success_action_redirect")) {
string redirect;
- part_str("success_action_redirect", &redirect);
+ part_str(parts, "success_action_redirect", &redirect);
string tenant;
string bucket;
string status_string;
uint32_t status_int;
- part_str("success_action_status", &status_string);
+ part_str(parts, "success_action_status", &status_string);
int r = stringtoul(status_string, &status_int);
if (r < 0) {
};
class RGWPostObj_ObjStore_S3 : public RGWPostObj_ObjStore {
- string filename;
+ parts_collection_t parts;
+ std::string filename;
RGWPolicyEnv env;
RGWPolicy post_policy;
map<string, string> crypt_http_responses;
return -EINVAL;
}
- parts[part.name] = std::move(part);
+ ctrl_parts[part.name] = std::move(part);
}
} while (! stream_done);
std::string expires;
- if (part_str("expires", &expires) && is_expired(expires)) {
+ if (part_str(ctrl_parts, "expires", &expires) && is_expired(expires)) {
err_msg = "FormPost: Form Expired";
return -EACCES;
}
bool is_next_file_to_upload() override;
static bool is_expired(const std::string& expires);
+ parts_collection_t ctrl_parts;
boost::optional<post_form_part> current_data_part;
std::string prefix;
bool stream_done = false;