Restore PerformError on rsAPI.PerformInvite

This commit is contained in:
Neil Alexander 2020-08-14 16:02:24 +01:00
parent e502d6b6d1
commit 29d091b3a2
No known key found for this signature in database
GPG key ID: A02A2019A2BB0944
6 changed files with 61 additions and 30 deletions

View file

@ -402,15 +402,23 @@ func createRoom(
} }
} }
// Send the invite event to the roomserver. // Send the invite event to the roomserver.
if err := roomserverAPI.SendInvite( err = roomserverAPI.SendInvite(
req.Context(), rsAPI, req.Context(), rsAPI,
inviteEvent.Headered(roomVersion), inviteEvent.Headered(roomVersion),
strippedState, // invite room state strippedState, // invite room state
cfg.Matrix.ServerName, // send as server cfg.Matrix.ServerName, // send as server
nil, // transaction ID nil, // transaction ID
); err != nil { )
util.GetLogger(req.Context()).WithError(err).Error("SendInvite failed") switch e := err.(type) {
return jsonerror.InternalServerError() case *roomserverAPI.PerformError:
return e.JSONResponse()
case nil:
default:
util.GetLogger(req.Context()).WithError(err).Error("roomserverAPI.SendInvite failed")
return util.JSONResponse{
Code: http.StatusInternalServerError,
JSON: jsonerror.InternalServerError(),
}
} }
} }

View file

@ -221,17 +221,21 @@ func SendInvite(
cfg.Matrix.ServerName, cfg.Matrix.ServerName,
nil, nil,
) )
if err != nil { switch e := err.(type) {
util.GetLogger(req.Context()).WithError(err).Error("roomserverAPI.SendInvite failed") case *roomserverAPI.PerformError:
return util.JSONResponse{ return e.JSONResponse()
Code: http.StatusForbidden, case nil:
JSON: jsonerror.Forbidden(err.Error()),
}
}
return util.JSONResponse{ return util.JSONResponse{
Code: http.StatusOK, Code: http.StatusOK,
JSON: struct{}{}, JSON: struct{}{},
} }
default:
util.GetLogger(req.Context()).WithError(err).Error("roomserverAPI.SendInvite failed")
return util.JSONResponse{
Code: http.StatusInternalServerError,
JSON: jsonerror.InternalServerError(),
}
}
} }
func buildMembershipEvent( func buildMembershipEvent(

View file

@ -143,17 +143,24 @@ func processInvite(
) )
// Add the invite event to the roomserver. // Add the invite event to the roomserver.
if err := api.SendInvite( err = api.SendInvite(
ctx, rsAPI, signedEvent.Headered(roomVer), strippedState, api.DoNotSendToOtherServers, nil, ctx, rsAPI, signedEvent.Headered(roomVer), strippedState, api.DoNotSendToOtherServers, nil,
); err != nil { )
util.GetLogger(ctx).WithError(err).Error("producer.SendInvite failed") switch e := err.(type) {
return jsonerror.InternalServerError() case *api.PerformError:
} return e.JSONResponse()
case nil:
// Return the signed event to the originating server, it should then tell // Return the signed event to the originating server, it should then tell
// the other servers in the room that we have been invited. // the other servers in the room that we have been invited.
return util.JSONResponse{ return util.JSONResponse{
Code: http.StatusOK, Code: http.StatusOK,
JSON: gomatrixserverlib.RespInviteV2{Event: signedEvent}, JSON: gomatrixserverlib.RespInviteV2{Event: signedEvent},
} }
default:
util.GetLogger(ctx).WithError(err).Error("api.SendInvite failed")
return util.JSONResponse{
Code: http.StatusInternalServerError,
JSON: jsonerror.InternalServerError(),
}
}
} }

View file

@ -105,6 +105,7 @@ type PerformInviteRequest struct {
} }
type PerformInviteResponse struct { type PerformInviteResponse struct {
Error *PerformError `json:"error"`
} }
// PerformBackfillRequest is a request to PerformBackfill. // PerformBackfillRequest is a request to PerformBackfill.

View file

@ -112,6 +112,9 @@ func SendInvite(
} }
response := &PerformInviteResponse{} response := &PerformInviteResponse{}
if err := rsAPI.PerformInvite(ctx, request, response); err != nil { if err := rsAPI.PerformInvite(ctx, request, response); err != nil {
if response.Error != nil {
return response.Error
}
return fmt.Errorf("rsAPI.PerformInvite: %w", err) return fmt.Errorf("rsAPI.PerformInvite: %w", err)
} }

View file

@ -2,7 +2,6 @@ package internal
import ( import (
"context" "context"
"errors"
"fmt" "fmt"
federationSenderAPI "github.com/matrix-org/dendrite/federationsender/api" federationSenderAPI "github.com/matrix-org/dendrite/federationsender/api"
@ -48,17 +47,17 @@ func (r *RoomserverInternalAPI) PerformInvite(
} }
if len(inviteState) == 0 { if len(inviteState) == 0 {
if err := event.SetUnsignedField("invite_room_state", struct{}{}); err != nil { if err := event.SetUnsignedField("invite_room_state", struct{}{}); err != nil {
return err return fmt.Errorf("event.SetUnsignedField: %w", err)
} }
} else { } else {
if err := event.SetUnsignedField("invite_room_state", inviteState); err != nil { if err := event.SetUnsignedField("invite_room_state", inviteState); err != nil {
return err return fmt.Errorf("event.SetUnsignedField: %w", err)
} }
} }
updater, err := r.DB.MembershipUpdater(ctx, roomID, targetUserID, isTargetLocal, req.RoomVersion) updater, err := r.DB.MembershipUpdater(ctx, roomID, targetUserID, isTargetLocal, req.RoomVersion)
if err != nil { if err != nil {
return err return fmt.Errorf("r.DB.MembershipUpdater: %w", err)
} }
succeeded := false succeeded := false
defer func() { defer func() {
@ -96,7 +95,11 @@ func (r *RoomserverInternalAPI) PerformInvite(
// For now we will implement option 2. Since in the abesence of a retry // For now we will implement option 2. Since in the abesence of a retry
// mechanism it will be equivalent to option 1, and we don't have a // mechanism it will be equivalent to option 1, and we don't have a
// signalling mechanism to implement option 3. // signalling mechanism to implement option 3.
return errors.New("The user is already in the room") res.Error = &api.PerformError{
Code: api.PerformErrorNoOperation,
Msg: "User is already joined to room",
}
return res.Error
} }
if isOriginLocal { if isOriginLocal {
@ -108,10 +111,11 @@ func (r *RoomserverInternalAPI) PerformInvite(
"processInviteEvent.checkAuthEvents failed for event", "processInviteEvent.checkAuthEvents failed for event",
) )
if _, ok := err.(*gomatrixserverlib.NotAllowed); ok { if _, ok := err.(*gomatrixserverlib.NotAllowed); ok {
return &api.PerformError{ res.Error = &api.PerformError{
Msg: err.Error(), Msg: err.Error(),
Code: api.PerformErrorNotAllowed, Code: api.PerformErrorNotAllowed,
} }
return fmt.Errorf("checkAuthEvents: %w", err)
} }
return err return err
} }
@ -128,6 +132,10 @@ func (r *RoomserverInternalAPI) PerformInvite(
} }
fsRes := &federationSenderAPI.PerformInviteResponse{} fsRes := &federationSenderAPI.PerformInviteResponse{}
if err = r.fsAPI.PerformInvite(ctx, fsReq, fsRes); err != nil { if err = r.fsAPI.PerformInvite(ctx, fsReq, fsRes); err != nil {
res.Error = &api.PerformError{
Msg: err.Error(),
Code: api.PerformErrorNoOperation,
}
return fmt.Errorf("r.fsAPI.PerformInvite: %w", err) return fmt.Errorf("r.fsAPI.PerformInvite: %w", err)
} }
event = fsRes.SignedEvent event = fsRes.SignedEvent
@ -137,11 +145,11 @@ func (r *RoomserverInternalAPI) PerformInvite(
unwrapped := event.Unwrap() unwrapped := event.Unwrap()
outputUpdates, err := updateToInviteMembership(updater, &unwrapped, nil, req.Event.RoomVersion) outputUpdates, err := updateToInviteMembership(updater, &unwrapped, nil, req.Event.RoomVersion)
if err != nil { if err != nil {
return err return fmt.Errorf("updateToInviteMembership: %w", err)
} }
if err = r.WriteOutputEvents(roomID, outputUpdates); err != nil { if err = r.WriteOutputEvents(roomID, outputUpdates); err != nil {
return err return fmt.Errorf("r.WriteOutputEvents: %w", err)
} }
succeeded = true succeeded = true