@iobroker/modbus 7.0.21 → 7.0.23

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/README.md CHANGED
@@ -135,7 +135,10 @@ There are some programs in folder `test` to test the TCP communication:
135
135
  -->
136
136
 
137
137
  ## Changelog
138
- ### 7.0.21 (2025-11-23)
138
+ ### 7.0.23 (2025-12-02)
139
+ - (@GermanBluefox) Corrected parsing of TSV files
140
+
141
+ ### 7.0.22 (2025-11-23)
139
142
 
140
143
  - (@GermanBluefox) Updated packages
141
144
 
@@ -1,2 +1,4 @@
1
1
  import type { Register, RegisterType } from './types';
2
- export default function tsv2registers(type: RegisterType, fileNameOrText: string): Register[];
2
+ import { type BinaryLike } from 'node:crypto';
3
+ export declare function decrypt(cipherTextB64: string, password: BinaryLike): string;
4
+ export default function tsv2registers(type: RegisterType, fileNameOrText: string, password?: string): Register[];
package/build/convert.js CHANGED
@@ -1,8 +1,13 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.decrypt = decrypt;
3
4
  exports.default = tsv2registers;
4
5
  const tsv_json_1 = require("tsv-json");
5
6
  const node_fs_1 = require("node:fs");
7
+ const node_crypto_1 = require("node:crypto");
8
+ const ALGO = 'aes-256-gcm';
9
+ const KEY_LEN = 32; // 256 Bit
10
+ const IV_LEN = 12; // GCM suggest 12 Byte
6
11
  const coils = [
7
12
  { name: '_address' },
8
13
  { name: 'name' },
@@ -57,7 +62,28 @@ const inputRegs = [
57
62
  { name: 'cw', type: 'checkbox' },
58
63
  { name: 'isScale', type: 'checkbox' },
59
64
  ];
60
- function tsv2registers(type, fileNameOrText) {
65
+ const regTypes = {
66
+ coils,
67
+ disInputs,
68
+ holdingRegs,
69
+ inputRegs,
70
+ };
71
+ function decrypt(cipherTextB64, password) {
72
+ const data = Buffer.from(cipherTextB64, 'base64');
73
+ if (typeof password === 'string' && password.length !== 32) {
74
+ password = Buffer.from(password, 'base64');
75
+ }
76
+ const salt = data.subarray(0, 16);
77
+ const iv = data.subarray(16, 16 + IV_LEN);
78
+ const authTag = data.subarray(16 + IV_LEN, 16 + IV_LEN + 16);
79
+ const encrypted = data.subarray(16 + IV_LEN + 16);
80
+ const key = (0, node_crypto_1.scryptSync)(password, salt, KEY_LEN);
81
+ const decipher = (0, node_crypto_1.createDecipheriv)(ALGO, key, iv);
82
+ decipher.setAuthTag(authTag);
83
+ const decrypted = Buffer.concat([decipher.update(encrypted), decipher.final()]);
84
+ return decrypted.toString('utf8');
85
+ }
86
+ function tsv2registers(type, fileNameOrText, password) {
61
87
  if (fileNameOrText.toLowerCase().endsWith('.tsv')) {
62
88
  if ((0, node_fs_1.existsSync)(fileNameOrText)) {
63
89
  fileNameOrText = (0, node_fs_1.readFileSync)(fileNameOrText).toString();
@@ -66,38 +92,44 @@ function tsv2registers(type, fileNameOrText) {
66
92
  throw new Error(`File name ${fileNameOrText} not found`);
67
93
  }
68
94
  }
69
- let propsFields;
70
- if (type === 'coils') {
71
- propsFields = coils;
72
- }
73
- else if (type === 'inputRegs') {
74
- propsFields = inputRegs;
75
- }
76
- else if (type === 'holdingRegs') {
77
- propsFields = holdingRegs;
78
- }
79
- else if (type === 'disInputs') {
80
- propsFields = disInputs;
95
+ else if (fileNameOrText.toLowerCase().endsWith('tsv.enc')) {
96
+ if ((0, node_fs_1.existsSync)(fileNameOrText)) {
97
+ fileNameOrText = (0, node_fs_1.readFileSync)(fileNameOrText).toString();
98
+ fileNameOrText = decrypt(fileNameOrText, password || '');
99
+ }
100
+ else {
101
+ throw new Error(`File name ${fileNameOrText} not found`);
102
+ }
81
103
  }
104
+ const propsFields = regTypes[type];
82
105
  if (!propsFields) {
83
106
  throw new Error('Unknown register type');
84
107
  }
85
108
  const data = (0, tsv_json_1.tsv2json)(fileNameOrText.endsWith('\n') ? fileNameOrText : `${fileNameOrText}\n`);
86
109
  const fields = data.shift();
87
110
  if (fields) {
88
- for (const index in propsFields) {
89
- if (propsFields[index].name !== fields[index]) {
90
- throw new Error(`Unexpected field ${index} for ${fields[index]}`);
111
+ for (const field of fields) {
112
+ if (!propsFields.find(it => it.name === field)) {
113
+ throw new Error(`Unexpected field ${field}`);
91
114
  }
92
115
  }
93
116
  }
117
+ else {
118
+ throw new Error('No fields found');
119
+ }
94
120
  return data.map(itemValues => {
95
121
  const item = {};
96
- for (const index in propsFields) {
97
- if (propsFields[index].type === 'checkbox') {
98
- itemValues[index] = itemValues[index] === 'true';
122
+ for (let f = 0; f < itemValues.length; f++) {
123
+ const field = fields[f];
124
+ const prop = propsFields.find(it => it.name === field);
125
+ if (!prop) {
126
+ // cannot happen due to check before
127
+ continue;
128
+ }
129
+ if (prop.type === 'checkbox') {
130
+ itemValues[f] = itemValues[f] === 'true';
99
131
  }
100
- item[propsFields[index].name] = itemValues[index];
132
+ item[prop.name] = itemValues[f];
101
133
  }
102
134
  return item;
103
135
  });
@@ -1 +1 @@
1
- {"version":3,"file":"convert.js","sourceRoot":"","sources":["../src/convert.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"convert.js","sourceRoot":"","sources":["../src/convert.ts"],"names":[],"mappings":"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"}
package/encrypt.mjs ADDED
@@ -0,0 +1,49 @@
1
+ import { randomBytes, scryptSync, createCipheriv } from 'node:crypto';
2
+ import { readFileSync, writeFileSync } from 'node:fs';
3
+
4
+ const ALGO = 'aes-256-gcm';
5
+ const KEY_LEN = 32; // 256 Bit
6
+ const IV_LEN = 12; // GCM suggest 12 Byte
7
+
8
+ function generatePassword32() {
9
+ // 32 Bytes = 256 Bit
10
+ return randomBytes(32); // oder 'hex' für hexadezimale Darstellung
11
+ }
12
+
13
+ /**
14
+ * Encrypts plainText with the given password.
15
+ *
16
+ * @param plainText {string}
17
+ * @param password {string} 32 bytes password
18
+ * @returns {string} Base64 encoded encrypted text
19
+ */
20
+ export function encrypt(plainText, password) {
21
+ const salt = randomBytes(16);
22
+ const iv = randomBytes(IV_LEN);
23
+ const key = scryptSync(password, salt, KEY_LEN);
24
+
25
+ const cipher = createCipheriv(ALGO, key, iv);
26
+ const encrypted = Buffer.concat([cipher.update(plainText, 'utf8'), cipher.final()]);
27
+ const authTag = cipher.getAuthTag();
28
+
29
+ // Alles zusammenpacken: salt | iv | tag | ciphertext (Base64 für Speicherung/Transport)
30
+ return Buffer.concat([salt, iv, authTag, encrypted]).toString('base64');
31
+ }
32
+
33
+ if (process.argv.length === 3 || process.argv.length === 4) {
34
+ let password = process.argv[3] || generatePassword32();
35
+ if (password.length !== 32) {
36
+ console.warn('Warning: It is recommended to use a 32 bytes long password for encryption!');
37
+ } else {
38
+ // Encrypt file with password
39
+ // argv[1]: file name
40
+ // argv[2]: password
41
+ const text = readFileSync(process.argv[2], 'utf8');
42
+ writeFileSync(`${process.argv[2]}.enc`, encrypt(text, password));
43
+ if (typeof password !== 'string') {
44
+ console.log(`Password encrypted: ${password.toString('base64')}`);
45
+ }
46
+ }
47
+ } else {
48
+ console.log('Usage: node @iobroker/modbus/encrypt.mjs <file> <password>');
49
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@iobroker/modbus",
3
- "version": "7.0.21",
3
+ "version": "7.0.23",
4
4
  "description": "Template for Modbus protocol in ioBroker",
5
5
  "publishConfig": {
6
6
  "access": "public"
@@ -45,6 +45,7 @@
45
45
  "main": "build/index.js",
46
46
  "files": [
47
47
  "build/",
48
+ "encrypt.mjs",
48
49
  "LICENSE"
49
50
  ],
50
51
  "scripts": {