From 14badaeeb50fc1c9da8dc06bffb4be40fd70e47c Mon Sep 17 00:00:00 2001 From: Skylar Sadlier Date: Wed, 1 Sep 2021 20:48:39 -0600 Subject: [PATCH] - fs-extra added as a dependency to handle config folder upgrading - config folder now upgrades automatically to the new structure - fixed error preventing matrix client from connecting to servers (just stays disconnected) --- package-lock.json | 39 ++++++-------------- package.json | 5 +-- src/matrix-server-config.js | 72 ++++++++++++++++++++----------------- 3 files changed, 53 insertions(+), 63 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6973054..c42198f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,21 +1,20 @@ { "name": "node-red-contrib-matrix-chat", - "version": "0.0.5", + "version": "0.1.8", "lockfileVersion": 2, "requires": true, "packages": { "": { - "version": "0.0.5", + "version": "0.1.8", "license": "SEE LICENSE FILE", "dependencies": { + "fs-extra": "^9.1.0", "got": "^11.8.2", "isomorphic-webcrypto": "^2.3.8", "matrix-js-sdk": "^12.2.0", + "node-localstorage": "^2.2.1", "olm": "https://packages.matrix.org/npm/olm/olm-3.1.4.tgz", "utf8": "^3.0.0" - }, - "devDependencies": { - "node-localstorage": "^2.2.1" } }, "node_modules/@babel/code-frame": { @@ -2337,7 +2336,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", - "optional": true, "engines": { "node": ">= 4.0.0" } @@ -4126,7 +4124,6 @@ "version": "9.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "optional": true, "dependencies": { "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", @@ -4298,8 +4295,7 @@ "node_modules/graceful-fs": { "version": "4.2.8", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", - "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", - "devOptional": true + "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==" }, "node_modules/har-schema": { "version": "2.0.0", @@ -4537,7 +4533,6 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true, "engines": { "node": ">=0.8.19" } @@ -5129,7 +5124,6 @@ "version": "6.1.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "optional": true, "dependencies": { "universalify": "^2.0.0" }, @@ -6082,7 +6076,6 @@ "version": "2.2.1", "resolved": "https://registry.npmjs.org/node-localstorage/-/node-localstorage-2.2.1.tgz", "integrity": "sha512-vv8fJuOUCCvSPjDjBLlMqYMHob4aGjkmrkaE42/mZr0VT+ZAU10jRF8oTnX9+pgU9/vYJ8P7YT3Vd6ajkmzSCw==", - "dev": true, "dependencies": { "write-file-atomic": "^1.1.4" }, @@ -7979,7 +7972,6 @@ "version": "1.1.6", "resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz", "integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=", - "dev": true, "engines": { "node": "*" } @@ -8822,7 +8814,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "optional": true, "engines": { "node": ">= 10.0.0" } @@ -9090,7 +9081,6 @@ "version": "1.3.4", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-1.3.4.tgz", "integrity": "sha1-+Aek8LHZ6ROuekgRLmzDrxmRtF8=", - "dev": true, "dependencies": { "graceful-fs": "^4.1.11", "imurmurhash": "^0.1.4", @@ -11090,8 +11080,7 @@ "at-least-node": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", - "optional": true + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==" }, "atob": { "version": "2.1.2", @@ -12552,7 +12541,6 @@ "version": "9.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "optional": true, "requires": { "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", @@ -12678,8 +12666,7 @@ "graceful-fs": { "version": "4.2.8", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", - "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", - "devOptional": true + "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==" }, "har-schema": { "version": "2.0.0", @@ -12863,8 +12850,7 @@ "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" }, "inflight": { "version": "1.0.6", @@ -13357,7 +13343,6 @@ "version": "6.1.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "optional": true, "requires": { "graceful-fs": "^4.1.6", "universalify": "^2.0.0" @@ -14184,7 +14169,6 @@ "version": "2.2.1", "resolved": "https://registry.npmjs.org/node-localstorage/-/node-localstorage-2.2.1.tgz", "integrity": "sha512-vv8fJuOUCCvSPjDjBLlMqYMHob4aGjkmrkaE42/mZr0VT+ZAU10jRF8oTnX9+pgU9/vYJ8P7YT3Vd6ajkmzSCw==", - "dev": true, "requires": { "write-file-atomic": "^1.1.4" } @@ -15684,8 +15668,7 @@ "slide": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz", - "integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=", - "dev": true + "integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=" }, "snapdragon": { "version": "0.8.2", @@ -16387,8 +16370,7 @@ "universalify": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "optional": true + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==" }, "unpipe": { "version": "1.0.0", @@ -16615,7 +16597,6 @@ "version": "1.3.4", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-1.3.4.tgz", "integrity": "sha1-+Aek8LHZ6ROuekgRLmzDrxmRtF8=", - "dev": true, "requires": { "graceful-fs": "^4.1.11", "imurmurhash": "^0.1.4", diff --git a/package.json b/package.json index 9fb74ad..4e96af1 100644 --- a/package.json +++ b/package.json @@ -3,12 +3,13 @@ "version": "0.1.8", "description": "Matrix chat server client for Node-RED", "dependencies": { + "fs-extra": "^9.1.0", "got": "^11.8.2", "isomorphic-webcrypto": "^2.3.8", "matrix-js-sdk": "^12.2.0", + "node-localstorage": "^2.2.1", "olm": "https://packages.matrix.org/npm/olm/olm-3.1.4.tgz", - "utf8": "^3.0.0", - "node-localstorage": "^2.2.1" + "utf8": "^3.0.0" }, "node-red": { "nodes": { diff --git a/src/matrix-server-config.js b/src/matrix-server-config.js index 7b28cda..68f8b17 100644 --- a/src/matrix-server-config.js +++ b/src/matrix-server-config.js @@ -1,13 +1,15 @@ global.Olm = require('olm'); -const fs = require("fs"); +const fs = require("fs-extra"); const sdk = require("matrix-js-sdk"); const { LocalStorage } = require('node-localstorage'); const { LocalStorageCryptoStore } = require('matrix-js-sdk/lib/crypto/store/localStorage-crypto-store'); module.exports = function(RED) { + function MatrixFolderNameFromUserId(name) { + return name.replace(/[^a-z0-9]/gi, '_').toLowerCase(); + } function MatrixServerNode(n) { - let oldStorageDir = './matrix-local-storage'; let storageDir = './matrix-client-storage'; // we should add support for getting access token automatically from username/password @@ -33,10 +35,6 @@ module.exports = function(RED) { this.enableE2ee = n.enableE2ee || false; this.e2ee = (this.enableE2ee && this.deviceId); - function toFolderName(name) { - return name.replace(/[^a-z0-9]/gi, '_').toLowerCase(); - } - if(!this.credentials.accessToken) { node.log("Matrix connection failed: missing access token."); } else if(!this.url) { @@ -44,21 +42,11 @@ module.exports = function(RED) { } else if(!this.userId) { node.log("Matrix connection failed: missing user ID."); } else { - let localStorageDir = storageDir + '/' + toFolderName(this.userId); - - // create storage directory if it doesn't exist - if(!fs.existsSync(storageDir)) { - fs.mkdirSync(storageDir); - } - - // if the old storage location exists lets move it to it's new location - if(fs.existsSync(oldStorageDir) && !fs.existsSync(localStorageDir)){ - node.log("found old '" + oldStorageDir + "' path, moving to new location '" + localStorageDir + "' ------------------------------"); - fs.renameSync(oldStorageDir, localStorageDir); - } + let localStorageDir = storageDir + '/' + MatrixFolderNameFromUserId(this.userId); + fs.ensureDirSync(storageDir); // create storage directory if it doesn't exist + upgradeDirectoryIfNecessary(node, storageDir); const localStorage = new LocalStorage(localStorageDir); - node.matrixClient = sdk.createClient({ baseUrl: this.url, accessToken: this.credentials.accessToken, @@ -172,25 +160,19 @@ module.exports = function(RED) { }); async function run() { - if(node.e2ee){ - const initCrypto = ms => new Promise(res => node.matrixClient.initCrypto()); - try { - await initCrypto(); - } catch(error){ - node.error(error); - } - node.matrixClient.setGlobalErrorOnUnknownDevices(false); - } - - const startClient = ms => new Promise(res => node.matrixClient.startClient({ initialSyncLimit: 8 })); try { - await startClient(); + if(node.e2ee){ + node.log("Initializing crypto..."); + await node.matrixClient.initCrypto(); + node.matrixClient.setGlobalErrorOnUnknownDevices(false); + } + node.log("Connecting to Matrix server..."); + await node.matrixClient.startClient({ initialSyncLimit: 8 }); } catch(error){ node.error(error); } } - node.log("Connecting to Matrix server..."); run().catch((error) => node.error(error)); } } @@ -203,4 +185,30 @@ module.exports = function(RED) { url: { type: "text", required: true }, } }); + + function upgradeDirectoryIfNecessary(node, storageDir) { + let oldStorageDir = './matrix-local-storage'; + + // if the old storage location exists lets move it to it's new location + if(fs.pathExistsSync(oldStorageDir)){ + RED.nodes.eachNode(function(n){ + try { + if(n.type !== 'matrix-server-config') return; + let { userId } = RED.nodes.getCredentials(n.id); + let dir = storageDir + '/' + MatrixFolderNameFromUserId(userId); + if(!fs.pathExistsSync(dir)) { + fs.ensureDirSync(dir); + node.log("found old '" + oldStorageDir + "' path, copying to new location '" + dir); + fs.copySync(oldStorageDir, dir); + } + } catch (err) { + console.error(err) + } + }); + + // rename folder to keep as a backup (and so we don't run again) + node.log("archiving old config folder '" + oldStorageDir + "' to '" + oldStorageDir + "-backup"); + fs.renameSync(oldStorageDir, oldStorageDir + "-backup"); + } + } } \ No newline at end of file