summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGarren Smith <garren.smith@gmail.com>2018-08-29 16:47:41 +0200
committerRobert Newson <rnewson@apache.org>2018-10-08 09:51:20 +0100
commitcda713ab7ccb4a56899d45675be2d7be3db2f71b (patch)
treec6ac3938f6bd25c1858c4a8e55d0761f8f550f64
parent58556fe0012651dbb3f48d65461a2d1af12394c8 (diff)
downloadcouchdb-cda713ab7ccb4a56899d45675be2d7be3db2f71b.tar.gz
add r = 3 restrictions to partition _find and _explain
-rw-r--r--src/mango/src/mango_error.erl7
-rw-r--r--src/mango/src/mango_httpd.erl2
-rw-r--r--src/mango/src/mango_opts.erl13
3 files changed, 22 insertions, 0 deletions
diff --git a/src/mango/src/mango_error.erl b/src/mango/src/mango_error.erl
index 603fb5fd4..b5c69b3f3 100644
--- a/src/mango/src/mango_error.erl
+++ b/src/mango/src/mango_error.erl
@@ -264,6 +264,13 @@ info(mango_opts, {multiple_text_operator, {invalid_selector, BadSel}}) ->
[BadSel])
};
+info(mango_opts, invalid_partition_read) ->
+ {
+ 400,
+ <<"invalid_partition_read_value">>,
+ <<"`r` value can only be r = 1 for partitions">>
+ };
+
info(mango_selector, {invalid_selector, missing_field_name}) ->
{
400,
diff --git a/src/mango/src/mango_httpd.erl b/src/mango/src/mango_httpd.erl
index ca867faed..77a73c112 100644
--- a/src/mango/src/mango_httpd.erl
+++ b/src/mango/src/mango_httpd.erl
@@ -208,6 +208,7 @@ handle_partition_explain_req(#httpd{method='POST'}=Req, Db, Partition) ->
chttpd:validate_ctype(Req, "application/json"),
{ok, Body} = add_partition_to_query(Req, Partition),
{ok, Opts0} = mango_opts:validate_find(Body),
+ ok = mango_opts:validate_partition(Body),
{value, {selector, Sel}, Opts} = lists:keytake(selector, 1, Opts0),
Resp = mango_crud:explain(Db, Sel, Opts),
chttpd:send_json(Req, Resp);
@@ -234,6 +235,7 @@ handle_partition_find_req(#httpd{method='POST'}=Req, Db, Partition) ->
chttpd:validate_ctype(Req, "application/json"),
{ok, Body} = add_partition_to_query(Req, Partition),
{ok, Opts0} = mango_opts:validate_find(Body),
+ ok = mango_opts:validate_partition(Body),
{value, {selector, Sel}, Opts} = lists:keytake(selector, 1, Opts0),
{ok, Resp0} = start_find_resp(Req),
{ok, AccOut} = run_find(Resp0, Db, Sel, Opts),
diff --git a/src/mango/src/mango_opts.erl b/src/mango/src/mango_opts.erl
index d846287c3..365e248ec 100644
--- a/src/mango/src/mango_opts.erl
+++ b/src/mango/src/mango_opts.erl
@@ -34,6 +34,7 @@
validate_sort/1,
validate_fields/1,
validate_bulk_delete/1,
+ validate_partition/1,
default_limit/0
]).
@@ -357,3 +358,15 @@ validate_opt(Name, [{validator, Fun} | Rest], Value) ->
default_limit() ->
config:get_integer("mango", "default_limit", 25).
+
+
+validate_partition({Props}) ->
+ case lists:keyfind(<<"r">>, 1, Props) of
+ false ->
+ ok;
+ {<<"r">>, 1} ->
+ ok;
+ {<<"r">>, _Value} ->
+ ?MANGO_ERROR(invalid_partition_read)
+
+ end.