|
| 1 | +var util = require('./util'); |
| 2 | +var nacl = require('tweetnacl'); |
| 3 | +var naclUtil = require('tweetnacl-util'); |
| 4 | + |
| 5 | +function encrypt(pusher, channel, data) { |
| 6 | + if (pusher.config.encryptionMasterKey === undefined) { |
| 7 | + throw new Error("Set encryptionMasterKey before triggering events on encrypted channels"); |
| 8 | + } |
| 9 | + |
| 10 | + var nonceBytes = nacl.randomBytes(24); |
| 11 | + |
| 12 | + var ciphertextBytes = nacl.secretbox( |
| 13 | + naclUtil.decodeUTF8(JSON.stringify(data)), |
| 14 | + nonceBytes, |
| 15 | + pusher.channelSharedSecret(channel)); |
| 16 | + |
| 17 | + return JSON.stringify({ |
| 18 | + nonce: naclUtil.encodeBase64(nonceBytes), |
| 19 | + ciphertext: naclUtil.encodeBase64(ciphertextBytes) |
| 20 | + }); |
| 21 | +} |
| 22 | + |
1 | 23 | exports.trigger = function(pusher, channels, eventName, data, socketId, callback) { |
2 | | - var event = { |
3 | | - "name": eventName, |
4 | | - "data": ensureJSON(data), |
5 | | - "channels": channels |
6 | | - }; |
7 | | - if (socketId) { |
8 | | - event.socket_id = socketId; |
| 24 | + if (channels.length === 1 && util.isEncryptedChannel(channels[0])) { |
| 25 | + var channel = channels[0]; |
| 26 | + var event = { |
| 27 | + "name": eventName, |
| 28 | + "data": encrypt(pusher, channel, data), |
| 29 | + "channels": [channel] |
| 30 | + }; |
| 31 | + if (socketId) { |
| 32 | + event.socket_id = socketId; |
| 33 | + } |
| 34 | + pusher.post({ path: '/events', body: event }, callback); |
| 35 | + } else { |
| 36 | + for (var i = 0; i < channels.length; i++) { |
| 37 | + if (util.isEncryptedChannel(channels[i])) { |
| 38 | + // For rationale, see limitations of end-to-end encryption in the README |
| 39 | + throw new Error("You cannot trigger to multiple channels when using encrypted channels"); |
| 40 | + } |
| 41 | + } |
| 42 | + |
| 43 | + var event = { |
| 44 | + "name": eventName, |
| 45 | + "data": ensureJSON(data), |
| 46 | + "channels": channels |
| 47 | + }; |
| 48 | + if (socketId) { |
| 49 | + event.socket_id = socketId; |
| 50 | + } |
| 51 | + pusher.post({ path: '/events', body: event }, callback); |
9 | 52 | } |
10 | | - pusher.post({ path: '/events', body: event }, callback); |
11 | 53 | } |
12 | 54 |
|
13 | 55 | exports.triggerBatch = function(pusher, batch, callback) { |
14 | 56 | for (var i = 0; i < batch.length; i++) { |
15 | | - batch[i].data = ensureJSON(batch[i].data); |
| 57 | + batch[i].data = util.isEncryptedChannel(batch[i].channel) ? |
| 58 | + encrypt(pusher, batch[i].channel, batch[i].data) : |
| 59 | + ensureJSON(batch[i].data); |
16 | 60 | } |
17 | 61 | pusher.post({ path: '/batch_events', body: { batch: batch } }, callback); |
18 | 62 | } |
|
0 commit comments