summaryrefslogtreecommitdiff
path: root/src/mongo/db/commands.cpp
diff options
context:
space:
mode:
authorA. Jesse Jiryu Davis <jesse@mongodb.com>2020-08-11 11:17:08 -0400
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2020-08-13 19:32:49 +0000
commitf4ed96b5a788003322a2dc36b46063475a0b36ca (patch)
tree78bcdd4a6ba79586131222de0c228dfb4fc6e9b3 /src/mongo/db/commands.cpp
parent53b690294d160a6e1cd0f4a004cb55c4835a48b8 (diff)
downloadmongo-f4ed96b5a788003322a2dc36b46063475a0b36ca.tar.gz
SERVER-49858 Don't forward API params from drop/dropDatabase to config servers
There are two mongos commands in API Version 1 that forward their parameters to internal commands: "drop" forwards to "_configsvrDropCollection" and "dropDatabase" forwards to "_configsvrDropDatabase". Users should be permitted to call the mongos commands with apiVersion: "1", apiStrict: true, but the internal commands aren't in Version 1 and they'll reject these parameters. So, strip the API version parameters when forwarding.
Diffstat (limited to 'src/mongo/db/commands.cpp')
-rw-r--r--src/mongo/db/commands.cpp37
1 files changed, 32 insertions, 5 deletions
diff --git a/src/mongo/db/commands.cpp b/src/mongo/db/commands.cpp
index 579603598e7..7fcbd220b6d 100644
--- a/src/mongo/db/commands.cpp
+++ b/src/mongo/db/commands.cpp
@@ -358,18 +358,45 @@ void CommandHelpers::appendCommandWCStatus(BSONObjBuilder& result,
}
}
-BSONObj CommandHelpers::appendPassthroughFields(const BSONObj& cmdObjWithPassthroughFields,
- const BSONObj& request) {
+namespace {
+
+enum class FilterApiParameters { kPreserveApiParameters, kRemoveApiParameters };
+
+BSONObj _appendPassthroughFields(const BSONObj& cmdObjWithPassthroughFields,
+ const BSONObj& request,
+ FilterApiParameters filterApiParameters) {
BSONObjBuilder b;
b.appendElements(request);
- for (const auto& elem : filterCommandRequestForPassthrough(cmdObjWithPassthroughFields)) {
+ for (const auto& elem :
+ CommandHelpers::filterCommandRequestForPassthrough(cmdObjWithPassthroughFields)) {
const auto name = elem.fieldNameStringData();
- if (isGenericArgument(name) && !request.hasField(name)) {
- b.append(elem);
+ if (request.hasField(name)) {
+ continue;
+ }
+ if (filterApiParameters == FilterApiParameters::kRemoveApiParameters &&
+ isApiParameter(name)) {
+ continue;
}
+ if (!isGenericArgument(name)) {
+ continue;
+ }
+ b.append(elem);
}
return b.obj();
}
+} // namespace
+
+BSONObj CommandHelpers::appendPassthroughFields(const BSONObj& cmdObjWithPassthroughFields,
+ const BSONObj& request) {
+ return _appendPassthroughFields(
+ cmdObjWithPassthroughFields, request, FilterApiParameters::kPreserveApiParameters);
+}
+
+BSONObj CommandHelpers::appendInternalPassthroughFields(const BSONObj& cmdObjWithPassthroughFields,
+ const BSONObj& request) {
+ return _appendPassthroughFields(
+ cmdObjWithPassthroughFields, request, FilterApiParameters::kRemoveApiParameters);
+}
BSONObj CommandHelpers::appendMajorityWriteConcern(const BSONObj& cmdObj,
WriteConcernOptions defaultWC) {