diff options
author | Kegsay <kegan@matrix.org> | 2020-06-24 09:59:59 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-06-24 09:59:59 +0100 |
commit | 0577bfca55d1478bd1076d02f0b0623a3d3802a8 (patch) | |
tree | 05d39e8735e8ba1ef9b02c0cd7bfebe9610e9494 /roomserver | |
parent | 1f93427ed906f63925e2768120cf437e0b1e85fb (diff) |
Pass join errors through internal API boundaries (#1157)
* Pass join errors through internal API boundaries
Required for certain invite sytests. We will need to think of a
better way of handling this going forwards.
* Include m.room.avatar in stripped state; handle trailing slashes when GETing state events
* Update whitelist
* Update whitelist
Diffstat (limited to 'roomserver')
-rw-r--r-- | roomserver/api/perform.go | 16 | ||||
-rw-r--r-- | roomserver/internal/input_events.go | 3 | ||||
-rw-r--r-- | roomserver/internal/perform_join.go | 10 | ||||
-rw-r--r-- | roomserver/inthttp/server.go | 2 |
4 files changed, 30 insertions, 1 deletions
diff --git a/roomserver/api/perform.go b/roomserver/api/perform.go index 3e5cae1b..0f5394c9 100644 --- a/roomserver/api/perform.go +++ b/roomserver/api/perform.go @@ -5,6 +5,17 @@ import ( "github.com/matrix-org/util" ) +type JoinError int + +const ( + // JoinErrorNotAllowed means the user is not allowed to join this room (e.g join_rule:invite or banned) + JoinErrorNotAllowed JoinError = 1 + // JoinErrorBadRequest means the request was wrong in some way (invalid user ID, wrong server, etc) + JoinErrorBadRequest JoinError = 2 + // JoinErrorNoRoom means that the room being joined doesn't exist. + JoinErrorNoRoom JoinError = 3 +) + type PerformJoinRequest struct { RoomIDOrAlias string `json:"room_id_or_alias"` UserID string `json:"user_id"` @@ -13,7 +24,12 @@ type PerformJoinRequest struct { } type PerformJoinResponse struct { + // The room ID, populated on success. RoomID string `json:"room_id"` + // The reason why the join failed. Can be blank. + Error JoinError `json:"error"` + // Debugging description of the error. Always present on failure. + ErrMsg string `json:"err_msg"` } type PerformLeaveRequest struct { diff --git a/roomserver/internal/input_events.go b/roomserver/internal/input_events.go index 4487aea0..fe3bdf4b 100644 --- a/roomserver/internal/input_events.go +++ b/roomserver/internal/input_events.go @@ -298,9 +298,12 @@ func buildInviteStrippedState( return nil, fmt.Errorf("room %q unknown", input.Event.RoomID()) } stateWanted := []gomatrixserverlib.StateKeyTuple{} + // "If they are set on the room, at least the state for m.room.avatar, m.room.canonical_alias, m.room.join_rules, and m.room.name SHOULD be included." + // https://matrix.org/docs/spec/client_server/r0.6.0#m-room-member for _, t := range []string{ gomatrixserverlib.MRoomName, gomatrixserverlib.MRoomCanonicalAlias, gomatrixserverlib.MRoomAliases, gomatrixserverlib.MRoomJoinRules, + "m.room.avatar", } { stateWanted = append(stateWanted, gomatrixserverlib.StateKeyTuple{ EventType: t, diff --git a/roomserver/internal/perform_join.go b/roomserver/internal/perform_join.go index 1c951bb1..44f84240 100644 --- a/roomserver/internal/perform_join.go +++ b/roomserver/internal/perform_join.go @@ -2,6 +2,7 @@ package internal import ( "context" + "errors" "fmt" "strings" "time" @@ -21,9 +22,11 @@ func (r *RoomserverInternalAPI) PerformJoin( ) error { _, domain, err := gomatrixserverlib.SplitID('@', req.UserID) if err != nil { + res.Error = api.JoinErrorBadRequest return fmt.Errorf("Supplied user ID %q in incorrect format", req.UserID) } if domain != r.Cfg.Matrix.ServerName { + res.Error = api.JoinErrorBadRequest return fmt.Errorf("User %q does not belong to this homeserver", req.UserID) } if strings.HasPrefix(req.RoomIDOrAlias, "!") { @@ -32,6 +35,7 @@ func (r *RoomserverInternalAPI) PerformJoin( if strings.HasPrefix(req.RoomIDOrAlias, "#") { return r.performJoinRoomByAlias(ctx, req, res) } + res.Error = api.JoinErrorBadRequest return fmt.Errorf("Room ID or alias %q is invalid", req.RoomIDOrAlias) } @@ -99,6 +103,7 @@ func (r *RoomserverInternalAPI) performJoinRoomByID( // Get the domain part of the room ID. _, domain, err := gomatrixserverlib.SplitID('!', req.RoomIDOrAlias) if err != nil { + res.Error = api.JoinErrorBadRequest return fmt.Errorf("Room ID %q is invalid", req.RoomIDOrAlias) } req.ServerNames = append(req.ServerNames, domain) @@ -198,6 +203,10 @@ func (r *RoomserverInternalAPI) performJoinRoomByID( } inputRes := api.InputRoomEventsResponse{} if err = r.InputRoomEvents(ctx, &inputReq, &inputRes); err != nil { + var notAllowed *gomatrixserverlib.NotAllowed + if errors.As(err, ¬Allowed) { + res.Error = api.JoinErrorNotAllowed + } return fmt.Errorf("r.InputRoomEvents: %w", err) } } @@ -207,6 +216,7 @@ func (r *RoomserverInternalAPI) performJoinRoomByID( // room. If it is then there's nothing more to do - the room just // hasn't been created yet. if domain == r.Cfg.Matrix.ServerName { + res.Error = api.JoinErrorNoRoom return fmt.Errorf("Room ID %q does not exist", req.RoomIDOrAlias) } diff --git a/roomserver/inthttp/server.go b/roomserver/inthttp/server.go index 822acd15..e3b81daa 100644 --- a/roomserver/inthttp/server.go +++ b/roomserver/inthttp/server.go @@ -34,7 +34,7 @@ func AddRoutes(r api.RoomserverInternalAPI, internalAPIMux *mux.Router) { return util.MessageResponse(http.StatusBadRequest, err.Error()) } if err := r.PerformJoin(req.Context(), &request, &response); err != nil { - return util.ErrorResponse(err) + response.ErrMsg = err.Error() } return util.JSONResponse{Code: http.StatusOK, JSON: &response} }), |