Fix sync not returning on room join (#195)

* Use BuildEvent method on room join

* Fix building the list of room members in the sync notifier

* Fix building the list of room members in the sync notifier

* Rephrase comment
main
Brendan Abolivier 2017-08-22 14:14:37 +01:00 committed by Mark Haines
parent b15ce900ab
commit 166ac9d092
2 changed files with 9 additions and 45 deletions

View File

@ -22,6 +22,7 @@ import (
"github.com/matrix-org/dendrite/clientapi/auth/authtypes" "github.com/matrix-org/dendrite/clientapi/auth/authtypes"
"github.com/matrix-org/dendrite/clientapi/auth/storage/accounts" "github.com/matrix-org/dendrite/clientapi/auth/storage/accounts"
"github.com/matrix-org/dendrite/clientapi/events"
"github.com/matrix-org/dendrite/clientapi/httputil" "github.com/matrix-org/dendrite/clientapi/httputil"
"github.com/matrix-org/dendrite/clientapi/jsonerror" "github.com/matrix-org/dendrite/clientapi/jsonerror"
"github.com/matrix-org/dendrite/clientapi/producers" "github.com/matrix-org/dendrite/clientapi/producers"
@ -168,52 +169,10 @@ func (r joinRoomReq) joinRoomUsingServers(
var eb gomatrixserverlib.EventBuilder var eb gomatrixserverlib.EventBuilder
r.writeToBuilder(&eb, roomID) r.writeToBuilder(&eb, roomID)
needed, err := gomatrixserverlib.StateNeededForEventBuilder(&eb)
if err != nil {
return httputil.LogThenError(r.req, err)
}
// Ask the roomserver for information about this room
queryReq := api.QueryLatestEventsAndStateRequest{
RoomID: roomID,
StateToFetch: needed.Tuples(),
}
var queryRes api.QueryLatestEventsAndStateResponse var queryRes api.QueryLatestEventsAndStateResponse
if queryErr := r.queryAPI.QueryLatestEventsAndState(&queryReq, &queryRes); queryErr != nil { if event, err := events.BuildEvent(&eb, r.cfg, r.queryAPI, &queryRes); err == nil {
return httputil.LogThenError(r.req, queryErr) if sendErr := r.producer.SendEvents([]gomatrixserverlib.Event{*event}, r.cfg.Matrix.ServerName); err != nil {
} return httputil.LogThenError(r.req, sendErr)
if queryRes.RoomExists {
// The room exists in the local database, so we just have to send a join
// membership event and return the room ID
// TODO: Check if the user is allowed in the room (has been invited if
// the room is invite-only)
eb.Depth = queryRes.Depth
eb.PrevEvents = queryRes.LatestEvents
authEvents := gomatrixserverlib.NewAuthEvents(nil)
for i := range queryRes.StateEvents {
authEvents.AddEvent(&queryRes.StateEvents[i])
}
refs, err := needed.AuthEventReferences(&authEvents)
if err != nil {
return httputil.LogThenError(r.req, err)
}
eb.AuthEvents = refs
now := time.Now()
eventID := fmt.Sprintf("$%s:%s", util.RandomString(16), r.cfg.Matrix.ServerName)
event, err := eb.Build(
eventID, now, r.cfg.Matrix.ServerName, r.cfg.Matrix.KeyID, r.cfg.Matrix.PrivateKey,
)
if err != nil {
return httputil.LogThenError(r.req, err)
}
if err := r.producer.SendEvents([]gomatrixserverlib.Event{event}, r.cfg.Matrix.ServerName); err != nil {
return httputil.LogThenError(r.req, err)
} }
return util.JSONResponse{ return util.JSONResponse{
@ -222,6 +181,8 @@ func (r joinRoomReq) joinRoomUsingServers(
RoomID string `json:"room_id"` RoomID string `json:"room_id"`
}{roomID}, }{roomID},
} }
} else if err != events.ErrRoomNoExists {
return httputil.LogThenError(r.req, err)
} }
if len(servers) == 0 { if len(servers) == 0 {

View File

@ -79,6 +79,9 @@ func (n *Notifier) OnNewEvent(ev *gomatrixserverlib.Event, userID string, pos ty
case "invite": case "invite":
userIDs = append(userIDs, userID) userIDs = append(userIDs, userID)
case "join": case "join":
// Manually append the new user's ID so they get notified
// along all members in the room
userIDs = append(userIDs, userID)
n.addJoinedUser(ev.RoomID(), userID) n.addJoinedUser(ev.RoomID(), userID)
case "leave": case "leave":
fallthrough fallthrough