summaryrefslogtreecommitdiff
path: root/src/mongo/crypto/jwk_manager.cpp
diff options
context:
space:
mode:
authorAdrian Gonzalez <adriangonzalezmontemayor@gmail.com>2023-02-14 22:09:30 +0000
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2023-03-02 06:33:19 +0000
commit5053b3a61e96650ecee5590145e2f4e01c80b715 (patch)
tree6f1355cac427f27220fa343c3caf60ab68f0e349 /src/mongo/crypto/jwk_manager.cpp
parent35a35f737db703ec3b35e33f94e2bc5862453bd1 (diff)
downloadmongo-5053b3a61e96650ecee5590145e2f4e01c80b715.tar.gz
SERVER-73495 Allow JWKS refresh to invalidate keys even on failure
Diffstat (limited to 'src/mongo/crypto/jwk_manager.cpp')
-rw-r--r--src/mongo/crypto/jwk_manager.cpp20
1 files changed, 13 insertions, 7 deletions
diff --git a/src/mongo/crypto/jwk_manager.cpp b/src/mongo/crypto/jwk_manager.cpp
index 32234719608..4f8d78ebb92 100644
--- a/src/mongo/crypto/jwk_manager.cpp
+++ b/src/mongo/crypto/jwk_manager.cpp
@@ -56,12 +56,18 @@ StringData reduceInt(StringData value) {
} // namespace
-JWKManager::JWKManager(StringData source) : _keyURI(source), _isKeyModified(false) {
- _loadKeysFromUri(true /* isInitialLoad */);
+JWKManager::JWKManager(StringData source, bool loadAtStartup)
+ : _keyURI(source), _isKeyModified(false) {
+ if (loadAtStartup) {
+ _loadKeysFromUri();
+ } else {
+ _keyMaterial = std::make_shared<KeyMap>();
+ _validators = std::make_shared<SharedValidatorMap>();
+ }
}
JWKManager::JWKManager(BSONObj keys) : _isKeyModified(false) {
- _setAndValidateKeys(keys, true /* isInitialLoad */);
+ _setAndValidateKeys(keys);
}
StatusWith<SharedValidator> JWKManager::getValidator(StringData keyId) {
@@ -70,7 +76,7 @@ StatusWith<SharedValidator> JWKManager::getValidator(StringData keyId) {
if (it == currentValidators->end()) {
// If the JWKManager has been initialized with an URI, try refreshing.
if (_keyURI) {
- _loadKeysFromUri(false /* isInitialLoad */);
+ _loadKeysFromUri();
currentValidators = _validators;
it = currentValidators->find(keyId.toString());
}
@@ -83,7 +89,7 @@ StatusWith<SharedValidator> JWKManager::getValidator(StringData keyId) {
return it->second;
}
-void JWKManager::_setAndValidateKeys(const BSONObj& keys, bool isInitialLoad) {
+void JWKManager::_setAndValidateKeys(const BSONObj& keys) {
auto newValidators = std::make_shared<SharedValidatorMap>();
auto newKeyMaterial = std::make_shared<KeyMap>();
@@ -138,7 +144,7 @@ void JWKManager::_setAndValidateKeys(const BSONObj& keys, bool isInitialLoad) {
std::atomic_exchange(&_keyMaterial, std::move(newKeyMaterial)); // NOLINT
}
-void JWKManager::_loadKeysFromUri(bool isInitialLoad) {
+void JWKManager::_loadKeysFromUri() {
try {
auto httpClient = HttpClient::createWithoutConnectionPool();
httpClient->setHeaders({"Accept: */*"});
@@ -152,7 +158,7 @@ void JWKManager::_loadKeysFromUri(bool isInitialLoad) {
cdr.readInto<StringData>(&str);
BSONObj data = fromjson(str);
- _setAndValidateKeys(data, isInitialLoad);
+ _setAndValidateKeys(data);
} catch (const DBException& ex) {
// throws
uassertStatusOK(ex.toStatus().withContext(str::stream() << "Failed loading keys from "