SetVisibility implements PUT /directory/list/room/{roomID} TODO: Allow admin users to edit the room visibility
( req *http.Request, rsAPI roomserverAPI.ClientRoomserverAPI, dev *userapi.Device, roomID string, )
| 265 | // SetVisibility implements PUT /directory/list/room/{roomID} |
| 266 | // TODO: Allow admin users to edit the room visibility |
| 267 | func SetVisibility( |
| 268 | req *http.Request, rsAPI roomserverAPI.ClientRoomserverAPI, dev *userapi.Device, |
| 269 | roomID string, |
| 270 | ) util.JSONResponse { |
| 271 | resErr := checkMemberInRoom(req.Context(), rsAPI, dev.UserID, roomID) |
| 272 | if resErr != nil { |
| 273 | return *resErr |
| 274 | } |
| 275 | |
| 276 | queryEventsReq := roomserverAPI.QueryLatestEventsAndStateRequest{ |
| 277 | RoomID: roomID, |
| 278 | StateToFetch: []gomatrixserverlib.StateKeyTuple{{ |
| 279 | EventType: gomatrixserverlib.MRoomPowerLevels, |
| 280 | StateKey: "", |
| 281 | }}, |
| 282 | } |
| 283 | var queryEventsRes roomserverAPI.QueryLatestEventsAndStateResponse |
| 284 | err := rsAPI.QueryLatestEventsAndState(req.Context(), &queryEventsReq, &queryEventsRes) |
| 285 | if err != nil || len(queryEventsRes.StateEvents) == 0 { |
| 286 | util.GetLogger(req.Context()).WithError(err).Error("could not query events from room") |
| 287 | return jsonerror.InternalServerError() |
| 288 | } |
| 289 | |
| 290 | // NOTSPEC: Check if the user's power is greater than power required to change m.room.canonical_alias event |
| 291 | power, _ := gomatrixserverlib.NewPowerLevelContentFromEvent(queryEventsRes.StateEvents[0].Event) |
| 292 | if power.UserLevel(dev.UserID) < power.EventLevel(gomatrixserverlib.MRoomCanonicalAlias, true) { |
| 293 | return util.JSONResponse{ |
| 294 | Code: http.StatusForbidden, |
| 295 | JSON: jsonerror.Forbidden("userID doesn't have power level to change visibility"), |
| 296 | } |
| 297 | } |
| 298 | |
| 299 | var v roomVisibility |
| 300 | if reqErr := httputil.UnmarshalJSONRequest(req, &v); reqErr != nil { |
| 301 | return *reqErr |
| 302 | } |
| 303 | |
| 304 | var publishRes roomserverAPI.PerformPublishResponse |
| 305 | rsAPI.PerformPublish(req.Context(), &roomserverAPI.PerformPublishRequest{ |
| 306 | RoomID: roomID, |
| 307 | Visibility: v.Visibility, |
| 308 | }, &publishRes) |
| 309 | if publishRes.Error != nil { |
| 310 | util.GetLogger(req.Context()).WithError(publishRes.Error).Error("PerformPublish failed") |
| 311 | return publishRes.Error.JSONResponse() |
| 312 | } |
| 313 | |
| 314 | return util.JSONResponse{ |
| 315 | Code: http.StatusOK, |
| 316 | JSON: struct{}{}, |
| 317 | } |
| 318 | } |
no test coverage detected