@rsdk/db 5.11.0-next.1 → 5.11.0-next.10

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 CHANGED
@@ -6,3 +6,4 @@ export { TransactionRunner } from './transactional.runner';
6
6
  export { Propagation } from './propagation.enum';
7
7
  export { HEALTH_CHECK_QUERY } from './constants';
8
8
  export { getSecureContextOptions } from './tls';
9
+ export { SslModeEnum } from './ssl-mode.enum';
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,8 @@
1
+ export declare enum SslModeEnum {
2
+ DISABLE = "disable",
3
+ ALLOW = "allow",
4
+ PREFER = "prefer",
5
+ REQUIRE = "require",
6
+ VERIFY_CA = "verify-ca",
7
+ VERIFY_FULL = "verify-full"
8
+ }
@@ -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) => typeof config.allowSelfSignedCert === 'boolean' ||
9
- config.tlsCa ||
10
- config.tlsKey ||
11
- config.tlsCert
12
- ? {
13
- rejectUnauthorized: !config.allowSelfSignedCert,
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
- : false;
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;AAUlB,MAAM,uBAAuB,GAAG,CACrC,MAAoB,EAKZ,EAAE,CACV,OAAO,MAAM,CAAC,mBAAmB,KAAK,SAAS;IAC/C,MAAM,CAAC,KAAK;IACZ,MAAM,CAAC,MAAM;IACb,MAAM,CAAC,OAAO;IACZ,CAAC,CAAC;QACE,kBAAkB,EAAE,CAAC,MAAM,CAAC,mBAAmB;QAC/C,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;IACH,CAAC,CAAC,KAAK,CAAC;AAvBC,QAAA,uBAAuB,2BAuBxB;AAEZ,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"}
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.1",
3
+ "version": "5.11.0-next.10",
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": "5702cb032179ff5c8319c4b7e85b99af7e90245e"
21
+ "gitHead": "de767781fa92c9a3db87d8aa982aa682cb6375b6"
22
22
  }
package/src/index.ts CHANGED
@@ -10,3 +10,4 @@ export { TransactionRunner } from './transactional.runner';
10
10
  export { Propagation } from './propagation.enum';
11
11
  export { HEALTH_CHECK_QUERY } from './constants';
12
12
  export { getSecureContextOptions } from './tls';
13
+ export { SslModeEnum } from './ssl-mode.enum';
@@ -0,0 +1,8 @@
1
+ export enum SslModeEnum {
2
+ DISABLE = 'disable',
3
+ ALLOW = 'allow',
4
+ PREFER = 'prefer',
5
+ REQUIRE = 'require',
6
+ VERIFY_CA = 'verify-ca',
7
+ VERIFY_FULL = 'verify-full',
8
+ }
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
- typeof config.allowSelfSignedCert === 'boolean' ||
19
- config.tlsCa ||
20
- config.tlsKey ||
21
- config.tlsCert
22
- ? {
23
- rejectUnauthorized: !config.allowSelfSignedCert,
24
- ...(config.tlsCa && {
25
- ca: readFileIfExistsSync(config.tlsCa) ?? config.tlsCa,
26
- }),
27
- ...(config.tlsKey && {
28
- key: readFileIfExistsSync(config.tlsKey) ?? config.tlsKey,
29
- }),
30
- ...(config.tlsCert && {
31
- cert: readFileIfExistsSync(config.tlsCert) ?? config.tlsCert,
32
- }),
33
- }
34
- : false;
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;