158 lines
3.7 KiB
JavaScript
158 lines
3.7 KiB
JavaScript
|
'use strict'
|
||
|
|
||
|
var mqtt = require('..')
|
||
|
var path = require('path')
|
||
|
var abstractClientTests = require('./abstract_client')
|
||
|
var fs = require('fs')
|
||
|
var port = 9899
|
||
|
var KEY = path.join(__dirname, 'helpers', 'tls-key.pem')
|
||
|
var CERT = path.join(__dirname, 'helpers', 'tls-cert.pem')
|
||
|
var WRONG_CERT = path.join(__dirname, 'helpers', 'wrong-cert.pem')
|
||
|
var Server = require('./server')
|
||
|
|
||
|
var server = new Server.SecureServer({
|
||
|
key: fs.readFileSync(KEY),
|
||
|
cert: fs.readFileSync(CERT)
|
||
|
}, function (client) {
|
||
|
client.on('connect', function (packet) {
|
||
|
if (packet.clientId === 'invalid') {
|
||
|
client.connack({returnCode: 2})
|
||
|
} else {
|
||
|
server.emit('connect', client)
|
||
|
client.connack({returnCode: 0})
|
||
|
}
|
||
|
})
|
||
|
|
||
|
client.on('publish', function (packet) {
|
||
|
setImmediate(function () {
|
||
|
/* jshint -W027 */
|
||
|
/* eslint default-case:0 */
|
||
|
switch (packet.qos) {
|
||
|
case 0:
|
||
|
break
|
||
|
case 1:
|
||
|
client.puback(packet)
|
||
|
break
|
||
|
case 2:
|
||
|
client.pubrec(packet)
|
||
|
break
|
||
|
}
|
||
|
/* jshint +W027 */
|
||
|
})
|
||
|
})
|
||
|
|
||
|
client.on('pubrel', function (packet) {
|
||
|
client.pubcomp(packet)
|
||
|
})
|
||
|
|
||
|
client.on('pubrec', function (packet) {
|
||
|
client.pubrel(packet)
|
||
|
})
|
||
|
|
||
|
client.on('pubcomp', function () {
|
||
|
// Nothing to be done
|
||
|
})
|
||
|
|
||
|
client.on('subscribe', function (packet) {
|
||
|
client.suback({
|
||
|
messageId: packet.messageId,
|
||
|
granted: packet.subscriptions.map(function (e) {
|
||
|
return e.qos
|
||
|
})
|
||
|
})
|
||
|
})
|
||
|
|
||
|
client.on('unsubscribe', function (packet) {
|
||
|
client.unsuback(packet)
|
||
|
})
|
||
|
|
||
|
client.on('pingreq', function () {
|
||
|
client.pingresp()
|
||
|
})
|
||
|
}).listen(port)
|
||
|
|
||
|
describe('MqttSecureClient', function () {
|
||
|
var config = { protocol: 'mqtts', port: port, rejectUnauthorized: false }
|
||
|
abstractClientTests(server, config)
|
||
|
|
||
|
describe('with secure parameters', function () {
|
||
|
it('should validate successfully the CA', function (done) {
|
||
|
var client = mqtt.connect({
|
||
|
protocol: 'mqtts',
|
||
|
port: port,
|
||
|
ca: [fs.readFileSync(CERT)],
|
||
|
rejectUnauthorized: true
|
||
|
})
|
||
|
|
||
|
client.on('error', function (err) {
|
||
|
done(err)
|
||
|
})
|
||
|
|
||
|
server.once('connect', function () {
|
||
|
done()
|
||
|
})
|
||
|
})
|
||
|
|
||
|
it('should validate successfully the CA using URI', function (done) {
|
||
|
var client = mqtt.connect('mqtts://localhost:' + port, {
|
||
|
ca: [fs.readFileSync(CERT)],
|
||
|
rejectUnauthorized: true
|
||
|
})
|
||
|
|
||
|
client.on('error', function (err) {
|
||
|
done(err)
|
||
|
})
|
||
|
|
||
|
server.once('connect', function () {
|
||
|
done()
|
||
|
})
|
||
|
})
|
||
|
|
||
|
it('should validate successfully the CA using URI with path', function (done) {
|
||
|
var client = mqtt.connect('mqtts://localhost:' + port + '/', {
|
||
|
ca: [fs.readFileSync(CERT)],
|
||
|
rejectUnauthorized: true
|
||
|
})
|
||
|
|
||
|
client.on('error', function (err) {
|
||
|
done(err)
|
||
|
})
|
||
|
|
||
|
server.once('connect', function () {
|
||
|
done()
|
||
|
})
|
||
|
})
|
||
|
|
||
|
it('should validate unsuccessfully the CA', function (done) {
|
||
|
var client = mqtt.connect({
|
||
|
protocol: 'mqtts',
|
||
|
port: port,
|
||
|
ca: [fs.readFileSync(WRONG_CERT)],
|
||
|
rejectUnauthorized: true
|
||
|
})
|
||
|
|
||
|
client.once('error', function () {
|
||
|
done()
|
||
|
client.end()
|
||
|
client.on('error', function () {})
|
||
|
})
|
||
|
})
|
||
|
|
||
|
it('should emit close on TLS error', function (done) {
|
||
|
var client = mqtt.connect({
|
||
|
protocol: 'mqtts',
|
||
|
port: port,
|
||
|
ca: [fs.readFileSync(WRONG_CERT)],
|
||
|
rejectUnauthorized: true
|
||
|
})
|
||
|
|
||
|
client.on('error', function () {})
|
||
|
|
||
|
// TODO node v0.8.x emits multiple close events
|
||
|
client.once('close', function () {
|
||
|
done()
|
||
|
})
|
||
|
})
|
||
|
})
|
||
|
})
|