mirror of
https://github.com/matrix-org/dendrite.git
synced 2025-12-16 11:23:11 -06:00
Remove federation queries for event and missing states
Signed-off-by: Alex Chen <minecnly@gmail.com>
This commit is contained in:
parent
b982eb2095
commit
3a6022e957
|
|
@ -58,33 +58,16 @@ 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.
|
return util.JSONResponse{
|
||||||
// TODO: May need a better way to determine which server to query
|
Code: http.StatusNotFound,
|
||||||
_, domain, err := gomatrixserverlib.SplitID('!', roomID)
|
JSON: jsonerror.NotFound("The event was not found or you do not have permission to read this event."),
|
||||||
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{
|
|
||||||
Code: http.StatusNotFound,
|
|
||||||
JSON: jsonerror.NotFound("The event was not found or you do not have permission to read this event."),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
requestedEvent = txnResp.PDUs[0]
|
|
||||||
} else {
|
|
||||||
requestedEvent = eventsResp.Events[0]
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
requestedEvent := eventsResp.Events[0]
|
||||||
|
|
||||||
r := getEventRequest{
|
r := getEventRequest{
|
||||||
req: req,
|
req: req,
|
||||||
device: device,
|
device: device,
|
||||||
|
|
@ -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" {
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue