From 0562dca90f27f793dfb483a73c46e5534671b29d Mon Sep 17 00:00:00 2001 From: Rebar Ahmad Date: Wed, 21 Feb 2024 03:59:20 +0100 Subject: [PATCH 1/5] Add MONGODB_X509 Authenticator --- lib/src/auth/mongodb_x509_authenticator.dart | 33 ++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 lib/src/auth/mongodb_x509_authenticator.dart diff --git a/lib/src/auth/mongodb_x509_authenticator.dart b/lib/src/auth/mongodb_x509_authenticator.dart new file mode 100644 index 00000000..58bfd2cb --- /dev/null +++ b/lib/src/auth/mongodb_x509_authenticator.dart @@ -0,0 +1,33 @@ +//part of mongo_dart; +import 'package:mongo_dart/mongo_dart.dart' + show Connection, Db, DbCommand, MongoQueryMessage; +import 'package:mongo_dart/src/auth/auth.dart'; + +class MongoDbX509Authenticator extends Authenticator { + MongoDbX509Authenticator(this.username, this.db) : super(); + + static final String name = 'MONGODB-X509'; + + final Db db; + final String? username; + + @override + Future authenticate(Connection connection) { + var command = createMongoDbX509AuthenticationCommand(db, username); + return db + .executeDbCommand(command, connection: connection) + .then((res) => res['ok'] == 1); + } + + static DbCommand createMongoDbX509AuthenticationCommand( + Db db, String? username) { + var selector = { + 'authenticate': 1, + 'mechanism': name, + if (username != null && username.isNotEmpty) 'user': username, + }; + + return DbCommand(db.authSourceDb ?? db, DbCommand.SYSTEM_COMMAND_COLLECTION, + MongoQueryMessage.OPTS_NONE, 0, 0, selector, null); + } +} From aea3cf3b81793fff9c949074c95f7ee302c3f8fc Mon Sep 17 00:00:00 2001 From: Rebar Ahmad Date: Wed, 21 Feb 2024 03:59:33 +0100 Subject: [PATCH 2/5] Add X509 to AuthenticationScheme --- lib/src/auth/auth.dart | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lib/src/auth/auth.dart b/lib/src/auth/auth.dart index a9d72b86..54a2df56 100644 --- a/lib/src/auth/auth.dart +++ b/lib/src/auth/auth.dart @@ -1,5 +1,6 @@ //part of mongo_dart; import 'package:mongo_dart/mongo_dart.dart' show Connection, Db, MongoDartError; +import 'package:mongo_dart/src/auth/mongodb_x509_authenticator.dart'; import 'package:sasl_scram/sasl_scram.dart' show UsernamePasswordCredential; import 'mongodb_cr_authenticator.dart'; @@ -7,7 +8,7 @@ import 'scram_sha1_authenticator.dart'; import 'scram_sha256_authenticator.dart'; // ignore: constant_identifier_names -enum AuthenticationScheme { MONGODB_CR, SCRAM_SHA_1, SCRAM_SHA_256 } +enum AuthenticationScheme { MONGODB_CR, SCRAM_SHA_1, SCRAM_SHA_256, X509 } abstract class Authenticator { Authenticator(); @@ -21,6 +22,8 @@ abstract class Authenticator { return ScramSha1Authenticator(credentials, db); case AuthenticationScheme.SCRAM_SHA_256: return ScramSha256Authenticator(credentials, db); + case AuthenticationScheme.X509: + return MongoDbX509Authenticator(credentials.username, db); default: throw MongoDartError("Authenticator wasn't specified"); } From 5826c78d632f29c9bfd853e6195f7edaf6c8cf6d Mon Sep 17 00:00:00 2001 From: Rebar Ahmad Date: Wed, 21 Feb 2024 03:59:53 +0100 Subject: [PATCH 3/5] Extend db to accept x509 --- lib/src/database/db.dart | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/src/database/db.dart b/lib/src/database/db.dart index 0b8aa9b6..952051b1 100644 --- a/lib/src/database/db.dart +++ b/lib/src/database/db.dart @@ -392,6 +392,8 @@ class Db { _authenticationScheme = AuthenticationScheme.SCRAM_SHA_256; } else if (authenticationSchemeName == MongoDbCRAuthenticator.name) { _authenticationScheme = AuthenticationScheme.MONGODB_CR; + } else if (authenticationSchemeName == MongoDbX509Authenticator.name) { + _authenticationScheme = AuthenticationScheme.X509; } else { throw MongoDartError('Provided authentication scheme is ' 'not supported : $authenticationSchemeName'); @@ -727,7 +729,7 @@ class Db { .toList(); } - Future authenticate(String userName, String password, + Future authenticate(String? userName, String? password, {Connection? connection}) async { var credential = UsernamePasswordCredential() ..username = userName From a41f99baffb5def9057589e01501312816ba85c6 Mon Sep 17 00:00:00 2001 From: Rebar Ahmad Date: Wed, 21 Feb 2024 04:00:26 +0100 Subject: [PATCH 4/5] Fix ConnectionManager to accept passwordless authentication --- lib/src/network/connection_manager.dart | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/src/network/connection_manager.dart b/lib/src/network/connection_manager.dart index 1fc9772a..ea3ae932 100644 --- a/lib/src/network/connection_manager.dart +++ b/lib/src/network/connection_manager.dart @@ -90,12 +90,12 @@ class ConnectionManager { db._authenticationScheme = AuthenticationScheme.MONGODB_CR; } } - if (connection.serverConfig.userName == null) { + if (connection.serverConfig.isAuthenticated) { _log.fine(() => '$db: ${connection.serverConfig.hostUrl} connected'); } else { try { - await db.authenticate(connection.serverConfig.userName!, - connection.serverConfig.password ?? '', + await db.authenticate(connection.serverConfig.userName, + connection.serverConfig.password, connection: connection); _log.fine(() => '$db: ${connection.serverConfig.hostUrl} connected'); } catch (e) { From 496314909f18c805a410bd26f97cf81076061690 Mon Sep 17 00:00:00 2001 From: Rebar Ahmad Date: Wed, 21 Feb 2024 04:00:42 +0100 Subject: [PATCH 5/5] Update Dart sdk: ">=3.3.0 <4.0.0" --- lib/mongo_dart.dart | 1 + pubspec.yaml | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/mongo_dart.dart b/lib/mongo_dart.dart index 371c09ca..266a2671 100644 --- a/lib/mongo_dart.dart +++ b/lib/mongo_dart.dart @@ -26,6 +26,7 @@ import 'package:bson/src/types/bson_map.dart'; // ignore: implementation_imports import 'package:bson/src/types/bson_string.dart'; import 'package:logging/logging.dart'; +import 'package:mongo_dart/src/auth/mongodb_x509_authenticator.dart'; import 'package:uuid/uuid.dart'; import 'package:mongo_dart/src/auth/scram_sha256_authenticator.dart'; import 'package:mongo_dart/src/database/cursor/modern_cursor.dart'; diff --git a/pubspec.yaml b/pubspec.yaml index 76c6d145..1e0ece3b 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -4,7 +4,7 @@ description: MongoDB driver, implemented in pure Dart. All CRUD operations, aggr homepage: https://github.com/mongo-dart/mongo_dart environment: - sdk: ">=2.17.0 <4.0.0" + sdk: ">=3.3.0 <4.0.0" dependencies: bson: ^5.0.0