Detect `types.MissingStateError` in `CheckServerAllowedToSeeEvent`
This will hopefully stop some 500 errors on `/event` where there is no state-before known.
MODIFY
roomserver/internal/helpers/helpers.go
roomserver/internal/helpers/helpers.go
@@ -253,10 +253,17 @@ func CheckServerAllowedToSeeEvent(
if err != nil {
return false, err
}
+ default:
+ switch err.(type) {
+ case types.MissingStateError:
+ // If there's no state then we assume it's open visibility, as Synapse does:
+ // https://github.com/matrix-org/synapse/blob/aec87a0f9369a3015b2a53469f88d1de274e8b71/synapse/visibility.py#L654-L655
+ return true, nil
default:
// Something else went wrong
return false, err
}
+ }
return auth.IsServerAllowed(serverName, isServerInRoom, stateAtEvent), nil
}

MODIFY
roomserver/storage/postgres/events_table.go
roomserver/storage/postgres/events_table.go
@@ -346,7 +346,7 @@ func (s *eventStatements) BulkSelectStateAtEventByID(
// Genuine create events are the only case where it's OK to have no previous state.
isCreate := result.EventTypeNID == types.MRoomCreateNID && result.EventStateKeyNID == 1
if result.BeforeStateSnapshotNID == 0 && !isCreate {
- return nil, types.MissingEventError(
+ return nil, types.MissingStateError(
fmt.Sprintf("storage: missing state for event NID %d", result.EventNID),
)
}

MODIFY
roomserver/storage/sqlite3/events_table.go
roomserver/storage/sqlite3/events_table.go
@@ -362,7 +362,7 @@ func (s *eventStatements) BulkSelectStateAtEventByID(
// Genuine create events are the only case where it's OK to have no previous state.
isCreate := result.EventTypeNID == types.MRoomCreateNID && result.EventStateKeyNID == 1
if result.BeforeStateSnapshotNID == 0 && !isCreate {
- return nil, types.MissingEventError(
+ return nil, types.MissingStateError(
fmt.Sprintf("storage: missing state for event NID %d", result.EventNID),
)
}

Detect `types.MissingStateError` in `CheckServerAllowedToSeeEvent` (#2667)

This will hopefully stop some 500 errors on `/event` where there is no state-before known.