@rsdk/db 5.11.0-next.7 → 5.11.0-next.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +1 -0
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/ssl-mode.enum.d.ts +8 -0
- package/dist/ssl-mode.enum.js +13 -0
- package/dist/ssl-mode.enum.js.map +1 -0
- package/dist/tls.d.ts +3 -0
- package/dist/tls.js +37 -7
- package/dist/tls.js.map +1 -1
- package/package.json +2 -2
- package/src/index.ts +1 -0
- package/src/ssl-mode.enum.ts +8 -0
- package/src/tls.ts +57 -18
package/dist/index.d.ts
CHANGED
package/dist/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.getSecureContextOptions = exports.HEALTH_CHECK_QUERY = exports.Propagation = exports.TransactionRunner = exports.IncompatibleIsolationLevels = exports.CallOutOfContextWithMandatory = exports.NeverRunningInTransaction = exports.BaseContext = exports.ContextStorage = void 0;
|
|
3
|
+
exports.SslModeEnum = exports.getSecureContextOptions = exports.HEALTH_CHECK_QUERY = exports.Propagation = exports.TransactionRunner = exports.IncompatibleIsolationLevels = exports.CallOutOfContextWithMandatory = exports.NeverRunningInTransaction = exports.BaseContext = exports.ContextStorage = void 0;
|
|
4
4
|
var context_storage_1 = require("./context.storage");
|
|
5
5
|
Object.defineProperty(exports, "ContextStorage", { enumerable: true, get: function () { return context_storage_1.ContextStorage; } });
|
|
6
6
|
var context_base_1 = require("./context.base");
|
|
@@ -17,4 +17,6 @@ var constants_1 = require("./constants");
|
|
|
17
17
|
Object.defineProperty(exports, "HEALTH_CHECK_QUERY", { enumerable: true, get: function () { return constants_1.HEALTH_CHECK_QUERY; } });
|
|
18
18
|
var tls_1 = require("./tls");
|
|
19
19
|
Object.defineProperty(exports, "getSecureContextOptions", { enumerable: true, get: function () { return tls_1.getSecureContextOptions; } });
|
|
20
|
+
var ssl_mode_enum_1 = require("./ssl-mode.enum");
|
|
21
|
+
Object.defineProperty(exports, "SslModeEnum", { enumerable: true, get: function () { return ssl_mode_enum_1.SslModeEnum; } });
|
|
20
22
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,qDAAmD;AAA1C,iHAAA,cAAc,OAAA;AACvB,+CAA6C;AAApC,2GAAA,WAAW,OAAA;AAEpB,2CAIsB;AAHpB,uHAAA,yBAAyB,OAAA;AACzB,2HAAA,6BAA6B,OAAA;AAC7B,yHAAA,2BAA2B,OAAA;AAE7B,+DAA2D;AAAlD,yHAAA,iBAAiB,OAAA;AAC1B,uDAAiD;AAAxC,+GAAA,WAAW,OAAA;AACpB,yCAAiD;AAAxC,+GAAA,kBAAkB,OAAA;AAC3B,6BAAgD;AAAvC,8GAAA,uBAAuB,OAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,qDAAmD;AAA1C,iHAAA,cAAc,OAAA;AACvB,+CAA6C;AAApC,2GAAA,WAAW,OAAA;AAEpB,2CAIsB;AAHpB,uHAAA,yBAAyB,OAAA;AACzB,2HAAA,6BAA6B,OAAA;AAC7B,yHAAA,2BAA2B,OAAA;AAE7B,+DAA2D;AAAlD,yHAAA,iBAAiB,OAAA;AAC1B,uDAAiD;AAAxC,+GAAA,WAAW,OAAA;AACpB,yCAAiD;AAAxC,+GAAA,kBAAkB,OAAA;AAC3B,6BAAgD;AAAvC,8GAAA,uBAAuB,OAAA;AAChC,iDAA8C;AAArC,4GAAA,WAAW,OAAA"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SslModeEnum = void 0;
|
|
4
|
+
var SslModeEnum;
|
|
5
|
+
(function (SslModeEnum) {
|
|
6
|
+
SslModeEnum["DISABLE"] = "disable";
|
|
7
|
+
SslModeEnum["ALLOW"] = "allow";
|
|
8
|
+
SslModeEnum["PREFER"] = "prefer";
|
|
9
|
+
SslModeEnum["REQUIRE"] = "require";
|
|
10
|
+
SslModeEnum["VERIFY_CA"] = "verify-ca";
|
|
11
|
+
SslModeEnum["VERIFY_FULL"] = "verify-full";
|
|
12
|
+
})(SslModeEnum || (exports.SslModeEnum = SslModeEnum = {}));
|
|
13
|
+
//# sourceMappingURL=ssl-mode.enum.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ssl-mode.enum.js","sourceRoot":"","sources":["../src/ssl-mode.enum.ts"],"names":[],"mappings":";;;AAAA,IAAY,WAOX;AAPD,WAAY,WAAW;IACrB,kCAAmB,CAAA;IACnB,8BAAe,CAAA;IACf,gCAAiB,CAAA;IACjB,kCAAmB,CAAA;IACnB,sCAAuB,CAAA;IACvB,0CAA2B,CAAA;AAC7B,CAAC,EAPW,WAAW,2BAAX,WAAW,QAOtB"}
|
package/dist/tls.d.ts
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import type { SecureContextOptions } from 'node:tls';
|
|
2
|
+
import type { SslModeEnum } from './ssl-mode.enum';
|
|
2
3
|
export interface SecureConfig {
|
|
4
|
+
sslMode: SslModeEnum;
|
|
3
5
|
allowSelfSignedCert?: boolean | undefined;
|
|
4
6
|
tlsCa?: string | undefined;
|
|
5
7
|
tlsCert?: string | undefined;
|
|
@@ -7,4 +9,5 @@ export interface SecureConfig {
|
|
|
7
9
|
}
|
|
8
10
|
export declare const getSecureContextOptions: (config: SecureConfig) => (Pick<SecureContextOptions, "ca" | "cert" | "key"> & {
|
|
9
11
|
rejectUnauthorized: boolean;
|
|
12
|
+
checkServerIdentity?: (host: string, cert: any) => Error | undefined;
|
|
10
13
|
}) | false;
|
package/dist/tls.js
CHANGED
|
@@ -5,12 +5,12 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.getSecureContextOptions = void 0;
|
|
7
7
|
const node_fs_1 = __importDefault(require("node:fs"));
|
|
8
|
-
const getSecureContextOptions = (config) =>
|
|
9
|
-
|
|
10
|
-
config.
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
8
|
+
const getSecureContextOptions = (config) => {
|
|
9
|
+
// disable - SSL полностью отключен
|
|
10
|
+
if (config.sslMode === 'disable') {
|
|
11
|
+
return false;
|
|
12
|
+
}
|
|
13
|
+
const tlsOptions = {
|
|
14
14
|
...(config.tlsCa && {
|
|
15
15
|
ca: readFileIfExistsSync(config.tlsCa) ?? config.tlsCa,
|
|
16
16
|
}),
|
|
@@ -20,8 +20,38 @@ const getSecureContextOptions = (config) => typeof config.allowSelfSignedCert ==
|
|
|
20
20
|
...(config.tlsCert && {
|
|
21
21
|
cert: readFileIfExistsSync(config.tlsCert) ?? config.tlsCert,
|
|
22
22
|
}),
|
|
23
|
+
};
|
|
24
|
+
// allow, prefer, require - SSL используется, но сертификат сервера не проверяется
|
|
25
|
+
// allow/prefer - в теории позволяют fallback на незащищенное соединение,
|
|
26
|
+
// но в Node.js это контролируется сервером БД, а не клиентом
|
|
27
|
+
// require - требует SSL, но не проверяет валидность сертификата
|
|
28
|
+
// Все три режима защищают от пассивного прослушивания, но не от MITM атак
|
|
29
|
+
if (config.sslMode === 'allow' ||
|
|
30
|
+
config.sslMode === 'prefer' ||
|
|
31
|
+
config.sslMode === 'require') {
|
|
32
|
+
return {
|
|
33
|
+
rejectUnauthorized: false,
|
|
34
|
+
...tlsOptions,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
// verify-ca - проверяется, что сертификат сервера подписан доверенным CA,
|
|
38
|
+
// но hostname не проверяется. Защищает от MITM с самоподписанными сертификатами
|
|
39
|
+
if (config.sslMode === 'verify-ca') {
|
|
40
|
+
return {
|
|
41
|
+
rejectUnauthorized: !config.allowSelfSignedCert,
|
|
42
|
+
// Отключаем проверку hostname (принимаем любой hostname если CA валидный)
|
|
43
|
+
// eslint-disable-next-line unicorn/no-useless-undefined
|
|
44
|
+
checkServerIdentity: () => undefined,
|
|
45
|
+
...tlsOptions,
|
|
46
|
+
};
|
|
23
47
|
}
|
|
24
|
-
|
|
48
|
+
// verify-full - полная проверка сертификата включая hostname
|
|
49
|
+
// Самый безопасный режим, защищает от всех видов MITM атак
|
|
50
|
+
return {
|
|
51
|
+
rejectUnauthorized: !config.allowSelfSignedCert,
|
|
52
|
+
...tlsOptions,
|
|
53
|
+
};
|
|
54
|
+
};
|
|
25
55
|
exports.getSecureContextOptions = getSecureContextOptions;
|
|
26
56
|
const readFileIfExistsSync = (path) => node_fs_1.default.existsSync(path) ? node_fs_1.default.readFileSync(path) : undefined;
|
|
27
57
|
//# sourceMappingURL=tls.js.map
|
package/dist/tls.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tls.js","sourceRoot":"","sources":["../src/tls.ts"],"names":[],"mappings":";;;;;;AAAA,sDAAyB;
|
|
1
|
+
{"version":3,"file":"tls.js","sourceRoot":"","sources":["../src/tls.ts"],"names":[],"mappings":";;;;;;AAAA,sDAAyB;AAalB,MAAM,uBAAuB,GAAG,CACrC,MAAoB,EAMZ,EAAE;IACV,mCAAmC;IACnC,IAAI,MAAM,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;QACjC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,UAAU,GAAG;QACjB,GAAG,CAAC,MAAM,CAAC,KAAK,IAAI;YAClB,EAAE,EAAE,oBAAoB,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,KAAK;SACvD,CAAC;QACF,GAAG,CAAC,MAAM,CAAC,MAAM,IAAI;YACnB,GAAG,EAAE,oBAAoB,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM;SAC1D,CAAC;QACF,GAAG,CAAC,MAAM,CAAC,OAAO,IAAI;YACpB,IAAI,EAAE,oBAAoB,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO;SAC7D,CAAC;KACH,CAAC;IAEF,kFAAkF;IAClF,yEAAyE;IACzE,+DAA+D;IAC/D,gEAAgE;IAChE,0EAA0E;IAC1E,IACE,MAAM,CAAC,OAAO,KAAK,OAAO;QAC1B,MAAM,CAAC,OAAO,KAAK,QAAQ;QAC3B,MAAM,CAAC,OAAO,KAAK,SAAS,EAC5B,CAAC;QACD,OAAO;YACL,kBAAkB,EAAE,KAAK;YACzB,GAAG,UAAU;SACd,CAAC;IACJ,CAAC;IAED,0EAA0E;IAC1E,gFAAgF;IAChF,IAAI,MAAM,CAAC,OAAO,KAAK,WAAW,EAAE,CAAC;QACnC,OAAO;YACL,kBAAkB,EAAE,CAAC,MAAM,CAAC,mBAAmB;YAE/C,0EAA0E;YAC1E,wDAAwD;YACxD,mBAAmB,EAAE,GAAG,EAAE,CAAC,SAAS;YACpC,GAAG,UAAU;SACd,CAAC;IACJ,CAAC;IAED,6DAA6D;IAC7D,2DAA2D;IAC3D,OAAO;QACL,kBAAkB,EAAE,CAAC,MAAM,CAAC,mBAAmB;QAC/C,GAAG,UAAU;KACd,CAAC;AACJ,CAAC,CAAC;AA5DW,QAAA,uBAAuB,2BA4DlC;AACF,MAAM,oBAAoB,GAAG,CAAC,IAAY,EAAsB,EAAE,CAChE,iBAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,iBAAE,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rsdk/db",
|
|
3
|
-
"version": "5.11.0-next.
|
|
3
|
+
"version": "5.11.0-next.9",
|
|
4
4
|
"description": "Common functionality and interfaces for relational database plugins",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"publishConfig": {
|
|
@@ -18,5 +18,5 @@
|
|
|
18
18
|
"@rsdk/decorators": "*",
|
|
19
19
|
"reflect-metadata": "^0.1.12 || ^0.2.0"
|
|
20
20
|
},
|
|
21
|
-
"gitHead": "
|
|
21
|
+
"gitHead": "eb042e3055f9ab6c64099ed246641cff1855272d"
|
|
22
22
|
}
|
package/src/index.ts
CHANGED
package/src/tls.ts
CHANGED
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
import fs from 'node:fs';
|
|
2
2
|
import type { SecureContextOptions } from 'node:tls';
|
|
3
3
|
|
|
4
|
+
import type { SslModeEnum } from './ssl-mode.enum';
|
|
5
|
+
|
|
4
6
|
export interface SecureConfig {
|
|
7
|
+
sslMode: SslModeEnum;
|
|
5
8
|
allowSelfSignedCert?: boolean | undefined;
|
|
6
9
|
tlsCa?: string | undefined;
|
|
7
10
|
tlsCert?: string | undefined;
|
|
@@ -13,25 +16,61 @@ export const getSecureContextOptions = (
|
|
|
13
16
|
):
|
|
14
17
|
| (Pick<SecureContextOptions, 'ca' | 'cert' | 'key'> & {
|
|
15
18
|
rejectUnauthorized: boolean;
|
|
19
|
+
checkServerIdentity?: (host: string, cert: any) => Error | undefined;
|
|
16
20
|
})
|
|
17
|
-
| false =>
|
|
18
|
-
|
|
19
|
-
config.
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
21
|
+
| false => {
|
|
22
|
+
// disable - SSL полностью отключен
|
|
23
|
+
if (config.sslMode === 'disable') {
|
|
24
|
+
return false;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
const tlsOptions = {
|
|
28
|
+
...(config.tlsCa && {
|
|
29
|
+
ca: readFileIfExistsSync(config.tlsCa) ?? config.tlsCa,
|
|
30
|
+
}),
|
|
31
|
+
...(config.tlsKey && {
|
|
32
|
+
key: readFileIfExistsSync(config.tlsKey) ?? config.tlsKey,
|
|
33
|
+
}),
|
|
34
|
+
...(config.tlsCert && {
|
|
35
|
+
cert: readFileIfExistsSync(config.tlsCert) ?? config.tlsCert,
|
|
36
|
+
}),
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
// allow, prefer, require - SSL используется, но сертификат сервера не проверяется
|
|
40
|
+
// allow/prefer - в теории позволяют fallback на незащищенное соединение,
|
|
41
|
+
// но в Node.js это контролируется сервером БД, а не клиентом
|
|
42
|
+
// require - требует SSL, но не проверяет валидность сертификата
|
|
43
|
+
// Все три режима защищают от пассивного прослушивания, но не от MITM атак
|
|
44
|
+
if (
|
|
45
|
+
config.sslMode === 'allow' ||
|
|
46
|
+
config.sslMode === 'prefer' ||
|
|
47
|
+
config.sslMode === 'require'
|
|
48
|
+
) {
|
|
49
|
+
return {
|
|
50
|
+
rejectUnauthorized: false,
|
|
51
|
+
...tlsOptions,
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// verify-ca - проверяется, что сертификат сервера подписан доверенным CA,
|
|
56
|
+
// но hostname не проверяется. Защищает от MITM с самоподписанными сертификатами
|
|
57
|
+
if (config.sslMode === 'verify-ca') {
|
|
58
|
+
return {
|
|
59
|
+
rejectUnauthorized: !config.allowSelfSignedCert,
|
|
60
|
+
|
|
61
|
+
// Отключаем проверку hostname (принимаем любой hostname если CA валидный)
|
|
62
|
+
// eslint-disable-next-line unicorn/no-useless-undefined
|
|
63
|
+
checkServerIdentity: () => undefined,
|
|
64
|
+
...tlsOptions,
|
|
65
|
+
};
|
|
66
|
+
}
|
|
35
67
|
|
|
68
|
+
// verify-full - полная проверка сертификата включая hostname
|
|
69
|
+
// Самый безопасный режим, защищает от всех видов MITM атак
|
|
70
|
+
return {
|
|
71
|
+
rejectUnauthorized: !config.allowSelfSignedCert,
|
|
72
|
+
...tlsOptions,
|
|
73
|
+
};
|
|
74
|
+
};
|
|
36
75
|
const readFileIfExistsSync = (path: string): Buffer | undefined =>
|
|
37
76
|
fs.existsSync(path) ? fs.readFileSync(path) : undefined;
|