summaryrefslogtreecommitdiff
path: root/src/mongo/db/auth/user_request_x509.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mongo/db/auth/user_request_x509.cpp')
-rw-r--r--src/mongo/db/auth/user_request_x509.cpp29
1 files changed, 29 insertions, 0 deletions
diff --git a/src/mongo/db/auth/user_request_x509.cpp b/src/mongo/db/auth/user_request_x509.cpp
index b1ee435ba5b..ef19943435b 100644
--- a/src/mongo/db/auth/user_request_x509.cpp
+++ b/src/mongo/db/auth/user_request_x509.cpp
@@ -35,12 +35,41 @@ namespace mongo {
#ifdef MONGO_CONFIG_SSL
+StatusWith<std::unique_ptr<UserRequest>> UserRequestX509::makeUserRequestX509(
+ UserName name,
+ boost::optional<std::set<RoleName>> roles,
+ const SSLPeerInfo& peerInfo,
+ bool forReacquire) {
+ auto request =
+ std::make_unique<UserRequestX509>(std::move(name), std::move(roles), std::move(peerInfo));
+
+ if (!forReacquire) {
+ return std::unique_ptr<UserRequest>(std::move(request));
+ }
+
+ request->_tryAcquireRoles();
+ return std::unique_ptr<UserRequest>(std::move(request));
+}
+
UserRequest::UserRequestCacheKey UserRequestX509::generateUserRequestCacheKey() const {
auto hashElements = getUserNameAndRolesVector(getUserName(), getRoles());
getPeerInfo().appendPeerInfoToVector(hashElements);
return UserRequestCacheKey(getUserName(), hashElements);
}
+void UserRequestX509::_tryAcquireRoles() {
+ auto&& peerRoles = getPeerInfo().roles();
+ if (peerRoles.empty()) {
+ return;
+ }
+
+ std::set<RoleName> requestRoles;
+ std::copy(
+ peerRoles.begin(), peerRoles.end(), std::inserter(requestRoles, requestRoles.begin()));
+
+ setRoles(std::move(requestRoles));
+}
+
#endif // MONGO_CONFIG_SSL
} // namespace mongo