From 7b73571dabd30c70f860239d1163ada43dc7e242 Mon Sep 17 00:00:00 2001 From: Neil Alexander Date: Fri, 24 Apr 2020 13:36:28 +0100 Subject: [PATCH] Prevent roomserver query API from trying to handle requests for stub rooms --- roomserver/query/query.go | 24 ++++++++++++++++++++++++ roomserver/storage/interface.go | 1 + roomserver/storage/postgres/storage.go | 10 ++++++++++ roomserver/storage/sqlite3/storage.go | 10 ++++++++++ 4 files changed, 45 insertions(+) diff --git a/roomserver/query/query.go b/roomserver/query/query.go index e9286b4e6..6489a30fd 100644 --- a/roomserver/query/query.go +++ b/roomserver/query/query.go @@ -61,6 +61,14 @@ func (r *RoomserverQueryAPI) QueryLatestEventsAndState( if roomNID == 0 { return nil } + isStub, err := r.DB.IsRoomStub(ctx, roomNID) + if err != nil { + return err + } + if isStub { + response.RoomExists = false + return nil + } response.RoomExists = true response.RoomVersion = roomVersion @@ -121,6 +129,14 @@ func (r *RoomserverQueryAPI) QueryStateAfterEvents( if roomNID == 0 { return nil } + isStub, err := r.DB.IsRoomStub(ctx, roomNID) + if err != nil { + return err + } + if isStub { + response.RoomExists = false + return nil + } response.RoomExists = true response.RoomVersion = roomVersion @@ -656,6 +672,14 @@ func (r *RoomserverQueryAPI) QueryStateAndAuthChain( if roomNID == 0 { return nil } + isStub, err := r.DB.IsRoomStub(ctx, roomNID) + if err != nil { + return err + } + if isStub { + response.RoomExists = false + return nil + } response.RoomExists = true roomVersion, err := r.DB.GetRoomVersionForRoom(ctx, request.RoomID) diff --git a/roomserver/storage/interface.go b/roomserver/storage/interface.go index 0235e51ed..d5ac143bf 100644 --- a/roomserver/storage/interface.go +++ b/roomserver/storage/interface.go @@ -83,4 +83,5 @@ type Database interface { GetMembershipEventNIDsForRoom(ctx context.Context, roomNID types.RoomNID, joinOnly bool) ([]types.EventNID, error) EventsFromIDs(ctx context.Context, eventIDs []string) ([]types.Event, error) GetRoomVersionForRoom(ctx context.Context, roomID string) (gomatrixserverlib.RoomVersion, error) + IsRoomStub(ctx context.Context, roomNID types.RoomNID) (bool, error) } diff --git a/roomserver/storage/postgres/storage.go b/roomserver/storage/postgres/storage.go index 6f2b96610..bb06db963 100644 --- a/roomserver/storage/postgres/storage.go +++ b/roomserver/storage/postgres/storage.go @@ -772,6 +772,16 @@ func (d *Database) GetRoomVersionForRoomNID( ) } +func (d *Database) IsRoomStub( + ctx context.Context, roomNID types.RoomNID, +) (bool, error) { + nids, _, err := d.statements.selectLatestEventNIDs(ctx, roomNID) + if err != nil { + return false, err + } + return len(nids) == 0, nil +} + type transaction struct { ctx context.Context txn *sql.Tx diff --git a/roomserver/storage/sqlite3/storage.go b/roomserver/storage/sqlite3/storage.go index 444a8fdd5..b9b37cbbe 100644 --- a/roomserver/storage/sqlite3/storage.go +++ b/roomserver/storage/sqlite3/storage.go @@ -926,6 +926,16 @@ func (d *Database) GetRoomVersionForRoomNID( ) } +func (d *Database) IsRoomStub( + ctx context.Context, roomNID types.RoomNID, +) (bool, error) { + nids, _, err := d.statements.selectLatestEventNIDs(ctx, nil, roomNID) + if err != nil { + return false, err + } + return len(nids) == 0, nil +} + type transaction struct { ctx context.Context txn *sql.Tx