Skip to content

Commit 0246b84

Browse files
authored
Merge pull request #3225 from Countly/fix/mongodb-options
Fix/mongodb options
2 parents 76b42ed + ac6d1fc commit 0246b84

File tree

3 files changed

+102
-20
lines changed

3 files changed

+102
-20
lines changed

api/configextender.js

+78-2
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,81 @@ const OVERRIDES = {
2626
REPLSETSERVERS: 'replSetServers',
2727
REPLICANAME: 'replicaName',
2828
MAX_POOL_SIZE: 'max_pool_size',
29-
DBOPTIONS: 'dbOptions',
30-
SERVEROPTIONS: 'serverOptions'
29+
DBOPTIONS: {
30+
__name: "dbOptions",
31+
AUTHMECHANISM: 'authMechanism',
32+
AUTHMECHANISMPROPERTIES: 'authMechanismProperties',
33+
AUTHSOURCE: 'authSource',
34+
AUTOENCRYPTION: 'autoEncryption',
35+
BSONREGEXP: 'bsonRegExp',
36+
CHECKKEYS: 'checkKeys',
37+
CHECKSERVERIDENTITY: 'checkServerIdentity',
38+
CONNECTTIMEOUTMS: 'connectTimeoutMS',
39+
DIRECTCONNECTION: 'directConnection',
40+
DRIVERINFO: 'driverInfo',
41+
ECDHCURVE: 'ecdhCurve',
42+
ENABLEUTF8VALIDATION: 'enableUtf8Validation',
43+
FIELDSASRAW: 'fieldsAsRaw',
44+
FORCESERVEROBJECTID: 'forceServerObjectId',
45+
HEARTBEATFREQUENCYMS: 'heartbeatFrequencyMS',
46+
IGNOREUNDEFINED: 'ignoreUndefined',
47+
KEEPALIVE: 'keepAlive',
48+
KEEPALIVEINITIALDELAY: 'keepAliveInitialDelay',
49+
LOADBALANCED: 'loadBalanced',
50+
LOCALADDRESS: 'localAddress',
51+
LOCALPORT: 'localPort',
52+
LOCALTHRESHOLDMS: 'localThresholdMS',
53+
LOGGERLEVEL: 'loggerLevel',
54+
MAXIDLETIMEMS: 'maxIdleTimeMS',
55+
MAXPOOLSIZE: 'maxPoolSize',
56+
MAXSTALENESSSECONDS: 'maxStalenessSeconds',
57+
MINDHSIZE: 'minDHSize',
58+
MINHEARTBEATFREQUENCYMS: 'minHeartbeatFrequencyMS',
59+
MINPOOLSIZE: 'minPoolSize',
60+
MONITORCOMMANDS: 'monitorCommands',
61+
NODELAY: 'noDelay',
62+
PKFACTORY: 'pkFactory',
63+
PROMISELIBRARY: 'promiseLibrary',
64+
PROMOTEBUFFERS: 'promoteBuffers',
65+
PROMOTELONGS: 'promoteLongs',
66+
PROMOTEVALUES: 'promoteValues',
67+
PROXYHOST: 'proxyHost',
68+
PROXYPASSWORD: 'proxyPassword',
69+
PROXYPORT: 'proxyPort',
70+
PROXYUSERNAME: 'proxyUsername',
71+
READCONCERN: 'readConcern',
72+
READCONCERNLEVEL: 'readConcernLevel',
73+
READPREFERENCE: 'readPreference',
74+
READPREFERENCETAGS: 'readPreferenceTags',
75+
REJECTUNAUTHORIZED: 'rejectUnauthorized',
76+
REPLICASET: 'replicaSet',
77+
RETRYREADS: 'retryReads',
78+
RETRYWRITES: 'retryWrites',
79+
SECURECONTEXT: 'secureContext',
80+
SECUREPROTOCOL: 'secureProtocol',
81+
SERIALIZEFUNCTIONS: 'serializeFunctions',
82+
SERVERAPI: 'serverApi',
83+
SERVERSELECTIONTIMEOUTMS: 'serverSelectionTimeoutMS',
84+
SOCKETTIMEOUTMS: 'socketTimeoutMS',
85+
SRVMAXHOSTS: 'srvMaxHosts',
86+
SRVSERVICENAME: 'srvServiceName',
87+
SSLCA: 'sslCA',
88+
SSLCRL: 'sslCRL',
89+
SSLCERT: 'sslCert',
90+
SSLKEY: 'sslKey',
91+
SSLPASS: 'sslPass',
92+
SSLVALIDATE: 'sslValidate',
93+
TLSALLOWINVALIDCERTIFICATES: 'tlsAllowInvalidCertificates',
94+
TLSALLOWINVALIDHOSTNAMES: 'tlsAllowInvalidHostnames',
95+
TLSCAFILE: 'tlsCAFile',
96+
TLSCERTIFICATEFILE: 'tlsCertificateFile',
97+
TLSCERTIFICATEKEYFILE: 'tlsCertificateKeyFile',
98+
TLSCERTIFICATEKEYFILEPASSWORD: 'tlsCertificateKeyFilePassword',
99+
TLSINSECURE: 'tlsInsecure',
100+
WAITQUEUETIMEOUTMS: 'waitQueueTimeoutMS',
101+
WTIMEOUTMS: 'wtimeoutMS',
102+
ZLIBCOMPRESSIONLEVEL: 'zlibCompressionLevel',
103+
},
31104
},
32105

33106
API: {
@@ -66,6 +139,9 @@ function dig(config, over, name, value) {
66139
sub = over[n];
67140
over[n] = {};
68141
}
142+
else if (over[n] && over[n].__name) {
143+
sub = over[n].__name;
144+
}
69145
else {
70146
sub = Object.keys(config).filter(k => k.toUpperCase() === n)[0];
71147
}

plugins/pluginManager.js

+24-9
Original file line numberDiff line numberDiff line change
@@ -1078,8 +1078,12 @@ var pluginManager = function pluginManager() {
10781078
config = config || JSON.parse(JSON.stringify(countlyConfig));
10791079
}
10801080

1081-
if (typeof config.mongodb === 'string') {
1082-
var dbName = this.replaceDatabaseString(config.mongodb, db);
1081+
if (config && typeof config.mongodb === "string") {
1082+
config.mongodb = {uri: config.mongodb};
1083+
}
1084+
1085+
if (config.mongodb.uri) {
1086+
var dbName = this.replaceDatabaseString(config.mongodb.uri, db);
10831087
//remove protocol
10841088
dbName = dbName.split("://").pop();
10851089
if (dbName.indexOf("@") !== -1) {
@@ -1152,12 +1156,13 @@ var pluginManager = function pluginManager() {
11521156
* @returns {string} modified connection string
11531157
**/
11541158
this.replaceDatabaseString = function(str, db) {
1155-
var i = str.lastIndexOf('/countly');
1156-
var k = str.lastIndexOf('/' + db);
1159+
var parts = str.split("?");
1160+
var i = parts[0].lastIndexOf('/countly');
1161+
var k = parts[0].lastIndexOf('/' + db);
11571162
if (i !== k && i !== -1 && db) {
1158-
return str.substr(0, i) + "/" + db + str.substr(i + ('/countly').length);
1163+
return parts[0].substr(0, i) + "/" + db + parts[0].substr(i + ('/countly').length);
11591164
}
1160-
return str;
1165+
return parts.join("?");
11611166
};
11621167

11631168
this.connectToAllDatabases = async() => {
@@ -1217,7 +1222,11 @@ var pluginManager = function pluginManager() {
12171222
}
12181223

12191224
if (config && typeof config.mongodb === "string") {
1220-
var urlParts = url.parse(config.mongodb, true);
1225+
config.mongodb = {uri: config.mongodb};
1226+
}
1227+
1228+
if (config.mongodb.uri) {
1229+
var urlParts = url.parse(config.mongodb.uri, true);
12211230
if (urlParts && urlParts.query && urlParts.query.maxPoolSize) {
12221231
maxPoolSize = urlParts.query.maxPoolSize;
12231232
}
@@ -1240,8 +1249,8 @@ var pluginManager = function pluginManager() {
12401249
useNewUrlParser: true,
12411250
useUnifiedTopology: true
12421251
};
1243-
if (typeof config.mongodb === 'string') {
1244-
dbName = this.replaceDatabaseString(config.mongodb, db);
1252+
if (config.mongodb.uri) {
1253+
dbName = this.replaceDatabaseString(config.mongodb.uri, db);
12451254
}
12461255
else {
12471256
config.mongodb.db = db || config.mongodb.db || 'countly';
@@ -1266,9 +1275,15 @@ var pluginManager = function pluginManager() {
12661275
}
12671276

12681277
if (config.mongodb.username && config.mongodb.password) {
1278+
dbName = dbName.replace('mongodb://', '').replace('mongodb+srv://', '');
12691279
dbName = encodeURIComponent(config.mongodb.username) + ":" + encodeURIComponent(utils.decrypt(config.mongodb.password)) + "@" + dbName;
12701280
}
12711281

1282+
if (config.mongodb.username) {
1283+
dbName = dbName.replace('mongodb://', '').replace('mongodb+srv://', '');
1284+
dbName = encodeURIComponent(config.mongodb.username) + "@" + dbName;
1285+
}
1286+
12721287
if (dbName.indexOf('mongodb://') !== 0 && dbName.indexOf('mongodb+srv://') !== 0) {
12731288
dbName = 'mongodb://' + dbName;
12741289
}

test/2.api/00.read.config.js

-9
Original file line numberDiff line numberDiff line change
@@ -64,15 +64,6 @@ describe('Reading config with ENV extensions', function() {
6464
config.mongodb.should.equal(VALUE);
6565
});
6666

67-
it('should support camel case with JSON object', () => {
68-
let VALUE = '{"ssl": false}',
69-
config = configExtender('API', JSON.parse(JSON.stringify(testConfig)), {COUNTLY_CONFIG_API_MONGODB_SERVEROPTIONS: VALUE});
70-
should.exist(config.mongodb);
71-
should.exist(config.mongodb.serverOptions);
72-
should.exist(config.mongodb.serverOptions.ssl);
73-
config.mongodb.serverOptions.ssl.should.equal(false);
74-
});
75-
7667
it('should support create intermediary object in camelCase', () => {
7768
let VALUE = 'something',
7869
config = configExtender('API', JSON.parse(JSON.stringify(testConfig)), {COUNTLY_CONFIG_API_MONGODB_DBOPTIONS_DEEP_KEY: VALUE});

0 commit comments

Comments
 (0)