Skip to content

Commit 423fbe1

Browse files
authored
Feature/172 x509 support (#364)
* Add MONGODB_X509 Authenticator * Add X509 to AuthenticationScheme * Extend db to accept x509 * Fix ConnectionManager to accept passwordless authentication * Update Dart sdk: ">=3.3.0 <4.0.0"
1 parent ef277a5 commit 423fbe1

File tree

6 files changed

+45
-6
lines changed

6 files changed

+45
-6
lines changed

lib/mongo_dart.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import 'package:bson/src/types/bson_map.dart';
2626
// ignore: implementation_imports
2727
import 'package:bson/src/types/bson_string.dart';
2828
import 'package:logging/logging.dart';
29+
import 'package:mongo_dart/src/auth/mongodb_x509_authenticator.dart';
2930
import 'package:uuid/uuid.dart';
3031
import 'package:mongo_dart/src/auth/scram_sha256_authenticator.dart';
3132
import 'package:mongo_dart/src/database/cursor/modern_cursor.dart';

lib/src/auth/auth.dart

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
//part of mongo_dart;
22
import 'package:mongo_dart/mongo_dart.dart' show Connection, Db, MongoDartError;
3+
import 'package:mongo_dart/src/auth/mongodb_x509_authenticator.dart';
34
import 'package:sasl_scram/sasl_scram.dart' show UsernamePasswordCredential;
45

56
import 'mongodb_cr_authenticator.dart';
67
import 'scram_sha1_authenticator.dart';
78
import 'scram_sha256_authenticator.dart';
89

910
// ignore: constant_identifier_names
10-
enum AuthenticationScheme { MONGODB_CR, SCRAM_SHA_1, SCRAM_SHA_256 }
11+
enum AuthenticationScheme { MONGODB_CR, SCRAM_SHA_1, SCRAM_SHA_256, X509 }
1112

1213
abstract class Authenticator {
1314
Authenticator();
@@ -21,6 +22,8 @@ abstract class Authenticator {
2122
return ScramSha1Authenticator(credentials, db);
2223
case AuthenticationScheme.SCRAM_SHA_256:
2324
return ScramSha256Authenticator(credentials, db);
25+
case AuthenticationScheme.X509:
26+
return MongoDbX509Authenticator(credentials.username, db);
2427
default:
2528
throw MongoDartError("Authenticator wasn't specified");
2629
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
//part of mongo_dart;
2+
import 'package:mongo_dart/mongo_dart.dart'
3+
show Connection, Db, DbCommand, MongoQueryMessage;
4+
import 'package:mongo_dart/src/auth/auth.dart';
5+
6+
class MongoDbX509Authenticator extends Authenticator {
7+
MongoDbX509Authenticator(this.username, this.db) : super();
8+
9+
static final String name = 'MONGODB-X509';
10+
11+
final Db db;
12+
final String? username;
13+
14+
@override
15+
Future authenticate(Connection connection) {
16+
var command = createMongoDbX509AuthenticationCommand(db, username);
17+
return db
18+
.executeDbCommand(command, connection: connection)
19+
.then((res) => res['ok'] == 1);
20+
}
21+
22+
static DbCommand createMongoDbX509AuthenticationCommand(
23+
Db db, String? username) {
24+
var selector = {
25+
'authenticate': 1,
26+
'mechanism': name,
27+
if (username != null && username.isNotEmpty) 'user': username,
28+
};
29+
30+
return DbCommand(db.authSourceDb ?? db, DbCommand.SYSTEM_COMMAND_COLLECTION,
31+
MongoQueryMessage.OPTS_NONE, 0, 0, selector, null);
32+
}
33+
}

lib/src/database/db.dart

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -392,6 +392,8 @@ class Db {
392392
_authenticationScheme = AuthenticationScheme.SCRAM_SHA_256;
393393
} else if (authenticationSchemeName == MongoDbCRAuthenticator.name) {
394394
_authenticationScheme = AuthenticationScheme.MONGODB_CR;
395+
} else if (authenticationSchemeName == MongoDbX509Authenticator.name) {
396+
_authenticationScheme = AuthenticationScheme.X509;
395397
} else {
396398
throw MongoDartError('Provided authentication scheme is '
397399
'not supported : $authenticationSchemeName');
@@ -727,7 +729,7 @@ class Db {
727729
.toList();
728730
}
729731

730-
Future<bool> authenticate(String userName, String password,
732+
Future<bool> authenticate(String? userName, String? password,
731733
{Connection? connection}) async {
732734
var credential = UsernamePasswordCredential()
733735
..username = userName

lib/src/network/connection_manager.dart

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -90,12 +90,12 @@ class ConnectionManager {
9090
db._authenticationScheme = AuthenticationScheme.MONGODB_CR;
9191
}
9292
}
93-
if (connection.serverConfig.userName == null) {
93+
if (connection.serverConfig.isAuthenticated) {
9494
_log.fine(() => '$db: ${connection.serverConfig.hostUrl} connected');
9595
} else {
9696
try {
97-
await db.authenticate(connection.serverConfig.userName!,
98-
connection.serverConfig.password ?? '',
97+
await db.authenticate(connection.serverConfig.userName,
98+
connection.serverConfig.password,
9999
connection: connection);
100100
_log.fine(() => '$db: ${connection.serverConfig.hostUrl} connected');
101101
} catch (e) {

pubspec.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ description: MongoDB driver, implemented in pure Dart. All CRUD operations, aggr
44
homepage: https://github.com/mongo-dart/mongo_dart
55

66
environment:
7-
sdk: ">=2.17.0 <4.0.0"
7+
sdk: ">=3.3.0 <4.0.0"
88

99
dependencies:
1010
bson: ^5.0.0

0 commit comments

Comments
 (0)