Try to limit how many state events we have to unmarshal

This commit is contained in:
Neil Alexander 2020-12-02 11:02:51 +00:00
parent d5b8260196
commit a8a90a4c7d
No known key found for this signature in database
GPG key ID: A02A2019A2BB0944

View file

@ -5,6 +5,7 @@ import (
"database/sql" "database/sql"
"errors" "errors"
"fmt" "fmt"
"strings"
"github.com/matrix-org/dendrite/roomserver/api" "github.com/matrix-org/dendrite/roomserver/api"
"github.com/matrix-org/dendrite/roomserver/auth" "github.com/matrix-org/dendrite/roomserver/auth"
@ -222,16 +223,51 @@ func CheckServerAllowedToSeeEvent(
if errors.Is(err, sql.ErrNoRows) { if errors.Is(err, sql.ErrNoRows) {
return false, nil return false, nil
} }
return false, err return false, fmt.Errorf("roomState.LoadStateAtEvent: %w", err)
}
// Extract all of the event state key NIDs from the room state.
var stateKeyNIDs []types.EventStateKeyNID
for _, entry := range stateEntries {
stateKeyNIDs = append(stateKeyNIDs, entry.EventStateKeyNID)
}
// Then request those state ky NIDs from the database.
stateKeys, err := db.EventStateKeys(ctx, stateKeyNIDs)
if err != nil {
return false, fmt.Errorf("db.EventStateKeys: %w", err)
}
// If the event state key doesn't match
for nid, key := range stateKeys {
if key != "" && !strings.HasSuffix(key, ":"+string(serverName)) {
delete(stateKeys, nid)
}
}
var filteredEntries []types.StateEntry
for _, entry := range stateEntries {
if _, ok := stateKeys[entry.EventStateKeyNID]; ok {
filteredEntries = append(filteredEntries, entry)
}
}
if len(filteredEntries) == 0 {
return false, nil
} }
// TODO: We probably want to make it so that we don't have to pull // TODO: We probably want to make it so that we don't have to pull
// out all the state if possible. // out all the state if possible.
stateAtEvent, err := LoadStateEvents(ctx, db, stateEntries) stateAtEvent, err := LoadStateEvents(ctx, db, filteredEntries)
if err != nil { if err != nil {
return false, err return false, err
} }
fmt.Println("Filtered entries:")
for _, entry := range stateAtEvent {
fmt.Println("*", entry.Type(), *entry.StateKey())
}
return auth.IsServerAllowed(serverName, isServerInRoom, stateAtEvent), nil return auth.IsServerAllowed(serverName, isServerInRoom, stateAtEvent), nil
} }