matterbridge 3.0.1-dev-20250502-7ffc38b → 3.0.1-dev-20250503-466a8ec
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/CHANGELOG.md +4 -0
- package/dist/frontend.js +46 -17
- package/dist/matterbridge.js +2 -0
- package/npm-shrinkwrap.json +2 -2
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -29,6 +29,10 @@ It is also available the official Matterbridge Home Assistant plugin https://git
|
|
|
29
29
|
- [docker]: Updated the [Docker configurations](README-DOCKER.md).
|
|
30
30
|
- [frontend]: Changing configuration for a plugin now only lock configuration on that plugin.
|
|
31
31
|
|
|
32
|
+
### Fixed
|
|
33
|
+
|
|
34
|
+
- [BasicInformation]: Fixed vulnerability to BasicInformation and BridgedDeviceBasicInformation cluster initialization attributes.
|
|
35
|
+
|
|
32
36
|
## [3.0.0] - 2025-04-29
|
|
33
37
|
|
|
34
38
|
## Breaking changes
|
package/dist/frontend.js
CHANGED
|
@@ -364,16 +364,6 @@ export class Frontend {
|
|
|
364
364
|
}
|
|
365
365
|
});
|
|
366
366
|
});
|
|
367
|
-
this.expressApp.get('/api/download-mjstorage', async (req, res) => {
|
|
368
|
-
this.log.debug('The frontend sent /api/download-mjstorage');
|
|
369
|
-
await createZip(path.join(os.tmpdir(), `matterbridge.${this.matterbridge.matterStorageName}.zip`), path.join(this.matterbridge.matterbridgeDirectory, this.matterbridge.matterStorageName));
|
|
370
|
-
res.download(path.join(os.tmpdir(), `matterbridge.${this.matterbridge.matterStorageName}.zip`), `matterbridge.${this.matterbridge.matterStorageName}.zip`, (error) => {
|
|
371
|
-
if (error) {
|
|
372
|
-
this.log.error(`Error downloading the matter storage matterbridge.${this.matterbridge.matterStorageName}.zip: ${error instanceof Error ? error.message : error}`);
|
|
373
|
-
res.status(500).send('Error downloading the matter storage zip file');
|
|
374
|
-
}
|
|
375
|
-
});
|
|
376
|
-
});
|
|
377
367
|
this.expressApp.get('/api/download-mbstorage', async (req, res) => {
|
|
378
368
|
this.log.debug('The frontend sent /api/download-mbstorage');
|
|
379
369
|
await createZip(path.join(os.tmpdir(), `matterbridge.${this.matterbridge.nodeStorageName}.zip`), path.join(this.matterbridge.matterbridgeDirectory, this.matterbridge.nodeStorageName));
|
|
@@ -384,6 +374,16 @@ export class Frontend {
|
|
|
384
374
|
}
|
|
385
375
|
});
|
|
386
376
|
});
|
|
377
|
+
this.expressApp.get('/api/download-mjstorage', async (req, res) => {
|
|
378
|
+
this.log.debug('The frontend sent /api/download-mjstorage');
|
|
379
|
+
await createZip(path.join(os.tmpdir(), `matterbridge.${this.matterbridge.matterStorageName}.zip`), path.join(this.matterbridge.matterbridgeDirectory, this.matterbridge.matterStorageName));
|
|
380
|
+
res.download(path.join(os.tmpdir(), `matterbridge.${this.matterbridge.matterStorageName}.zip`), `matterbridge.${this.matterbridge.matterStorageName}.zip`, (error) => {
|
|
381
|
+
if (error) {
|
|
382
|
+
this.log.error(`Error downloading the matter storage matterbridge.${this.matterbridge.matterStorageName}.zip: ${error instanceof Error ? error.message : error}`);
|
|
383
|
+
res.status(500).send('Error downloading the matter storage zip file');
|
|
384
|
+
}
|
|
385
|
+
});
|
|
386
|
+
});
|
|
387
387
|
this.expressApp.get('/api/download-pluginstorage', async (req, res) => {
|
|
388
388
|
this.log.debug('The frontend sent /api/download-pluginstorage');
|
|
389
389
|
await createZip(path.join(os.tmpdir(), `matterbridge.pluginstorage.zip`), this.matterbridge.matterbridgePluginDirectory);
|
|
@@ -965,44 +965,54 @@ export class Frontend {
|
|
|
965
965
|
this.wssSendSnackbarMessage(`Saved config for plugin ${data.params.pluginName}`);
|
|
966
966
|
this.wssSendRefreshRequired('plugins');
|
|
967
967
|
this.wssSendRestartRequired();
|
|
968
|
+
client.send(JSON.stringify({ id: data.id, method: data.method, src: 'Matterbridge', dst: data.src, success: true }));
|
|
968
969
|
}
|
|
969
970
|
}
|
|
970
971
|
else if (data.method === '/api/shellysysupdate') {
|
|
971
972
|
const { triggerShellySysUpdate } = await import('./shelly.js');
|
|
972
973
|
triggerShellySysUpdate(this.matterbridge);
|
|
974
|
+
client.send(JSON.stringify({ id: data.id, method: data.method, src: 'Matterbridge', dst: data.src, success: true }));
|
|
973
975
|
}
|
|
974
976
|
else if (data.method === '/api/shellymainupdate') {
|
|
975
977
|
const { triggerShellyMainUpdate } = await import('./shelly.js');
|
|
976
978
|
triggerShellyMainUpdate(this.matterbridge);
|
|
979
|
+
client.send(JSON.stringify({ id: data.id, method: data.method, src: 'Matterbridge', dst: data.src, success: true }));
|
|
977
980
|
}
|
|
978
981
|
else if (data.method === '/api/shellycreatesystemlog') {
|
|
979
982
|
const { createShellySystemLog } = await import('./shelly.js');
|
|
980
983
|
createShellySystemLog(this.matterbridge);
|
|
984
|
+
client.send(JSON.stringify({ id: data.id, method: data.method, src: 'Matterbridge', dst: data.src, success: true }));
|
|
981
985
|
}
|
|
982
986
|
else if (data.method === '/api/shellynetconfig') {
|
|
983
987
|
this.log.debug('/api/shellynetconfig:', data.params);
|
|
984
988
|
const { triggerShellyChangeIp: triggerShellyChangeNet } = await import('./shelly.js');
|
|
985
989
|
triggerShellyChangeNet(this.matterbridge, data.params);
|
|
990
|
+
client.send(JSON.stringify({ id: data.id, method: data.method, src: 'Matterbridge', dst: data.src, success: true }));
|
|
986
991
|
}
|
|
987
992
|
else if (data.method === '/api/softreset') {
|
|
988
993
|
const { triggerShellySoftReset } = await import('./shelly.js');
|
|
989
994
|
triggerShellySoftReset(this.matterbridge);
|
|
995
|
+
client.send(JSON.stringify({ id: data.id, method: data.method, src: 'Matterbridge', dst: data.src, success: true }));
|
|
990
996
|
}
|
|
991
997
|
else if (data.method === '/api/hardreset') {
|
|
992
998
|
const { triggerShellyHardReset } = await import('./shelly.js');
|
|
993
999
|
triggerShellyHardReset(this.matterbridge);
|
|
1000
|
+
client.send(JSON.stringify({ id: data.id, method: data.method, src: 'Matterbridge', dst: data.src, success: true }));
|
|
994
1001
|
}
|
|
995
1002
|
else if (data.method === '/api/reboot') {
|
|
996
1003
|
const { triggerShellyReboot } = await import('./shelly.js');
|
|
997
1004
|
triggerShellyReboot(this.matterbridge);
|
|
1005
|
+
client.send(JSON.stringify({ id: data.id, method: data.method, src: 'Matterbridge', dst: data.src, success: true }));
|
|
998
1006
|
}
|
|
999
1007
|
else if (data.method === '/api/restart') {
|
|
1000
1008
|
this.wssSendSnackbarMessage(`Restarting matterbridge...`, 0);
|
|
1001
1009
|
await this.matterbridge.restartProcess();
|
|
1010
|
+
client.send(JSON.stringify({ id: data.id, method: data.method, src: 'Matterbridge', dst: data.src, success: true }));
|
|
1002
1011
|
}
|
|
1003
1012
|
else if (data.method === '/api/shutdown') {
|
|
1004
1013
|
this.wssSendSnackbarMessage(`Shutting down matterbridge...`, 0);
|
|
1005
1014
|
await this.matterbridge.shutdownProcess();
|
|
1015
|
+
client.send(JSON.stringify({ id: data.id, method: data.method, src: 'Matterbridge', dst: data.src, success: true }));
|
|
1006
1016
|
}
|
|
1007
1017
|
else if (data.method === '/api/create-backup') {
|
|
1008
1018
|
this.wssSendSnackbarMessage('Creating backup...', 0);
|
|
@@ -1011,18 +1021,23 @@ export class Frontend {
|
|
|
1011
1021
|
this.log.notice(`Backup ready to be downloaded.`);
|
|
1012
1022
|
this.wssSendCloseSnackbarMessage('Creating backup...');
|
|
1013
1023
|
this.wssSendSnackbarMessage('Backup ready to be downloaded', 10);
|
|
1024
|
+
client.send(JSON.stringify({ id: data.id, method: data.method, src: 'Matterbridge', dst: data.src, success: true }));
|
|
1014
1025
|
}
|
|
1015
1026
|
else if (data.method === '/api/unregister') {
|
|
1016
|
-
this.wssSendSnackbarMessage('
|
|
1027
|
+
this.wssSendSnackbarMessage('Unregistering all bridged devices...', 0);
|
|
1017
1028
|
await this.matterbridge.unregisterAndShutdownProcess();
|
|
1029
|
+
this.wssSendCloseSnackbarMessage('Unregistering all bridged devices...');
|
|
1030
|
+
client.send(JSON.stringify({ id: data.id, method: data.method, src: 'Matterbridge', dst: data.src, success: true }));
|
|
1018
1031
|
}
|
|
1019
1032
|
else if (data.method === '/api/reset') {
|
|
1020
1033
|
this.wssSendSnackbarMessage('Resetting matterbridge commissioning...', 10);
|
|
1021
1034
|
await this.matterbridge.shutdownProcessAndReset();
|
|
1035
|
+
client.send(JSON.stringify({ id: data.id, method: data.method, src: 'Matterbridge', dst: data.src, success: true }));
|
|
1022
1036
|
}
|
|
1023
1037
|
else if (data.method === '/api/factoryreset') {
|
|
1024
1038
|
this.wssSendSnackbarMessage('Factory reset of matterbridge...', 10);
|
|
1025
1039
|
await this.matterbridge.shutdownProcessAndFactoryReset();
|
|
1040
|
+
client.send(JSON.stringify({ id: data.id, method: data.method, src: 'Matterbridge', dst: data.src, success: true }));
|
|
1026
1041
|
}
|
|
1027
1042
|
else if (data.method === '/api/advertise') {
|
|
1028
1043
|
const pairingCodes = await this.matterbridge.advertiseServerNode(this.matterbridge.serverNode);
|
|
@@ -1038,7 +1053,7 @@ export class Frontend {
|
|
|
1038
1053
|
this.matterbridge.matterbridgeInformation.matterbridgeAdvertise = false;
|
|
1039
1054
|
this.wssSendRefreshRequired('matterbridgeAdvertise');
|
|
1040
1055
|
this.wssSendSnackbarMessage(`Stopped fabrics share`, 0);
|
|
1041
|
-
client.send(JSON.stringify({ id: data.id, method: data.method, src: 'Matterbridge', dst: data.src }));
|
|
1056
|
+
client.send(JSON.stringify({ id: data.id, method: data.method, src: 'Matterbridge', dst: data.src, success: true }));
|
|
1042
1057
|
}
|
|
1043
1058
|
else if (data.method === '/api/settings') {
|
|
1044
1059
|
client.send(JSON.stringify({ id: data.id, method: data.method, src: 'Matterbridge', dst: data.src, response: await this.getApiSettings() }));
|
|
@@ -1204,17 +1219,18 @@ export class Frontend {
|
|
|
1204
1219
|
return;
|
|
1205
1220
|
}
|
|
1206
1221
|
this.log.debug(`Received /api/config name ${CYAN}${data.params.name}${db} value ${CYAN}${data.params.value}${db}`);
|
|
1207
|
-
this.log.fatal(`Received /api/config name ${CYAN}${data.params.name}${db} value(${typeof data.params.value}) ${CYAN}${data.params.value}${db}`);
|
|
1208
1222
|
switch (data.params.name) {
|
|
1209
1223
|
case 'setpassword':
|
|
1210
1224
|
if (isValidString(data.params.value)) {
|
|
1211
1225
|
await this.matterbridge.nodeContext?.set('password', data.params.value);
|
|
1226
|
+
client.send(JSON.stringify({ id: data.id, method: data.method, src: 'Matterbridge', dst: data.src, success: true }));
|
|
1212
1227
|
}
|
|
1213
1228
|
break;
|
|
1214
1229
|
case 'setbridgemode':
|
|
1215
|
-
if (isValidString(data.params.value,
|
|
1230
|
+
if (isValidString(data.params.value) && ['bridge', 'childbridge'].includes(data.params.value)) {
|
|
1216
1231
|
await this.matterbridge.nodeContext?.set('bridgeMode', data.params.value);
|
|
1217
1232
|
this.wssSendRestartRequired();
|
|
1233
|
+
client.send(JSON.stringify({ id: data.id, method: data.method, src: 'Matterbridge', dst: data.src, success: true }));
|
|
1218
1234
|
}
|
|
1219
1235
|
break;
|
|
1220
1236
|
case 'setmbloglevel':
|
|
@@ -1239,6 +1255,7 @@ export class Frontend {
|
|
|
1239
1255
|
await this.matterbridge.setLogLevel("fatal");
|
|
1240
1256
|
}
|
|
1241
1257
|
await this.matterbridge.nodeContext?.set('matterbridgeLogLevel', this.log.logLevel);
|
|
1258
|
+
client.send(JSON.stringify({ id: data.id, method: data.method, src: 'Matterbridge', dst: data.src, success: true }));
|
|
1242
1259
|
}
|
|
1243
1260
|
break;
|
|
1244
1261
|
case 'setmblogfile':
|
|
@@ -1250,6 +1267,7 @@ export class Frontend {
|
|
|
1250
1267
|
AnsiLogger.setGlobalLogfile(path.join(this.matterbridge.matterbridgeDirectory, this.matterbridge.matterbrideLoggerFile), this.matterbridge.matterbridgeInformation.loggerLevel, true);
|
|
1251
1268
|
else
|
|
1252
1269
|
AnsiLogger.setGlobalLogfile(undefined);
|
|
1270
|
+
client.send(JSON.stringify({ id: data.id, method: data.method, src: 'Matterbridge', dst: data.src, success: true }));
|
|
1253
1271
|
}
|
|
1254
1272
|
break;
|
|
1255
1273
|
case 'setmjloglevel':
|
|
@@ -1275,6 +1293,7 @@ export class Frontend {
|
|
|
1275
1293
|
}
|
|
1276
1294
|
this.matterbridge.matterbridgeInformation.matterLoggerLevel = Logger.level;
|
|
1277
1295
|
await this.matterbridge.nodeContext?.set('matterLogLevel', Logger.level);
|
|
1296
|
+
client.send(JSON.stringify({ id: data.id, method: data.method, src: 'Matterbridge', dst: data.src, success: true }));
|
|
1278
1297
|
}
|
|
1279
1298
|
break;
|
|
1280
1299
|
case 'setmjlogfile':
|
|
@@ -1301,6 +1320,7 @@ export class Frontend {
|
|
|
1301
1320
|
this.log.debug(`Error removing the matterfilelogger for file ${CYAN}${path.join(this.matterbridge.matterbridgeDirectory, this.matterbridge.matterLoggerFile)}${er}: ${error instanceof Error ? error.message : error}`);
|
|
1302
1321
|
}
|
|
1303
1322
|
}
|
|
1323
|
+
client.send(JSON.stringify({ id: data.id, method: data.method, src: 'Matterbridge', dst: data.src, success: true }));
|
|
1304
1324
|
}
|
|
1305
1325
|
break;
|
|
1306
1326
|
case 'setmdnsinterface':
|
|
@@ -1310,6 +1330,7 @@ export class Frontend {
|
|
|
1310
1330
|
this.matterbridge.matterbridgeInformation.mattermdnsinterface = this.matterbridge.mdnsInterface;
|
|
1311
1331
|
await this.matterbridge.nodeContext?.set('mattermdnsinterface', data.params.value);
|
|
1312
1332
|
this.wssSendRestartRequired();
|
|
1333
|
+
client.send(JSON.stringify({ id: data.id, method: data.method, src: 'Matterbridge', dst: data.src, success: true }));
|
|
1313
1334
|
}
|
|
1314
1335
|
break;
|
|
1315
1336
|
case 'setipv4address':
|
|
@@ -1319,6 +1340,7 @@ export class Frontend {
|
|
|
1319
1340
|
this.matterbridge.matterbridgeInformation.matteripv4address = this.matterbridge.ipv4address;
|
|
1320
1341
|
await this.matterbridge.nodeContext?.set('matteripv4address', data.params.value);
|
|
1321
1342
|
this.wssSendRestartRequired();
|
|
1343
|
+
client.send(JSON.stringify({ id: data.id, method: data.method, src: 'Matterbridge', dst: data.src, success: true }));
|
|
1322
1344
|
}
|
|
1323
1345
|
break;
|
|
1324
1346
|
case 'setipv6address':
|
|
@@ -1328,6 +1350,7 @@ export class Frontend {
|
|
|
1328
1350
|
this.matterbridge.matterbridgeInformation.matteripv6address = this.matterbridge.ipv6address;
|
|
1329
1351
|
await this.matterbridge.nodeContext?.set('matteripv6address', data.params.value);
|
|
1330
1352
|
this.wssSendRestartRequired();
|
|
1353
|
+
client.send(JSON.stringify({ id: data.id, method: data.method, src: 'Matterbridge', dst: data.src, success: true }));
|
|
1331
1354
|
}
|
|
1332
1355
|
break;
|
|
1333
1356
|
case 'setmatterport':
|
|
@@ -1339,11 +1362,12 @@ export class Frontend {
|
|
|
1339
1362
|
this.wssSendRestartRequired();
|
|
1340
1363
|
}
|
|
1341
1364
|
else {
|
|
1342
|
-
this.log.debug(`Reset matter commissioning port to ${CYAN}
|
|
1343
|
-
this.matterbridge.matterbridgeInformation.matterPort =
|
|
1344
|
-
await this.matterbridge.nodeContext?.set('matterport',
|
|
1365
|
+
this.log.debug(`Reset matter commissioning port to ${CYAN}5540${db}`);
|
|
1366
|
+
this.matterbridge.matterbridgeInformation.matterPort = 5540;
|
|
1367
|
+
await this.matterbridge.nodeContext?.set('matterport', 5540);
|
|
1345
1368
|
this.wssSendRestartRequired();
|
|
1346
1369
|
}
|
|
1370
|
+
client.send(JSON.stringify({ id: data.id, method: data.method, src: 'Matterbridge', dst: data.src, success: true }));
|
|
1347
1371
|
break;
|
|
1348
1372
|
case 'setmatterdiscriminator':
|
|
1349
1373
|
data.params.value = isValidString(data.params.value) ? parseInt(data.params.value) : 0;
|
|
@@ -1359,6 +1383,7 @@ export class Frontend {
|
|
|
1359
1383
|
await this.matterbridge.nodeContext?.remove('matterdiscriminator');
|
|
1360
1384
|
this.wssSendRestartRequired();
|
|
1361
1385
|
}
|
|
1386
|
+
client.send(JSON.stringify({ id: data.id, method: data.method, src: 'Matterbridge', dst: data.src, success: true }));
|
|
1362
1387
|
break;
|
|
1363
1388
|
case 'setmatterpasscode':
|
|
1364
1389
|
data.params.value = isValidString(data.params.value) ? parseInt(data.params.value) : 0;
|
|
@@ -1374,7 +1399,11 @@ export class Frontend {
|
|
|
1374
1399
|
await this.matterbridge.nodeContext?.remove('matterpasscode');
|
|
1375
1400
|
this.wssSendRestartRequired();
|
|
1376
1401
|
}
|
|
1402
|
+
client.send(JSON.stringify({ id: data.id, method: data.method, src: 'Matterbridge', dst: data.src, success: true }));
|
|
1377
1403
|
break;
|
|
1404
|
+
default:
|
|
1405
|
+
this.log.warn(`Unknown parameter ${data.params.name} in /api/config`);
|
|
1406
|
+
client.send(JSON.stringify({ id: data.id, method: data.method, src: 'Matterbridge', dst: data.src, error: `Unknown parameter ${data.params.name} in /api/config` }));
|
|
1378
1407
|
}
|
|
1379
1408
|
}
|
|
1380
1409
|
else if (data.method === '/api/command') {
|
package/dist/matterbridge.js
CHANGED
|
@@ -1018,6 +1018,7 @@ export class Matterbridge extends EventEmitter {
|
|
|
1018
1018
|
}
|
|
1019
1019
|
async cleanup(message, restart = false) {
|
|
1020
1020
|
if (this.initialized && !this.hasCleanupStarted) {
|
|
1021
|
+
this.emit('cleanup_started');
|
|
1021
1022
|
this.hasCleanupStarted = true;
|
|
1022
1023
|
this.log.info(message);
|
|
1023
1024
|
if (this.startMatterInterval) {
|
|
@@ -1171,6 +1172,7 @@ export class Matterbridge extends EventEmitter {
|
|
|
1171
1172
|
}
|
|
1172
1173
|
this.hasCleanupStarted = false;
|
|
1173
1174
|
this.initialized = false;
|
|
1175
|
+
this.emit('cleanup_completed');
|
|
1174
1176
|
}
|
|
1175
1177
|
else {
|
|
1176
1178
|
this.log.debug('Cleanup already started...');
|
package/npm-shrinkwrap.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "matterbridge",
|
|
3
|
-
"version": "3.0.1-dev-
|
|
3
|
+
"version": "3.0.1-dev-20250503-466a8ec",
|
|
4
4
|
"lockfileVersion": 3,
|
|
5
5
|
"requires": true,
|
|
6
6
|
"packages": {
|
|
7
7
|
"": {
|
|
8
8
|
"name": "matterbridge",
|
|
9
|
-
"version": "3.0.1-dev-
|
|
9
|
+
"version": "3.0.1-dev-20250503-466a8ec",
|
|
10
10
|
"license": "Apache-2.0",
|
|
11
11
|
"dependencies": {
|
|
12
12
|
"@matter/main": "0.13.0",
|
package/package.json
CHANGED