You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
82 lines
2.9 KiB
82 lines
2.9 KiB
4 years ago
|
'use strict';
|
||
|
|
||
|
// Resolves the default auth mechanism according to
|
||
|
// https://github.com/mongodb/specifications/blob/master/source/auth/auth.rst
|
||
|
function getDefaultAuthMechanism(ismaster) {
|
||
|
if (ismaster) {
|
||
|
// If ismaster contains saslSupportedMechs, use scram-sha-256
|
||
|
// if it is available, else scram-sha-1
|
||
|
if (Array.isArray(ismaster.saslSupportedMechs)) {
|
||
|
return ismaster.saslSupportedMechs.indexOf('SCRAM-SHA-256') >= 0
|
||
|
? 'scram-sha-256'
|
||
|
: 'scram-sha-1';
|
||
|
}
|
||
|
|
||
|
// Fallback to legacy selection method. If wire version >= 3, use scram-sha-1
|
||
|
if (ismaster.maxWireVersion >= 3) {
|
||
|
return 'scram-sha-1';
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Default for wireprotocol < 3
|
||
|
return 'mongocr';
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* A representation of the credentials used by MongoDB
|
||
|
* @class
|
||
|
* @property {string} mechanism The method used to authenticate
|
||
|
* @property {string} [username] The username used for authentication
|
||
|
* @property {string} [password] The password used for authentication
|
||
|
* @property {string} [source] The database that the user should authenticate against
|
||
|
* @property {object} [mechanismProperties] Special properties used by some types of auth mechanisms
|
||
|
*/
|
||
|
class MongoCredentials {
|
||
|
/**
|
||
|
* Creates a new MongoCredentials object
|
||
|
* @param {object} [options]
|
||
|
* @param {string} [options.username] The username used for authentication
|
||
|
* @param {string} [options.password] The password used for authentication
|
||
|
* @param {string} [options.source] The database that the user should authenticate against
|
||
|
* @param {string} [options.mechanism] The method used to authenticate
|
||
|
* @param {object} [options.mechanismProperties] Special properties used by some types of auth mechanisms
|
||
|
*/
|
||
|
constructor(options) {
|
||
|
options = options || {};
|
||
|
this.username = options.username;
|
||
|
this.password = options.password;
|
||
|
this.source = options.source || options.db;
|
||
|
this.mechanism = options.mechanism || 'default';
|
||
|
this.mechanismProperties = options.mechanismProperties;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Determines if two MongoCredentials objects are equivalent
|
||
|
* @param {MongoCredentials} other another MongoCredentials object
|
||
|
* @returns {boolean} true if the two objects are equal.
|
||
|
*/
|
||
|
equals(other) {
|
||
|
return (
|
||
|
this.mechanism === other.mechanism &&
|
||
|
this.username === other.username &&
|
||
|
this.password === other.password &&
|
||
|
this.source === other.source
|
||
|
);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* If the authentication mechanism is set to "default", resolves the authMechanism
|
||
|
* based on the server version and server supported sasl mechanisms.
|
||
|
*
|
||
|
* @param {Object} [ismaster] An ismaster response from the server
|
||
|
*/
|
||
|
resolveAuthMechanism(ismaster) {
|
||
|
// If the mechanism is not "default", then it does not need to be resolved
|
||
|
if (this.mechanism.toLowerCase() === 'default') {
|
||
|
this.mechanism = getDefaultAuthMechanism(ismaster);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
module.exports = { MongoCredentials };
|