send_response();
}
+int RGWSetBucketVersioning::verify_permission()
+{
+ if (s->user.user_id.compare(s->bucket_owner.get_id()) != 0)
+ return -EACCES;
+
+ return 0;
+}
+
+void RGWSetBucketVersioning::pre_exec()
+{
+ rgw_bucket_object_pre_exec(s);
+}
+
+void RGWSetBucketVersioning::execute()
+{
+ ret = get_params();
+
+ if (ret < 0)
+ goto done;
+
+ s->bucket_info.versioning_enabled = true;
+
+ ret = store->put_bucket_instance_info(s->bucket_info, false, 0, &s->bucket_attrs);
+ if (ret < 0) {
+ ldout(s->cct, 0) << "NOTICE: put_bucket_info on bucket=" << s->bucket.name << " returned err=" << ret << dendl;
+ goto done;
+ }
+
+done:
+ send_response();
+}
+
int RGWStatBucket::verify_permission()
{
if (!verify_bucket_permission(s, RGW_PERM_READ))
virtual uint32_t op_mask() { return RGW_OP_TYPE_READ; }
};
+class RGWSetBucketVersioning : public RGWOp {
+protected:
+ bool enable_versioning;
+ int ret;
+public:
+ RGWSetBucketVersioning() : enable_versioning(false), ret(0) {}
+
+ int verify_permission();
+ void pre_exec();
+ void execute();
+
+ virtual int get_params() { return 0; }
+
+ virtual void send_response() = 0;
+ virtual const string name() { return "set_bucket_versioning"; }
+ virtual uint32_t op_mask() { return RGW_OP_TYPE_WRITE; }
+};
+
class RGWStatBucket : public RGWOp {
protected:
int ret;
rgw_flush_formatter_and_reset(s, s->formatter);
}
+class RGWSetBucketVersioningParser : public RGWXMLParser
+{
+ XMLObj *alloc_obj(const char *el) {
+ return new XMLObj;
+ }
+
+public:
+ RGWSetBucketVersioningParser() {}
+ ~RGWSetBucketVersioningParser() {}
+
+ int get_versioning_status(bool *status) {
+ XMLObj *config = find_first("VersioningConfiguration");
+ if (!config)
+ return -EINVAL;
+
+ *status = false;
+
+ XMLObj *field = config->find_first("Status");
+ if (!field)
+ return 0;
+
+ string& s = field->get_data();
+
+ if (stringcasecmp(s, "Enabled") == 0) {
+ *status = true;
+ } else if (stringcasecmp(s, "Suspended") != 0) {
+ return -EINVAL;
+ }
+
+ return 0;
+ }
+};
+
+int RGWSetBucketVersioning_ObjStore_S3::get_params()
+{
+#define GET_BUCKET_VERSIONING_BUF_MAX (128 * 1024)
+
+ char *data;
+ int len = 0;
+ int r = rgw_rest_read_all_input(s, &data, &len, GET_BUCKET_VERSIONING_BUF_MAX);
+ if (r < 0) {
+ return r;
+ }
+
+ RGWSetBucketVersioningParser parser;
+
+ if (!parser.init()) {
+ ldout(s->cct, 0) << "ERROR: failed to initialize parser" << dendl;
+ r = -EIO;
+ goto done;
+ }
+
+ if (!parser.parse(data, len, 1)) {
+ ldout(s->cct, 10) << "failed to parse data: " << data << dendl;
+ r = -EINVAL;
+ goto done;
+ }
+
+ r = parser.get_versioning_status(&enable_versioning);
+
+done:
+ free(data);
+
+ return r;
+}
+
+void RGWSetBucketVersioning_ObjStore_S3::send_response()
+{
+ if (ret)
+ set_req_state_err(s, ret);
+ dump_errno(s);
+ end_header(s);
+}
+
+
static void dump_bucket_metadata(struct req_state *s, RGWBucketEnt& bucket)
{
char buf[32];
void send_response();
};
+class RGWSetBucketVersioning_ObjStore_S3 : public RGWSetBucketVersioning {
+public:
+ RGWSetBucketVersioning_ObjStore_S3() {}
+ ~RGWSetBucketVersioning_ObjStore_S3() {}
+
+ int get_params();
+ void send_response();
+};
+
class RGWStatBucket_ObjStore_S3 : public RGWStatBucket_ObjStore {
public:
RGWStatBucket_ObjStore_S3() {}