UNPKG

22.7 kBSource Map (JSON)View Raw
1{"version":3,"sources":["../src/pushprocessor.js"],"names":["RULEKINDS_IN_ORDER","PushProcessor","client","cachedGlobToRegex","matchingRuleFromKindSet","ev","kindset","device","ruleKindIndex","length","kind","ruleset","ruleIndex","rule","enabled","rawrule","templateRuleToRaw","ruleMatchesEvent","tprule","rule_id","actions","conditions","push","pattern","eventFulfillsCondition","cond","condition_functions","eventFulfillsEventMatchCondition","eventFulfillsDeviceCondition","eventFulfillsDisplayNameCondition","eventFulfillsRoomMemberCountCondition","eventFulfillsSenderNotifPermCondition","notifLevelKey","room","getRoom","getRoomId","currentState","mayTriggerNotifOfType","getSender","is","members","memberCount","getJoinedMemberCount","m","match","ineq","rhs","parseInt","isNaN","content","getContent","body","getMember","credentials","userId","displayName","name","pat","RegExp","search","key","val","valueForDottedKey","value","regex","createCachedRegex","prefix","glob","suffix","parts","split","firstPart","shift","getType","event","thispart","matchingRuleForEventWithRulesets","rulesets","allDevNames","i","devname","devrules","matchingRule","global","pushActionsForEventAndRulesets","actionObj","actionListToActionsObject","tweaks","highlight","undefined","ret","actionsForEvent","pushRules","getPushRuleById","ruleId","scope","actionlist","actionobj","action","notify","set_tweak","module","exports"],"mappings":"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","file":"pushprocessor.js","sourcesContent":["/*\nCopyright 2015, 2016 OpenMarket Ltd\nCopyright 2017 New Vector Ltd\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\nimport {escapeRegExp, globToRegexp} from \"./utils\";\n\n/**\n * @module pushprocessor\n */\n\nconst RULEKINDS_IN_ORDER = ['override', 'content', 'room', 'sender', 'underride'];\n\n/**\n * Construct a Push Processor.\n * @constructor\n * @param {Object} client The Matrix client object to use\n */\nfunction PushProcessor(client) {\n const cachedGlobToRegex = {\n // $glob: RegExp,\n };\n\n const matchingRuleFromKindSet = (ev, kindset, device) => {\n for (let ruleKindIndex = 0;\n ruleKindIndex < RULEKINDS_IN_ORDER.length;\n ++ruleKindIndex) {\n const kind = RULEKINDS_IN_ORDER[ruleKindIndex];\n const ruleset = kindset[kind];\n\n for (let ruleIndex = 0; ruleIndex < ruleset.length; ++ruleIndex) {\n const rule = ruleset[ruleIndex];\n if (!rule.enabled) {\n continue;\n }\n\n const rawrule = templateRuleToRaw(kind, rule, device);\n if (!rawrule) {\n continue;\n }\n\n if (this.ruleMatchesEvent(rawrule, ev)) {\n rule.kind = kind;\n return rule;\n }\n }\n }\n return null;\n };\n\n const templateRuleToRaw = function(kind, tprule, device) {\n const rawrule = {\n 'rule_id': tprule.rule_id,\n 'actions': tprule.actions,\n 'conditions': [],\n };\n switch (kind) {\n case 'underride':\n case 'override':\n rawrule.conditions = tprule.conditions;\n break;\n case 'room':\n if (!tprule.rule_id) {\n return null;\n }\n rawrule.conditions.push({\n 'kind': 'event_match',\n 'key': 'room_id',\n 'value': tprule.rule_id,\n });\n break;\n case 'sender':\n if (!tprule.rule_id) {\n return null;\n }\n rawrule.conditions.push({\n 'kind': 'event_match',\n 'key': 'user_id',\n 'value': tprule.rule_id,\n });\n break;\n case 'content':\n if (!tprule.pattern) {\n return null;\n }\n rawrule.conditions.push({\n 'kind': 'event_match',\n 'key': 'content.body',\n 'pattern': tprule.pattern,\n });\n break;\n }\n if (device) {\n rawrule.conditions.push({\n 'kind': 'device',\n 'profile_tag': device,\n });\n }\n return rawrule;\n };\n\n const eventFulfillsCondition = function(cond, ev) {\n const condition_functions = {\n \"event_match\": eventFulfillsEventMatchCondition,\n \"device\": eventFulfillsDeviceCondition,\n \"contains_display_name\": eventFulfillsDisplayNameCondition,\n \"room_member_count\": eventFulfillsRoomMemberCountCondition,\n \"sender_notification_permission\": eventFulfillsSenderNotifPermCondition,\n };\n if (condition_functions[cond.kind]) {\n return condition_functions[cond.kind](cond, ev);\n }\n // unknown conditions: we previously matched all unknown conditions,\n // but given that rules can be added to the base rules on a server,\n // it's probably better to not match unknown conditions.\n return false;\n };\n\n const eventFulfillsSenderNotifPermCondition = function(cond, ev) {\n const notifLevelKey = cond['key'];\n if (!notifLevelKey) {\n return false;\n }\n\n const room = client.getRoom(ev.getRoomId());\n if (!room || !room.currentState) {\n return false;\n }\n\n // Note that this should not be the current state of the room but the state at\n // the point the event is in the DAG. Unfortunately the js-sdk does not store\n // this.\n return room.currentState.mayTriggerNotifOfType(notifLevelKey, ev.getSender());\n };\n\n const eventFulfillsRoomMemberCountCondition = function(cond, ev) {\n if (!cond.is) {\n return false;\n }\n\n const room = client.getRoom(ev.getRoomId());\n if (!room || !room.currentState || !room.currentState.members) {\n return false;\n }\n\n const memberCount = room.currentState.getJoinedMemberCount();\n\n const m = cond.is.match(/^([=<>]*)([0-9]*)$/);\n if (!m) {\n return false;\n }\n const ineq = m[1];\n const rhs = parseInt(m[2]);\n if (isNaN(rhs)) {\n return false;\n }\n switch (ineq) {\n case '':\n case '==':\n return memberCount == rhs;\n case '<':\n return memberCount < rhs;\n case '>':\n return memberCount > rhs;\n case '<=':\n return memberCount <= rhs;\n case '>=':\n return memberCount >= rhs;\n default:\n return false;\n }\n };\n\n const eventFulfillsDisplayNameCondition = function(cond, ev) {\n const content = ev.getContent();\n if (!content || !content.body || typeof content.body != 'string') {\n return false;\n }\n\n const room = client.getRoom(ev.getRoomId());\n if (!room || !room.currentState || !room.currentState.members ||\n !room.currentState.getMember(client.credentials.userId)) {\n return false;\n }\n\n const displayName = room.currentState.getMember(client.credentials.userId).name;\n\n // N.B. we can't use \\b as it chokes on unicode. however \\W seems to be okay\n // as shorthand for [^0-9A-Za-z_].\n const pat = new RegExp(\"(^|\\\\W)\" + escapeRegExp(displayName) + \"(\\\\W|$)\", 'i');\n return content.body.search(pat) > -1;\n };\n\n const eventFulfillsDeviceCondition = function(cond, ev) {\n return false; // XXX: Allow a profile tag to be set for the web client instance\n };\n\n const eventFulfillsEventMatchCondition = function(cond, ev) {\n if (!cond.key) {\n return false;\n }\n\n const val = valueForDottedKey(cond.key, ev);\n if (!val || typeof val != 'string') {\n return false;\n }\n\n if (cond.value) {\n return cond.value === val;\n }\n\n let regex;\n\n if (cond.key == 'content.body') {\n regex = createCachedRegex('(^|\\\\W)', cond.pattern, '(\\\\W|$)');\n } else {\n regex = createCachedRegex('^', cond.pattern, '$');\n }\n\n return !!val.match(regex);\n };\n\n const createCachedRegex = function(prefix, glob, suffix) {\n if (cachedGlobToRegex[glob]) {\n return cachedGlobToRegex[glob];\n }\n cachedGlobToRegex[glob] = new RegExp(\n prefix + globToRegexp(glob) + suffix,\n 'i', // Case insensitive\n );\n return cachedGlobToRegex[glob];\n };\n\n const valueForDottedKey = function(key, ev) {\n const parts = key.split('.');\n let val;\n\n // special-case the first component to deal with encrypted messages\n const firstPart = parts[0];\n if (firstPart == 'content') {\n val = ev.getContent();\n parts.shift();\n } else if (firstPart == 'type') {\n val = ev.getType();\n parts.shift();\n } else {\n // use the raw event for any other fields\n val = ev.event;\n }\n\n while (parts.length > 0) {\n const thispart = parts.shift();\n if (!val[thispart]) {\n return null;\n }\n val = val[thispart];\n }\n return val;\n };\n\n const matchingRuleForEventWithRulesets = function(ev, rulesets) {\n if (!rulesets || !rulesets.device) {\n return null;\n }\n if (ev.getSender() == client.credentials.userId) {\n return null;\n }\n\n const allDevNames = Object.keys(rulesets.device);\n for (let i = 0; i < allDevNames.length; ++i) {\n const devname = allDevNames[i];\n const devrules = rulesets.device[devname];\n\n const matchingRule = matchingRuleFromKindSet(devrules, devname);\n if (matchingRule) {\n return matchingRule;\n }\n }\n return matchingRuleFromKindSet(ev, rulesets.global);\n };\n\n const pushActionsForEventAndRulesets = function(ev, rulesets) {\n const rule = matchingRuleForEventWithRulesets(ev, rulesets);\n if (!rule) {\n return {};\n }\n\n const actionObj = PushProcessor.actionListToActionsObject(rule.actions);\n\n // Some actions are implicit in some situations: we add those here\n if (actionObj.tweaks.highlight === undefined) {\n // if it isn't specified, highlight if it's a content\n // rule but otherwise not\n actionObj.tweaks.highlight = (rule.kind == 'content');\n }\n\n return actionObj;\n };\n\n this.ruleMatchesEvent = function(rule, ev) {\n let ret = true;\n for (let i = 0; i < rule.conditions.length; ++i) {\n const cond = rule.conditions[i];\n ret &= eventFulfillsCondition(cond, ev);\n }\n //console.log(\"Rule \"+rule.rule_id+(ret ? \" matches\" : \" doesn't match\"));\n return ret;\n };\n\n\n /**\n * Get the user's push actions for the given event\n *\n * @param {module:models/event.MatrixEvent} ev\n *\n * @return {PushAction}\n */\n this.actionsForEvent = function(ev) {\n return pushActionsForEventAndRulesets(ev, client.pushRules);\n };\n\n /**\n * Get one of the users push rules by its ID\n *\n * @param {string} ruleId The ID of the rule to search for\n * @return {object} The push rule, or null if no such rule was found\n */\n this.getPushRuleById = function(ruleId) {\n for (const scope of ['device', 'global']) {\n if (client.pushRules[scope] === undefined) continue;\n\n for (const kind of RULEKINDS_IN_ORDER) {\n if (client.pushRules[scope][kind] === undefined) continue;\n\n for (const rule of client.pushRules[scope][kind]) {\n if (rule.rule_id === ruleId) return rule;\n }\n }\n }\n return null;\n };\n}\n\n/**\n * Convert a list of actions into a object with the actions as keys and their values\n * eg. [ 'notify', { set_tweak: 'sound', value: 'default' } ]\n * becomes { notify: true, tweaks: { sound: 'default' } }\n * @param {array} actionlist The actions list\n *\n * @return {object} A object with key 'notify' (true or false) and an object of actions\n */\nPushProcessor.actionListToActionsObject = function(actionlist) {\n const actionobj = { 'notify': false, 'tweaks': {} };\n for (let i = 0; i < actionlist.length; ++i) {\n const action = actionlist[i];\n if (action === 'notify') {\n actionobj.notify = true;\n } else if (typeof action === 'object') {\n if (action.value === undefined) {\n action.value = true;\n }\n actionobj.tweaks[action.set_tweak] = action.value;\n }\n }\n return actionobj;\n};\n\n/**\n * @typedef {Object} PushAction\n * @type {Object}\n * @property {boolean} notify Whether this event should notify the user or not.\n * @property {Object} tweaks How this event should be notified.\n * @property {boolean} tweaks.highlight Whether this event should be highlighted\n * on the UI.\n * @property {boolean} tweaks.sound Whether this notification should produce a\n * noise.\n */\n\n/** The PushProcessor class. */\nmodule.exports = PushProcessor;\n\n"]}
\No newline at end of file