1
0
Fork 0
mirror of https://github.com/openstf/stf synced 2025-10-05 10:39:25 +02:00

add groups feature

This commit is contained in:
Denis barbaron 2019-06-12 10:29:07 +02:00
parent 6fd750dad5
commit 7f5dc4c152
119 changed files with 12416 additions and 402 deletions

View file

@ -1,3 +1,7 @@
/**
* Copyright © 2019 contains code contributed by Orange SA, authors: Denis Barbaron - Licensed under the Apache license 2.0
**/
var http = require('http')
var events = require('events')
var util = require('util')
@ -23,6 +27,8 @@ var ip = require('./middleware/remote-ip')
var auth = require('./middleware/auth')
var jwtutil = require('../../util/jwtutil')
const apiutil = require('../../util/apiutil')
module.exports = function(options) {
var log = logger.createLogger('websocket')
var server = http.createServer()
@ -118,23 +124,99 @@ module.exports = function(options) {
}
}
let disconnectSocket
var messageListener = wirerouter()
.on(wire.UpdateAccessTokenMessage, function() {
socket.emit('user.keys.accessToken.updated')
})
.on(wire.DeleteUserMessage, function() {
disconnectSocket(true)
})
.on(wire.DeviceChangeMessage, function(channel, message) {
if (user.groups.subscribed.indexOf(message.device.group.origin) > -1 ||
user.groups.subscribed.indexOf(message.oldOriginGroupId) > -1) {
socket.emit('user.settings.devices.' + message.action, message)
}
})
.on(wire.UserChangeMessage, function(channel, message) {
Promise.map(message.targets, function(target) {
socket.emit('user.' + target + '.users.' + message.action, message)
})
})
.on(wire.GroupChangeMessage, function(channel, message) {
if (user.privilege === 'admin' ||
user.email === message.group.owner.email ||
!apiutil.isOriginGroup(message.group.class) &&
(message.action === 'deleted' ||
message.action === 'updated' &&
(message.isChangedDates || message.isChangedClass || message.devices.length))) {
socket.emit('user.settings.groups.' + message.action, message)
}
if (message.subscribers.indexOf(user.email) > -1) {
socket.emit('user.view.groups.' + message.action, message)
}
})
.on(wire.DeviceGroupChangeMessage, function(channel, message) {
if (user.groups.subscribed.indexOf(message.id) > -1) {
if (user.groups.subscribed.indexOf(message.group.id) > -1) {
socket.emit('device.updateGroupDevice', {
important: true
, data: {
serial: message.serial
, group: message.group
}
})
}
else {
socket.emit('device.removeGroupDevices', {important: true, devices: [message.serial]})
}
}
else if (user.groups.subscribed.indexOf(message.group.id) > -1) {
socket.emit('device.addGroupDevices', {important: true, devices: [message.serial]})
}
})
.on(wire.GroupUserChangeMessage, function(channel, message) {
if (message.users.indexOf(user.email) > -1) {
if (message.isAdded) {
user.groups.subscribed = _.union(user.groups.subscribed, [message.id])
if (message.devices.length) {
socket.emit('device.addGroupDevices', {important: true, devices: message.devices})
}
}
else {
if (message.devices.length) {
socket.emit('device.removeGroupDevices', {important: true, devices: message.devices})
}
if (message.isDeletedLater) {
setTimeout(function() {
user.groups.subscribed = _.without(user.groups.subscribed, message.id)
}, 5000)
}
else {
user.groups.subscribed = _.without(user.groups.subscribed, message.id)
}
}
}
})
.on(wire.DeviceLogMessage, function(channel, message) {
socket.emit('device.log', message)
})
.on(wire.DeviceIntroductionMessage, function(channel, message) {
socket.emit('device.add', {
important: true
, data: {
serial: message.serial
, present: false
, provider: message.provider
, owner: null
, status: message.status
, ready: false
, reverseForwards: []
}
})
if (user.groups.subscribed.indexOf(message.group.id) > -1) {
socket.emit('device.add', {
important: true
, data: {
serial: message.serial
, present: true
, provider: message.provider
, owner: null
, status: message.status
, ready: false
, reverseForwards: []
, group: message.group
}
})
}
})
.on(wire.DeviceReadyMessage, function(channel, message) {
socket.emit('device.change', {
@ -307,6 +389,7 @@ module.exports = function(options) {
joinChannel(user.group)
new Promise(function(resolve) {
disconnectSocket = resolve
socket.on('disconnect', resolve)
// Global messages for all clients using socket.io
//
@ -314,15 +397,19 @@ module.exports = function(options) {
.on('device.note', function(data) {
return dbapi.setDeviceNote(data.serial, data.note)
.then(function() {
return dbapi.loadDevice(data.serial)
return dbapi.loadDevice(user.groups.subscribed, data.serial)
})
.then(function(device) {
if (device) {
io.emit('device.change', {
important: true
, data: {
serial: device.serial
, notes: device.notes
.then(function(cursor) {
if (cursor) {
cursor.next(function(err, device) {
if (!err) {
io.emit('device.change', {
important: true
, data: {
serial: device.serial
, notes: device.notes
}
})
}
})
}
@ -364,7 +451,7 @@ module.exports = function(options) {
.on('user.keys.accessToken.remove', function(data) {
return dbapi.removeUserAccessToken(user.email, data.title)
.then(function() {
socket.emit('user.keys.accessToken.removed', data.title)
socket.emit('user.keys.accessToken.updated')
})
})
.on('user.keys.adb.add', function(data) {
@ -916,6 +1003,7 @@ module.exports = function(options) {
channelRouter.removeListener(channel, messageListener)
sub.unsubscribe(channel)
})
socket.disconnect(true)
})
.catch(function(err) {
// Cannot guarantee integrity of client
@ -923,8 +1011,7 @@ module.exports = function(options) {
'Client had an error, disconnecting due to probable loss of integrity'
, err.stack
)
socket.disconnect(true)
// move 'socket.disconnect(true)' statement to finally block instead!
})
})