summaryrefslogtreecommitdiff
path: root/src/mongo/db/commands
diff options
context:
space:
mode:
Diffstat (limited to 'src/mongo/db/commands')
-rw-r--r--src/mongo/db/commands/user_management_commands.cpp50
-rw-r--r--src/mongo/db/commands/user_management_commands_parser.cpp2
2 files changed, 49 insertions, 3 deletions
diff --git a/src/mongo/db/commands/user_management_commands.cpp b/src/mongo/db/commands/user_management_commands.cpp
index 8739320b876..10382f06f62 100644
--- a/src/mongo/db/commands/user_management_commands.cpp
+++ b/src/mongo/db/commands/user_management_commands.cpp
@@ -67,6 +67,20 @@ namespace mongo {
}
}
+ static Status extractWriteConcern(const BSONObj cmdObj, BSONObj* writeConcern) {
+ BSONElement writeConcernElement;
+ Status status = bsonExtractTypedField(cmdObj, "writeConcern", Object, &writeConcernElement);
+ if (!status.isOK()) {
+ if (status.code() == ErrorCodes::NoSuchKey) {
+ *writeConcern = BSONObj();
+ return Status::OK();
+ }
+ return status;
+ }
+ *writeConcern = writeConcernElement.Obj();
+ return Status::OK();
+ }
+
class CmdCreateUser : public Command {
public:
@@ -114,7 +128,14 @@ namespace mongo {
return false;
}
- status = authzManager->insertPrivilegeDocument(dbname, userObj);
+ BSONObj writeConcern;
+ status = extractWriteConcern(cmdObj, &writeConcern);
+ if (!status.isOK()) {
+ addStatus(status, result);
+ return false;
+ }
+
+ status = authzManager->insertPrivilegeDocument(dbname, userObj, writeConcern);
if (!status.isOK()) {
addStatus(status, result);
return false;
@@ -177,7 +198,14 @@ namespace mongo {
return false;
}
- status = authzManager->updatePrivilegeDocument(userName, updateObj);
+ BSONObj writeConcern;
+ status = extractWriteConcern(cmdObj, &writeConcern);
+ if (!status.isOK()) {
+ addStatus(status, result);
+ return false;
+ }
+
+ status = authzManager->updatePrivilegeDocument(userName, updateObj, writeConcern);
if (!status.isOK()) {
addStatus(status, result);
return false;
@@ -237,11 +265,19 @@ namespace mongo {
return false;
}
+ BSONObj writeConcern;
+ status = extractWriteConcern(cmdObj, &writeConcern);
+ if (!status.isOK()) {
+ addStatus(status, result);
+ return false;
+ }
+
int numUpdated;
AuthorizationManager* authzManager = getGlobalAuthorizationManager();
status = authzManager->removePrivilegeDocuments(
BSON(AuthorizationManager::USER_NAME_FIELD_NAME << user <<
AuthorizationManager::USER_SOURCE_FIELD_NAME << dbname),
+ writeConcern,
&numUpdated);
if (!status.isOK()) {
addStatus(status, result);
@@ -298,10 +334,18 @@ namespace mongo {
string& errmsg,
BSONObjBuilder& result,
bool fromRepl) {
+ BSONObj writeConcern;
+ Status status = extractWriteConcern(cmdObj, &writeConcern);
+ if (!status.isOK()) {
+ addStatus(status, result);
+ return false;
+ }
+
int numRemoved;
AuthorizationManager* authzManager = getGlobalAuthorizationManager();
- Status status = authzManager->removePrivilegeDocuments(
+ status = authzManager->removePrivilegeDocuments(
BSON(AuthorizationManager::USER_SOURCE_FIELD_NAME << dbname),
+ writeConcern,
&numRemoved);
if (!status.isOK()) {
addStatus(status, result);
diff --git a/src/mongo/db/commands/user_management_commands_parser.cpp b/src/mongo/db/commands/user_management_commands_parser.cpp
index 2e4f42211fd..ff17d046653 100644
--- a/src/mongo/db/commands/user_management_commands_parser.cpp
+++ b/src/mongo/db/commands/user_management_commands_parser.cpp
@@ -116,6 +116,7 @@ namespace auth {
validFieldNames.insert("customData");
validFieldNames.insert("pwd");
validFieldNames.insert("roles");
+ validFieldNames.insert("writeConcern");
// Iterate through all fields in command object and make sure there are no unexpected
// ones.
@@ -218,6 +219,7 @@ namespace auth {
validFieldNames.insert("customData");
validFieldNames.insert("pwd");
validFieldNames.insert("roles");
+ validFieldNames.insert("writeConcern");
// Iterate through all fields in command object and make sure there are no unexpected
// ones.