diff --git a/components/mdns/message-handler.js b/components/mdns/message-handler.js index 20d3dcc..9dcf480 100644 --- a/components/mdns/message-handler.js +++ b/components/mdns/message-handler.js @@ -15,7 +15,7 @@ module.exports = (scope) => { // listen for newly added items - scope.events.on("added", ({ name, type, _matches }) => { + scope.events.on("add", ({ name, type, _matches }) => { matchCallbacks.push({ name, type, @@ -24,6 +24,28 @@ module.exports = (scope) => { }); + // liste for removed items + scope.events.on("remove", ({ name, type }) => { + try { + + let item = matchCallbacks.find((item) => { + return item.name === name && item.type === type; + }); + + let index = matchCallbacks.indexOf(item); + + if (index !== -1) { + matchCallbacks.splice(index, 1); + } + + } catch (err) { + + logger.error(err, "Could not remove matchCallback"); + + } + }); + + scope.events.on("connected", (ws) => { let questions = scope.items.map(({ type, name }) => { diff --git a/components/scenes/index.js b/components/scenes/index.js index ebe5676..9602b6b 100644 --- a/components/scenes/index.js +++ b/components/scenes/index.js @@ -39,7 +39,15 @@ class C_SCENES extends COMPONENT { // fix #390 data.triggers.forEach((trigger, i, arr) => { if (!(trigger instanceof Trigger)) { + arr[i] = new Trigger(trigger); + + // data = scene item instance + // same handling as in class.scene.js + arr[i].signal.on("fire", () => { + data.trigger(); + }); + } }); diff --git a/components/ssdp/message-handler.js b/components/ssdp/message-handler.js index 2287895..64bf4e4 100644 --- a/components/ssdp/message-handler.js +++ b/components/ssdp/message-handler.js @@ -24,7 +24,7 @@ module.exports = (scope) => { // listen for newly added items //scope.events.on("added", ({ nt, usn, _matches, headers }) => { - scope.events.on("added", ({ nt, usn, _matches }) => { + scope.events.on("add", ({ nt, usn, _matches }) => { matchCallbacks.push({ nt, usn, @@ -37,6 +37,28 @@ module.exports = (scope) => { }); + // liste for removed items + scope.events.on("remove", ({ name, type }) => { + try { + + let item = matchCallbacks.find((item) => { + return item.name === name && item.type === type; + }); + + let index = matchCallbacks.indexOf(item); + + if (index !== -1) { + matchCallbacks.splice(index, 1); + } + + } catch (err) { + + logger.error(err, "Could not remove matchCallback"); + + } + }); + + scope.events.on("message", (type, headers, description) => { // feedback diff --git a/routes/auth-handler.js b/routes/auth-handler.js index 449799f..7e89741 100644 --- a/routes/auth-handler.js +++ b/routes/auth-handler.js @@ -2,6 +2,8 @@ const jwt = require("jsonwebtoken"); module.exports = (C_USERS, router) => { + const { logger } = C_USERS; + // check if the request came from the same machine // either via reverse proxy or socket // if it came via unix socket, handle the request as authentciated @@ -57,6 +59,7 @@ module.exports = (C_USERS, router) => { }, (err, decoded) => { if (err) { + logger.error(err); res.status(401).end(); } else { diff --git a/routes/router.auth.js b/routes/router.auth.js index 6c3f485..e66a6aa 100644 --- a/routes/router.auth.js +++ b/routes/router.auth.js @@ -1,9 +1,10 @@ const jwt = require("jsonwebtoken"); const C_USERS = require("../components/users"); +const { logger } = C_USERS; module.exports = (app, router) => { - router.get("/", (req, res) => { + router.get("/check", (req, res) => { if (process.env.API_AUTH_ENABLED === "true") { // override header header token with query token @@ -79,32 +80,45 @@ module.exports = (app, router) => { router.post("/logout", (req, res) => { if (req.headers["x-auth-token"]) { - let decoded = jwt.decode(req.headers["x-auth-token"]); - - if (!decoded.uuid || decoded.uuid !== process.env.UUID) { - res.status(401).end(); - return; - } - - C_USERS.logout(decoded.email, (err, user, success) => { + // TODO: use jwt.verify() instead, otherwise you could trigger a logout for any other user + //let decoded = jwt.decode(req.headers["x-auth-token"]); + jwt.verify(req.headers["x-auth-token"], process.env.USERS_JWT_SECRET, { + algorithms: [process.env.USERS_JWT_ALGORITHM] + }, (err, decoded) => { if (err) { + logger.error(err); res.status(401).end(); } else { - if (!user) { + if (!decoded.uuid || decoded.uuid !== process.env.UUID) { res.status(401).end(); return; } - res.status(200).json({ - success + // NOTE: could this a security risk? + C_USERS.logout(decoded.email, (err, user, success) => { + if (err) { + + res.status(401).end(); + + } else { + + if (!user) { + res.status(401).end(); + return; + } + + res.status(200).json({ + success + }); + + } }); } }); - } else { res.status(401).end();