1 | 'use strict'
|
2 |
|
3 | var mqtt = require('..')
|
4 | var path = require('path')
|
5 | var abstractClientTests = require('./abstract_client')
|
6 | var fs = require('fs')
|
7 | var port = 9899
|
8 | var KEY = path.join(__dirname, 'helpers', 'tls-key.pem')
|
9 | var CERT = path.join(__dirname, 'helpers', 'tls-cert.pem')
|
10 | var WRONG_CERT = path.join(__dirname, 'helpers', 'wrong-cert.pem')
|
11 | var Server = require('./server')
|
12 |
|
13 | var server = new Server.SecureServer({
|
14 | key: fs.readFileSync(KEY),
|
15 | cert: fs.readFileSync(CERT)
|
16 | }, function (client) {
|
17 | client.on('connect', function (packet) {
|
18 | if (packet.clientId === 'invalid') {
|
19 | client.connack({returnCode: 2})
|
20 | } else {
|
21 | server.emit('connect', client)
|
22 | client.connack({returnCode: 0})
|
23 | }
|
24 | })
|
25 |
|
26 | client.on('publish', function (packet) {
|
27 | setImmediate(function () {
|
28 |
|
29 |
|
30 | switch (packet.qos) {
|
31 | case 0:
|
32 | break
|
33 | case 1:
|
34 | client.puback(packet)
|
35 | break
|
36 | case 2:
|
37 | client.pubrec(packet)
|
38 | break
|
39 | }
|
40 |
|
41 | })
|
42 | })
|
43 |
|
44 | client.on('pubrel', function (packet) {
|
45 | client.pubcomp(packet)
|
46 | })
|
47 |
|
48 | client.on('pubrec', function (packet) {
|
49 | client.pubrel(packet)
|
50 | })
|
51 |
|
52 | client.on('pubcomp', function () {
|
53 |
|
54 | })
|
55 |
|
56 | client.on('subscribe', function (packet) {
|
57 | client.suback({
|
58 | messageId: packet.messageId,
|
59 | granted: packet.subscriptions.map(function (e) {
|
60 | return e.qos
|
61 | })
|
62 | })
|
63 | })
|
64 |
|
65 | client.on('unsubscribe', function (packet) {
|
66 | client.unsuback(packet)
|
67 | })
|
68 |
|
69 | client.on('pingreq', function () {
|
70 | client.pingresp()
|
71 | })
|
72 | }).listen(port)
|
73 |
|
74 | describe('MqttSecureClient', function () {
|
75 | var config = { protocol: 'mqtts', port: port, rejectUnauthorized: false }
|
76 | abstractClientTests(server, config)
|
77 |
|
78 | describe('with secure parameters', function () {
|
79 | it('should validate successfully the CA', function (done) {
|
80 | var client = mqtt.connect({
|
81 | protocol: 'mqtts',
|
82 | port: port,
|
83 | ca: [fs.readFileSync(CERT)],
|
84 | rejectUnauthorized: true
|
85 | })
|
86 |
|
87 | client.on('error', function (err) {
|
88 | done(err)
|
89 | })
|
90 |
|
91 | server.once('connect', function () {
|
92 | done()
|
93 | })
|
94 | })
|
95 |
|
96 | it('should validate unsuccessfully the CA', function (done) {
|
97 | var client = mqtt.connect({
|
98 | protocol: 'mqtts',
|
99 | port: port,
|
100 | ca: [fs.readFileSync(WRONG_CERT)],
|
101 | rejectUnauthorized: true
|
102 | })
|
103 |
|
104 | client.once('error', function () {
|
105 | done()
|
106 | client.end()
|
107 | client.on('error', function () {})
|
108 | })
|
109 | })
|
110 |
|
111 | it('should emit close on TLS error', function (done) {
|
112 | var client = mqtt.connect({
|
113 | protocol: 'mqtts',
|
114 | port: port,
|
115 | ca: [fs.readFileSync(WRONG_CERT)],
|
116 | rejectUnauthorized: true
|
117 | })
|
118 |
|
119 | client.on('error', function () {})
|
120 |
|
121 |
|
122 | client.once('close', function () {
|
123 | done()
|
124 | })
|
125 | })
|
126 | })
|
127 | })
|