@futdevpro/fsm-dynamo 1.16.11 → 1.16.12
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/build/_modules/security/_collections/stored-secret.util.d.ts +10 -11
- package/build/_modules/security/_collections/stored-secret.util.d.ts.map +1 -1
- package/build/_modules/security/_collections/stored-secret.util.js +16 -17
- package/build/_modules/security/_collections/stored-secret.util.js.map +1 -1
- package/build/_modules/security/_models/stored-secret.control-model.d.ts +26 -19
- package/build/_modules/security/_models/stored-secret.control-model.d.ts.map +1 -1
- package/build/_modules/security/_models/stored-secret.control-model.js +26 -19
- package/build/_modules/security/_models/stored-secret.control-model.js.map +1 -1
- package/package.json +1 -1
- package/src/_modules/security/_collections/stored-secret.util.spec.ts +12 -8
- package/src/_modules/security/_collections/stored-secret.util.ts +17 -19
- package/src/_modules/security/_models/stored-secret.control-model.ts +27 -21
|
@@ -2,16 +2,15 @@ import { DyFM_SecretMask_PartialReveal_Interface } from '../../../_collections/u
|
|
|
2
2
|
import { DyFM_StoredSecret } from '../_models/stored-secret.control-model';
|
|
3
3
|
/** A levezetett, decrypt-nelkul megjelenitheto resz (a DyFM_StoredSecret masked-mezoi). */
|
|
4
4
|
export interface DyFM_StoredSecret_Preview_Interface {
|
|
5
|
-
keyPrefix: string;
|
|
6
|
-
keySuffix: string;
|
|
7
5
|
maskedPreview: string;
|
|
6
|
+
keyLength: number;
|
|
8
7
|
kind: string | undefined;
|
|
9
8
|
}
|
|
10
9
|
/**
|
|
11
|
-
* A DyFM_StoredSecret masked-reszenek levezetese egy nyers secret-bol — ENCRYPT/DECRYPT
|
|
12
|
-
* megjelenitheto azonosito-reszt allit elo (`<prefix>...<suffix>` + a detektalt `kind`
|
|
13
|
-
* ertek titkositasa NEM itt tortenik (a host adja a kulcsot); ez a
|
|
14
|
-
* szamolja, hogy a UI / a fogyasztok visszafejtes nelkul
|
|
10
|
+
* A DyFM_StoredSecret masked-reszenek levezetese egy USER-SAJAT nyers secret-bol — ENCRYPT/DECRYPT
|
|
11
|
+
* NELKUL megjelenitheto azonosito-reszt allit elo (`<prefix>...<suffix>` + a detektalt `kind` +
|
|
12
|
+
* a `keyLength`). A nyers ertek titkositasa NEM itt tortenik (a host/auth adja a kulcsot); ez a
|
|
13
|
+
* util csak a lathato reszt szamolja, hogy a UI / a fogyasztok visszafejtes nelkul azonositsanak.
|
|
15
14
|
*/
|
|
16
15
|
export declare class DyFM_StoredSecret_Util {
|
|
17
16
|
/**
|
|
@@ -22,14 +21,14 @@ export declare class DyFM_StoredSecret_Util {
|
|
|
22
21
|
static detectKind(rawSecret: string): string | undefined;
|
|
23
22
|
/**
|
|
24
23
|
* 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
|
|
26
|
-
*
|
|
24
|
+
* nem reveal-junk semmit (kulonben az egesz secret osszetapadhatna) — ilyenkor tisztan opaque
|
|
25
|
+
* `...` preview. A `keyLength` ettol fuggetlenul mindig a nyers hossz.
|
|
27
26
|
*/
|
|
28
27
|
static derivePreview(rawSecret: string, reveal?: DyFM_SecretMask_PartialReveal_Interface): DyFM_StoredSecret_Preview_Interface;
|
|
29
28
|
/**
|
|
30
|
-
* Egy DyFM_StoredSecret osszeallitasa a nyers secret-bol — a masked-reszt levezeti,
|
|
31
|
-
* `encryptedValue`-t a HIVO adja (a host/auth titkositja a
|
|
32
|
-
* itt csak a preview-levezeteshez kell, NEM tarolodik el nyersen).
|
|
29
|
+
* Egy DyFM_StoredSecret osszeallitasa a USER-SAJAT nyers secret-bol — a masked-reszt levezeti,
|
|
30
|
+
* az `encryptedValue`-t a HIVO adja (a host/auth titkositja a `FDP_PRIVATE_API_KEY_CRYPT_KEY`-jel;
|
|
31
|
+
* a nyers ertek itt csak a preview-levezeteshez kell, NEM tarolodik el nyersen).
|
|
33
32
|
*/
|
|
34
33
|
static build(set: {
|
|
35
34
|
rawSecret: string;
|
|
@@ -1 +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,
|
|
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,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,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;CAatB"}
|
|
@@ -6,10 +6,10 @@ const stored_secret_control_model_1 = require("../_models/stored-secret.control-
|
|
|
6
6
|
/** Default reveal — az elso 4 + utolso 4 karakter (egysegben a secret-mask util default-javal). */
|
|
7
7
|
const DEFAULT_REVEAL = { prefix: 4, suffix: 4 };
|
|
8
8
|
/**
|
|
9
|
-
* A DyFM_StoredSecret masked-reszenek levezetese egy nyers secret-bol — ENCRYPT/DECRYPT
|
|
10
|
-
* megjelenitheto azonosito-reszt allit elo (`<prefix>...<suffix>` + a detektalt `kind`
|
|
11
|
-
* ertek titkositasa NEM itt tortenik (a host adja a kulcsot); ez a
|
|
12
|
-
* szamolja, hogy a UI / a fogyasztok visszafejtes nelkul
|
|
9
|
+
* A DyFM_StoredSecret masked-reszenek levezetese egy USER-SAJAT nyers secret-bol — ENCRYPT/DECRYPT
|
|
10
|
+
* NELKUL megjelenitheto azonosito-reszt allit elo (`<prefix>...<suffix>` + a detektalt `kind` +
|
|
11
|
+
* a `keyLength`). A nyers ertek titkositasa NEM itt tortenik (a host/auth adja a kulcsot); ez a
|
|
12
|
+
* util csak a lathato reszt szamolja, hogy a UI / a fogyasztok visszafejtes nelkul azonositsanak.
|
|
13
13
|
*/
|
|
14
14
|
class DyFM_StoredSecret_Util {
|
|
15
15
|
/**
|
|
@@ -33,38 +33,37 @@ class DyFM_StoredSecret_Util {
|
|
|
33
33
|
}
|
|
34
34
|
/**
|
|
35
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
|
|
37
|
-
*
|
|
36
|
+
* nem reveal-junk semmit (kulonben az egesz secret osszetapadhatna) — ilyenkor tisztan opaque
|
|
37
|
+
* `...` preview. A `keyLength` ettol fuggetlenul mindig a nyers hossz.
|
|
38
38
|
*/
|
|
39
39
|
static derivePreview(rawSecret, reveal = DEFAULT_REVEAL) {
|
|
40
40
|
const kind = this.detectKind(rawSecret);
|
|
41
|
+
const keyLength = rawSecret ? rawSecret.length : 0;
|
|
41
42
|
const p = Math.max(0, reveal.prefix);
|
|
42
43
|
const s = Math.max(0, reveal.suffix);
|
|
43
44
|
if (!rawSecret || (p === 0 && s === 0) || rawSecret.length <= p + s + 4) {
|
|
44
|
-
return {
|
|
45
|
+
return { maskedPreview: '...', keyLength: keyLength, kind: kind };
|
|
45
46
|
}
|
|
46
|
-
const
|
|
47
|
-
const
|
|
47
|
+
const head = rawSecret.slice(0, p);
|
|
48
|
+
const tail = rawSecret.slice(rawSecret.length - s);
|
|
48
49
|
return {
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
maskedPreview: `${keyPrefix}...${keySuffix}`,
|
|
50
|
+
maskedPreview: `${head}...${tail}`,
|
|
51
|
+
keyLength: keyLength,
|
|
52
52
|
kind: kind,
|
|
53
53
|
};
|
|
54
54
|
}
|
|
55
55
|
/**
|
|
56
|
-
* Egy DyFM_StoredSecret osszeallitasa a nyers secret-bol — a masked-reszt levezeti,
|
|
57
|
-
* `encryptedValue`-t a HIVO adja (a host/auth titkositja a
|
|
58
|
-
* itt csak a preview-levezeteshez kell, NEM tarolodik el nyersen).
|
|
56
|
+
* Egy DyFM_StoredSecret osszeallitasa a USER-SAJAT nyers secret-bol — a masked-reszt levezeti,
|
|
57
|
+
* az `encryptedValue`-t a HIVO adja (a host/auth titkositja a `FDP_PRIVATE_API_KEY_CRYPT_KEY`-jel;
|
|
58
|
+
* a nyers ertek itt csak a preview-levezeteshez kell, NEM tarolodik el nyersen).
|
|
59
59
|
*/
|
|
60
60
|
static build(set) {
|
|
61
61
|
const preview = this.derivePreview(set.rawSecret, set.reveal ?? DEFAULT_REVEAL);
|
|
62
62
|
return new stored_secret_control_model_1.DyFM_StoredSecret({
|
|
63
63
|
label: set.label,
|
|
64
64
|
kind: preview.kind,
|
|
65
|
-
keyPrefix: preview.keyPrefix,
|
|
66
|
-
keySuffix: preview.keySuffix,
|
|
67
65
|
maskedPreview: preview.maskedPreview,
|
|
66
|
+
keyLength: preview.keyLength,
|
|
68
67
|
encryptedValue: set.encryptedValue,
|
|
69
68
|
isActive: true,
|
|
70
69
|
});
|
|
@@ -1 +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;
|
|
1
|
+
{"version":3,"file":"stored-secret.util.js","sourceRoot":"","sources":["../../../../src/_modules/security/_collections/stored-secret.util.ts"],"names":[],"mappings":";;;AAAA,mFAGsD;AACtD,wFAA2E;AAS3E,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,SAAS,GAAW,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3D,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,aAAa,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QACpE,CAAC;QAED,MAAM,IAAI,GAAW,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC3C,MAAM,IAAI,GAAW,SAAS,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAE3D,OAAO;YACL,aAAa,EAAE,GAAG,IAAI,MAAM,IAAI,EAAE;YAClC,SAAS,EAAE,SAAS;YACpB,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,aAAa,EAAE,OAAO,CAAC,aAAa;YACpC,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,cAAc,EAAE,GAAG,CAAC,cAAc;YAClC,QAAQ,EAAE,IAAI;SACf,CAAC,CAAC;IACL,CAAC;CACF;AAzED,wDAyEC"}
|
|
@@ -1,34 +1,41 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Univerzalis tarolt-secret forma (bedrock SSOT)
|
|
3
|
-
*
|
|
2
|
+
* Univerzalis tarolt-secret forma (bedrock SSOT) a USER-SAJAT private API-kulcsok / titkos
|
|
3
|
+
* ertekek tarolasara — minden FDP-rendszer ugyanezt hasznalja, igy kozos eredetet kapnak
|
|
4
|
+
* (auth per-user AI-kulcs, Organizer user-kulcs, jovobeli).
|
|
4
5
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* MELYIK kulcs ez, anelkul hogy a nyers ertek valaha kliensre / logba kerulne.
|
|
6
|
+
* FONTOS scope: ez a forma a USER altal megadott sajat kulcsokra valo (ezek titkositva
|
|
7
|
+
* tarolodnak a `FDP_PRIVATE_API_KEY_CRYPT_KEY`-jel). Az FDP SAJAT rendszer-api-kulcsai NEM
|
|
8
|
+
* ezen at mennek — azok env-var-ok (nem titkositott DB-tarolas).
|
|
9
9
|
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
* (a
|
|
10
|
+
* A lenyeg: a secret-bol tarolaskor levezetheto egy ENCRYPT/DECRYPT NELKUL megjelenitheto
|
|
11
|
+
* azonosito-resz — egy `label` (a user altal beallithato nev) + egy `maskedPreview`
|
|
12
|
+
* (`<prefix>...<suffix>`) + a `kind` (detektalt fajta) + a `keyLength`. Igy a UI / a fogyasztok
|
|
13
|
+
* visszafejtes nelkul azonositjak MELYIK kulcs ez, anelkul hogy a nyers ertek valaha
|
|
14
|
+
* kliensre / logba kerulne.
|
|
13
15
|
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
+
* Az `encryptedValue` a titkositott nyers secret — KIZAROLAG szerver-oldalon. A titkositas
|
|
17
|
+
* kulcsa NEM ennek a bedrock-modellnek a felelossege (a host/auth adja a kulcsot a DyFM_Crypto-nak);
|
|
18
|
+
* itt csak a mar titkositott string tarolodik. A masked-mezoket a `DyFM_StoredSecret_Util`
|
|
19
|
+
* szamolja a nyers ertekbol.
|
|
20
|
+
*
|
|
21
|
+
* Embeddable control-model (NEM extends DyFM_Metadata) — provider-config-okba / kulcs-listakba agyazhato.
|
|
16
22
|
*/
|
|
17
23
|
export declare class DyFM_StoredSecret {
|
|
18
|
-
/**
|
|
24
|
+
/**
|
|
25
|
+
* A user altal BEALLITHATO megjelenitendo nev (settable feature; a host/UI allitja be, pl.
|
|
26
|
+
* "OpenAI Production"). Decrypt nelkul megjelenitheto; tisztan ember-baratti azonositas.
|
|
27
|
+
*/
|
|
19
28
|
label?: string;
|
|
20
29
|
/** A secret detektalt fajtaja a masking-patternek alapjan (pl. 'openai-key', 'anthropic-key', 'github-pat'). */
|
|
21
30
|
kind?: string;
|
|
22
|
-
/**
|
|
23
|
-
keyPrefix?: string;
|
|
24
|
-
/** A nyers secret utolso ~N karaktere — decrypt NELKUL megjelenitheto. */
|
|
25
|
-
keySuffix?: string;
|
|
26
|
-
/** Teljes megjelenitheto elonezet: `<prefix>...<suffix>` (decrypt nelkul). */
|
|
31
|
+
/** Decrypt NELKUL megjelenitheto elonezet: `<prefix>...<suffix>` (pl. `sk-a...7890`). */
|
|
27
32
|
maskedPreview?: string;
|
|
33
|
+
/** A nyers secret hossza karakterben — decrypt nelkul megjelenitheto / validalashoz hasznos. */
|
|
34
|
+
keyLength?: number;
|
|
28
35
|
/**
|
|
29
36
|
* 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
|
|
31
|
-
*
|
|
37
|
+
* A titkositas kulcsa NEM ennek a bedrock-modellnek a felelossege (a host/auth adja); itt csak
|
|
38
|
+
* a mar titkositott string tarolodik.
|
|
32
39
|
*/
|
|
33
40
|
encryptedValue?: string;
|
|
34
41
|
isActive?: boolean;
|
|
@@ -1 +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
|
|
1
|
+
{"version":3,"file":"stored-secret.control-model.d.ts","sourceRoot":"","sources":["../../../../src/_modules/security/_models/stored-secret.control-model.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,qBAAa,iBAAiB;IAC5B;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,gHAAgH;IAChH,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd,yFAAyF;IACzF,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB,gGAAgG;IAChG,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;;;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"}
|
|
@@ -2,36 +2,43 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.DyFM_StoredSecret = void 0;
|
|
4
4
|
/**
|
|
5
|
-
* Univerzalis tarolt-secret forma (bedrock SSOT)
|
|
6
|
-
*
|
|
5
|
+
* Univerzalis tarolt-secret forma (bedrock SSOT) a USER-SAJAT private API-kulcsok / titkos
|
|
6
|
+
* ertekek tarolasara — minden FDP-rendszer ugyanezt hasznalja, igy kozos eredetet kapnak
|
|
7
|
+
* (auth per-user AI-kulcs, Organizer user-kulcs, jovobeli).
|
|
7
8
|
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
* MELYIK kulcs ez, anelkul hogy a nyers ertek valaha kliensre / logba kerulne.
|
|
9
|
+
* FONTOS scope: ez a forma a USER altal megadott sajat kulcsokra valo (ezek titkositva
|
|
10
|
+
* tarolodnak a `FDP_PRIVATE_API_KEY_CRYPT_KEY`-jel). Az FDP SAJAT rendszer-api-kulcsai NEM
|
|
11
|
+
* ezen at mennek — azok env-var-ok (nem titkositott DB-tarolas).
|
|
12
12
|
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
* (a
|
|
13
|
+
* A lenyeg: a secret-bol tarolaskor levezetheto egy ENCRYPT/DECRYPT NELKUL megjelenitheto
|
|
14
|
+
* azonosito-resz — egy `label` (a user altal beallithato nev) + egy `maskedPreview`
|
|
15
|
+
* (`<prefix>...<suffix>`) + a `kind` (detektalt fajta) + a `keyLength`. Igy a UI / a fogyasztok
|
|
16
|
+
* visszafejtes nelkul azonositjak MELYIK kulcs ez, anelkul hogy a nyers ertek valaha
|
|
17
|
+
* kliensre / logba kerulne.
|
|
16
18
|
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
+
* Az `encryptedValue` a titkositott nyers secret — KIZAROLAG szerver-oldalon. A titkositas
|
|
20
|
+
* kulcsa NEM ennek a bedrock-modellnek a felelossege (a host/auth adja a kulcsot a DyFM_Crypto-nak);
|
|
21
|
+
* itt csak a mar titkositott string tarolodik. A masked-mezoket a `DyFM_StoredSecret_Util`
|
|
22
|
+
* szamolja a nyers ertekbol.
|
|
23
|
+
*
|
|
24
|
+
* Embeddable control-model (NEM extends DyFM_Metadata) — provider-config-okba / kulcs-listakba agyazhato.
|
|
19
25
|
*/
|
|
20
26
|
class DyFM_StoredSecret {
|
|
21
|
-
/**
|
|
27
|
+
/**
|
|
28
|
+
* A user altal BEALLITHATO megjelenitendo nev (settable feature; a host/UI allitja be, pl.
|
|
29
|
+
* "OpenAI Production"). Decrypt nelkul megjelenitheto; tisztan ember-baratti azonositas.
|
|
30
|
+
*/
|
|
22
31
|
label;
|
|
23
32
|
/** A secret detektalt fajtaja a masking-patternek alapjan (pl. 'openai-key', 'anthropic-key', 'github-pat'). */
|
|
24
33
|
kind;
|
|
25
|
-
/**
|
|
26
|
-
keyPrefix;
|
|
27
|
-
/** A nyers secret utolso ~N karaktere — decrypt NELKUL megjelenitheto. */
|
|
28
|
-
keySuffix;
|
|
29
|
-
/** Teljes megjelenitheto elonezet: `<prefix>...<suffix>` (decrypt nelkul). */
|
|
34
|
+
/** Decrypt NELKUL megjelenitheto elonezet: `<prefix>...<suffix>` (pl. `sk-a...7890`). */
|
|
30
35
|
maskedPreview;
|
|
36
|
+
/** A nyers secret hossza karakterben — decrypt nelkul megjelenitheto / validalashoz hasznos. */
|
|
37
|
+
keyLength;
|
|
31
38
|
/**
|
|
32
39
|
* 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
|
|
34
|
-
*
|
|
40
|
+
* A titkositas kulcsa NEM ennek a bedrock-modellnek a felelossege (a host/auth adja); itt csak
|
|
41
|
+
* a mar titkositott string tarolodik.
|
|
35
42
|
*/
|
|
36
43
|
encryptedValue;
|
|
37
44
|
isActive;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stored-secret.control-model.js","sourceRoot":"","sources":["../../../../src/_modules/security/_models/stored-secret.control-model.ts"],"names":[],"mappings":";;;AAAA
|
|
1
|
+
{"version":3,"file":"stored-secret.control-model.js","sourceRoot":"","sources":["../../../../src/_modules/security/_models/stored-secret.control-model.ts"],"names":[],"mappings":";;;AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAa,iBAAiB;IAC5B;;;OAGG;IACH,KAAK,CAAU;IAEf,gHAAgH;IAChH,IAAI,CAAU;IAEd,yFAAyF;IACzF,aAAa,CAAU;IAEvB,gGAAgG;IAChG,SAAS,CAAU;IAEnB;;;;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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@futdevpro/fsm-dynamo",
|
|
3
|
-
"version": "01.16.
|
|
3
|
+
"version": "01.16.12",
|
|
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",
|
|
@@ -31,27 +31,32 @@ describe('| DyFM_StoredSecret_Util', () => {
|
|
|
31
31
|
});
|
|
32
32
|
|
|
33
33
|
describe('| derivePreview', () => {
|
|
34
|
-
it('| normal kulcsbol
|
|
34
|
+
it('| normal kulcsbol maskedPreview + keyLength + kind', () => {
|
|
35
35
|
const preview = DyFM_StoredSecret_Util.derivePreview(openAiKey);
|
|
36
|
-
expect(preview.keyPrefix).toBe('sk-a');
|
|
37
|
-
expect(preview.keySuffix).toBe('7890');
|
|
38
36
|
expect(preview.maskedPreview).toBe('sk-a...7890');
|
|
37
|
+
expect(preview.keyLength).toBe(openAiKey.length);
|
|
39
38
|
expect(preview.kind).toBe('openai-key');
|
|
40
39
|
// a nyers kulcs SOHA nem jelenik meg teljes egeszeben a preview-ban
|
|
41
40
|
expect(preview.maskedPreview).not.toContain('abcdefghij');
|
|
42
41
|
});
|
|
43
42
|
|
|
44
|
-
it('| tul rovid secret -> opaque
|
|
43
|
+
it('| tul rovid secret -> opaque preview, de keyLength megvan', () => {
|
|
45
44
|
const preview = DyFM_StoredSecret_Util.derivePreview('short');
|
|
46
|
-
expect(preview.keyPrefix).toBe('');
|
|
47
|
-
expect(preview.keySuffix).toBe('');
|
|
48
45
|
expect(preview.maskedPreview).toBe('...');
|
|
46
|
+
expect(preview.keyLength).toBe(5);
|
|
49
47
|
});
|
|
50
48
|
|
|
51
49
|
it('| 0/0 reveal -> opaque', () => {
|
|
52
50
|
const preview = DyFM_StoredSecret_Util.derivePreview(openAiKey, { prefix: 0, suffix: 0 });
|
|
53
51
|
expect(preview.maskedPreview).toBe('...');
|
|
54
52
|
});
|
|
53
|
+
|
|
54
|
+
it('| ures input -> opaque + keyLength 0', () => {
|
|
55
|
+
const preview = DyFM_StoredSecret_Util.derivePreview('');
|
|
56
|
+
expect(preview.maskedPreview).toBe('...');
|
|
57
|
+
expect(preview.keyLength).toBe(0);
|
|
58
|
+
expect(preview.kind).toBeUndefined();
|
|
59
|
+
});
|
|
55
60
|
});
|
|
56
61
|
|
|
57
62
|
describe('| build', () => {
|
|
@@ -64,9 +69,8 @@ describe('| DyFM_StoredSecret_Util', () => {
|
|
|
64
69
|
|
|
65
70
|
expect(secret.label).toBe('Anthropic Prod');
|
|
66
71
|
expect(secret.kind).toBe('anthropic-key');
|
|
67
|
-
expect(secret.keyPrefix).toBe('sk-a');
|
|
68
|
-
expect(secret.keySuffix).toBe('7890');
|
|
69
72
|
expect(secret.maskedPreview).toBe('sk-a...7890');
|
|
73
|
+
expect(secret.keyLength).toBe(anthropicKey.length);
|
|
70
74
|
expect(secret.encryptedValue).toBe('ENCRYPTED-BLOB-xyz');
|
|
71
75
|
expect(secret.isActive).toBe(true);
|
|
72
76
|
// a nyers kulcs NINCS eltarolva a modellben (csak az encryptedValue + a masked-resz)
|
|
@@ -6,9 +6,8 @@ import { DyFM_StoredSecret } from '../_models/stored-secret.control-model';
|
|
|
6
6
|
|
|
7
7
|
/** A levezetett, decrypt-nelkul megjelenitheto resz (a DyFM_StoredSecret masked-mezoi). */
|
|
8
8
|
export interface DyFM_StoredSecret_Preview_Interface {
|
|
9
|
-
keyPrefix: string;
|
|
10
|
-
keySuffix: string;
|
|
11
9
|
maskedPreview: string;
|
|
10
|
+
keyLength: number;
|
|
12
11
|
kind: string | undefined;
|
|
13
12
|
}
|
|
14
13
|
|
|
@@ -16,10 +15,10 @@ export interface DyFM_StoredSecret_Preview_Interface {
|
|
|
16
15
|
const DEFAULT_REVEAL: DyFM_SecretMask_PartialReveal_Interface = { prefix: 4, suffix: 4 };
|
|
17
16
|
|
|
18
17
|
/**
|
|
19
|
-
* A DyFM_StoredSecret masked-reszenek levezetese egy nyers secret-bol — ENCRYPT/DECRYPT
|
|
20
|
-
* megjelenitheto azonosito-reszt allit elo (`<prefix>...<suffix>` + a detektalt `kind`
|
|
21
|
-
* ertek titkositasa NEM itt tortenik (a host adja a kulcsot); ez a
|
|
22
|
-
* szamolja, hogy a UI / a fogyasztok visszafejtes nelkul
|
|
18
|
+
* A DyFM_StoredSecret masked-reszenek levezetese egy USER-SAJAT nyers secret-bol — ENCRYPT/DECRYPT
|
|
19
|
+
* NELKUL megjelenitheto azonosito-reszt allit elo (`<prefix>...<suffix>` + a detektalt `kind` +
|
|
20
|
+
* a `keyLength`). A nyers ertek titkositasa NEM itt tortenik (a host/auth adja a kulcsot); ez a
|
|
21
|
+
* util csak a lathato reszt szamolja, hogy a UI / a fogyasztok visszafejtes nelkul azonositsanak.
|
|
23
22
|
*/
|
|
24
23
|
export class DyFM_StoredSecret_Util {
|
|
25
24
|
|
|
@@ -45,36 +44,36 @@ export class DyFM_StoredSecret_Util {
|
|
|
45
44
|
|
|
46
45
|
/**
|
|
47
46
|
* 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
|
|
49
|
-
*
|
|
47
|
+
* nem reveal-junk semmit (kulonben az egesz secret osszetapadhatna) — ilyenkor tisztan opaque
|
|
48
|
+
* `...` preview. A `keyLength` ettol fuggetlenul mindig a nyers hossz.
|
|
50
49
|
*/
|
|
51
50
|
static derivePreview(
|
|
52
51
|
rawSecret: string,
|
|
53
52
|
reveal: DyFM_SecretMask_PartialReveal_Interface = DEFAULT_REVEAL,
|
|
54
53
|
): DyFM_StoredSecret_Preview_Interface {
|
|
55
54
|
const kind: string | undefined = this.detectKind(rawSecret);
|
|
55
|
+
const keyLength: number = rawSecret ? rawSecret.length : 0;
|
|
56
56
|
const p: number = Math.max(0, reveal.prefix);
|
|
57
57
|
const s: number = Math.max(0, reveal.suffix);
|
|
58
58
|
|
|
59
59
|
if (!rawSecret || (p === 0 && s === 0) || rawSecret.length <= p + s + 4) {
|
|
60
|
-
return {
|
|
60
|
+
return { maskedPreview: '...', keyLength: keyLength, kind: kind };
|
|
61
61
|
}
|
|
62
62
|
|
|
63
|
-
const
|
|
64
|
-
const
|
|
63
|
+
const head: string = rawSecret.slice(0, p);
|
|
64
|
+
const tail: string = rawSecret.slice(rawSecret.length - s);
|
|
65
65
|
|
|
66
66
|
return {
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
maskedPreview: `${keyPrefix}...${keySuffix}`,
|
|
67
|
+
maskedPreview: `${head}...${tail}`,
|
|
68
|
+
keyLength: keyLength,
|
|
70
69
|
kind: kind,
|
|
71
70
|
};
|
|
72
71
|
}
|
|
73
72
|
|
|
74
73
|
/**
|
|
75
|
-
* Egy DyFM_StoredSecret osszeallitasa a nyers secret-bol — a masked-reszt levezeti,
|
|
76
|
-
* `encryptedValue`-t a HIVO adja (a host/auth titkositja a
|
|
77
|
-
* itt csak a preview-levezeteshez kell, NEM tarolodik el nyersen).
|
|
74
|
+
* Egy DyFM_StoredSecret osszeallitasa a USER-SAJAT nyers secret-bol — a masked-reszt levezeti,
|
|
75
|
+
* az `encryptedValue`-t a HIVO adja (a host/auth titkositja a `FDP_PRIVATE_API_KEY_CRYPT_KEY`-jel;
|
|
76
|
+
* a nyers ertek itt csak a preview-levezeteshez kell, NEM tarolodik el nyersen).
|
|
78
77
|
*/
|
|
79
78
|
static build(set: {
|
|
80
79
|
rawSecret: string,
|
|
@@ -88,9 +87,8 @@ export class DyFM_StoredSecret_Util {
|
|
|
88
87
|
return new DyFM_StoredSecret({
|
|
89
88
|
label: set.label,
|
|
90
89
|
kind: preview.kind,
|
|
91
|
-
keyPrefix: preview.keyPrefix,
|
|
92
|
-
keySuffix: preview.keySuffix,
|
|
93
90
|
maskedPreview: preview.maskedPreview,
|
|
91
|
+
keyLength: preview.keyLength,
|
|
94
92
|
encryptedValue: set.encryptedValue,
|
|
95
93
|
isActive: true,
|
|
96
94
|
});
|
|
@@ -1,39 +1,45 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Univerzalis tarolt-secret forma (bedrock SSOT)
|
|
3
|
-
*
|
|
2
|
+
* Univerzalis tarolt-secret forma (bedrock SSOT) a USER-SAJAT private API-kulcsok / titkos
|
|
3
|
+
* ertekek tarolasara — minden FDP-rendszer ugyanezt hasznalja, igy kozos eredetet kapnak
|
|
4
|
+
* (auth per-user AI-kulcs, Organizer user-kulcs, jovobeli).
|
|
4
5
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* MELYIK kulcs ez, anelkul hogy a nyers ertek valaha kliensre / logba kerulne.
|
|
6
|
+
* FONTOS scope: ez a forma a USER altal megadott sajat kulcsokra valo (ezek titkositva
|
|
7
|
+
* tarolodnak a `FDP_PRIVATE_API_KEY_CRYPT_KEY`-jel). Az FDP SAJAT rendszer-api-kulcsai NEM
|
|
8
|
+
* ezen at mennek — azok env-var-ok (nem titkositott DB-tarolas).
|
|
9
9
|
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
* (a
|
|
10
|
+
* A lenyeg: a secret-bol tarolaskor levezetheto egy ENCRYPT/DECRYPT NELKUL megjelenitheto
|
|
11
|
+
* azonosito-resz — egy `label` (a user altal beallithato nev) + egy `maskedPreview`
|
|
12
|
+
* (`<prefix>...<suffix>`) + a `kind` (detektalt fajta) + a `keyLength`. Igy a UI / a fogyasztok
|
|
13
|
+
* visszafejtes nelkul azonositjak MELYIK kulcs ez, anelkul hogy a nyers ertek valaha
|
|
14
|
+
* kliensre / logba kerulne.
|
|
13
15
|
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
+
* Az `encryptedValue` a titkositott nyers secret — KIZAROLAG szerver-oldalon. A titkositas
|
|
17
|
+
* kulcsa NEM ennek a bedrock-modellnek a felelossege (a host/auth adja a kulcsot a DyFM_Crypto-nak);
|
|
18
|
+
* itt csak a mar titkositott string tarolodik. A masked-mezoket a `DyFM_StoredSecret_Util`
|
|
19
|
+
* szamolja a nyers ertekbol.
|
|
20
|
+
*
|
|
21
|
+
* Embeddable control-model (NEM extends DyFM_Metadata) — provider-config-okba / kulcs-listakba agyazhato.
|
|
16
22
|
*/
|
|
17
23
|
export class DyFM_StoredSecret {
|
|
18
|
-
/**
|
|
24
|
+
/**
|
|
25
|
+
* A user altal BEALLITHATO megjelenitendo nev (settable feature; a host/UI allitja be, pl.
|
|
26
|
+
* "OpenAI Production"). Decrypt nelkul megjelenitheto; tisztan ember-baratti azonositas.
|
|
27
|
+
*/
|
|
19
28
|
label?: string;
|
|
20
29
|
|
|
21
30
|
/** A secret detektalt fajtaja a masking-patternek alapjan (pl. 'openai-key', 'anthropic-key', 'github-pat'). */
|
|
22
31
|
kind?: string;
|
|
23
32
|
|
|
24
|
-
/**
|
|
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). */
|
|
33
|
+
/** Decrypt NELKUL megjelenitheto elonezet: `<prefix>...<suffix>` (pl. `sk-a...7890`). */
|
|
31
34
|
maskedPreview?: string;
|
|
32
35
|
|
|
36
|
+
/** A nyers secret hossza karakterben — decrypt nelkul megjelenitheto / validalashoz hasznos. */
|
|
37
|
+
keyLength?: number;
|
|
38
|
+
|
|
33
39
|
/**
|
|
34
40
|
* 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
|
|
36
|
-
*
|
|
41
|
+
* A titkositas kulcsa NEM ennek a bedrock-modellnek a felelossege (a host/auth adja); itt csak
|
|
42
|
+
* a mar titkositott string tarolodik.
|
|
37
43
|
*/
|
|
38
44
|
encryptedValue?: string;
|
|
39
45
|
|