From f5c17b3af105732f9097d945fd153785efb87862 Mon Sep 17 00:00:00 2001 From: yuhj <315913876@qq.com> Date: Mon, 18 Apr 2022 17:14:31 +0800 Subject: [PATCH] fix uri connection unavaliable when password contains some characters --- lib/connection_config.js | 23 +++++++++++++++++-- .../unit/connection/test-connection_config.js | 2 +- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/lib/connection_config.js b/lib/connection_config.js index 98fa1d3d1d..43e58b8a5b 100644 --- a/lib/connection_config.js +++ b/lib/connection_config.js @@ -250,12 +250,31 @@ class ConnectionConfig { static parseUrl(url) { const parsedUrl = new URL(url); + // reference https://nodejs.org/dist/latest/docs/api/url.html#urlpassword + // reference https://nodejs.org/dist/latest/docs/api/url.html#percent-encoding-in-urls + const userInfoSet = [ + '\u002F', + '\u003A', + '\u003B', + '\u003D', + '\u0040', + '\u005B', + '\u005C', + '\u005D', + '\u005E', + '\u007C' + ].map(char => [encodeURIComponent(char), char]); + let { username, password } = parsedUrl; + userInfoSet.forEach(([encoded, raw]) => { + username = username.replace(encoded, raw); + password = password.replace(encoded, raw); + }); const options = { host: parsedUrl.hostname, port: parsedUrl.port, database: parsedUrl.pathname.slice(1), - user: parsedUrl.username, - password: parsedUrl.password + user: username, + password: password }; parsedUrl.searchParams.forEach((value, key) => { try { diff --git a/test/unit/connection/test-connection_config.js b/test/unit/connection/test-connection_config.js index 0e1c0b1ca6..bda1929401 100644 --- a/test/unit/connection/test-connection_config.js +++ b/test/unit/connection/test-connection_config.js @@ -47,5 +47,5 @@ assert.strictEqual( ConnectionConfig.parseUrl( String.raw`fml://test:pass!@$%^&*()\word:@www.example.com/database` ).password, - 'pass!%40$%%5E&*()%5Cword%3A' + 'pass!@$%^&*()\\word:' );