Skip to content

Commit 9bad913

Browse files
committed
fix(MongoMemoryServer::createAuth): handle connection erroring and maybe not closing
1 parent 8eb4564 commit 9bad913

File tree

1 file changed

+52
-49
lines changed

1 file changed

+52
-49
lines changed

packages/mongodb-memory-server-core/src/MongoMemoryServer.ts

+52-49
Original file line numberDiff line numberDiff line change
@@ -731,61 +731,64 @@ export class MongoMemoryServer extends EventEmitter implements ManagerAdvanced {
731731
{}
732732
);
733733

734-
let db = con.db('admin'); // just to ensure it is actually the "admin" database AND to have the "Db" data
735-
736-
// Create the root user
737-
this.debug(`createAuth: Creating Root user, name: "${this.auth.customRootName}"`);
738-
await db.command({
739-
createUser: this.auth.customRootName,
740-
pwd: this.auth.customRootPwd,
741-
mechanisms: ['SCRAM-SHA-256'],
742-
customData: {
743-
createdBy: 'mongodb-memory-server',
744-
as: 'ROOTUSER',
745-
},
746-
roles: ['root'],
747-
// "writeConcern" is needced, otherwise replset servers might fail with "auth failed: such user does not exist"
748-
writeConcern: {
749-
w: 'majority',
750-
},
751-
} as CreateUserMongoDB);
752-
753-
if (this.auth.extraUsers.length > 0) {
754-
this.debug(`createAuth: Creating "${this.auth.extraUsers.length}" Custom Users`);
755-
this.auth.extraUsers.sort((a, b) => {
756-
if (a.database === 'admin') {
757-
return -1; // try to make all "admin" at the start of the array
758-
}
734+
try {
735+
let db = con.db('admin'); // just to ensure it is actually the "admin" database AND to have the "Db" data
736+
737+
// Create the root user
738+
this.debug(`createAuth: Creating Root user, name: "${this.auth.customRootName}"`);
739+
await db.command({
740+
createUser: this.auth.customRootName,
741+
pwd: this.auth.customRootPwd,
742+
mechanisms: ['SCRAM-SHA-256'],
743+
customData: {
744+
createdBy: 'mongodb-memory-server',
745+
as: 'ROOTUSER',
746+
},
747+
roles: ['root'],
748+
// "writeConcern" is needced, otherwise replset servers might fail with "auth failed: such user does not exist"
749+
writeConcern: {
750+
w: 'majority',
751+
},
752+
} as CreateUserMongoDB);
759753

760-
return a.database === b.database ? 0 : 1; // "0" to sort all databases that are the same after each other, and "1" to for pushing it back
761-
});
754+
if (this.auth.extraUsers.length > 0) {
755+
this.debug(`createAuth: Creating "${this.auth.extraUsers.length}" Custom Users`);
756+
this.auth.extraUsers.sort((a, b) => {
757+
if (a.database === 'admin') {
758+
return -1; // try to make all "admin" at the start of the array
759+
}
762760

763-
for (const user of this.auth.extraUsers) {
764-
user.database = isNullOrUndefined(user.database) ? 'admin' : user.database;
761+
return a.database === b.database ? 0 : 1; // "0" to sort all databases that are the same after each other, and "1" to for pushing it back
762+
});
765763

766-
// just to have not to call "con.db" everytime in the loop if its the same
767-
if (user.database !== db.databaseName) {
768-
db = con.db(user.database);
764+
for (const user of this.auth.extraUsers) {
765+
user.database = isNullOrUndefined(user.database) ? 'admin' : user.database;
766+
767+
// just to have not to call "con.db" everytime in the loop if its the same
768+
if (user.database !== db.databaseName) {
769+
db = con.db(user.database);
770+
}
771+
772+
this.debug('createAuth: Creating User: ', user);
773+
await db.command({
774+
createUser: user.createUser,
775+
pwd: user.pwd,
776+
customData: {
777+
...user.customData,
778+
createdBy: 'mongodb-memory-server',
779+
as: 'EXTRAUSER',
780+
},
781+
roles: user.roles,
782+
authenticationRestrictions: user.authenticationRestrictions ?? [],
783+
mechanisms: user.mechanisms ?? ['SCRAM-SHA-256'],
784+
digestPassword: user.digestPassword ?? true,
785+
} as CreateUserMongoDB);
769786
}
770-
771-
this.debug('createAuth: Creating User: ', user);
772-
await db.command({
773-
createUser: user.createUser,
774-
pwd: user.pwd,
775-
customData: {
776-
...user.customData,
777-
createdBy: 'mongodb-memory-server',
778-
as: 'EXTRAUSER',
779-
},
780-
roles: user.roles,
781-
authenticationRestrictions: user.authenticationRestrictions ?? [],
782-
mechanisms: user.mechanisms ?? ['SCRAM-SHA-256'],
783-
digestPassword: user.digestPassword ?? true,
784-
} as CreateUserMongoDB);
785787
}
788+
} finally {
789+
// close connection in any case (even if throwing a error or being successfull)
790+
await con.close();
786791
}
787-
788-
await con.close();
789792
}
790793
}
791794

0 commit comments

Comments
 (0)