@@ -259,17 +259,20 @@ public virtual MongoCollection<BsonDocument> this[string collectionName]
259
259
/// Adds a user to this database.
260
260
/// </summary>
261
261
/// <param name="user">The user.</param>
262
+ [ Obsolete ( "Use the new user management command 'createUser' or 'updateUser'." ) ]
262
263
public virtual void AddUser ( MongoUser user )
263
264
{
264
- var users = GetCollection ( "system.users" ) ;
265
- var document = users . FindOne ( Query . EQ ( "user" , user . Username ) ) ;
266
- if ( document == null )
265
+ using ( RequestStart ( ReadPreference . Primary ) )
267
266
{
268
- document = new BsonDocument ( "user" , user . Username ) ;
267
+ if ( _server . RequestConnection . ServerInstance . Supports ( FeatureId . UserManagementCommands ) )
268
+ {
269
+ AddUserWithUserManagementCommands ( user ) ;
270
+ }
271
+ else
272
+ {
273
+ AddUserWithInsert ( user ) ;
274
+ }
269
275
}
270
- document [ "readOnly" ] = user . IsReadOnly ;
271
- document [ "pwd" ] = user . PasswordHash ;
272
- users . Save ( document ) ;
273
276
}
274
277
275
278
/// <summary>
@@ -467,40 +470,36 @@ public virtual object FetchDBRefAs(Type documentType, MongoDBRef dbRef)
467
470
/// Finds all users of this database.
468
471
/// </summary>
469
472
/// <returns>An array of users.</returns>
473
+ [ Obsolete ( "Use the new user management command 'usersInfo'." ) ]
470
474
public virtual MongoUser [ ] FindAllUsers ( )
471
475
{
472
- var result = new List < MongoUser > ( ) ;
473
- var users = GetCollection ( "system.users" ) ;
474
- foreach ( var document in users . FindAll ( ) )
476
+ using ( RequestStart ( ReadPreference . Primary ) )
475
477
{
476
- var username = document [ "user" ] . AsString ;
477
- var passwordHash = document [ "pwd" ] . AsString ;
478
- var readOnly = document [ "readOnly" ] . ToBoolean ( ) ;
479
- var user = new MongoUser ( username , passwordHash , readOnly ) ;
480
- result . Add ( user ) ;
481
- } ;
482
- return result . ToArray ( ) ;
478
+ if ( _server . RequestConnection . ServerInstance . Supports ( FeatureId . UserManagementCommands ) )
479
+ {
480
+ return FindAllUsersWithUserManagementCommands ( ) ;
481
+ }
482
+
483
+ return FindAllUsersWithQuery ( ) ;
484
+ }
483
485
}
484
486
485
487
/// <summary>
486
488
/// Finds a user of this database.
487
489
/// </summary>
488
490
/// <param name="username">The username.</param>
489
491
/// <returns>The user.</returns>
492
+ [ Obsolete ( "Use the new user management command 'usersInfo'." ) ]
490
493
public virtual MongoUser FindUser ( string username )
491
494
{
492
- var users = GetCollection ( "system.users" ) ;
493
- var query = Query . EQ ( "user" , username ) ;
494
- var document = users . FindOne ( query ) ;
495
- if ( document != null )
496
- {
497
- var passwordHash = document [ "pwd" ] . AsString ;
498
- var readOnly = document [ "readOnly" ] . ToBoolean ( ) ;
499
- return new MongoUser ( username , passwordHash , readOnly ) ;
500
- }
501
- else
495
+ using ( RequestStart ( ReadPreference . Primary ) )
502
496
{
503
- return null ;
497
+ if ( _server . RequestConnection . ServerInstance . Supports ( FeatureId . UserManagementCommands ) )
498
+ {
499
+ return FindUserWithUserManagementCommands ( username ) ;
500
+ }
501
+
502
+ return FindUserWithQuery ( username ) ;
504
503
}
505
504
}
506
505
@@ -796,6 +795,7 @@ public virtual bool IsCollectionNameValid(string collectionName, out string mess
796
795
/// Removes a user from this database.
797
796
/// </summary>
798
797
/// <param name="user">The user to remove.</param>
798
+ [ Obsolete ( "Use RunCommand with a { dropUser: <username> } document." ) ]
799
799
public virtual void RemoveUser ( MongoUser user )
800
800
{
801
801
RemoveUser ( user . Username ) ;
@@ -805,10 +805,21 @@ public virtual void RemoveUser(MongoUser user)
805
805
/// Removes a user from this database.
806
806
/// </summary>
807
807
/// <param name="username">The username to remove.</param>
808
+ [ Obsolete ( "Use RunCommand with a { dropUser: <username> } document." ) ]
808
809
public virtual void RemoveUser ( string username )
809
810
{
810
- var users = GetCollection ( "system.users" ) ;
811
- users . Remove ( Query . EQ ( "user" , username ) ) ;
811
+ using ( RequestStart ( ReadPreference . Primary ) )
812
+ {
813
+ if ( _server . RequestConnection . ServerInstance . Supports ( FeatureId . UserManagementCommands ) )
814
+ {
815
+ RunCommand ( new CommandDocument ( "dropUser" , username ) ) ;
816
+ }
817
+ else
818
+ {
819
+ var users = GetCollection ( "system.users" ) ;
820
+ users . Remove ( Query . EQ ( "user" , username ) ) ;
821
+ }
822
+ }
812
823
}
813
824
814
825
/// <summary>
@@ -1009,6 +1020,118 @@ public override string ToString()
1009
1020
}
1010
1021
1011
1022
// private methods
1023
+ #pragma warning disable 618
1024
+ private void AddUserWithInsert ( MongoUser user )
1025
+ {
1026
+ var users = GetCollection ( "system.users" ) ;
1027
+ var document = users . FindOne ( Query . EQ ( "user" , user . Username ) ) ;
1028
+ if ( document == null )
1029
+ {
1030
+ document = new BsonDocument ( "user" , user . Username ) ;
1031
+ }
1032
+ document [ "readOnly" ] = user . IsReadOnly ;
1033
+ document [ "pwd" ] = user . PasswordHash ;
1034
+ users . Save ( document ) ;
1035
+ }
1036
+ #pragma warning restore
1037
+
1038
+ #pragma warning disable 618
1039
+ private void AddUserWithUserManagementCommands ( MongoUser user )
1040
+ {
1041
+ var usersInfo = RunCommand ( new CommandDocument ( "usersInfo" , user . Username ) ) ;
1042
+
1043
+ var roles = new BsonArray ( ) ;
1044
+ if ( _name == "admin" )
1045
+ {
1046
+ roles . Add ( user . IsReadOnly ? "readAnyDatabase" : "root" ) ;
1047
+ }
1048
+ else
1049
+ {
1050
+ roles . Add ( user . IsReadOnly ? "read" : "dbOwner" ) ;
1051
+ }
1052
+
1053
+ var commandName = "createUser" ;
1054
+
1055
+ if ( usersInfo . Response . Contains ( "users" ) && usersInfo . Response [ "users" ] . AsBsonArray . Count > 0 )
1056
+ {
1057
+ commandName = "updateUser" ;
1058
+ }
1059
+
1060
+ var userCommand = new CommandDocument
1061
+ {
1062
+ { commandName , user . Username } ,
1063
+ { "pwd" , user . PasswordHash } ,
1064
+ { "digestPassword" , false } ,
1065
+ { "roles" , roles }
1066
+ } ;
1067
+
1068
+ RunCommand ( userCommand ) ;
1069
+ }
1070
+ #pragma warning restore
1071
+
1072
+ #pragma warning disable 618
1073
+ private MongoUser FindUserWithQuery ( string username )
1074
+ {
1075
+ var users = GetCollection ( "system.users" ) ;
1076
+ var query = Query . EQ ( "user" , username ) ;
1077
+ var document = users . FindOne ( query ) ;
1078
+ if ( document != null )
1079
+ {
1080
+ var passwordHash = document . GetValue ( "pwd" , "" ) . AsString ;
1081
+ var readOnly = document [ "readOnly" ] . ToBoolean ( ) ;
1082
+ return new MongoUser ( username , passwordHash , readOnly ) ;
1083
+ }
1084
+
1085
+ return null ;
1086
+ }
1087
+ #pragma warning restore
1088
+
1089
+ #pragma warning disable 618
1090
+ private MongoUser FindUserWithUserManagementCommands ( string username )
1091
+ {
1092
+ var usersInfoResult = RunCommand ( new CommandDocument ( "usersInfo" , username ) ) ;
1093
+ if ( usersInfoResult . Response . Contains ( "users" ) && usersInfoResult . Response [ "users" ] . AsBsonArray . Count > 0 )
1094
+ {
1095
+ return new MongoUser ( username , new PasswordEvidence ( "" ) , false ) ;
1096
+ }
1097
+
1098
+ return null ;
1099
+ }
1100
+ #pragma warning restore
1101
+
1102
+ #pragma warning disable 618
1103
+ private MongoUser [ ] FindAllUsersWithQuery ( )
1104
+ {
1105
+ var results = new List < MongoUser > ( ) ;
1106
+ var users = GetCollection ( "system.users" ) ;
1107
+ foreach ( var document in users . FindAll ( ) )
1108
+ {
1109
+ var username = document [ "user" ] . AsString ;
1110
+ var passwordHash = document . GetValue ( "pwd" , "" ) . AsString ;
1111
+ var readOnly = document [ "readOnly" ] . ToBoolean ( ) ;
1112
+ var user = new MongoUser ( username , passwordHash , readOnly ) ;
1113
+ results . Add ( user ) ;
1114
+ } ;
1115
+ return results . ToArray ( ) ;
1116
+ }
1117
+ #pragma warning restore
1118
+
1119
+ #pragma warning disable 618
1120
+ private MongoUser [ ] FindAllUsersWithUserManagementCommands ( )
1121
+ {
1122
+ var results = new List < MongoUser > ( ) ;
1123
+ var usersInfoResult = RunCommand ( new CommandDocument ( "usersInfo" , 1 ) ) ;
1124
+ if ( usersInfoResult . Response . Contains ( "users" ) )
1125
+ {
1126
+ foreach ( var document in usersInfoResult . Response [ "users" ] . AsBsonArray )
1127
+ {
1128
+ results . Add ( new MongoUser ( document [ "user" ] . AsString , new PasswordEvidence ( "" ) , false ) ) ;
1129
+ }
1130
+ }
1131
+ return results . ToArray ( ) ;
1132
+ }
1133
+ #pragma warning restore
1134
+
1012
1135
private TCommandResult RunCommandAs < TCommandResult > (
1013
1136
IMongoCommand command ,
1014
1137
IBsonSerializer resultSerializer ,
0 commit comments