You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

63 lines
1.8 KiB
JavaScript

"use strict";
const defaultValue = require("default-value");
const diffLists = require("../diff-lists");
function mapFields(eventContent) {
if (eventContent != null) {
let ipLiteralSetting = eventContent.allow_ip_literals;
return {
// Weird logic to implement this spec requirement: "Defaults to true if missing or otherwise not a boolean."
ipLiteralsAllowed: (ipLiteralSetting === false)
? false
: true,
allowedHosts: defaultValue(eventContent.allow, []),
deniedHosts: defaultValue(eventContent.deny, [])
};
} else {
return {
ipLiteralsAllowed: true,
allowedHosts: [],
deniedHosts: []
};
}
}
module.exports = function mapServerACLEvent(event, _context) {
// FIXME: Number + full event
let newFields = mapFields(event.content);
let oldFields = mapFields(event.unsigned.prev_content);
let deltaEvents = [];
if (newFields.ipLiteralsAllowed !== oldFields.ipLiteralsAllowed) {
deltaEvents.push({
type: "accessRulesChanged",
sender: event.sender,
ipLiteralsAllowed: newFields.ipLiteralsAllowed
});
}
let { removed: removedAllowed, added: addedAllowed } = diffLists(oldFields.allowedHosts, newFields.allowedHosts);
let { removed: removedDenied, added: addedDenied } = diffLists(oldFields.deniedHosts, newFields.deniedHosts);
for (let host of removedAllowed) {
deltaEvents.push({ type: "allowedHostRemoved", sender: event.sender, hostmask: host });
}
for (let host of removedDenied) {
deltaEvents.push({ type: "deniedHostRemoved", sender: event.sender, hostmask: host });
}
for (let host of addedAllowed) {
deltaEvents.push({ type: "allowedHostAdded", sender: event.sender, hostmask: host });
}
for (let host of addedDenied) {
deltaEvents.push({ type: "deniedHostAdded", sender: event.sender, hostmask: host });
}
return deltaEvents;
};