@frangoteam/fuxa-min 1.2.11 → 1.3.1

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 (67) hide show
  1. package/api/auth/index.js +141 -3
  2. package/api/command/index.js +1 -1
  3. package/api/index.js +21 -2
  4. package/api/jwt-helper.js +3 -1
  5. package/api/resources/index.js +19 -2
  6. package/api/scripts/index.js +7 -3
  7. package/dist/3rdpartylicenses.txt +139 -7
  8. package/dist/assets/i18n/de.json +10 -0
  9. package/dist/assets/i18n/en.json +21 -3
  10. package/dist/assets/i18n/es.json +12 -0
  11. package/dist/assets/i18n/fr.json +11 -0
  12. package/dist/assets/i18n/ja.json +16 -6
  13. package/dist/assets/i18n/ko.json +12 -0
  14. package/dist/assets/i18n/pt.json +9 -2
  15. package/dist/assets/i18n/ru.json +11 -0
  16. package/dist/assets/i18n/sv.json +11 -1
  17. package/dist/assets/i18n/tr.json +8 -1
  18. package/dist/assets/i18n/ua.json +9 -2
  19. package/dist/assets/i18n/zh-cn.json +11 -0
  20. package/dist/assets/i18n/zh-tw.json +12 -1
  21. package/dist/assets/lib/svgeditor/fuxa-editor.min.js +17 -23
  22. package/dist/index.html +2 -2
  23. package/dist/main.72bdfed42c527918.js +329 -0
  24. package/dist/polyfills.d7de05f9af2fb559.js +1 -0
  25. package/dist/{runtime.8ef63094e52a66ba.js → runtime.9136a61a9b98f987.js} +1 -1
  26. package/dist/{scripts.40b60f02658462e4.js → scripts.d9e6ee984bf6f3b7.js} +1 -1
  27. package/dist/styles.545e37beb3e671ba.css +1 -0
  28. package/docs/openapi.yaml +3 -0
  29. package/integrations/node-red/index.js +4 -5
  30. package/integrations/node-red/node-red-contrib-fuxa/nodes/fuxa-get-daq.html +56 -5
  31. package/integrations/node-red/node-red-contrib-fuxa/nodes/fuxa-get-daq.js +8 -2
  32. package/integrations/node-red/node-red-contrib-fuxa/nodes/fuxa-get-tag-change.html +56 -5
  33. package/integrations/node-red/node-red-contrib-fuxa/nodes/fuxa-get-tag-change.js +12 -12
  34. package/integrations/node-red/node-red-contrib-fuxa/nodes/fuxa-get-tag-daq-settings.html +56 -5
  35. package/integrations/node-red/node-red-contrib-fuxa/nodes/fuxa-get-tag-daq-settings.js +14 -10
  36. package/integrations/node-red/node-red-contrib-fuxa/nodes/fuxa-get-tag.html +69 -14
  37. package/integrations/node-red/node-red-contrib-fuxa/nodes/fuxa-get-tag.js +44 -12
  38. package/integrations/node-red/node-red-contrib-fuxa/nodes/fuxa-set-tag-daq-settings.html +56 -5
  39. package/integrations/node-red/node-red-contrib-fuxa/nodes/fuxa-set-tag-daq-settings.js +24 -20
  40. package/integrations/node-red/node-red-contrib-fuxa/nodes/fuxa-set-tag.html +72 -13
  41. package/integrations/node-red/node-red-contrib-fuxa/nodes/fuxa-set-tag.js +33 -7
  42. package/main.js +38 -17
  43. package/package.json +10 -5
  44. package/runtime/alarms/alarmstorage.js +45 -30
  45. package/runtime/apikeys/apiKeysStorage.js +34 -22
  46. package/runtime/devices/adsclient/index.js +1 -1
  47. package/runtime/devices/ethernetip/index.js +1 -1
  48. package/runtime/devices/gpio/index.js +1 -1
  49. package/runtime/devices/odbc/index.js +14 -9
  50. package/runtime/devices/s7/index.js +2 -2
  51. package/runtime/devices/template/index.js +14 -14
  52. package/runtime/notificator/notifystorage.js +34 -23
  53. package/runtime/project/index.js +16 -0
  54. package/runtime/project/prjstorage.js +78 -40
  55. package/runtime/scripts/index.js +6 -2
  56. package/runtime/storage/calculator.js +17 -13
  57. package/runtime/storage/daqstorage.js +28 -2
  58. package/runtime/storage/influxdb/index.js +8 -3
  59. package/runtime/storage/questdb/index.js +224 -0
  60. package/runtime/storage/sqlite/index.js +11 -8
  61. package/runtime/storage/tdengine/index.js +24 -9
  62. package/runtime/users/usrstorage.js +65 -61
  63. package/runtime/utils.js +5 -0
  64. package/settings.default.js +8 -2
  65. package/dist/main.92522279642ef880.js +0 -329
  66. package/dist/polyfills.c8e7db9850a3ad8b.js +0 -1
  67. package/dist/styles.03cc550382689976.css +0 -1
@@ -15,6 +15,18 @@ var settings // Application settings
15
15
  var logger; // Application logger
16
16
  var db_usr; // Database of users
17
17
 
18
+ function _run(sql, params = []) {
19
+ return new Promise((resolve, reject) => {
20
+ db_usr.run(sql, params, function (err) {
21
+ if (err) {
22
+ reject(err);
23
+ } else {
24
+ resolve(this);
25
+ }
26
+ });
27
+ });
28
+ }
29
+
18
30
  /**
19
31
  * Init and bind the database resource
20
32
  * @param {*} _settings
@@ -96,16 +108,13 @@ function _checkUpdate(columnsToAdd) {
96
108
  */
97
109
  function setDefault() {
98
110
  return new Promise(function (resolve, reject) {
99
- // prepare query
100
- var sql = "";
101
- sql += "INSERT OR REPLACE INTO users (username, fullname, password, groups) VALUES('admin', 'Administrator Account', '" + bcrypt.hashSync('123456', 10) + "','-1');";
102
- db_usr.exec(sql, function (err) {
103
- if (err) {
104
- logger.error(`usrstorage.set failed! ${err}`);
105
- reject();
106
- } else {
107
- resolve();
108
- }
111
+ const sql = "INSERT OR REPLACE INTO users (username, fullname, password, groups) VALUES(?, ?, ?, ?)";
112
+ const params = ['admin', 'Administrator Account', bcrypt.hashSync('123456', 10), -1];
113
+ _run(sql, params).then(() => {
114
+ resolve();
115
+ }).catch((err) => {
116
+ logger.error(`usrstorage.set failed! ${err}`);
117
+ reject();
109
118
  });
110
119
  });
111
120
  }
@@ -136,33 +145,33 @@ function getUsers(user) {
136
145
  */
137
146
  function setUser(usr, fullname, pwd, groups, info) {
138
147
  return new Promise(function (resolve, reject) {
139
- // prepare query
140
- var exist = false;
141
148
  getUsers({ username: usr }).then(function (data) {
142
- if (data && data.length) {
143
- exist = true;
144
- }
145
- var sql = "";
149
+ const exist = data && data.length;
150
+ let sql = '';
151
+ let params = [];
146
152
  if (pwd) {
147
- sql = "INSERT OR REPLACE INTO users (username, fullname, password, groups, info) VALUES('" + usr + "','" + fullname + "','" + bcrypt.hashSync(pwd, 10) + "','" + groups + "','" + info + "');";
153
+ const hashedPwd = bcrypt.hashSync(pwd, 10);
148
154
  if (exist) {
149
- sql = "UPDATE users SET password = '" + bcrypt.hashSync(pwd, 10) + "', info = '" + info + "', groups = '" + groups + "', fullname = '" + fullname + "' WHERE username = '" + usr + "';";
155
+ sql = "UPDATE users SET password = ?, info = ?, groups = ?, fullname = ? WHERE username = ?";
156
+ params = [hashedPwd, info, groups, fullname, usr];
157
+ } else {
158
+ sql = "INSERT OR REPLACE INTO users (username, fullname, password, groups, info) VALUES(?, ?, ?, ?, ?)";
159
+ params = [usr, fullname, hashedPwd, groups, info];
150
160
  }
161
+ } else if (exist) {
162
+ sql = "UPDATE users SET groups = ?, info = ?, fullname = ? WHERE username = ?";
163
+ params = [groups, info, fullname, usr];
151
164
  } else {
152
- sql = "INSERT OR REPLACE INTO users (username, fullname, groups, info) VALUES('" + usr + "','" + fullname + "','" + groups + "','" + info + "');";
153
- if (exist) {
154
- sql = "UPDATE users SET groups = '" + groups + "', info = '" + info + "', fullname = '" + fullname + "' WHERE username = '" + usr + "';";
155
- }
165
+ sql = "INSERT OR REPLACE INTO users (username, fullname, groups, info) VALUES(?, ?, ?, ?)";
166
+ params = [usr, fullname, groups, info];
156
167
  }
157
- db_usr.exec(sql, function (err) {
158
- if (err) {
159
- logger.error(`usrstorage.set failed! ${err}`);
160
- reject();
161
- } else {
162
- resolve();
163
- }
168
+ _run(sql, params).then(() => {
169
+ resolve();
170
+ }).catch((err) => {
171
+ logger.error(`usrstorage.set failed! ${err}`);
172
+ reject();
164
173
  });
165
- }).catch(function (err) {
174
+ }).catch(function () {
166
175
  reject();
167
176
  });
168
177
  });
@@ -173,15 +182,12 @@ function setUser(usr, fullname, pwd, groups, info) {
173
182
  */
174
183
  function removeUser(usr) {
175
184
  return new Promise(function (resolve, reject) {
176
- // prepare query
177
- var sql = "DELETE FROM users WHERE username = '" + usr + "'";
178
- db_usr.exec(sql, function (err) {
179
- if (err) {
180
- logger.error(`usrstorage.remove failed! ${err}`);
181
- reject();
182
- } else {
183
- resolve();
184
- }
185
+ var sql = "DELETE FROM users WHERE username = ?";
186
+ _run(sql, [usr]).then(() => {
187
+ resolve();
188
+ }).catch((err) => {
189
+ logger.error(`usrstorage.remove failed! ${err}`);
190
+ reject();
185
191
  });
186
192
  });
187
193
  }
@@ -207,18 +213,17 @@ function getRoles() {
207
213
  */
208
214
  function setRoles(roles) {
209
215
  return new Promise(async function (resolve, reject) {
210
- for (var i = 0; i < roles.length; i++) {
211
- const role = roles[i];
212
- var value = JSON.stringify(role).replace(/\'/g,"''");
213
- var sql = "INSERT OR REPLACE INTO roles (name, value) VALUES('" + role.id + "','"+ value + "');";
214
- await db_usr.exec(sql, function (err) {
215
- if (err) {
216
- logger.error(`usrstorage.set role failed! ${err}`);
217
- reject();
218
- }
219
- });
216
+ try {
217
+ const sql = "INSERT OR REPLACE INTO roles (name, value) VALUES(?, ?)";
218
+ for (const role of roles) {
219
+ const value = JSON.stringify(role);
220
+ await _run(sql, [role.id, value]);
221
+ }
222
+ resolve();
223
+ } catch (err) {
224
+ logger.error(`usrstorage.set role failed! ${err}`);
225
+ reject();
220
226
  }
221
- resolve();
222
227
  });
223
228
  }
224
229
 
@@ -227,17 +232,16 @@ function setRoles(roles) {
227
232
  */
228
233
  function removeRoles(roles) {
229
234
  return new Promise(async function (resolve, reject) {
230
- for (var i = 0; i < roles.length; i++) {
231
- const role = roles[i];
232
- var sql = "DELETE FROM roles WHERE name = '" + role.id + "'";
233
- await db_usr.exec(sql, function (err) {
234
- if (err) {
235
- logger.error(`usrstorage.remove role failed! ${err}`);
236
- reject();
237
- }
238
- });
235
+ try {
236
+ const sql = "DELETE FROM roles WHERE name = ?";
237
+ for (const role of roles) {
238
+ await _run(sql, [role.id]);
239
+ }
240
+ resolve();
241
+ } catch (err) {
242
+ logger.error(`usrstorage.remove role failed! ${err}`);
243
+ reject();
239
244
  }
240
- resolve();
241
245
  });
242
246
  }
243
247
 
@@ -260,4 +264,4 @@ module.exports = {
260
264
  getRoles: getRoles,
261
265
  setRoles: setRoles,
262
266
  removeRoles: removeRoles
263
- };
267
+ };
package/runtime/utils.js CHANGED
@@ -1,5 +1,6 @@
1
1
  const os = require('os');
2
2
  const ip = require('ip');
3
+ const crypto = require('crypto');
3
4
 
4
5
  'use strict';
5
6
  var utils = module.exports = {
@@ -361,5 +362,9 @@ var utils = module.exports = {
361
362
  }
362
363
  }
363
364
  return target;
365
+ },
366
+
367
+ generateSecretCode: function(byteLength = 32) {
368
+ return crypto.randomBytes(byteLength).toString('hex');
364
369
  }
365
370
  }
@@ -6,6 +6,9 @@ module.exports = {
6
6
  // Standard language (editor)
7
7
  language: 'en',
8
8
 
9
+ // Hide the editor onboarding wizard when entering editor mode
10
+ hideEditorOnboarding: false,
11
+
9
12
  // The tcp port that the FUXA web server is listening on
10
13
  uiPort: process.env.PORT || 1881,
11
14
 
@@ -24,6 +27,7 @@ module.exports = {
24
27
  // - 'common': Less detailed than 'combined', omitting the referrer and user-agent.
25
28
  // - 'short': Shorter format that includes the remote address and request details.
26
29
  // - 'tiny': Minimalist format, showing just the method, URL, status, response length, and response time.
30
+ // - 'none': Completely disables HTTP request logging to clean the console for custom debugging scripts and reduce I/O overhead.
27
31
  //
28
32
  // Default Value:
29
33
  // - 'combined': By default, logApiLevel is set to 'combined', providing detailed logs suitable for thorough tracking and analysis.
@@ -91,8 +95,10 @@ module.exports = {
91
95
 
92
96
  // Used to enable security, authentication and authorization and crypt Token
93
97
  //secureEnabled: true,
94
- //secretCode: 'frangoteam751',
95
- //tokenExpiresIn: '1h' // '1h'=1hour, 60=60seconds, '1d'=1day
98
+ //secretCode: '<set-a-strong-random-secret>',
99
+ //tokenExpiresIn: '1h', // '1h'=1hour, 60=60seconds, '1d'=1day
100
+ //enableRefreshCookieAuth: false, // if true, use refresh token HttpOnly cookie flow
101
+ //refreshTokenExpiresIn: '7d' // '7d'=7days, 12h=12hours, 3600=3600seconds
96
102
 
97
103
  // Heartbeat interval in seconds (1-20)
98
104
  heartbeatIntervalSec: 10,