matrix-react-sdk
Version:
SDK for matrix.org using React
162 lines (133 loc) • 15.5 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.ruleTypeToStable = ruleTypeToStable;
exports.BanList = exports.ALL_RULE_TYPES = exports.SERVER_RULE_TYPES = exports.ROOM_RULE_TYPES = exports.USER_RULE_TYPES = exports.RULE_SERVER = exports.RULE_ROOM = exports.RULE_USER = void 0;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _ListRule = require("./ListRule");
var _MatrixClientPeg = require("../MatrixClientPeg");
/*
Copyright 2019 The Matrix.org Foundation C.I.C.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
// Inspiration largely taken from Mjolnir itself
const RULE_USER = "m.room.rule.user";
exports.RULE_USER = RULE_USER;
const RULE_ROOM = "m.room.rule.room";
exports.RULE_ROOM = RULE_ROOM;
const RULE_SERVER = "m.room.rule.server";
exports.RULE_SERVER = RULE_SERVER;
const USER_RULE_TYPES = [RULE_USER, "org.matrix.mjolnir.rule.user"];
exports.USER_RULE_TYPES = USER_RULE_TYPES;
const ROOM_RULE_TYPES = [RULE_ROOM, "org.matrix.mjolnir.rule.room"];
exports.ROOM_RULE_TYPES = ROOM_RULE_TYPES;
const SERVER_RULE_TYPES = [RULE_SERVER, "org.matrix.mjolnir.rule.server"];
exports.SERVER_RULE_TYPES = SERVER_RULE_TYPES;
const ALL_RULE_TYPES = [...USER_RULE_TYPES, ...ROOM_RULE_TYPES, ...SERVER_RULE_TYPES];
exports.ALL_RULE_TYPES = ALL_RULE_TYPES;
function ruleTypeToStable(rule
/*: string*/
, unstable = true)
/*: string*/
{
if (USER_RULE_TYPES.includes(rule)) {
return unstable ? USER_RULE_TYPES[USER_RULE_TYPES.length - 1] : RULE_USER;
}
if (ROOM_RULE_TYPES.includes(rule)) {
return unstable ? ROOM_RULE_TYPES[ROOM_RULE_TYPES.length - 1] : RULE_ROOM;
}
if (SERVER_RULE_TYPES.includes(rule)) {
return unstable ? SERVER_RULE_TYPES[SERVER_RULE_TYPES.length - 1] : RULE_SERVER;
}
return null;
}
class BanList {
constructor(roomId
/*: string*/
) {
(0, _defineProperty2.default)(this, "_rules", []);
(0, _defineProperty2.default)(this, "_roomId", void 0);
this._roomId = roomId;
this.updateList();
}
get roomId()
/*: string*/
{
return this._roomId;
}
get serverRules()
/*: ListRule[]*/
{
return this._rules.filter(r => r.kind === RULE_SERVER);
}
get userRules()
/*: ListRule[]*/
{
return this._rules.filter(r => r.kind === RULE_USER);
}
get roomRules()
/*: ListRule[]*/
{
return this._rules.filter(r => r.kind === RULE_ROOM);
}
async banEntity(kind
/*: string*/
, entity
/*: string*/
, reason
/*: string*/
)
/*: Promise<any>*/
{
await _MatrixClientPeg.MatrixClientPeg.get().sendStateEvent(this._roomId, ruleTypeToStable(kind, true), {
entity: entity,
reason: reason,
recommendation: (0, _ListRule.recommendationToStable)(_ListRule.RECOMMENDATION_BAN, true)
}, "rule:" + entity);
this._rules.push(new _ListRule.ListRule(entity, _ListRule.RECOMMENDATION_BAN, reason, ruleTypeToStable(kind, false)));
}
async unbanEntity(kind
/*: string*/
, entity
/*: string*/
)
/*: Promise<any>*/
{
// Empty state event is effectively deleting it.
await _MatrixClientPeg.MatrixClientPeg.get().sendStateEvent(this._roomId, ruleTypeToStable(kind, true), {}, "rule:" + entity);
this._rules = this._rules.filter(r => {
if (r.kind !== ruleTypeToStable(kind, false)) return true;
if (r.entity !== entity) return true;
return false; // we just deleted this rule
});
}
updateList() {
this._rules = [];
const room = _MatrixClientPeg.MatrixClientPeg.get().getRoom(this._roomId);
if (!room) return;
for (const eventType of ALL_RULE_TYPES) {
const events = room.currentState.getStateEvents(eventType, undefined);
for (const ev of events) {
if (!ev.getStateKey()) continue;
const kind = ruleTypeToStable(eventType, false);
const entity = ev.getContent()['entity'];
const recommendation = ev.getContent()['recommendation'];
const reason = ev.getContent()['reason'];
if (!entity || !recommendation || !reason) continue;
this._rules.push(new _ListRule.ListRule(entity, recommendation, reason, kind));
}
}
}
}
exports.BanList = BanList;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9tam9sbmlyL0Jhbkxpc3QudHMiXSwibmFtZXMiOlsiUlVMRV9VU0VSIiwiUlVMRV9ST09NIiwiUlVMRV9TRVJWRVIiLCJVU0VSX1JVTEVfVFlQRVMiLCJST09NX1JVTEVfVFlQRVMiLCJTRVJWRVJfUlVMRV9UWVBFUyIsIkFMTF9SVUxFX1RZUEVTIiwicnVsZVR5cGVUb1N0YWJsZSIsInJ1bGUiLCJ1bnN0YWJsZSIsImluY2x1ZGVzIiwibGVuZ3RoIiwiQmFuTGlzdCIsImNvbnN0cnVjdG9yIiwicm9vbUlkIiwiX3Jvb21JZCIsInVwZGF0ZUxpc3QiLCJzZXJ2ZXJSdWxlcyIsIl9ydWxlcyIsImZpbHRlciIsInIiLCJraW5kIiwidXNlclJ1bGVzIiwicm9vbVJ1bGVzIiwiYmFuRW50aXR5IiwiZW50aXR5IiwicmVhc29uIiwiTWF0cml4Q2xpZW50UGVnIiwiZ2V0Iiwic2VuZFN0YXRlRXZlbnQiLCJyZWNvbW1lbmRhdGlvbiIsIlJFQ09NTUVOREFUSU9OX0JBTiIsInB1c2giLCJMaXN0UnVsZSIsInVuYmFuRW50aXR5Iiwicm9vbSIsImdldFJvb20iLCJldmVudFR5cGUiLCJldmVudHMiLCJjdXJyZW50U3RhdGUiLCJnZXRTdGF0ZUV2ZW50cyIsInVuZGVmaW5lZCIsImV2IiwiZ2V0U3RhdGVLZXkiLCJnZXRDb250ZW50Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFrQkE7O0FBQ0E7O0FBbkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBS08sTUFBTUEsU0FBUyxHQUFHLGtCQUFsQjs7QUFDQSxNQUFNQyxTQUFTLEdBQUcsa0JBQWxCOztBQUNBLE1BQU1DLFdBQVcsR0FBRyxvQkFBcEI7O0FBRUEsTUFBTUMsZUFBZSxHQUFHLENBQUNILFNBQUQsRUFBWSw4QkFBWixDQUF4Qjs7QUFDQSxNQUFNSSxlQUFlLEdBQUcsQ0FBQ0gsU0FBRCxF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QUgsR0FBZ0IsUUFBaEIsQ0FBZjtBQUNBLFlBQUksQ0FBQ25CLE1BQUQsSUFBVyxDQUFDSyxjQUFaLElBQThCLENBQUNKLE1BQW5DLEVBQTJDOztBQUUzQyxhQUFLUixNQUFMLENBQVljLElBQVosQ0FBaUIsSUFBSUMsa0JBQUosQ0FBYVIsTUFBYixFQUFxQkssY0FBckIsRUFBcUNKLE1BQXJDLEVBQTZDTCxJQUE3QyxDQUFqQjtBQUNIO0FBQ0o7QUFDSjs7QUFqRWdCIiwic291cmNlc0NvbnRlbnQiOlsiLypcbkNvcHlyaWdodCAyMDE5IFRoZSBNYXRyaXgub3JnIEZvdW5kYXRpb24gQy5JLkMuXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKi9cblxuLy8gSW5zcGlyYXRpb24gbGFyZ2VseSB0YWtlbiBmcm9tIE1qb2xuaXIgaXRzZWxmXG5cbmltcG9ydCB7TGlzdFJ1bGUsIFJFQ09NTUVOREFUSU9OX0JBTiwgcmVjb21tZW5kYXRpb25Ub1N0YWJsZX0gZnJvbSBcIi4vTGlzdFJ1bGVcIjtcbmltcG9ydCB7TWF0cml4Q2xpZW50UGVnfSBmcm9tIFwiLi4vTWF0cml4Q2xpZW50UGVnXCI7XG5cbmV4cG9ydCBjb25zdCBSVUxFX1VTRVIgPSBcIm0ucm9vbS5ydWxlLnVzZXJcIjtcbmV4cG9ydCBjb25zdCBSVUxFX1JPT00gPSBcIm0ucm9vbS5ydWxlLnJvb21cIjtcbmV4cG9ydCBjb25zdCBSVUxFX1NFUlZFUiA9IFwibS5yb29tLnJ1bGUuc2VydmVyXCI7XG5cbmV4cG9ydCBjb25zdCBVU0VSX1JVTEVfVFlQRVMgPSBbUlVMRV9VU0VSLCBcIm9yZy5tYXRyaXgubWpvbG5pci5ydWxlLnVzZXJcIl07XG5leHBvcnQgY29uc3QgUk9PTV9SVUxFX1RZUEVTID0gW1JVTEVfUk9PTSwgXCJvcmcubWF0cml4Lm1qb2xuaXIucnVsZS5yb29tXCJdO1xuZXhwb3J0IGNvbnN0IFNFUlZFUl9SVUxFX1RZUEVTID0gW1JVTEVfU0VSVkVSLCBcIm9yZy5tYXRyaXgubWpvbG5pci5ydWxlLnNlcnZlclwiXTtcbmV4cG9ydCBjb25zdCBBTExfUlVMRV9UWVBFUyA9IFsuLi5VU0VSX1JVTEVfVFlQRVMsIC4uLlJPT01fUlVMRV9UWVBFUywgLi4uU0VSVkVSX1JVTEVfVFlQRVNdO1xuXG5leHBvcnQgZnVuY3Rpb24gcnVsZVR5cGVUb1N0YWJsZShydWxlOiBzdHJpbmcsIHVuc3RhYmxlID0gdHJ1ZSk6IHN0cmluZyB7XG4gICAgaWYgKFVTRVJfUlVMRV9UWVBFUy5pbmNsdWRlcyhydWxlKSkge1xuICAgICAgICByZXR1cm4gdW5zdGFibGUgPyBVU0VSX1JVTEVfVFlQRVNbVVNFUl9SVUxFX1RZUEVTLmxlbmd0aCAtIDFdIDogUlVMRV9VU0VSO1xuICAgIH1cbiAgICBpZiAoUk9PTV9SVUxFX1RZUEVTLmluY2x1ZGVzKHJ1bGUpKSB7XG4gICAgICAgIHJldHVybiB1bnN0YWJsZSA/IFJPT01fUlVMRV9UWVBFU1tST09NX1JVTEVfVFlQRVMubGVuZ3RoIC0gMV0gOiBSVUxFX1JPT007XG4gICAgfVxuICAgIGlmIChTRVJWRVJfUlVMRV9UWVBFUy5pbmNsdWRlcyhydWxlKSkge1xuICAgICAgICByZXR1cm4gdW5zdGFibGUgPyBTRVJWRVJfUlVMRV9UWVBFU1tTRVJWRVJfUlVMRV9UWVBFUy5sZW5ndGggLSAxXSA6IFJVTEVfU0VSVkVSO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn1cblxuZXhwb3J0IGNsYXNzIEJhbkxpc3Qge1xuICAgIF9ydWxlczogTGlzdFJ1bGVbXSA9IFtdO1xuICAgIF9yb29tSWQ6IHN0cmluZztcblxuICAgIGNvbnN0cnVjdG9yKHJvb21JZDogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX3Jvb21JZCA9IHJvb21JZDtcbiAgICAgICAgdGhpcy51cGRhdGVMaXN0KCk7XG4gICAgfVxuXG4gICAgZ2V0IHJvb21JZCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5fcm9vbUlkO1xuICAgIH1cblxuICAgIGdldCBzZXJ2ZXJSdWxlcygpOiBMaXN0UnVsZVtdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3J1bGVzLmZpbHRlcihyID0+IHIua2luZCA9PT0gUlVMRV9TRVJWRVIpO1xuICAgIH1cblxuICAgIGdldCB1c2VyUnVsZXMoKTogTGlzdFJ1bGVbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9ydWxlcy5maWx0ZXIociA9PiByLmtpbmQgPT09IFJVTEVfVVNFUik7XG4gICAgfVxuXG4gICAgZ2V0IHJvb21SdWxlcygpOiBMaXN0UnVsZVtdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3J1bGVzLmZpbHRlcihyID0+IHIua2luZCA9PT0gUlVMRV9ST09NKTtcbiAgICB9XG5cbiAgICBhc3luYyBiYW5FbnRpdHkoa2luZDogc3RyaW5nLCBlbnRpdHk6IHN0cmluZywgcmVhc29uOiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xuICAgICAgICBhd2FpdCBNYXRyaXhDbGllbnRQZWcuZ2V0KCkuc2VuZFN0YXRlRXZlbnQodGhpcy5fcm9vbUlkLCBydWxlVHlwZVRvU3RhYmxlKGtpbmQsIHRydWUpLCB7XG4gICAgICAgICAgICBlbnRpdHk6IGVudGl0eSxcbiAgICAgICAgICAgIHJlYXNvbjogcmVhc29uLFxuICAgICAgICAgICAgcmVjb21tZW5kYXRpb246IHJlY29tbWVuZGF0aW9uVG9TdGFibGUoUkVDT01NRU5EQVRJT05fQkFOLCB0cnVlKSxcbiAgICAgICAgfSwgXCJydWxlOlwiICsgZW50aXR5KTtcbiAgICAgICAgdGhpcy5fcnVsZXMucHVzaChuZXcgTGlzdFJ1bGUoZW50aXR5LCBSRUNPTU1FTkRBVElPTl9CQU4sIHJlYXNvbiwgcnVsZVR5cGVUb1N0YWJsZShraW5kLCBmYWxzZSkpKTtcbiAgICB9XG5cbiAgICBhc3luYyB1bmJhbkVudGl0eShraW5kOiBzdHJpbmcsIGVudGl0eTogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgLy8gRW1wdHkgc3RhdGUgZXZlbnQgaXMgZWZmZWN0aXZlbHkgZGVsZXRpbmcgaXQuXG4gICAgICAgIGF3YWl0IE1hdHJpeENsaWVudFBlZy5nZXQoKS5zZW5kU3RhdGVFdmVudCh0aGlzLl9yb29tSWQsIHJ1bGVUeXBlVG9TdGFibGUoa2luZCwgdHJ1ZSksIHt9LCBcInJ1bGU6XCIgKyBlbnRpdHkpO1xuICAgICAgICB0aGlzLl9ydWxlcyA9IHRoaXMuX3J1bGVzLmZpbHRlcihyID0+IHtcbiAgICAgICAgICAgIGlmIChyLmtpbmQgIT09IHJ1bGVUeXBlVG9TdGFibGUoa2luZCwgZmFsc2UpKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIGlmIChyLmVudGl0eSAhPT0gZW50aXR5KSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gd2UganVzdCBkZWxldGVkIHRoaXMgcnVsZVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICB1cGRhdGVMaXN0KCkge1xuICAgICAgICB0aGlzLl9ydWxlcyA9IFtdO1xuXG4gICAgICAgIGNvbnN0IHJvb20gPSBNYXRyaXhDbGllbnRQZWcuZ2V0KCkuZ2V0Um9vbSh0aGlzLl9yb29tSWQpO1xuICAgICAgICBpZiAoIXJvb20pIHJldHVybjtcblxuICAgICAgICBmb3IgKGNvbnN0IGV2ZW50VHlwZSBvZiBBTExfUlVMRV9UWVBFUykge1xuICAgICAgICAgICAgY29uc3QgZXZlbnRzID0gcm9vbS5jdXJyZW50U3RhdGUuZ2V0U3RhdGVFdmVudHMoZXZlbnRUeXBlLCB1bmRlZmluZWQpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBldiBvZiBldmVudHMpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWV2LmdldFN0YXRlS2V5KCkpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICAgICAgY29uc3Qga2luZCA9IHJ1bGVUeXBlVG9TdGFibGUoZXZlbnRUeXBlLCBmYWxzZSk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBlbnRpdHkgPSBldi5nZXRDb250ZW50KClbJ2VudGl0eSddO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlY29tbWVuZGF0aW9uID0gZXYuZ2V0Q29udGVudCgpWydyZWNvbW1lbmRhdGlvbiddO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlYXNvbiA9IGV2LmdldENvbnRlbnQoKVsncmVhc29uJ107XG4gICAgICAgICAgICAgICAgaWYgKCFlbnRpdHkgfHwgIXJlY29tbWVuZGF0aW9uIHx8ICFyZWFzb24pIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5fcnVsZXMucHVzaChuZXcgTGlzdFJ1bGUoZW50aXR5LCByZWNvbW1lbmRhdGlvbiwgcmVhc29uLCBraW5kKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG4iXX0=