@things-factory/shell 9.0.20 → 9.0.24
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-server/index.d.ts +1 -0
- package/dist-server/index.js +1 -0
- package/dist-server/index.js.map +1 -1
- package/dist-server/service/attribute-set/attribute-set-item-type.d.ts +2 -1
- package/dist-server/service/attribute-set/attribute-set-item-type.js +1 -0
- package/dist-server/service/attribute-set/attribute-set-item-type.js.map +1 -1
- package/dist-server/service/domain/domain.d.ts +2 -0
- package/dist-server/service/domain/domain.js +6 -0
- package/dist-server/service/domain/domain.js.map +1 -1
- package/dist-server/service/env-var/env-var-mutation.d.ts +9 -0
- package/dist-server/service/env-var/env-var-mutation.js +129 -0
- package/dist-server/service/env-var/env-var-mutation.js.map +1 -0
- package/dist-server/service/env-var/env-var-query.d.ts +9 -0
- package/dist-server/service/env-var/env-var-query.js +64 -0
- package/dist-server/service/env-var/env-var-query.js.map +1 -0
- package/dist-server/service/env-var/env-var-type.d.ts +19 -0
- package/dist-server/service/env-var/env-var-type.js +76 -0
- package/dist-server/service/env-var/env-var-type.js.map +1 -0
- package/dist-server/service/env-var/env-var.d.ts +12 -0
- package/dist-server/service/env-var/env-var.js +72 -0
- package/dist-server/service/env-var/env-var.js.map +1 -0
- package/dist-server/service/env-var/index.d.ts +9 -0
- package/dist-server/service/env-var/index.js +14 -0
- package/dist-server/service/env-var/index.js.map +1 -0
- package/dist-server/service/index.d.ts +3 -2
- package/dist-server/service/index.js +6 -2
- package/dist-server/service/index.js.map +1 -1
- package/dist-server/tsconfig.tsbuildinfo +1 -1
- package/dist-server/typeorm/encrypt-json-transform.d.ts +7 -0
- package/dist-server/typeorm/encrypt-json-transform.js +95 -0
- package/dist-server/typeorm/encrypt-json-transform.js.map +1 -0
- package/package.json +2 -2
- package/translations/en.json +1 -0
- package/translations/ja.json +1 -0
- package/translations/ko.json +1 -0
- package/translations/ms.json +1 -0
- package/translations/zh.json +1 -0
@@ -0,0 +1,7 @@
|
|
1
|
+
import { ValueTransformer } from 'typeorm';
|
2
|
+
/**
|
3
|
+
* ValueTransformer object for encrypting and decrypting JSON objects.
|
4
|
+
* Used in TypeORM entities to encrypt JSON field values before storing them in the database
|
5
|
+
* and decrypt values when retrieving them from the database.
|
6
|
+
*/
|
7
|
+
export declare const encryptJsonTransformer: ValueTransformer;
|
@@ -0,0 +1,95 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.encryptJsonTransformer = void 0;
|
4
|
+
const crypto_1 = require("crypto");
|
5
|
+
const get_data_encryption_key_js_1 = require("./get-data-encryption-key.js");
|
6
|
+
const ALGORITHM = 'aes-256-cbc';
|
7
|
+
const KEY_LENGTH = 32;
|
8
|
+
const IV_LENGTH = 16;
|
9
|
+
/**
|
10
|
+
* ValueTransformer object for encrypting and decrypting JSON objects.
|
11
|
+
* Used in TypeORM entities to encrypt JSON field values before storing them in the database
|
12
|
+
* and decrypt values when retrieving them from the database.
|
13
|
+
*/
|
14
|
+
exports.encryptJsonTransformer = {
|
15
|
+
/**
|
16
|
+
* Encrypts the JSON object before storing it in the database.
|
17
|
+
* @param {any} entityValue - JSON object to encrypt
|
18
|
+
* @returns {string} - Encrypted string
|
19
|
+
*/
|
20
|
+
to: (entityValue) => encryptJson(entityValue),
|
21
|
+
/**
|
22
|
+
* Decrypts the encrypted JSON string when retrieving it from the database.
|
23
|
+
* @param {string} databaseValue - Encrypted JSON string
|
24
|
+
* @returns {any} - Decrypted JSON object
|
25
|
+
*/
|
26
|
+
from: (databaseValue) => decryptJson(databaseValue)
|
27
|
+
};
|
28
|
+
/**
|
29
|
+
* Encrypts the given JSON object using the AES-256-CBC algorithm.
|
30
|
+
* @param {any} jsonObj - JSON object to encrypt
|
31
|
+
* @returns {string} - Encrypted string
|
32
|
+
*/
|
33
|
+
function encryptJson(jsonObj) {
|
34
|
+
if (!jsonObj) {
|
35
|
+
return null;
|
36
|
+
}
|
37
|
+
try {
|
38
|
+
// JSON 객체를 문자열로 변환
|
39
|
+
const jsonString = JSON.stringify(jsonObj);
|
40
|
+
const iv = (0, crypto_1.randomBytes)(IV_LENGTH);
|
41
|
+
const cipher = (0, crypto_1.createCipheriv)(ALGORITHM, get_data_encryption_key_js_1.dataEncryptionKey, iv);
|
42
|
+
const encrypted = Buffer.concat([cipher.update(jsonString, 'utf8'), cipher.final()]);
|
43
|
+
return `${iv.toString('hex')}:${encrypted.toString('hex')}`;
|
44
|
+
}
|
45
|
+
catch (err) {
|
46
|
+
console.error('Failed to encrypt JSON object:', err);
|
47
|
+
return null;
|
48
|
+
}
|
49
|
+
}
|
50
|
+
/**
|
51
|
+
* Decrypts the given encrypted JSON string.
|
52
|
+
* @param {string} text - Encrypted JSON string to decrypt
|
53
|
+
* @returns {any} - Decrypted JSON object
|
54
|
+
*/
|
55
|
+
function decryptJson(text) {
|
56
|
+
if (!text) {
|
57
|
+
return null;
|
58
|
+
}
|
59
|
+
try {
|
60
|
+
// 암호화된 데이터인지 확인 (iv:encrypted 형식)
|
61
|
+
if (!text.includes(':')) {
|
62
|
+
// 암호화되지 않은 기존 데이터인 경우 JSON 파싱 시도
|
63
|
+
try {
|
64
|
+
const parsedData = JSON.parse(text);
|
65
|
+
console.warn('Found unencrypted data in database. This data should be encrypted for security.');
|
66
|
+
return parsedData;
|
67
|
+
}
|
68
|
+
catch (parseErr) {
|
69
|
+
// JSON 파싱도 실패하면 원본 문자열 반환
|
70
|
+
console.warn('Found unencrypted non-JSON data in database. This data should be encrypted for security.');
|
71
|
+
return text;
|
72
|
+
}
|
73
|
+
}
|
74
|
+
const parts = text.split(':');
|
75
|
+
const iv = Buffer.from(parts.shift(), 'hex');
|
76
|
+
const encryptedText = Buffer.from(parts.join(':'), 'hex');
|
77
|
+
const decipher = (0, crypto_1.createDecipheriv)(ALGORITHM, get_data_encryption_key_js_1.dataEncryptionKey, iv);
|
78
|
+
const decryptedString = Buffer.concat([decipher.update(encryptedText), decipher.final()]).toString('utf8');
|
79
|
+
// JSON 문자열을 객체로 파싱
|
80
|
+
return JSON.parse(decryptedString);
|
81
|
+
}
|
82
|
+
catch (err) {
|
83
|
+
// 복호화 실패 시 원본 데이터 반환 시도
|
84
|
+
try {
|
85
|
+
const parsedData = JSON.parse(text);
|
86
|
+
console.warn('Failed to decrypt data, but found valid JSON. Data may be unencrypted or corrupted.');
|
87
|
+
return parsedData;
|
88
|
+
}
|
89
|
+
catch (parseErr) {
|
90
|
+
console.warn('Failed to decrypt data and not valid JSON. Returning original text.');
|
91
|
+
return text;
|
92
|
+
}
|
93
|
+
}
|
94
|
+
}
|
95
|
+
//# sourceMappingURL=encrypt-json-transform.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"encrypt-json-transform.js","sourceRoot":"","sources":["../../server/typeorm/encrypt-json-transform.ts"],"names":[],"mappings":";;;AACA,mCAAsE;AAEtE,6EAAgE;AAEhE,MAAM,SAAS,GAAG,aAAa,CAAA;AAC/B,MAAM,UAAU,GAAG,EAAE,CAAA;AACrB,MAAM,SAAS,GAAG,EAAE,CAAA;AAEpB;;;;GAIG;AACU,QAAA,sBAAsB,GAAqB;IACtD;;;;OAIG;IACH,EAAE,EAAE,CAAC,WAAgB,EAAE,EAAE,CAAC,WAAW,CAAC,WAAW,CAAC;IAElD;;;;OAIG;IACH,IAAI,EAAE,CAAC,aAAqB,EAAE,EAAE,CAAC,WAAW,CAAC,aAAa,CAAC;CAC5D,CAAA;AAED;;;;GAIG;AACH,SAAS,WAAW,CAAC,OAAY;IAC/B,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,IAAI,CAAA;IACb,CAAC;IAED,IAAI,CAAC;QACH,mBAAmB;QACnB,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAA;QAE1C,MAAM,EAAE,GAAG,IAAA,oBAAW,EAAC,SAAS,CAAC,CAAA;QACjC,MAAM,MAAM,GAAG,IAAA,uBAAc,EAAC,SAAS,EAAE,8CAAiB,EAAE,EAAE,CAAC,CAAA;QAC/D,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAA;QAEpF,OAAO,GAAG,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAA;IAC7D,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,gCAAgC,EAAE,GAAG,CAAC,CAAA;QACpD,OAAO,IAAI,CAAA;IACb,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,SAAS,WAAW,CAAC,IAAY;IAC/B,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,IAAI,CAAA;IACb,CAAC;IAED,IAAI,CAAC;QACH,kCAAkC;QAClC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YACxB,iCAAiC;YACjC,IAAI,CAAC;gBACH,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;gBACnC,OAAO,CAAC,IAAI,CAAC,iFAAiF,CAAC,CAAA;gBAC/F,OAAO,UAAU,CAAA;YACnB,CAAC;YAAC,OAAO,QAAQ,EAAE,CAAC;gBAClB,0BAA0B;gBAC1B,OAAO,CAAC,IAAI,CAAC,0FAA0F,CAAC,CAAA;gBACxG,OAAO,IAAI,CAAA;YACb,CAAC;QACH,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QAC7B,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,KAAK,CAAC,CAAA;QAC5C,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,CAAA;QACzD,MAAM,QAAQ,GAAG,IAAA,yBAAgB,EAAC,SAAS,EAAE,8CAAiB,EAAE,EAAE,CAAC,CAAA;QAEnE,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA;QAE1G,mBAAmB;QACnB,OAAO,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,CAAA;IACpC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,wBAAwB;QACxB,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;YACnC,OAAO,CAAC,IAAI,CAAC,qFAAqF,CAAC,CAAA;YACnG,OAAO,UAAU,CAAA;QACnB,CAAC;QAAC,OAAO,QAAQ,EAAE,CAAC;YAClB,OAAO,CAAC,IAAI,CAAC,qEAAqE,CAAC,CAAA;YACnF,OAAO,IAAI,CAAA;QACb,CAAC;IACH,CAAC;AACH,CAAC","sourcesContent":["import { ValueTransformer } from 'typeorm'\nimport { createCipheriv, createDecipheriv, randomBytes } from 'crypto'\n\nimport { dataEncryptionKey } from './get-data-encryption-key.js'\n\nconst ALGORITHM = 'aes-256-cbc'\nconst KEY_LENGTH = 32\nconst IV_LENGTH = 16\n\n/**\n * ValueTransformer object for encrypting and decrypting JSON objects.\n * Used in TypeORM entities to encrypt JSON field values before storing them in the database\n * and decrypt values when retrieving them from the database.\n */\nexport const encryptJsonTransformer: ValueTransformer = {\n /**\n * Encrypts the JSON object before storing it in the database.\n * @param {any} entityValue - JSON object to encrypt\n * @returns {string} - Encrypted string\n */\n to: (entityValue: any) => encryptJson(entityValue),\n\n /**\n * Decrypts the encrypted JSON string when retrieving it from the database.\n * @param {string} databaseValue - Encrypted JSON string\n * @returns {any} - Decrypted JSON object\n */\n from: (databaseValue: string) => decryptJson(databaseValue)\n}\n\n/**\n * Encrypts the given JSON object using the AES-256-CBC algorithm.\n * @param {any} jsonObj - JSON object to encrypt\n * @returns {string} - Encrypted string\n */\nfunction encryptJson(jsonObj: any): string {\n if (!jsonObj) {\n return null\n }\n\n try {\n // JSON 객체를 문자열로 변환\n const jsonString = JSON.stringify(jsonObj)\n\n const iv = randomBytes(IV_LENGTH)\n const cipher = createCipheriv(ALGORITHM, dataEncryptionKey, iv)\n const encrypted = Buffer.concat([cipher.update(jsonString, 'utf8'), cipher.final()])\n\n return `${iv.toString('hex')}:${encrypted.toString('hex')}`\n } catch (err) {\n console.error('Failed to encrypt JSON object:', err)\n return null\n }\n}\n\n/**\n * Decrypts the given encrypted JSON string.\n * @param {string} text - Encrypted JSON string to decrypt\n * @returns {any} - Decrypted JSON object\n */\nfunction decryptJson(text: string): any {\n if (!text) {\n return null\n }\n\n try {\n // 암호화된 데이터인지 확인 (iv:encrypted 형식)\n if (!text.includes(':')) {\n // 암호화되지 않은 기존 데이터인 경우 JSON 파싱 시도\n try {\n const parsedData = JSON.parse(text)\n console.warn('Found unencrypted data in database. This data should be encrypted for security.')\n return parsedData\n } catch (parseErr) {\n // JSON 파싱도 실패하면 원본 문자열 반환\n console.warn('Found unencrypted non-JSON data in database. This data should be encrypted for security.')\n return text\n }\n }\n\n const parts = text.split(':')\n const iv = Buffer.from(parts.shift(), 'hex')\n const encryptedText = Buffer.from(parts.join(':'), 'hex')\n const decipher = createDecipheriv(ALGORITHM, dataEncryptionKey, iv)\n\n const decryptedString = Buffer.concat([decipher.update(encryptedText), decipher.final()]).toString('utf8')\n\n // JSON 문자열을 객체로 파싱\n return JSON.parse(decryptedString)\n } catch (err) {\n // 복호화 실패 시 원본 데이터 반환 시도\n try {\n const parsedData = JSON.parse(text)\n console.warn('Failed to decrypt data, but found valid JSON. Data may be unencrypted or corrupted.')\n return parsedData\n } catch (parseErr) {\n console.warn('Failed to decrypt data and not valid JSON. Returning original text.')\n return text\n }\n }\n}\n"]}
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "@things-factory/shell",
|
3
|
-
"version": "9.0.
|
3
|
+
"version": "9.0.24",
|
4
4
|
"description": "Core module for framework",
|
5
5
|
"bin": {
|
6
6
|
"things-factory": "bin/things-factory",
|
@@ -129,5 +129,5 @@
|
|
129
129
|
"pg": "^8.7.3",
|
130
130
|
"sqlite3": "^5.0.8"
|
131
131
|
},
|
132
|
-
"gitHead": "
|
132
|
+
"gitHead": "5b0961255631f7b6bb0c83e66d3d8021e15658bd"
|
133
133
|
}
|
package/translations/en.json
CHANGED
@@ -23,6 +23,7 @@
|
|
23
23
|
"field.brand_image": "brand_image",
|
24
24
|
"field.content_image": "content_image",
|
25
25
|
"field.theme": "theme",
|
26
|
+
"label.env-var": "environment variable",
|
26
27
|
"prompt.sure to navigate away?": "You have unsaved changes. Are you sure you want to navigate away?",
|
27
28
|
"text.are_you_sure": "are you sure?",
|
28
29
|
"text.data_created_successfully": "data created successfully",
|
package/translations/ja.json
CHANGED
@@ -23,6 +23,7 @@
|
|
23
23
|
"field.brand_image": "ブランド写真",
|
24
24
|
"field.content_image": "コンテンツ イメージ",
|
25
25
|
"field.theme": "テーマ",
|
26
|
+
"label.env-var": "環境変数",
|
26
27
|
"prompt.sure to navigate away?": "未保存の変更があります。本当に移動しますか?",
|
27
28
|
"text.are_you_sure": "進行しますか?",
|
28
29
|
"text.data_created_successfully": "資料が正常に作成されました.",
|
package/translations/ko.json
CHANGED
@@ -23,6 +23,7 @@
|
|
23
23
|
"field.brand_image": "브랜드 사진",
|
24
24
|
"field.content_image": "컨텐츠 이미지",
|
25
25
|
"field.theme": "테마",
|
26
|
+
"label.env-var": "환경 변수",
|
26
27
|
"prompt.sure to navigate away?": "변경 사항이 저장되지 않았습니다. 정말 이동하시겠습니까?",
|
27
28
|
"text.are_you_sure": "진행하시겠습니까?",
|
28
29
|
"text.data_created_successfully": "성공적으로 자료를 생성하였습니다.",
|
package/translations/ms.json
CHANGED
@@ -23,6 +23,7 @@
|
|
23
23
|
"field.brand_image": "imej",
|
24
24
|
"field.content_image": "isian imej",
|
25
25
|
"field.theme": "tema",
|
26
|
+
"label.env-var": "pengubahsuaian persekitaran",
|
26
27
|
"prompt.sure to navigate away?": "Anda mempunyai perubahan yang belum disimpan. Adakah anda pasti mahu berpindah?",
|
27
28
|
"text.are_you_sure": "adakah anda pasti?",
|
28
29
|
"text.data_created_successfully": "data berjaya dicipta",
|
package/translations/zh.json
CHANGED