diff --git a/src/fireedge/src/server/routes/websockets/hooks/index.js b/src/fireedge/src/server/routes/websockets/hooks/index.js index 9b2cbbcc6b..d3788ae02f 100644 --- a/src/fireedge/src/server/routes/websockets/hooks/index.js +++ b/src/fireedge/src/server/routes/websockets/hooks/index.js @@ -17,62 +17,66 @@ const atob = require('atob') const { socket: socketZeroMQ } = require('zeromq') const xml2js = require('xml2js') const { messageTerminal } = require('server/utils/general') -const { authWebsocket, getDataZone } = require('server/utils/server') -const type = 'hooks' -const main = (app = {}) => { +const { + middlewareValidateAuthWebsocket, + middlewareValidateResourceForHookConnection, + validateAuthWebsocket, + getDataZone, + returnQueryData +} = require('server/utils/server') + +const main = (app = {}, type = '') => { try { app - .use(authWebsocket) + .use(middlewareValidateAuthWebsocket) + .use(middlewareValidateResourceForHookConnection) .on('connection', (server = {}) => { - if ( - server && - server.handshake && - server.handshake.query - ) { - const queryZone = server.handshake.query.zone - const zone = queryZone && queryZone !== 'undefined' ? queryZone : '0' - const dataZone = getDataZone(zone) - if (dataZone && dataZone.zeromq) { - const zeromqSock = socketZeroMQ('sub') - zeromqSock.connect(dataZone.zeromq) - zeromqSock.subscribe('') - server.on('disconnect', function () { - zeromqSock.close() + const { zone: queryZone, id, resource } = returnQueryData(server) + const { aud: username } = validateAuthWebsocket(server) + console.log('data: ', username, id, resource) + const zone = queryZone && queryZone !== 'undefined' ? queryZone : '0' + const dataZone = getDataZone(zone) + // aca colocar la validacion del recurso con global.user (necesitas buscar el nombre del usuario, id y resource) + if (dataZone && dataZone.zeromq) { + const zeromqSock = socketZeroMQ('sub') + zeromqSock.connect(dataZone.zeromq) + zeromqSock.subscribe('') + server.on('disconnect', function () { + zeromqSock.close() + }) + zeromqSock.on('message', (...args) => { + const mssgs = [] + Array.prototype.slice.call(args).forEach(arg => { + mssgs.push(arg.toString()) }) - zeromqSock.on('message', (...args) => { - const mssgs = [] - Array.prototype.slice.call(args).forEach(arg => { - mssgs.push(arg.toString()) - }) - if (mssgs[0] && mssgs[1]) { - xml2js.parseString( - atob(mssgs[1]), - { - explicitArray: false, - trim: true, - normalize: true, - includeWhiteChars: true, - strict: false - }, - (error, result) => { - if (error) { - const configErrorParser = { - color: 'red', - type: error, - message: 'Error parser: %s' - } - messageTerminal(configErrorParser) - } else { - app.emit(type, { - command: mssgs[0], - data: result - }) + if (mssgs[0] && mssgs[1]) { + xml2js.parseString( + atob(mssgs[1]), + { + explicitArray: false, + trim: true, + normalize: true, + includeWhiteChars: true, + strict: false + }, + (error, result) => { + if (error) { + const configErrorParser = { + color: 'red', + type: error, + message: 'Error parser: %s' } + messageTerminal(configErrorParser) + } else { + app.emit(type, { + command: mssgs[0], + data: result + }) } - ) - } - }) - } + } + ) + } + }) } }) } catch (error) { diff --git a/src/fireedge/src/server/routes/websockets/index.js b/src/fireedge/src/server/routes/websockets/index.js index 313a679113..19a5f8c6e6 100644 --- a/src/fireedge/src/server/routes/websockets/index.js +++ b/src/fireedge/src/server/routes/websockets/index.js @@ -50,7 +50,7 @@ const websockets = (appServer = {}) => { const fileInfo = require(`./${filename}`) if (fileInfo.main && typeof fileInfo.main === 'function') { sockets.push(io) - fileInfo.main(io) + fileInfo.main(io, filename) } } catch (error) { if (error instanceof Error) { diff --git a/src/fireedge/src/server/routes/websockets/provision/index.js b/src/fireedge/src/server/routes/websockets/provision/index.js index f566f10561..919807cf94 100644 --- a/src/fireedge/src/server/routes/websockets/provision/index.js +++ b/src/fireedge/src/server/routes/websockets/provision/index.js @@ -13,11 +13,11 @@ /* limitations under the License. */ /* -------------------------------------------------------------------------- */ -const { authWebsocket } = require('server/utils/server') +const { middlewareValidateAuthWebsocket } = require('server/utils/server') const { messageTerminal } = require('server/utils/general') const { subscriber } = require('server/routes/api/provision/functions') -const type = 'provision' -const main = (app = {}) => { + +const main = (app = {}, type = '') => { const configErrorProvision = (error = '') => { return { color: 'red', @@ -28,7 +28,7 @@ const main = (app = {}) => { try { app - .use(authWebsocket) + .use(middlewareValidateAuthWebsocket) .on('connection', (server = {}) => { server.on('disconnect', () => { messageTerminal(configErrorProvision('disconnect')) diff --git a/src/fireedge/src/server/utils/server.js b/src/fireedge/src/server/utils/server.js index 95f99c0de3..992a02e7f9 100644 --- a/src/fireedge/src/server/utils/server.js +++ b/src/fireedge/src/server/utils/server.js @@ -60,17 +60,41 @@ const httpResponse = (response, data, message) => { } return rtn } - -const authWebsocket = (server = {}, next = () => undefined) => { +const returnQueryData = (server = {}) => { + let rtn = {} if ( server && server.handshake && - server.handshake.query && - server.handshake.query.token && - validateAuth({ - headers: { authorization: server.handshake.query.token } - }) + server.handshake.query ) { + rtn = server.handshake.query + } + return rtn +} + +const validateAuthWebsocket = (server = {}) => { + let rtn + const { token } = returnQueryData(server) + if (token) { + rtn = validateAuth({ + headers: { authorization: token } + }) + } + return rtn +} + +const middlewareValidateResourceForHookConnection = (server = {}, next = () => undefined) => { + const { id, resource } = returnQueryData(server) + const { aud: username } = validateAuthWebsocket(server) + if (id && resource && username) { + next() + } else { + server.disconnect(true) + } +} + +const middlewareValidateAuthWebsocket = (server = {}, next = () => undefined) => { + if (validateAuthWebsocket(server)) { next() } else { server.disconnect(true) @@ -233,5 +257,8 @@ module.exports = { getKey, parsePostData, getParamsForObject, - authWebsocket + returnQueryData, + validateAuthWebsocket, + middlewareValidateAuthWebsocket, + middlewareValidateResourceForHookConnection } diff --git a/src/sunstone/public/app/utils/websocket.js b/src/sunstone/public/app/utils/websocket.js index 545fb24fcf..416a78dab1 100644 --- a/src/sunstone/public/app/utils/websocket.js +++ b/src/sunstone/public/app/utils/websocket.js @@ -49,7 +49,7 @@ define(function (require) { if (sunstone_fireedge_active && fireedgeToken != "" ){ const socket = io(Config.publicFireedgeEndpoint, { - path: "/fireedge/websocket", + path: "/fireedge/hooks", query: { token: fireedgeToken }