1
0
mirror of https://github.com/matrix-org/matrix-js-sdk.git synced 2025-11-26 17:03:12 +03:00

Add maySendEvent to match maySendStateEvent. Make them use the same function internally. Also add convenience maySendMessage. Also tests.

This commit is contained in:
David Baker
2016-03-23 15:10:51 +00:00
parent cdea96fa0a
commit 88cc63e2a2
2 changed files with 121 additions and 4 deletions

View File

@@ -239,6 +239,33 @@ RoomState.prototype.getUserIdsWithDisplayName = function(displayName) {
return this._displayNameToUserIds[displayName] || []; return this._displayNameToUserIds[displayName] || [];
}; };
/**
* Short-form for maySendEvent('m.room.message', userId)
* @param {string} userId The user ID of the user to test permission for
* @return {boolean} true if the given user ID should be permitted to send
* message events into the given room.
*/
RoomState.prototype.maySendMessage = function(userId) {
return this._maySendEventOfType('m.room.message', userId, false);
};
/**
* Returns true if the given user ID has permission to send a normal
* event of type `eventType` into this room.
* @param {string} type The type of event to test
* @param {string} userId The user ID of the user to test permission for
* @param {boolean} state If true, tests if the user may send a state
event of this type. Otherwise tests whether
they may send a regular event.
* @return {boolean} true if the given user ID should be permitted to send
* the given type of event into this room,
* according to the room's state.
*/
RoomState.prototype.maySendEvent = function(eventType, userId) {
return this._maySendEventOfType(eventType, userId, false);
};
/** /**
* Returns true if the given MatrixClient has permission to send a state * Returns true if the given MatrixClient has permission to send a state
* event of type `stateEventType` into this room. * event of type `stateEventType` into this room.
@@ -265,6 +292,22 @@ RoomState.prototype.mayClientSendStateEvent = function(stateEventType, cli) {
* according to the room's state. * according to the room's state.
*/ */
RoomState.prototype.maySendStateEvent = function(stateEventType, userId) { RoomState.prototype.maySendStateEvent = function(stateEventType, userId) {
return this._maySendEventOfType(stateEventType, userId, true);
};
/**
* Returns true if the given user ID has permission to send a normal or state
* event of type `eventType` into this room.
* @param {string} type The type of event to test
* @param {string} userId The user ID of the user to test permission for
* @param {boolean} state If true, tests if the user may send a state
event of this type. Otherwise tests whether
they may send a regular event.
* @return {boolean} true if the given user ID should be permitted to send
* the given type of event into this room,
* according to the room's state.
*/
RoomState.prototype._maySendEventOfType = function(eventType, userId, state) {
var member = this.getMember(userId); var member = this.getMember(userId);
if (!member || member.membership == 'leave') { return false; } if (!member || member.membership == 'leave') { return false; }
@@ -277,6 +320,7 @@ RoomState.prototype.maySendStateEvent = function(stateEventType, userId) {
var user_levels = []; var user_levels = [];
var state_default = 0; var state_default = 0;
var events_default = 0;
if (power_levels_event) { if (power_levels_event) {
power_levels = power_levels_event.getContent(); power_levels = power_levels_event.getContent();
events_levels = power_levels.events || {}; events_levels = power_levels.events || {};
@@ -289,13 +333,16 @@ RoomState.prototype.maySendStateEvent = function(stateEventType, userId) {
} else { } else {
state_default = 50; state_default = 50;
} }
if (power_levels.events_default !== undefined) {
events_default = power_levels.events_default;
}
} }
var state_event_level = state_default; var required_level = state ? state_default : events_default;
if (events_levels[stateEventType] !== undefined) { if (events_levels[eventType] !== undefined) {
state_event_level = events_levels[stateEventType]; required_level = events_levels[eventType];
} }
return member.powerLevel >= state_event_level; return member.powerLevel >= required_level;
}; };
/** /**

View File

@@ -362,4 +362,74 @@ describe("RoomState", function() {
expect(state.maySendStateEvent('m.room.other_thing', userB)).toEqual(false); expect(state.maySendStateEvent('m.room.other_thing', userB)).toEqual(false);
}); });
}); });
describe("maySendEvent", function() {
it("should say non-joined members may not send events",
function() {
expect(state.maySendEvent(
'm.room.message', "@nobody:nowhere"
)).toEqual(false);
expect(state.maySendMessage("@nobody:nowhere")).toEqual(false);
});
it("should say any member may send events with no power level event",
function() {
expect(state.maySendEvent('m.room.message', userA)).toEqual(true);
expect(state.maySendMessage(userA)).toEqual(true);
});
it("should obey events_default",
function() {
var powerLevelEvent = {
type: "m.room.power_levels", room: roomId, user: userA, event: true,
content: {
users_default: 10,
state_default: 30,
events_default: 25,
users: {
}
}
};
powerLevelEvent.content.users[userA] = 26;
powerLevelEvent.content.users[userB] = 24;
state.setStateEvents([utils.mkEvent(powerLevelEvent)]);
expect(state.maySendEvent('m.room.message', userA)).toEqual(true);
expect(state.maySendEvent('m.room.message', userB)).toEqual(false);
expect(state.maySendMessage(userA)).toEqual(true);
expect(state.maySendMessage(userB)).toEqual(false);
});
it("should honour explicit event power levels in the power_levels event",
function() {
var powerLevelEvent = {
type: "m.room.power_levels", room: roomId, user: userA, event: true,
content: {
events: {
"m.room.other_thing": 33
},
users_default: 10,
state_default: 50,
events_default: 25,
users: {
}
}
};
powerLevelEvent.content.users[userA] = 40;
powerLevelEvent.content.users[userB] = 30;
state.setStateEvents([utils.mkEvent(powerLevelEvent)]);
expect(state.maySendEvent('m.room.message', userA)).toEqual(true);
expect(state.maySendEvent('m.room.message', userB)).toEqual(true);
expect(state.maySendMessage(userA)).toEqual(true);
expect(state.maySendMessage(userB)).toEqual(true);
expect(state.maySendEvent('m.room.other_thing', userA)).toEqual(true);
expect(state.maySendEvent('m.room.other_thing', userB)).toEqual(false);
});
});
}); });