Remove federation queries for event and missing states

Signed-off-by: Alex Chen <minecnly@gmail.com>
This commit is contained in:
Cnly 2019-07-18 20:18:52 +08:00
parent b982eb2095
commit 3a6022e957

View file

@ -58,32 +58,15 @@ func GetEvent(
return httputil.LogThenError(req, err) return httputil.LogThenError(req, err)
} }
var requestedEvent gomatrixserverlib.Event
if len(eventsResp.Events) == 0 { if len(eventsResp.Events) == 0 {
// Event not found locally. Do a federation query in hope of getting // Event not found locally
// the event from another server.
// TODO: May need a better way to determine which server to query
_, domain, err := gomatrixserverlib.SplitID('!', roomID)
if err != nil {
return httputil.LogThenError(req, err)
}
txnResp, err := federation.GetEvent(req.Context(), domain, eventID)
if err != nil {
return httputil.LogThenError(req, err)
}
if len(txnResp.PDUs) == 0 {
return util.JSONResponse{ return util.JSONResponse{
Code: http.StatusNotFound, Code: http.StatusNotFound,
JSON: jsonerror.NotFound("The event was not found or you do not have permission to read this event."), JSON: jsonerror.NotFound("The event was not found or you do not have permission to read this event."),
} }
} }
requestedEvent = txnResp.PDUs[0] requestedEvent := eventsResp.Events[0]
} else {
requestedEvent = eventsResp.Events[0]
}
r := getEventRequest{ r := getEventRequest{
req: req, req: req,
@ -108,51 +91,20 @@ func GetEvent(
} }
if !stateResp.RoomExists { if !stateResp.RoomExists {
util.GetLogger(req.Context()).Errorf("Room not found for event %s", r.requestedEvent.EventID()) util.GetLogger(req.Context()).Errorf("Expected to find room for event %s but failed", r.requestedEvent.EventID())
return jsonerror.InternalServerError() return jsonerror.InternalServerError()
} }
if !stateResp.PrevEventsExist { if !stateResp.PrevEventsExist {
// Missing some events locally so stateResp.StateEvents will be unavailable. // Missing some events locally; stateResp.StateEvents unavailable.
// Do a federation query in hope of getting the state events needed.
return r.proceedWithMissingState()
}
return r.proceedWithStateEvents(stateResp.StateEvents)
}
// proceedWithMissingState tries to proceed by fetching the missing state over
// federation.
// Note: It's not guaranteed that the server(s) we query have the state events.
func (r *getEventRequest) proceedWithMissingState() util.JSONResponse {
_, domain, err := gomatrixserverlib.SplitID('!', r.roomID)
if err != nil {
return httputil.LogThenError(r.req, err)
}
if domain == r.cfg.Matrix.ServerName {
// Don't send a federation query to self
return util.JSONResponse{ return util.JSONResponse{
Code: http.StatusNotFound, Code: http.StatusNotFound,
JSON: jsonerror.NotFound("The event was not found or you do not have permission to read this event."), JSON: jsonerror.NotFound("The event was not found or you do not have permission to read this event."),
} }
} }
state, err := r.federation.LookupState(r.req.Context(), domain, r.roomID, r.eventID)
if err != nil {
return httputil.LogThenError(r.req, err)
}
if err := state.Check(r.req.Context(), r.keyRing); err != nil {
return httputil.LogThenError(r.req, err)
}
return r.proceedWithStateEvents(state.StateEvents)
}
func (r *getEventRequest) proceedWithStateEvents(stateEvents []gomatrixserverlib.Event) util.JSONResponse {
allowed := false allowed := false
for _, stateEvent := range stateEvents { for _, stateEvent := range stateResp.StateEvents {
if stateEvent.StateKeyEquals(r.device.UserID) { if stateEvent.StateKeyEquals(r.device.UserID) {
membership, err := stateEvent.Membership() membership, err := stateEvent.Membership()
if err == nil && membership == "join" { if err == nil && membership == "join" {