1
0
mirror of https://github.com/OpenNebula/one.git synced 2025-03-16 22:50:10 +03:00

M #~: add middleware hooks

Signed-off-by: Jorge Lobo <jlobo@opennebula.io>
This commit is contained in:
Jorge Lobo 2021-06-21 13:47:41 +02:00
parent 411c229d49
commit 2583ba3d0a
No known key found for this signature in database
GPG Key ID: 9C21660F7B06905E
5 changed files with 95 additions and 64 deletions

View File

@ -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) {

View File

@ -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) {

View File

@ -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'))

View File

@ -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
}

View File

@ -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
}