From 355f392ad26631f44dac250296e96f421d86fb8f Mon Sep 17 00:00:00 2001 From: Enming Zhang Date: Fri, 5 Jul 2019 08:09:22 -0700 Subject: [PATCH] rgw: fix the bug of rgw not doing necessary checking to website configuration Fixes: http://tracker.ceph.com/issues/40678 Signed-off-by: Enming Zhang --- src/rgw/rgw_rest_s3.cc | 15 +++++++++++++++ src/rgw/rgw_website.h | 4 ++++ src/rgw/rgw_xml_enc.cc | 2 ++ 3 files changed, 21 insertions(+) diff --git a/src/rgw/rgw_rest_s3.cc b/src/rgw/rgw_rest_s3.cc index bce2ca94576..42983890eab 100644 --- a/src/rgw/rgw_rest_s3.cc +++ b/src/rgw/rgw_rest_s3.cc @@ -1400,6 +1400,21 @@ int RGWSetBucketWebsite_ObjStore_S3::get_params() return -EINVAL; } + if (website_conf.is_redirect_all && website_conf.redirect_all.hostname.empty()) { + s->err.message = "A host name must be provided to redirect all requests (e.g. \"example.com\")."; + ldout(s->cct, 5) << s->err.message << dendl; + return -EINVAL; + } else if (!website_conf.is_redirect_all && !website_conf.is_set_index_doc) { + s->err.message = "A value for IndexDocument Suffix must be provided if RedirectAllRequestsTo is empty"; + ldout(s->cct, 5) << s->err.message << dendl; + return -EINVAL; + } else if (!website_conf.is_redirect_all && website_conf.is_set_index_doc && + website_conf.index_doc_suffix.empty()) { + s->err.message = "The IndexDocument Suffix is not well formed"; + ldout(s->cct, 5) << s->err.message << dendl; + return -EINVAL; + } + #define WEBSITE_ROUTING_RULES_MAX_NUM 50 int max_num = s->cct->_conf->rgw_website_routing_rules_max_num; if (max_num < 0) { diff --git a/src/rgw/rgw_website.h b/src/rgw/rgw_website.h index fb6a2d4d946..b423b630c34 100644 --- a/src/rgw/rgw_website.h +++ b/src/rgw/rgw_website.h @@ -182,10 +182,14 @@ struct RGWBucketWebsiteConf std::string subdir_marker; std::string listing_css_doc; bool listing_enabled; + bool is_redirect_all; + bool is_set_index_doc; RGWBWRoutingRules routing_rules; RGWBucketWebsiteConf() : listing_enabled(false) { + is_redirect_all = false; + is_set_index_doc = false; } void encode(bufferlist& bl) const { diff --git a/src/rgw/rgw_xml_enc.cc b/src/rgw/rgw_xml_enc.cc index 44a9364b802..1b9d250a7a6 100644 --- a/src/rgw/rgw_xml_enc.cc +++ b/src/rgw/rgw_xml_enc.cc @@ -116,11 +116,13 @@ void decode_xml_obj(list& l, XMLObj *obj) void RGWBucketWebsiteConf::decode_xml(XMLObj *obj) { XMLObj *o = obj->find_first("RedirectAllRequestsTo"); if (o) { + is_redirect_all = true; RGWXMLDecoder::decode_xml("HostName", redirect_all.hostname, o, true); RGWXMLDecoder::decode_xml("Protocol", redirect_all.protocol, o); } else { o = obj->find_first("IndexDocument"); if (o) { + is_set_index_doc = true; RGWXMLDecoder::decode_xml("Suffix", index_doc_suffix, o); } o = obj->find_first("ErrorDocument"); -- 2.39.5