diff options
author | A. Jesse Jiryu Davis <jesse@mongodb.com> | 2020-08-11 11:17:08 -0400 |
---|---|---|
committer | Evergreen Agent <no-reply@evergreen.mongodb.com> | 2020-08-13 19:32:49 +0000 |
commit | f4ed96b5a788003322a2dc36b46063475a0b36ca (patch) | |
tree | 78bcdd4a6ba79586131222de0c228dfb4fc6e9b3 /src/mongo/db/commands.cpp | |
parent | 53b690294d160a6e1cd0f4a004cb55c4835a48b8 (diff) | |
download | mongo-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.cpp | 37 |
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) { |