aboutsummaryrefslogtreecommitdiff
path: root/roomserver
diff options
context:
space:
mode:
authorNeil Alexander <neilalexander@users.noreply.github.com>2020-04-03 14:29:06 +0100
committerGitHub <noreply@github.com>2020-04-03 14:29:06 +0100
commit067b87506357c996fd6ddb11271db9469ad4ce80 (patch)
treee9127d78567b7676ba5ee607e9381ef4e0358911 /roomserver
parent955244c09298d0e6c870377dad3af2ffa1f5e578 (diff)
Invites v2 endpoint (#952)
* Start converting v1 invite endpoint to v2 * Update gomatrixserverlib * Early federationsender code for sending invites * Sending invites sorta happens now * Populate invite request with stripped state * Remodel a bit, don't reflect received invites * Handle invite_room_state * Handle room versions a bit better * Update gomatrixserverlib * Tweak order in destinationQueue.next * Revert check in processMessage * Tweak federation sender destination queue code a bit * Add comments
Diffstat (limited to 'roomserver')
-rw-r--r--roomserver/api/input.go4
-rw-r--r--roomserver/api/output.go2
-rw-r--r--roomserver/input/events.go18
-rw-r--r--roomserver/input/membership.go7
-rw-r--r--roomserver/storage/interface.go2
-rw-r--r--roomserver/storage/postgres/storage.go10
-rw-r--r--roomserver/storage/sqlite3/storage.go10
-rw-r--r--roomserver/types/types.go2
8 files changed, 44 insertions, 11 deletions
diff --git a/roomserver/api/input.go b/roomserver/api/input.go
index 42e8385d..87e3983e 100644
--- a/roomserver/api/input.go
+++ b/roomserver/api/input.go
@@ -86,7 +86,9 @@ type TransactionID struct {
// the usual context a matrix room event would have. We usually do not have
// access to the events needed to check the event auth rules for the invite.
type InputInviteEvent struct {
- Event gomatrixserverlib.HeaderedEvent `json:"event"`
+ RoomVersion gomatrixserverlib.RoomVersion `json:"room_version"`
+ Event gomatrixserverlib.HeaderedEvent `json:"event"`
+ InviteRoomState []gomatrixserverlib.InviteV2StrippedState `json:"invite_room_state"`
}
// InputRoomEventsRequest is a request to InputRoomEvents
diff --git a/roomserver/api/output.go b/roomserver/api/output.go
index 4e7adff7..92a468a9 100644
--- a/roomserver/api/output.go
+++ b/roomserver/api/output.go
@@ -116,6 +116,8 @@ type OutputNewRoomEvent struct {
// Invite events can be received outside of an existing room so have to be
// tracked separately from the room events themselves.
type OutputNewInviteEvent struct {
+ // The room version of the invited room.
+ RoomVersion gomatrixserverlib.RoomVersion `json:"room_version"`
// The "m.room.member" invite event.
Event gomatrixserverlib.HeaderedEvent `json:"event"`
}
diff --git a/roomserver/input/events.go b/roomserver/input/events.go
index c75a3acd..2bb0d0a0 100644
--- a/roomserver/input/events.go
+++ b/roomserver/input/events.go
@@ -26,6 +26,7 @@ import (
"github.com/matrix-org/dendrite/roomserver/state/database"
"github.com/matrix-org/dendrite/roomserver/types"
"github.com/matrix-org/gomatrixserverlib"
+ log "github.com/sirupsen/logrus"
)
// A RoomEventDatabase has the storage APIs needed to store a room event.
@@ -64,6 +65,7 @@ type RoomEventDatabase interface {
// Build a membership updater for the target user in a room.
MembershipUpdater(
ctx context.Context, roomID, targerUserID string,
+ roomVersion gomatrixserverlib.RoomVersion,
) (types.MembershipUpdater, error)
// Look up event ID by transaction's info.
// This is used to determine if the room event is processed/processing already.
@@ -193,7 +195,14 @@ func processInviteEvent(
roomID := input.Event.RoomID()
targetUserID := *input.Event.StateKey()
- updater, err := db.MembershipUpdater(ctx, roomID, targetUserID)
+ log.WithFields(log.Fields{
+ "event_id": input.Event.EventID(),
+ "room_id": roomID,
+ "room_version": input.RoomVersion,
+ "target_user_id": targetUserID,
+ }).Info("processing invite event")
+
+ updater, err := db.MembershipUpdater(ctx, roomID, targetUserID, input.RoomVersion)
if err != nil {
return err
}
@@ -237,7 +246,12 @@ func processInviteEvent(
}
event := input.Event.Unwrap()
- outputUpdates, err := updateToInviteMembership(updater, &event, nil)
+
+ if err = event.SetUnsignedField("invite_room_state", input.InviteRoomState); err != nil {
+ return err
+ }
+
+ outputUpdates, err := updateToInviteMembership(updater, &event, nil, input.Event.RoomVersion)
if err != nil {
return err
}
diff --git a/roomserver/input/membership.go b/roomserver/input/membership.go
index f2ac3b51..ee39ff5e 100644
--- a/roomserver/input/membership.go
+++ b/roomserver/input/membership.go
@@ -112,7 +112,7 @@ func updateMembership(
switch newMembership {
case gomatrixserverlib.Invite:
- return updateToInviteMembership(mu, add, updates)
+ return updateToInviteMembership(mu, add, updates, updater.RoomVersion())
case gomatrixserverlib.Join:
return updateToJoinMembership(mu, add, updates)
case gomatrixserverlib.Leave, gomatrixserverlib.Ban:
@@ -126,6 +126,7 @@ func updateMembership(
func updateToInviteMembership(
mu types.MembershipUpdater, add *gomatrixserverlib.Event, updates []api.OutputEvent,
+ roomVersion gomatrixserverlib.RoomVersion,
) ([]api.OutputEvent, error) {
// We may have already sent the invite to the user, either because we are
// reprocessing this event, or because the we received this invite from a
@@ -136,14 +137,14 @@ func updateToInviteMembership(
return nil, err
}
if needsSending {
- roomVersion := gomatrixserverlib.RoomVersionV1
// We notify the consumers using a special event even though we will
// notify them about the change in current state as part of the normal
// room event stream. This ensures that the consumers only have to
// consider a single stream of events when determining whether a user
// is invited, rather than having to combine multiple streams themselves.
onie := api.OutputNewInviteEvent{
- Event: (*add).Headered(roomVersion),
+ Event: (*add).Headered(roomVersion),
+ RoomVersion: roomVersion,
}
updates = append(updates, api.OutputEvent{
Type: api.OutputTypeNewInviteEvent,
diff --git a/roomserver/storage/interface.go b/roomserver/storage/interface.go
index 20db7ef7..50369d80 100644
--- a/roomserver/storage/interface.go
+++ b/roomserver/storage/interface.go
@@ -41,7 +41,7 @@ type Database interface {
GetAliasesForRoomID(ctx context.Context, roomID string) ([]string, error)
GetCreatorIDForAlias(ctx context.Context, alias string) (string, error)
RemoveRoomAlias(ctx context.Context, alias string) error
- MembershipUpdater(ctx context.Context, roomID, targetUserID string) (types.MembershipUpdater, error)
+ MembershipUpdater(ctx context.Context, roomID, targetUserID string, roomVersion gomatrixserverlib.RoomVersion) (types.MembershipUpdater, error)
GetMembership(ctx context.Context, roomNID types.RoomNID, requestSenderUserID string) (membershipEventNID types.EventNID, stillInRoom bool, err error)
GetMembershipEventNIDsForRoom(ctx context.Context, roomNID types.RoomNID, joinOnly bool) ([]types.EventNID, error)
EventsFromIDs(ctx context.Context, eventIDs []string) ([]types.Event, error)
diff --git a/roomserver/storage/postgres/storage.go b/roomserver/storage/postgres/storage.go
index 83a17b1a..c91c59eb 100644
--- a/roomserver/storage/postgres/storage.go
+++ b/roomserver/storage/postgres/storage.go
@@ -393,6 +393,12 @@ type roomRecentEventsUpdater struct {
currentStateSnapshotNID types.StateSnapshotNID
}
+// RoomVersion implements types.RoomRecentEventsUpdater
+func (u *roomRecentEventsUpdater) RoomVersion() (version gomatrixserverlib.RoomVersion) {
+ version, _ = u.d.GetRoomVersionForRoomNID(u.ctx, u.roomNID)
+ return
+}
+
// LatestEvents implements types.RoomRecentEventsUpdater
func (u *roomRecentEventsUpdater) LatestEvents() []types.StateAtEventAndReference {
return u.latestEvents
@@ -534,6 +540,7 @@ func (d *Database) StateEntriesForTuples(
// MembershipUpdater implements input.RoomEventDatabase
func (d *Database) MembershipUpdater(
ctx context.Context, roomID, targetUserID string,
+ roomVersion gomatrixserverlib.RoomVersion,
) (types.MembershipUpdater, error) {
txn, err := d.db.Begin()
if err != nil {
@@ -546,8 +553,7 @@ func (d *Database) MembershipUpdater(
}
}()
- // TODO: Room version here
- roomNID, err := d.assignRoomNID(ctx, txn, roomID, "1")
+ roomNID, err := d.assignRoomNID(ctx, txn, roomID, roomVersion)
if err != nil {
return nil, err
}
diff --git a/roomserver/storage/sqlite3/storage.go b/roomserver/storage/sqlite3/storage.go
index 6d674339..f6c692fd 100644
--- a/roomserver/storage/sqlite3/storage.go
+++ b/roomserver/storage/sqlite3/storage.go
@@ -486,6 +486,12 @@ type roomRecentEventsUpdater struct {
currentStateSnapshotNID types.StateSnapshotNID
}
+// RoomVersion implements types.RoomRecentEventsUpdater
+func (u *roomRecentEventsUpdater) RoomVersion() (version gomatrixserverlib.RoomVersion) {
+ version, _ = u.d.GetRoomVersionForRoomNID(u.ctx, u.roomNID)
+ return
+}
+
// LatestEvents implements types.RoomRecentEventsUpdater
func (u *roomRecentEventsUpdater) LatestEvents() []types.StateAtEventAndReference {
return u.latestEvents
@@ -657,6 +663,7 @@ func (d *Database) StateEntriesForTuples(
// MembershipUpdater implements input.RoomEventDatabase
func (d *Database) MembershipUpdater(
ctx context.Context, roomID, targetUserID string,
+ roomVersion gomatrixserverlib.RoomVersion,
) (updater types.MembershipUpdater, err error) {
var txn *sql.Tx
txn, err = d.db.Begin()
@@ -682,8 +689,7 @@ func (d *Database) MembershipUpdater(
}
}()
- // TODO: Room version here
- roomNID, err := d.assignRoomNID(ctx, txn, roomID, "1")
+ roomNID, err := d.assignRoomNID(ctx, txn, roomID, roomVersion)
if err != nil {
return nil, err
}
diff --git a/roomserver/types/types.go b/roomserver/types/types.go
index d5fe3276..dfc112cf 100644
--- a/roomserver/types/types.go
+++ b/roomserver/types/types.go
@@ -140,6 +140,8 @@ type StateEntryList struct {
// (On postgresql this wraps a database transaction that holds a "FOR UPDATE"
// lock on the row in the rooms table holding the latest events for the room.)
type RoomRecentEventsUpdater interface {
+ // The room version of the room.
+ RoomVersion() gomatrixserverlib.RoomVersion
// The latest event IDs and state in the room.
LatestEvents() []StateAtEventAndReference
// The event ID of the latest event written to the output log in the room.