Status AuthzManagerExternalStateMongod::getStoredAuthorizationVersion(int* outVersion) { { Client::GodScope gs; Client::ReadContext ctx(AuthorizationManager::versionCollectionNamespace.ns()); BSONObj versionDoc; if (Helpers::findOne(AuthorizationManager::versionCollectionNamespace.ns(), BSON("_id" << 1), versionDoc)) { BSONElement versionElement = versionDoc["currentVersion"]; if (versionElement.isNumber()) { *outVersion = versionElement.numberInt(); return Status::OK(); } else if (versionElement.eoo()) { return Status(ErrorCodes::NoSuchKey, "No currentVersion field in version document."); } else { return Status(ErrorCodes::TypeMismatch, mongoutils::str::stream() << "Bad (non-numeric) type " << versionElement.type() << "for currentVersion field in version document"); } } } if (hasAnyPrivilegeDocuments()) { *outVersion = 1; } else { *outVersion = 2; } return Status::OK(); }
Status AuthzManagerExternalStateLocal::getStoredAuthorizationVersion(int* outVersion) { BSONObj versionDoc; Status status = findOne(AuthorizationManager::versionCollectionNamespace, AuthorizationManager::versionDocumentQuery, &versionDoc); if (status.isOK()) { BSONElement versionElement = versionDoc[AuthorizationManager::schemaVersionFieldName]; if (versionElement.isNumber()) { *outVersion = versionElement.numberInt(); return Status::OK(); } else if (versionElement.eoo()) { return Status(ErrorCodes::NoSuchKey, mongoutils::str::stream() << "No " << AuthorizationManager::schemaVersionFieldName << " field in version document."); } else { return Status(ErrorCodes::TypeMismatch, mongoutils::str::stream() << "Bad (non-numeric) type " << versionElement.type() << "for " << AuthorizationManager::schemaVersionFieldName << " field in version document"); } } else if (status == ErrorCodes::NoMatchingDocument) { if (hasAnyPrivilegeDocuments()) { *outVersion = AuthorizationManager::schemaVersion24; } else { *outVersion = AuthorizationManager::schemaVersion26Final; } return Status::OK(); } else { return status; } }