Skip to content

Commit 6863dd8

Browse files
author
Tony Crisci
authored
Merge pull request #42 from dbusjs/monitor-fixes
Don't handle messages that aren't for the bus
2 parents e1536b0 + 90eea38 commit 6863dd8

2 files changed

Lines changed: 102 additions & 0 deletions

File tree

lib/bus.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,18 @@ class MessageBus extends EventEmitter {
7878
this.name = null;
7979

8080
let handleMessage = (msg) => {
81+
// Don't handle messages that aren't destined for us. This might happen
82+
// when we become a monitor.
83+
if (this.name && msg.destination) {
84+
if (msg.destination[0] === ':' && msg.destination !== this.name) {
85+
return;
86+
}
87+
if (this._nameOwners[msg.destination] &&
88+
this._nameOwners[msg.destination] !== this.name) {
89+
return;
90+
}
91+
}
92+
8193
if (msg.type === METHOD_RETURN ||
8294
msg.type === ERROR) {
8395
let handler = this._methodReturnHandlers[msg.replySerial];

test/integration/monitor.test.js

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
let dbus = require('../../');
2+
let Message = dbus.Message;
3+
let {
4+
SIGNAL
5+
} = dbus.MessageType;
6+
7+
let monitor = dbus.sessionBus();
8+
let bus1 = dbus.sessionBus();
9+
let bus2 = dbus.sessionBus();
10+
11+
bus1.on('error', (err) => {
12+
console.log(`bus1 got unexpected connection error:\n${err.stack}`);
13+
});
14+
bus2.on('error', (err) => {
15+
console.log(`bus2 got unexpected connection error:\n${err.stack}`);
16+
});
17+
monitor.on('error', (err) => {
18+
console.log(`monitor bus got unexpected connection error:\n${err.stack}`);
19+
});
20+
21+
beforeAll(async () => {
22+
let connect = [bus1, bus2, monitor].map((bus) => {
23+
return new Promise((resolve) => {
24+
bus.on('connect', resolve);
25+
});
26+
});
27+
28+
await Promise.all(connect);
29+
30+
await monitor.call(new Message({
31+
destination: 'org.freedesktop.DBus',
32+
path: '/org/freedesktop/DBus',
33+
interface: 'org.freedesktop.DBus.Monitoring',
34+
member: 'BecomeMonitor',
35+
signature: 'asu',
36+
body: [[`sender=${bus1.name}`, `sender=${bus2.name}`], 0]
37+
}));
38+
});
39+
40+
afterAll(() => {
41+
bus1.disconnect();
42+
bus2.disconnect();
43+
monitor.disconnect();
44+
});
45+
46+
async function waitForMessage(bus) {
47+
return new Promise((resolve) => {
48+
bus.once('message', (msg) => {
49+
resolve(msg);
50+
});
51+
});
52+
}
53+
54+
test('monitor a signal', async () => {
55+
let signal = Message.newSignal('/org/test/path', 'org.test.interface', 'SomeSignal', 's', ['a signal']);
56+
bus1.send(signal);
57+
let msg = await waitForMessage(monitor);
58+
expect(msg.type).toEqual(SIGNAL);
59+
expect(msg.sender).toEqual(bus1.name);
60+
expect(msg.serial).toEqual(signal.serial)
61+
});
62+
63+
test('monitor a method call', async () => {
64+
let messages = [];
65+
let monitorHandler = function(message) {
66+
messages.push(message);
67+
};
68+
monitor.on('message', monitorHandler);
69+
70+
let messageHandler = function(sent) {
71+
bus1.send(Message.newMethodReturn(sent, 's', ['got it']));
72+
return true;
73+
};
74+
75+
bus1.addMethodHandler(messageHandler);
76+
77+
await bus2.call(new Message({
78+
destination: bus1.name,
79+
path: '/org/test/path',
80+
interface: 'org.test.interface',
81+
member: 'TestMethod',
82+
signature: 's',
83+
body: ['hello']
84+
}));
85+
86+
expect(messages.length).toEqual(2);
87+
expect(messages[0].sender).toEqual(bus2.name);
88+
expect(messages[1].sender).toEqual(bus1.name);
89+
monitor.removeListener('message', monitorHandler);
90+
});

0 commit comments

Comments
 (0)