Do proper null-checks on decypted events to fix NPEs

Previously we assumed that a decrypted event has a room_id
but this isn't necessarily true for to_device events.

It makes sense to ignore events that aren't associated with
rooms anyway given that the list we're updating only contains
rooms!
This commit is contained in:
Luke Barnard 2018-02-23 14:54:00 +00:00
parent a28691b9de
commit fae7af1a62

View file

@ -90,12 +90,25 @@ class RoomListStore extends Store {
// When an event is decrypted, it could mean we need to reorder the room // When an event is decrypted, it could mean we need to reorder the room
// list because we now know the type of the event. // list because we now know the type of the event.
case 'MatrixActions.Event.decrypted': { case 'MatrixActions.Event.decrypted': {
const room = this._matrixClient.getRoom(payload.event.getRoomId()); // We may not have synced or done an initial generation of the lists
if (!this._matrixClient || !this._state.ready) break;
const roomId = payload.event.getRoomId();
// We may have decrypted an event without a roomId (e.g to_device)
if (!roomId) break;
const room = this._matrixClient.getRoom(roomId);
// We somehow decrypted an event for a room our client is unaware of
if (!room) break;
const liveTimeline = room.getLiveTimeline(); const liveTimeline = room.getLiveTimeline();
const eventTimeline = room.getTimelineForEvent(payload.event.getId()); const eventTimeline = room.getTimelineForEvent(payload.event.getId());
if (!this._state.ready || // Either this event was not added to the live timeline (e.g. pagination)
liveTimeline !== eventTimeline || // or it doesn't affect the ordering of the room list.
if (liveTimeline !== eventTimeline ||
!this._eventTriggersRecentReorder(payload.event) !this._eventTriggersRecentReorder(payload.event)
) break; ) break;
this._generateRoomLists(); this._generateRoomLists();