From 978db89deb8f032f387cd5eb91c4b9a1b956db64 Mon Sep 17 00:00:00 2001 From: David Baker Date: Thu, 2 Nov 2017 12:04:55 +0000 Subject: [PATCH] Function for working out notif trigger permission And make pushprocessor use this function --- src/models/room-state.js | 31 +++++++++++++++++++++++++++++++ src/pushprocessor.js | 26 ++++---------------------- 2 files changed, 35 insertions(+), 22 deletions(-) diff --git a/src/models/room-state.js b/src/models/room-state.js index 96350b031..3a995dad4 100644 --- a/src/models/room-state.js +++ b/src/models/room-state.js @@ -393,6 +393,37 @@ RoomState.prototype._maySendEventOfType = function(eventType, userId, state) { return member.powerLevel >= required_level; }; +/** + * Returns true if the given user ID has permission to trigger notification + * of type `notifLevelKey` + * @param {string} notifLevelKey The level of notification to test (eg. 'room') + * @param {string} userId The user ID of the user to test permission for + * @return {boolean} true if the given user ID has permission to trigger a + * notification of this type. + */ +RoomState.prototype.mayTriggerNotifOfType = function(notifLevelKey, userId) { + const member = this.getMember(userId); + if (!member || member.membership == 'leave') { + return false; + } + + const powerLevelsEvent = this.getStateEvents('m.room.power_levels', ''); + + if (!powerLevelsEvent || !powerLevelsEvent.getContent()) { + return false; + } + + let notifLevel = 50; + if ( + powerLevelsEvent.getContent().notifications && + powerLevelsEvent.getContent().notifications[notifLevelKey] + ) { + notifLevel = powerLevelsEvent.getContent().notifications[notifLevelKey]; + } + + return member.powerLevel >= notifLevel; +}; + /** * The RoomState class. */ diff --git a/src/pushprocessor.js b/src/pushprocessor.js index 535dd2b54..8a3887ff8 100644 --- a/src/pushprocessor.js +++ b/src/pushprocessor.js @@ -145,28 +145,10 @@ function PushProcessor(client) { return false; } - const powerLevels = room.currentState.getStateEvents('m.room.power_levels', ''); - if (!powerLevels || !powerLevels.getContent()) { - return false; - } - - let notifLevel = 50; - if ( - powerLevels.getContent().notifications && - powerLevels.getContent().notifications[notifLevelKey] - ) { - notifLevel = powerLevels.getContent().notifications[notifLevelKey]; - } - - // This cannot be assumed to always be set for state events - // (in particular it is never set for the room creation event - // because it preceeds the join event of the sender). - // In these cases, this condition cannot match. - if (ev.sender === null) { - return false; - } - - return ev.sender.powerLevel >= notifLevel; + // Note that this should not be the current state of the room but the state at + // the point the event is in the DAG. Unfortunately the js-sdk does not store + // this. + return room.currentState.mayTriggerNotifOfType(notifLevelKey, ev.getSender()); }; const eventFulfillsRoomMemberCountCondition = function(cond, ev) {