// Copyright 2022 The Matrix.org Foundation C.I.C. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package routing import ( "net/http" appserviceAPI "github.com/matrix-org/dendrite/appservice/api" "github.com/matrix-org/dendrite/clientapi/httputil" "github.com/matrix-org/dendrite/clientapi/jsonerror" roomserverAPI "github.com/matrix-org/dendrite/roomserver/api" "github.com/matrix-org/dendrite/roomserver/version" "github.com/matrix-org/dendrite/setup/config" userapi "github.com/matrix-org/dendrite/userapi/api" "github.com/matrix-org/gomatrixserverlib" "github.com/matrix-org/util" ) type upgradeRoomRequest struct { NewVersion string `json:"new_version"` } type upgradeRoomResponse struct { ReplacementRoom string `json:"replacement_room"` } // UpgradeRoom implements /upgrade func UpgradeRoom( req *http.Request, device *userapi.Device, cfg *config.ClientAPI, roomID string, profileAPI userapi.UserProfileAPI, rsAPI roomserverAPI.RoomserverInternalAPI, asAPI appserviceAPI.AppServiceQueryAPI, ) util.JSONResponse { var r upgradeRoomRequest if rErr := httputil.UnmarshalJSONRequest(req, &r); rErr != nil { return *rErr } // Validate that the room version is supported if _, err := version.SupportedRoomVersion(gomatrixserverlib.RoomVersion(r.NewVersion)); err != nil { return util.JSONResponse{ Code: http.StatusBadRequest, JSON: jsonerror.UnsupportedRoomVersion("This server does not support that room version"), } } upgradeReq := roomserverAPI.PerformRoomUpgradeRequest{ UserID: device.UserID, RoomID: roomID, RoomVersion: gomatrixserverlib.RoomVersion(r.NewVersion), } upgradeResp := roomserverAPI.PerformRoomUpgradeResponse{} rsAPI.PerformRoomUpgrade(req.Context(), &upgradeReq, &upgradeResp) if upgradeResp.Error != nil { if upgradeResp.Error.Code == roomserverAPI.PerformErrorNoRoom { return util.JSONResponse{ Code: http.StatusNotFound, JSON: jsonerror.NotFound("Room does not exist"), } } else if upgradeResp.Error.Code == roomserverAPI.PerformErrorNotAllowed { return util.JSONResponse{ Code: http.StatusForbidden, JSON: jsonerror.Forbidden(upgradeResp.Error.Msg), } } else { return jsonerror.InternalServerError() } } return util.JSONResponse{ Code: http.StatusOK, JSON: upgradeRoomResponse{ ReplacementRoom: upgradeResp.NewRoomID, }, } }