From 50eed11a802135e1d173d7325fede28cb66c68a8 Mon Sep 17 00:00:00 2001 From: Till Faelligen Date: Sun, 15 Nov 2020 12:25:00 +0100 Subject: [PATCH] Solve Outbound federation rejects invite response which include invalid JSON for room version 6 --- roomserver/api/perform.go | 7 +++++++ roomserver/internal/perform/perform_invite.go | 7 +++++++ 2 files changed, 14 insertions(+) diff --git a/roomserver/api/perform.go b/roomserver/api/perform.go index eda53c3e4..ca4b78030 100644 --- a/roomserver/api/perform.go +++ b/roomserver/api/perform.go @@ -56,6 +56,11 @@ func (p *PerformError) JSONResponse() util.JSONResponse { // TODO: Should we assert this is in fact JSON? E.g gjson parse? JSON: json.RawMessage(p.Msg), } + case PerformErrCanonicalJSON: + return util.JSONResponse{ + Code: http.StatusBadRequest, + JSON: jsonerror.BadJSON(p.Msg), + } default: return util.ErrorResponse(p) } @@ -72,6 +77,8 @@ const ( PerformErrorNoOperation PerformErrorCode = 4 // PerformErrRemote means that the request failed and the PerformError.Msg is the raw remote JSON error response PerformErrRemote PerformErrorCode = 5 + // PerformErrCanonicalJSON means that the request failed due to invalid json + PerformErrCanonicalJSON PerformErrorCode = 6 ) type PerformJoinRequest struct { diff --git a/roomserver/internal/perform/perform_invite.go b/roomserver/internal/perform/perform_invite.go index 0630ed455..8d6350a70 100644 --- a/roomserver/internal/perform/perform_invite.go +++ b/roomserver/internal/perform/perform_invite.go @@ -17,6 +17,7 @@ package perform import ( "context" "fmt" + "strings" federationSenderAPI "github.com/matrix-org/dendrite/federationsender/api" "github.com/matrix-org/dendrite/internal/config" @@ -158,6 +159,12 @@ func (r *Inviter) PerformInvite( Msg: err.Error(), Code: api.PerformErrorNotAllowed, } + + if strings.Contains(err.Error(), "value is outside of safe range") { + log.Debug("setting error to PerformErrCanonicalJSON") + res.Error.Code = api.PerformErrCanonicalJSON + } + log.WithError(err).WithField("event_id", event.EventID()).Error("r.FSAPI.PerformInvite failed") return nil, nil }