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:
parent
411c229d49
commit
2583ba3d0a
@ -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) {
|
||||
|
@ -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) {
|
||||
|
@ -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'))
|
||||
|
@ -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
|
||||
}
|
||||
|
@ -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
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user