diff options
Diffstat (limited to 'src/mongo/db/auth/user_request_x509.cpp')
| -rw-r--r-- | src/mongo/db/auth/user_request_x509.cpp | 29 |
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 |
