summaryrefslogtreecommitdiff
path: root/src/mongo/rpc/metadata.cpp
diff options
context:
space:
mode:
authorAdam Midvidy <amidvidy@gmail.com>2015-06-10 22:10:30 -0400
committerAdam Midvidy <amidvidy@gmail.com>2015-06-16 16:25:38 -0400
commit4eb15b34d157e2719fc9034f5956b698d96ef64e (patch)
treedbdb1714147eba77fd24f92d04d05db87afc0c3f /src/mongo/rpc/metadata.cpp
parent2bf407c955f383a29d3d10fc6be273d9c6890961 (diff)
downloadmongo-4eb15b34d157e2719fc9034f5956b698d96ef64e.tar.gz
SERVER-18236 SERVER-18292 send impersonated users and roles via metadata object
Diffstat (limited to 'src/mongo/rpc/metadata.cpp')
-rw-r--r--src/mongo/rpc/metadata.cpp57
1 files changed, 52 insertions, 5 deletions
diff --git a/src/mongo/rpc/metadata.cpp b/src/mongo/rpc/metadata.cpp
index 43e4cf37eff..e7725dd4a74 100644
--- a/src/mongo/rpc/metadata.cpp
+++ b/src/mongo/rpc/metadata.cpp
@@ -50,6 +50,11 @@ namespace rpc {
}
ServerSelectionMetadata::get(txn) = std::move(swServerSelectionMetadata.getValue());
+ auto swAuditMetadata = AuditMetadata::readFromMetadata(metadataObj);
+ if (!swAuditMetadata.isOK()) {
+ return swAuditMetadata.getStatus();
+ }
+ AuditMetadata::get(txn) = std::move(swAuditMetadata.getValue());
return Status::OK();
}
@@ -65,24 +70,66 @@ namespace rpc {
}
StatusWith<CommandAndMetadata> upconvertRequestMetadata(BSONObj legacyCmdObj, int queryFlags) {
- BSONObjBuilder commandBob;
+ // We can reuse the same metadata BOB for every upconvert call, but we need to keep
+ // making new command BOBs as each metadata bob will need to remove fields. We can not use
+ // mutablebson here because the ServerSelectionMetadata upconvert routine performs
+ // manipulations (replacing a root with its child) that mutablebson doesn't
+ // support.
BSONObjBuilder metadataBob;
+ // Ordering is important here - ServerSelectionMetadata must be upconverted
+ // first, then AuditMetadata.
+ BSONObjBuilder ssmCommandBob;
auto upconvertStatus = ServerSelectionMetadata::upconvert(legacyCmdObj,
queryFlags,
- &commandBob,
+ &ssmCommandBob,
&metadataBob);
if (!upconvertStatus.isOK()) {
return upconvertStatus;
}
- return std::make_tuple(commandBob.obj(), metadataBob.obj());
+
+ BSONObjBuilder auditCommandBob;
+ upconvertStatus = AuditMetadata::upconvert(ssmCommandBob.done(),
+ queryFlags,
+ &auditCommandBob,
+ &metadataBob);
+
+ if (!upconvertStatus.isOK()) {
+ return upconvertStatus;
+ }
+
+
+ return std::make_tuple(auditCommandBob.obj(), metadataBob.obj());
}
StatusWith<LegacyCommandAndFlags> downconvertRequestMetadata(BSONObj cmdObj, BSONObj metadata) {
int legacyQueryFlags = 0;
- BSONObjBuilder legacyCommandBob;
+ BSONObjBuilder auditCommandBob;
+ // Ordering is important here - AuditingMetadata must be downconverted first,
+ // then ServerSelectionMetadata.
+ auto downconvertStatus = AuditMetadata::downconvert(cmdObj,
+ metadata,
+ &auditCommandBob,
+ &legacyQueryFlags);
+ if (!downconvertStatus.isOK()) {
+ return downconvertStatus;
+ }
+
+
+ BSONObjBuilder ssmCommandBob;
+ downconvertStatus = ServerSelectionMetadata::downconvert(auditCommandBob.done(),
+ metadata,
+ &ssmCommandBob,
+ &legacyQueryFlags);
+ if (!downconvertStatus.isOK()) {
+ return downconvertStatus;
+ }
+
+
+ return std::make_tuple(ssmCommandBob.obj(), std::move(legacyQueryFlags));
+ }
StatusWith<CommandReplyWithMetadata> upconvertReplyMetadata(BSONObj legacyReply) {
BSONObjBuilder commandReplyBob;
@@ -108,7 +155,7 @@ namespace rpc {
return downconvertStatus;
}
- return std::make_tuple(legacyCommandBob.obj(), std::move(legacyQueryFlags));
+ return legacyCommandReplyBob.obj();
}
} // namespace rpc