@things-factory/shell 9.0.20 → 9.0.25

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.
Files changed (37) hide show
  1. package/dist-server/index.d.ts +1 -0
  2. package/dist-server/index.js +1 -0
  3. package/dist-server/index.js.map +1 -1
  4. package/dist-server/service/attribute-set/attribute-set-item-type.d.ts +2 -1
  5. package/dist-server/service/attribute-set/attribute-set-item-type.js +1 -0
  6. package/dist-server/service/attribute-set/attribute-set-item-type.js.map +1 -1
  7. package/dist-server/service/domain/domain.d.ts +2 -0
  8. package/dist-server/service/domain/domain.js +6 -0
  9. package/dist-server/service/domain/domain.js.map +1 -1
  10. package/dist-server/service/env-var/env-var-mutation.d.ts +9 -0
  11. package/dist-server/service/env-var/env-var-mutation.js +129 -0
  12. package/dist-server/service/env-var/env-var-mutation.js.map +1 -0
  13. package/dist-server/service/env-var/env-var-query.d.ts +9 -0
  14. package/dist-server/service/env-var/env-var-query.js +64 -0
  15. package/dist-server/service/env-var/env-var-query.js.map +1 -0
  16. package/dist-server/service/env-var/env-var-type.d.ts +19 -0
  17. package/dist-server/service/env-var/env-var-type.js +76 -0
  18. package/dist-server/service/env-var/env-var-type.js.map +1 -0
  19. package/dist-server/service/env-var/env-var.d.ts +12 -0
  20. package/dist-server/service/env-var/env-var.js +72 -0
  21. package/dist-server/service/env-var/env-var.js.map +1 -0
  22. package/dist-server/service/env-var/index.d.ts +9 -0
  23. package/dist-server/service/env-var/index.js +14 -0
  24. package/dist-server/service/env-var/index.js.map +1 -0
  25. package/dist-server/service/index.d.ts +3 -2
  26. package/dist-server/service/index.js +6 -2
  27. package/dist-server/service/index.js.map +1 -1
  28. package/dist-server/tsconfig.tsbuildinfo +1 -1
  29. package/dist-server/typeorm/encrypt-json-transform.d.ts +7 -0
  30. package/dist-server/typeorm/encrypt-json-transform.js +95 -0
  31. package/dist-server/typeorm/encrypt-json-transform.js.map +1 -0
  32. package/package.json +2 -2
  33. package/translations/en.json +1 -0
  34. package/translations/ja.json +1 -0
  35. package/translations/ko.json +1 -0
  36. package/translations/ms.json +1 -0
  37. 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":"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","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.20",
3
+ "version": "9.0.25",
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": "d66d7047d01d82c6c676f8f02ecf1233fe55eaab"
132
+ "gitHead": "f15d38b26438fe7e14edefdeb0b752ce9fe5fa83"
133
133
  }
@@ -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",
@@ -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": "資料が正常に作成されました.",
@@ -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": "성공적으로 자료를 생성하였습니다.",
@@ -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",
@@ -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": "数据创建成功。",