@futdevpro/fsm-dynamo 1.16.10 → 1.16.11

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.
@@ -0,0 +1,41 @@
1
+ import { DyFM_SecretMask_PartialReveal_Interface } from '../../../_collections/utils/secret-mask.util';
2
+ import { DyFM_StoredSecret } from '../_models/stored-secret.control-model';
3
+ /** A levezetett, decrypt-nelkul megjelenitheto resz (a DyFM_StoredSecret masked-mezoi). */
4
+ export interface DyFM_StoredSecret_Preview_Interface {
5
+ keyPrefix: string;
6
+ keySuffix: string;
7
+ maskedPreview: string;
8
+ kind: string | undefined;
9
+ }
10
+ /**
11
+ * A DyFM_StoredSecret masked-reszenek levezetese egy nyers secret-bol — ENCRYPT/DECRYPT NELKUL
12
+ * megjelenitheto azonosito-reszt allit elo (`<prefix>...<suffix>` + a detektalt `kind`). A nyers
13
+ * ertek titkositasa NEM itt tortenik (a host adja a kulcsot); ez a util csak a lathato reszt
14
+ * szamolja, hogy a UI / a fogyasztok visszafejtes nelkul azonositsak a kulcsot.
15
+ */
16
+ export declare class DyFM_StoredSecret_Util {
17
+ /**
18
+ * A secret fajtajanak detektalasa a kanonikus `DyFM_SECRET_PATTERNS`-szel (egysegesitett a
19
+ * masking-util kind-jeivel, pl. 'openai-key', 'anthropic-key', 'github-pat'). Az elso illeszkedo
20
+ * kind, vagy undefined ha egyik sem ismeri fel.
21
+ */
22
+ static detectKind(rawSecret: string): string | undefined;
23
+ /**
24
+ * A decrypt-nelkul megjelenitheto preview levezetese. Tul rovid secret-nel (vagy 0/0 reveal-nel)
25
+ * nem reveal-junk semmit (kulonben az egesz secret osszetapadhatna) — ilyenkor ures prefix/suffix
26
+ * + tisztan opaque `...` preview.
27
+ */
28
+ static derivePreview(rawSecret: string, reveal?: DyFM_SecretMask_PartialReveal_Interface): DyFM_StoredSecret_Preview_Interface;
29
+ /**
30
+ * Egy DyFM_StoredSecret osszeallitasa a nyers secret-bol — a masked-reszt levezeti, az
31
+ * `encryptedValue`-t a HIVO adja (a host/auth titkositja a sajat kulcsaval; a nyers ertek
32
+ * itt csak a preview-levezeteshez kell, NEM tarolodik el nyersen).
33
+ */
34
+ static build(set: {
35
+ rawSecret: string;
36
+ encryptedValue: string;
37
+ label?: string;
38
+ reveal?: DyFM_SecretMask_PartialReveal_Interface;
39
+ }): DyFM_StoredSecret;
40
+ }
41
+ //# sourceMappingURL=stored-secret.util.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stored-secret.util.d.ts","sourceRoot":"","sources":["../../../../src/_modules/security/_collections/stored-secret.util.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,uCAAuC,EACxC,MAAM,8CAA8C,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wCAAwC,CAAC;AAE3E,2FAA2F;AAC3F,MAAM,WAAW,mCAAmC;IAClD,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;CAC1B;AAKD;;;;;GAKG;AACH,qBAAa,sBAAsB;IAEjC;;;;OAIG;IACH,MAAM,CAAC,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAexD;;;;OAIG;IACH,MAAM,CAAC,aAAa,CAClB,SAAS,EAAE,MAAM,EACjB,MAAM,GAAE,uCAAwD,GAC/D,mCAAmC;IAoBtC;;;;OAIG;IACH,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE;QAChB,SAAS,EAAE,MAAM,CAAC;QAClB,cAAc,EAAE,MAAM,CAAC;QACvB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,uCAAuC,CAAC;KAClD,GAAG,iBAAiB;CActB"}
@@ -0,0 +1,74 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DyFM_StoredSecret_Util = void 0;
4
+ const secret_mask_util_1 = require("../../../_collections/utils/secret-mask.util");
5
+ const stored_secret_control_model_1 = require("../_models/stored-secret.control-model");
6
+ /** Default reveal — az elso 4 + utolso 4 karakter (egysegben a secret-mask util default-javal). */
7
+ const DEFAULT_REVEAL = { prefix: 4, suffix: 4 };
8
+ /**
9
+ * A DyFM_StoredSecret masked-reszenek levezetese egy nyers secret-bol — ENCRYPT/DECRYPT NELKUL
10
+ * megjelenitheto azonosito-reszt allit elo (`<prefix>...<suffix>` + a detektalt `kind`). A nyers
11
+ * ertek titkositasa NEM itt tortenik (a host adja a kulcsot); ez a util csak a lathato reszt
12
+ * szamolja, hogy a UI / a fogyasztok visszafejtes nelkul azonositsak a kulcsot.
13
+ */
14
+ class DyFM_StoredSecret_Util {
15
+ /**
16
+ * A secret fajtajanak detektalasa a kanonikus `DyFM_SECRET_PATTERNS`-szel (egysegesitett a
17
+ * masking-util kind-jeivel, pl. 'openai-key', 'anthropic-key', 'github-pat'). Az elso illeszkedo
18
+ * kind, vagy undefined ha egyik sem ismeri fel.
19
+ */
20
+ static detectKind(rawSecret) {
21
+ if (!rawSecret) {
22
+ return undefined;
23
+ }
24
+ for (const pattern of secret_mask_util_1.DyFM_SECRET_PATTERNS) {
25
+ // a patternek global flag-esek (stateful lastIndex) — minden teszt elott nullazzuk
26
+ pattern.regex.lastIndex = 0;
27
+ if (pattern.regex.test(rawSecret)) {
28
+ pattern.regex.lastIndex = 0;
29
+ return pattern.kind;
30
+ }
31
+ }
32
+ return undefined;
33
+ }
34
+ /**
35
+ * A decrypt-nelkul megjelenitheto preview levezetese. Tul rovid secret-nel (vagy 0/0 reveal-nel)
36
+ * nem reveal-junk semmit (kulonben az egesz secret osszetapadhatna) — ilyenkor ures prefix/suffix
37
+ * + tisztan opaque `...` preview.
38
+ */
39
+ static derivePreview(rawSecret, reveal = DEFAULT_REVEAL) {
40
+ const kind = this.detectKind(rawSecret);
41
+ const p = Math.max(0, reveal.prefix);
42
+ const s = Math.max(0, reveal.suffix);
43
+ if (!rawSecret || (p === 0 && s === 0) || rawSecret.length <= p + s + 4) {
44
+ return { keyPrefix: '', keySuffix: '', maskedPreview: '...', kind: kind };
45
+ }
46
+ const keyPrefix = rawSecret.slice(0, p);
47
+ const keySuffix = rawSecret.slice(rawSecret.length - s);
48
+ return {
49
+ keyPrefix: keyPrefix,
50
+ keySuffix: keySuffix,
51
+ maskedPreview: `${keyPrefix}...${keySuffix}`,
52
+ kind: kind,
53
+ };
54
+ }
55
+ /**
56
+ * Egy DyFM_StoredSecret osszeallitasa a nyers secret-bol — a masked-reszt levezeti, az
57
+ * `encryptedValue`-t a HIVO adja (a host/auth titkositja a sajat kulcsaval; a nyers ertek
58
+ * itt csak a preview-levezeteshez kell, NEM tarolodik el nyersen).
59
+ */
60
+ static build(set) {
61
+ const preview = this.derivePreview(set.rawSecret, set.reveal ?? DEFAULT_REVEAL);
62
+ return new stored_secret_control_model_1.DyFM_StoredSecret({
63
+ label: set.label,
64
+ kind: preview.kind,
65
+ keyPrefix: preview.keyPrefix,
66
+ keySuffix: preview.keySuffix,
67
+ maskedPreview: preview.maskedPreview,
68
+ encryptedValue: set.encryptedValue,
69
+ isActive: true,
70
+ });
71
+ }
72
+ }
73
+ exports.DyFM_StoredSecret_Util = DyFM_StoredSecret_Util;
74
+ //# sourceMappingURL=stored-secret.util.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stored-secret.util.js","sourceRoot":"","sources":["../../../../src/_modules/security/_collections/stored-secret.util.ts"],"names":[],"mappings":";;;AAAA,mFAGsD;AACtD,wFAA2E;AAU3E,mGAAmG;AACnG,MAAM,cAAc,GAA4C,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;AAEzF;;;;;GAKG;AACH,MAAa,sBAAsB;IAEjC;;;;OAIG;IACH,MAAM,CAAC,UAAU,CAAC,SAAiB;QACjC,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,KAAK,MAAM,OAAO,IAAI,uCAAoB,EAAE,CAAC;YAC3C,mFAAmF;YACnF,OAAO,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC;YAC5B,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;gBAClC,OAAO,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC;gBAC5B,OAAO,OAAO,CAAC,IAAI,CAAC;YACtB,CAAC;QACH,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;;;OAIG;IACH,MAAM,CAAC,aAAa,CAClB,SAAiB,EACjB,SAAkD,cAAc;QAEhE,MAAM,IAAI,GAAuB,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;QAC5D,MAAM,CAAC,GAAW,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QAC7C,MAAM,CAAC,GAAW,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QAE7C,IAAI,CAAC,SAAS,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,SAAS,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACxE,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,aAAa,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QAC5E,CAAC;QAED,MAAM,SAAS,GAAW,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAChD,MAAM,SAAS,GAAW,SAAS,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAEhE,OAAO;YACL,SAAS,EAAE,SAAS;YACpB,SAAS,EAAE,SAAS;YACpB,aAAa,EAAE,GAAG,SAAS,MAAM,SAAS,EAAE;YAC5C,IAAI,EAAE,IAAI;SACX,CAAC;IACJ,CAAC;IAED;;;;OAIG;IACH,MAAM,CAAC,KAAK,CAAC,GAKZ;QACC,MAAM,OAAO,GACX,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,EAAE,GAAG,CAAC,MAAM,IAAI,cAAc,CAAC,CAAC;QAElE,OAAO,IAAI,+CAAiB,CAAC;YAC3B,KAAK,EAAE,GAAG,CAAC,KAAK;YAChB,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,aAAa,EAAE,OAAO,CAAC,aAAa;YACpC,cAAc,EAAE,GAAG,CAAC,cAAc;YAClC,QAAQ,EAAE,IAAI;SACf,CAAC,CAAC;IACL,CAAC;CACF;AA1ED,wDA0EC"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Univerzalis tarolt-secret forma (bedrock SSOT) — minden FDP-rendszer ugyanezt hasznalja
3
+ * API-kulcs / token / barmilyen titkos ertek tarolasara.
4
+ *
5
+ * A lenyeg: a secret-bol a tarolaskor levezetheto egy ENCRYPT/DECRYPT NELKUL megjelenitheto
6
+ * "lathato resz" — egy `label` (nev) + egy `maskedPreview` (`<prefix>...<suffix>`) + a `kind`
7
+ * (a secret detektalt fajtaja). Igy a UI / a fogyasztok decrypt-kor nelkul tudjak azonositani
8
+ * MELYIK kulcs ez, anelkul hogy a nyers ertek valaha kliensre / logba kerulne.
9
+ *
10
+ * Az `encryptedValue` a titkositott nyers secret — KIZAROLAG szerver-oldalon tarolva/kezelve.
11
+ * A masked-mezoket a `DyFM_StoredSecret_Util.derivePreview()` szamolja ki a nyers ertekbol
12
+ * (a meglevo `DyFM_SECRET_PATTERNS` kind-detektorra epitve).
13
+ *
14
+ * Embeddable control-model (NEM extends DyFM_Metadata) — provider-config-okba / kulcs-listakba
15
+ * agyazhato (pl. DyFM_AI_UserProviderConfig, FDP user-api-key, Organizer MCP-kulcs).
16
+ */
17
+ export declare class DyFM_StoredSecret {
18
+ /** Ember-olvashato cimke (pl. "OpenAI Production"). Decrypt nelkul megjelenitheto. */
19
+ label?: string;
20
+ /** A secret detektalt fajtaja a masking-patternek alapjan (pl. 'openai-key', 'anthropic-key', 'github-pat'). */
21
+ kind?: string;
22
+ /** A nyers secret elso ~N karaktere — decrypt NELKUL megjelenitheto. */
23
+ keyPrefix?: string;
24
+ /** A nyers secret utolso ~N karaktere — decrypt NELKUL megjelenitheto. */
25
+ keySuffix?: string;
26
+ /** Teljes megjelenitheto elonezet: `<prefix>...<suffix>` (decrypt nelkul). */
27
+ maskedPreview?: string;
28
+ /**
29
+ * A titkositott nyers secret — KIZAROLAG szerver-oldalon. SOHA nem kerul kliensre / logba.
30
+ * A titkositas kulcsa NEM ennek a bedrock-modellnek a felelossege (a host-rendszer / auth
31
+ * adja a kulcsot a DyFM_Crypto-nak); itt csak a mar titkositott string tarolodik.
32
+ */
33
+ encryptedValue?: string;
34
+ isActive?: boolean;
35
+ expiresAt?: Date;
36
+ lastUsedAt?: Date;
37
+ constructor(set?: DyFM_StoredSecret);
38
+ }
39
+ //# sourceMappingURL=stored-secret.control-model.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stored-secret.control-model.d.ts","sourceRoot":"","sources":["../../../../src/_modules/security/_models/stored-secret.control-model.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,qBAAa,iBAAiB;IAC5B,sFAAsF;IACtF,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,gHAAgH;IAChH,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd,wEAAwE;IACxE,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,0EAA0E;IAC1E,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,8EAA8E;IAC9E,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB;;;;OAIG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,IAAI,CAAC;IACjB,UAAU,CAAC,EAAE,IAAI,CAAC;gBAEN,GAAG,CAAC,EAAE,iBAAiB;CAKpC"}
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DyFM_StoredSecret = void 0;
4
+ /**
5
+ * Univerzalis tarolt-secret forma (bedrock SSOT) — minden FDP-rendszer ugyanezt hasznalja
6
+ * API-kulcs / token / barmilyen titkos ertek tarolasara.
7
+ *
8
+ * A lenyeg: a secret-bol a tarolaskor levezetheto egy ENCRYPT/DECRYPT NELKUL megjelenitheto
9
+ * "lathato resz" — egy `label` (nev) + egy `maskedPreview` (`<prefix>...<suffix>`) + a `kind`
10
+ * (a secret detektalt fajtaja). Igy a UI / a fogyasztok decrypt-kor nelkul tudjak azonositani
11
+ * MELYIK kulcs ez, anelkul hogy a nyers ertek valaha kliensre / logba kerulne.
12
+ *
13
+ * Az `encryptedValue` a titkositott nyers secret — KIZAROLAG szerver-oldalon tarolva/kezelve.
14
+ * A masked-mezoket a `DyFM_StoredSecret_Util.derivePreview()` szamolja ki a nyers ertekbol
15
+ * (a meglevo `DyFM_SECRET_PATTERNS` kind-detektorra epitve).
16
+ *
17
+ * Embeddable control-model (NEM extends DyFM_Metadata) — provider-config-okba / kulcs-listakba
18
+ * agyazhato (pl. DyFM_AI_UserProviderConfig, FDP user-api-key, Organizer MCP-kulcs).
19
+ */
20
+ class DyFM_StoredSecret {
21
+ /** Ember-olvashato cimke (pl. "OpenAI Production"). Decrypt nelkul megjelenitheto. */
22
+ label;
23
+ /** A secret detektalt fajtaja a masking-patternek alapjan (pl. 'openai-key', 'anthropic-key', 'github-pat'). */
24
+ kind;
25
+ /** A nyers secret elso ~N karaktere — decrypt NELKUL megjelenitheto. */
26
+ keyPrefix;
27
+ /** A nyers secret utolso ~N karaktere — decrypt NELKUL megjelenitheto. */
28
+ keySuffix;
29
+ /** Teljes megjelenitheto elonezet: `<prefix>...<suffix>` (decrypt nelkul). */
30
+ maskedPreview;
31
+ /**
32
+ * A titkositott nyers secret — KIZAROLAG szerver-oldalon. SOHA nem kerul kliensre / logba.
33
+ * A titkositas kulcsa NEM ennek a bedrock-modellnek a felelossege (a host-rendszer / auth
34
+ * adja a kulcsot a DyFM_Crypto-nak); itt csak a mar titkositott string tarolodik.
35
+ */
36
+ encryptedValue;
37
+ isActive;
38
+ expiresAt;
39
+ lastUsedAt;
40
+ constructor(set) {
41
+ if (set) {
42
+ Object.assign(this, set);
43
+ }
44
+ }
45
+ }
46
+ exports.DyFM_StoredSecret = DyFM_StoredSecret;
47
+ //# sourceMappingURL=stored-secret.control-model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stored-secret.control-model.js","sourceRoot":"","sources":["../../../../src/_modules/security/_models/stored-secret.control-model.ts"],"names":[],"mappings":";;;AAAA;;;;;;;;;;;;;;;GAeG;AACH,MAAa,iBAAiB;IAC5B,sFAAsF;IACtF,KAAK,CAAU;IAEf,gHAAgH;IAChH,IAAI,CAAU;IAEd,wEAAwE;IACxE,SAAS,CAAU;IAEnB,0EAA0E;IAC1E,SAAS,CAAU;IAEnB,8EAA8E;IAC9E,aAAa,CAAU;IAEvB;;;;OAIG;IACH,cAAc,CAAU;IAExB,QAAQ,CAAW;IACnB,SAAS,CAAQ;IACjB,UAAU,CAAQ;IAElB,YAAY,GAAuB;QACjC,IAAI,GAAG,EAAE,CAAC;YACR,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC;CACF;AAhCD,8CAgCC"}
@@ -0,0 +1,4 @@
1
+ export * from './_models/stored-secret.control-model';
2
+ export * from './_collections/stored-secret.util';
3
+ export * from '../../_collections/utils/secret-mask.util';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/_modules/security/index.ts"],"names":[],"mappings":"AAIA,cAAc,uCAAuC,CAAC;AACtD,cAAc,mCAAmC,CAAC;AAGlD,cAAc,2CAA2C,CAAC"}
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ // security ("out + security alapok") modul — a titkos-ertek tarolas/maszkolas bedrock SSOT-ja.
3
+ // Erre epit minden FDP-rendszer (auth per-user AI-kulcs, Organizer MCP-kulcs, rendszer-kulcsok):
4
+ // kozos forma (DyFM_StoredSecret) + decrypt-nelkuli preview-derive + a meglevo secret-maszkolas.
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const tslib_1 = require("tslib");
7
+ tslib_1.__exportStar(require("./_models/stored-secret.control-model"), exports);
8
+ tslib_1.__exportStar(require("./_collections/stored-secret.util"), exports);
9
+ // a mar letezo univerzalis secret-maszkolas (log/output-redaction) is innen elerheto, egy helyrol
10
+ tslib_1.__exportStar(require("../../_collections/utils/secret-mask.util"), exports);
11
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/_modules/security/index.ts"],"names":[],"mappings":";AAAA,+FAA+F;AAC/F,iGAAiG;AACjG,iGAAiG;;;AAEjG,gFAAsD;AACtD,4EAAkD;AAElD,kGAAkG;AAClG,oFAA0D"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@futdevpro/fsm-dynamo",
3
- "version": "01.16.10",
3
+ "version": "01.16.11",
4
4
  "description": "Full Stack Model Collection for Dynamic (NodeJS-Typescript) Framework called Dynamo, by Future Development Ltd.",
5
5
  "DyBu_settings": {
6
6
  "packageType": "full-stack-package",
@@ -152,6 +152,12 @@
152
152
  "types": "./build/_modules/pipe/index.d.ts",
153
153
  "typings": "./build/_modules/pipe/index.d.ts"
154
154
  },
155
+ "./security": {
156
+ "default": "./build/_modules/security/index.js",
157
+ "module": "./build/_modules/security/index.js",
158
+ "types": "./build/_modules/security/index.d.ts",
159
+ "typings": "./build/_modules/security/index.d.ts"
160
+ },
155
161
  "./socket": {
156
162
  "default": "./build/_modules/socket/index.js",
157
163
  "module": "./build/_modules/socket/index.js",
@@ -269,7 +275,7 @@
269
275
  "uuid": "11.1.0"
270
276
  },
271
277
  "devDependencies": {
272
- "@futdevpro/dynamo-eslint": "1.15.16",
278
+ "@futdevpro/dynamo-eslint": "1.15.18",
273
279
  "@types/jasmine": "~4.3.5",
274
280
  "@typescript-eslint/eslint-plugin": "^8.41.0",
275
281
  "@typescript-eslint/parser": "^8.41.0",
@@ -0,0 +1,77 @@
1
+ import { DyFM_StoredSecret } from '../_models/stored-secret.control-model';
2
+ import { DyFM_StoredSecret_Util } from './stored-secret.util';
3
+
4
+ describe('| DyFM_StoredSecret_Util', () => {
5
+
6
+ // valid-formatumu teszt-kulcsok (a DyFM_SECRET_PATTERNS-hez igazitva)
7
+ const openAiKey: string = 'sk-abcdefghij1234567890abcdefghij1234567890';
8
+ const anthropicKey: string = 'sk-ant-abcdefghij1234567890abcdefghij1234567890';
9
+ const githubPat: string = 'ghp_abcdefghij1234567890abcdefghij1234567890';
10
+
11
+ describe('| detectKind', () => {
12
+ it('| OpenAI kulcsot felismer', () => {
13
+ expect(DyFM_StoredSecret_Util.detectKind(openAiKey)).toBe('openai-key');
14
+ });
15
+
16
+ it('| Anthropic kulcsot felismer (a sk-ant- specifikusabb mint a sk-)', () => {
17
+ expect(DyFM_StoredSecret_Util.detectKind(anthropicKey)).toBe('anthropic-key');
18
+ });
19
+
20
+ it('| GitHub PAT-ot felismer', () => {
21
+ expect(DyFM_StoredSecret_Util.detectKind(githubPat)).toBe('github-pat');
22
+ });
23
+
24
+ it('| ismeretlen formatumra undefined', () => {
25
+ expect(DyFM_StoredSecret_Util.detectKind('not-a-known-secret-format')).toBeUndefined();
26
+ });
27
+
28
+ it('| ures inputra undefined', () => {
29
+ expect(DyFM_StoredSecret_Util.detectKind('')).toBeUndefined();
30
+ });
31
+ });
32
+
33
+ describe('| derivePreview', () => {
34
+ it('| normal kulcsbol prefix/suffix/maskedPreview + kind', () => {
35
+ const preview = DyFM_StoredSecret_Util.derivePreview(openAiKey);
36
+ expect(preview.keyPrefix).toBe('sk-a');
37
+ expect(preview.keySuffix).toBe('7890');
38
+ expect(preview.maskedPreview).toBe('sk-a...7890');
39
+ expect(preview.kind).toBe('openai-key');
40
+ // a nyers kulcs SOHA nem jelenik meg teljes egeszeben a preview-ban
41
+ expect(preview.maskedPreview).not.toContain('abcdefghij');
42
+ });
43
+
44
+ it('| tul rovid secret -> opaque (nincs reveal)', () => {
45
+ const preview = DyFM_StoredSecret_Util.derivePreview('short');
46
+ expect(preview.keyPrefix).toBe('');
47
+ expect(preview.keySuffix).toBe('');
48
+ expect(preview.maskedPreview).toBe('...');
49
+ });
50
+
51
+ it('| 0/0 reveal -> opaque', () => {
52
+ const preview = DyFM_StoredSecret_Util.derivePreview(openAiKey, { prefix: 0, suffix: 0 });
53
+ expect(preview.maskedPreview).toBe('...');
54
+ });
55
+ });
56
+
57
+ describe('| build', () => {
58
+ it('| osszeallit egy DyFM_StoredSecret-et a masked-reszekkel + encryptedValue-val', () => {
59
+ const secret: DyFM_StoredSecret = DyFM_StoredSecret_Util.build({
60
+ rawSecret: anthropicKey,
61
+ encryptedValue: 'ENCRYPTED-BLOB-xyz',
62
+ label: 'Anthropic Prod',
63
+ });
64
+
65
+ expect(secret.label).toBe('Anthropic Prod');
66
+ expect(secret.kind).toBe('anthropic-key');
67
+ expect(secret.keyPrefix).toBe('sk-a');
68
+ expect(secret.keySuffix).toBe('7890');
69
+ expect(secret.maskedPreview).toBe('sk-a...7890');
70
+ expect(secret.encryptedValue).toBe('ENCRYPTED-BLOB-xyz');
71
+ expect(secret.isActive).toBe(true);
72
+ // a nyers kulcs NINCS eltarolva a modellben (csak az encryptedValue + a masked-resz)
73
+ expect(JSON.stringify(secret)).not.toContain('abcdefghij');
74
+ });
75
+ });
76
+
77
+ });
@@ -0,0 +1,98 @@
1
+ import {
2
+ DyFM_SECRET_PATTERNS,
3
+ DyFM_SecretMask_PartialReveal_Interface,
4
+ } from '../../../_collections/utils/secret-mask.util';
5
+ import { DyFM_StoredSecret } from '../_models/stored-secret.control-model';
6
+
7
+ /** A levezetett, decrypt-nelkul megjelenitheto resz (a DyFM_StoredSecret masked-mezoi). */
8
+ export interface DyFM_StoredSecret_Preview_Interface {
9
+ keyPrefix: string;
10
+ keySuffix: string;
11
+ maskedPreview: string;
12
+ kind: string | undefined;
13
+ }
14
+
15
+ /** Default reveal — az elso 4 + utolso 4 karakter (egysegben a secret-mask util default-javal). */
16
+ const DEFAULT_REVEAL: DyFM_SecretMask_PartialReveal_Interface = { prefix: 4, suffix: 4 };
17
+
18
+ /**
19
+ * A DyFM_StoredSecret masked-reszenek levezetese egy nyers secret-bol — ENCRYPT/DECRYPT NELKUL
20
+ * megjelenitheto azonosito-reszt allit elo (`<prefix>...<suffix>` + a detektalt `kind`). A nyers
21
+ * ertek titkositasa NEM itt tortenik (a host adja a kulcsot); ez a util csak a lathato reszt
22
+ * szamolja, hogy a UI / a fogyasztok visszafejtes nelkul azonositsak a kulcsot.
23
+ */
24
+ export class DyFM_StoredSecret_Util {
25
+
26
+ /**
27
+ * A secret fajtajanak detektalasa a kanonikus `DyFM_SECRET_PATTERNS`-szel (egysegesitett a
28
+ * masking-util kind-jeivel, pl. 'openai-key', 'anthropic-key', 'github-pat'). Az elso illeszkedo
29
+ * kind, vagy undefined ha egyik sem ismeri fel.
30
+ */
31
+ static detectKind(rawSecret: string): string | undefined {
32
+ if (!rawSecret) {
33
+ return undefined;
34
+ }
35
+ for (const pattern of DyFM_SECRET_PATTERNS) {
36
+ // a patternek global flag-esek (stateful lastIndex) — minden teszt elott nullazzuk
37
+ pattern.regex.lastIndex = 0;
38
+ if (pattern.regex.test(rawSecret)) {
39
+ pattern.regex.lastIndex = 0;
40
+ return pattern.kind;
41
+ }
42
+ }
43
+ return undefined;
44
+ }
45
+
46
+ /**
47
+ * A decrypt-nelkul megjelenitheto preview levezetese. Tul rovid secret-nel (vagy 0/0 reveal-nel)
48
+ * nem reveal-junk semmit (kulonben az egesz secret osszetapadhatna) — ilyenkor ures prefix/suffix
49
+ * + tisztan opaque `...` preview.
50
+ */
51
+ static derivePreview(
52
+ rawSecret: string,
53
+ reveal: DyFM_SecretMask_PartialReveal_Interface = DEFAULT_REVEAL,
54
+ ): DyFM_StoredSecret_Preview_Interface {
55
+ const kind: string | undefined = this.detectKind(rawSecret);
56
+ const p: number = Math.max(0, reveal.prefix);
57
+ const s: number = Math.max(0, reveal.suffix);
58
+
59
+ if (!rawSecret || (p === 0 && s === 0) || rawSecret.length <= p + s + 4) {
60
+ return { keyPrefix: '', keySuffix: '', maskedPreview: '...', kind: kind };
61
+ }
62
+
63
+ const keyPrefix: string = rawSecret.slice(0, p);
64
+ const keySuffix: string = rawSecret.slice(rawSecret.length - s);
65
+
66
+ return {
67
+ keyPrefix: keyPrefix,
68
+ keySuffix: keySuffix,
69
+ maskedPreview: `${keyPrefix}...${keySuffix}`,
70
+ kind: kind,
71
+ };
72
+ }
73
+
74
+ /**
75
+ * Egy DyFM_StoredSecret osszeallitasa a nyers secret-bol — a masked-reszt levezeti, az
76
+ * `encryptedValue`-t a HIVO adja (a host/auth titkositja a sajat kulcsaval; a nyers ertek
77
+ * itt csak a preview-levezeteshez kell, NEM tarolodik el nyersen).
78
+ */
79
+ static build(set: {
80
+ rawSecret: string,
81
+ encryptedValue: string,
82
+ label?: string,
83
+ reveal?: DyFM_SecretMask_PartialReveal_Interface,
84
+ }): DyFM_StoredSecret {
85
+ const preview: DyFM_StoredSecret_Preview_Interface =
86
+ this.derivePreview(set.rawSecret, set.reveal ?? DEFAULT_REVEAL);
87
+
88
+ return new DyFM_StoredSecret({
89
+ label: set.label,
90
+ kind: preview.kind,
91
+ keyPrefix: preview.keyPrefix,
92
+ keySuffix: preview.keySuffix,
93
+ maskedPreview: preview.maskedPreview,
94
+ encryptedValue: set.encryptedValue,
95
+ isActive: true,
96
+ });
97
+ }
98
+ }
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Univerzalis tarolt-secret forma (bedrock SSOT) — minden FDP-rendszer ugyanezt hasznalja
3
+ * API-kulcs / token / barmilyen titkos ertek tarolasara.
4
+ *
5
+ * A lenyeg: a secret-bol a tarolaskor levezetheto egy ENCRYPT/DECRYPT NELKUL megjelenitheto
6
+ * "lathato resz" — egy `label` (nev) + egy `maskedPreview` (`<prefix>...<suffix>`) + a `kind`
7
+ * (a secret detektalt fajtaja). Igy a UI / a fogyasztok decrypt-kor nelkul tudjak azonositani
8
+ * MELYIK kulcs ez, anelkul hogy a nyers ertek valaha kliensre / logba kerulne.
9
+ *
10
+ * Az `encryptedValue` a titkositott nyers secret — KIZAROLAG szerver-oldalon tarolva/kezelve.
11
+ * A masked-mezoket a `DyFM_StoredSecret_Util.derivePreview()` szamolja ki a nyers ertekbol
12
+ * (a meglevo `DyFM_SECRET_PATTERNS` kind-detektorra epitve).
13
+ *
14
+ * Embeddable control-model (NEM extends DyFM_Metadata) — provider-config-okba / kulcs-listakba
15
+ * agyazhato (pl. DyFM_AI_UserProviderConfig, FDP user-api-key, Organizer MCP-kulcs).
16
+ */
17
+ export class DyFM_StoredSecret {
18
+ /** Ember-olvashato cimke (pl. "OpenAI Production"). Decrypt nelkul megjelenitheto. */
19
+ label?: string;
20
+
21
+ /** A secret detektalt fajtaja a masking-patternek alapjan (pl. 'openai-key', 'anthropic-key', 'github-pat'). */
22
+ kind?: string;
23
+
24
+ /** A nyers secret elso ~N karaktere — decrypt NELKUL megjelenitheto. */
25
+ keyPrefix?: string;
26
+
27
+ /** A nyers secret utolso ~N karaktere — decrypt NELKUL megjelenitheto. */
28
+ keySuffix?: string;
29
+
30
+ /** Teljes megjelenitheto elonezet: `<prefix>...<suffix>` (decrypt nelkul). */
31
+ maskedPreview?: string;
32
+
33
+ /**
34
+ * A titkositott nyers secret — KIZAROLAG szerver-oldalon. SOHA nem kerul kliensre / logba.
35
+ * A titkositas kulcsa NEM ennek a bedrock-modellnek a felelossege (a host-rendszer / auth
36
+ * adja a kulcsot a DyFM_Crypto-nak); itt csak a mar titkositott string tarolodik.
37
+ */
38
+ encryptedValue?: string;
39
+
40
+ isActive?: boolean;
41
+ expiresAt?: Date;
42
+ lastUsedAt?: Date;
43
+
44
+ constructor(set?: DyFM_StoredSecret) {
45
+ if (set) {
46
+ Object.assign(this, set);
47
+ }
48
+ }
49
+ }
@@ -0,0 +1,9 @@
1
+ // security ("out + security alapok") modul — a titkos-ertek tarolas/maszkolas bedrock SSOT-ja.
2
+ // Erre epit minden FDP-rendszer (auth per-user AI-kulcs, Organizer MCP-kulcs, rendszer-kulcsok):
3
+ // kozos forma (DyFM_StoredSecret) + decrypt-nelkuli preview-derive + a meglevo secret-maszkolas.
4
+
5
+ export * from './_models/stored-secret.control-model';
6
+ export * from './_collections/stored-secret.util';
7
+
8
+ // a mar letezo univerzalis secret-maszkolas (log/output-redaction) is innen elerheto, egy helyrol
9
+ export * from '../../_collections/utils/secret-mask.util';