aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--publicroomsapi/directory/directory.go47
-rw-r--r--publicroomsapi/publicroomsapi.go2
-rw-r--r--publicroomsapi/routing/routing.go6
3 files changed, 50 insertions, 5 deletions
diff --git a/publicroomsapi/directory/directory.go b/publicroomsapi/directory/directory.go
index e56fc6cc..1e305f3c 100644
--- a/publicroomsapi/directory/directory.go
+++ b/publicroomsapi/directory/directory.go
@@ -17,6 +17,9 @@ package directory
import (
"net/http"
+ "github.com/matrix-org/dendrite/clientapi/auth/authtypes"
+ "github.com/matrix-org/dendrite/roomserver/api"
+
"github.com/matrix-org/dendrite/clientapi/httputil"
"github.com/matrix-org/dendrite/clientapi/jsonerror"
"github.com/matrix-org/dendrite/publicroomsapi/storage"
@@ -54,11 +57,51 @@ func GetVisibility(
}
// SetVisibility implements PUT /directory/list/room/{roomID}
-// TODO: Check if user has the power level to edit the room visibility
+// TODO: Allow admin users to edit the room visibility
func SetVisibility(
- req *http.Request, publicRoomsDatabase storage.Database,
+ req *http.Request, publicRoomsDatabase storage.Database, queryAPI api.RoomserverQueryAPI, dev *authtypes.Device,
roomID string,
) util.JSONResponse {
+ queryMembershipReq := api.QueryMembershipForUserRequest{
+ RoomID: roomID,
+ UserID: dev.UserID,
+ }
+ var queryMembershipRes api.QueryMembershipForUserResponse
+ err := queryAPI.QueryMembershipForUser(req.Context(), &queryMembershipReq, &queryMembershipRes)
+ if err != nil {
+ util.GetLogger(req.Context()).WithError(err).Error("could not query membership for user")
+ return jsonerror.InternalServerError()
+ }
+ // Check if user id is in room
+ if !queryMembershipRes.IsInRoom {
+ return util.JSONResponse{
+ Code: http.StatusForbidden,
+ JSON: jsonerror.Forbidden("user does not belong to room"),
+ }
+ }
+ queryEventsReq := api.QueryLatestEventsAndStateRequest{
+ RoomID: roomID,
+ StateToFetch: []gomatrixserverlib.StateKeyTuple{{
+ EventType: gomatrixserverlib.MRoomPowerLevels,
+ StateKey: "",
+ }},
+ }
+ var queryEventsRes api.QueryLatestEventsAndStateResponse
+ err = queryAPI.QueryLatestEventsAndState(req.Context(), &queryEventsReq, &queryEventsRes)
+ if err != nil || len(queryEventsRes.StateEvents) == 0 {
+ util.GetLogger(req.Context()).WithError(err).Error("could not query events from room")
+ return jsonerror.InternalServerError()
+ }
+ power, _ := gomatrixserverlib.NewPowerLevelContentFromEvent(queryEventsRes.StateEvents[0].Event)
+
+ // Check if the user's power is greater than power required to change m.room.aliases event
+ if power.UserLevel(dev.UserID) < power.EventLevel(gomatrixserverlib.MRoomAliases, true) {
+ return util.JSONResponse{
+ Code: http.StatusForbidden,
+ JSON: jsonerror.Forbidden("userID doesn't have power level to change visibility"),
+ }
+ }
+
var v roomVisibility
if reqErr := httputil.UnmarshalJSONRequest(req, &v); reqErr != nil {
return *reqErr
diff --git a/publicroomsapi/publicroomsapi.go b/publicroomsapi/publicroomsapi.go
index 399c0cc5..4d8a2601 100644
--- a/publicroomsapi/publicroomsapi.go
+++ b/publicroomsapi/publicroomsapi.go
@@ -47,5 +47,5 @@ func SetupPublicRoomsAPIComponent(
logrus.WithError(err).Panic("failed to start public rooms server consumer")
}
- routing.Setup(base.APIMux, deviceDB, publicRoomsDB, fedClient, extRoomsProvider)
+ routing.Setup(base.APIMux, deviceDB, publicRoomsDB, rsQueryAPI, fedClient, extRoomsProvider)
}
diff --git a/publicroomsapi/routing/routing.go b/publicroomsapi/routing/routing.go
index 321b61b8..da5ea90d 100644
--- a/publicroomsapi/routing/routing.go
+++ b/publicroomsapi/routing/routing.go
@@ -17,6 +17,8 @@ package routing
import (
"net/http"
+ "github.com/matrix-org/dendrite/roomserver/api"
+
"github.com/gorilla/mux"
"github.com/matrix-org/dendrite/clientapi/auth"
"github.com/matrix-org/dendrite/clientapi/auth/authtypes"
@@ -37,7 +39,7 @@ const pathPrefixR0 = "/_matrix/client/r0"
// applied:
// nolint: gocyclo
func Setup(
- apiMux *mux.Router, deviceDB devices.Database, publicRoomsDB storage.Database,
+ apiMux *mux.Router, deviceDB devices.Database, publicRoomsDB storage.Database, queryAPI api.RoomserverQueryAPI,
fedClient *gomatrixserverlib.FederationClient, extRoomsProvider types.ExternalPublicRoomsProvider,
) {
r0mux := apiMux.PathPrefix(pathPrefixR0).Subrouter()
@@ -64,7 +66,7 @@ func Setup(
if err != nil {
return util.ErrorResponse(err)
}
- return directory.SetVisibility(req, publicRoomsDB, vars["roomID"])
+ return directory.SetVisibility(req, publicRoomsDB, queryAPI, device, vars["roomID"])
}),
).Methods(http.MethodPut, http.MethodOptions)
r0mux.Handle("/publicRooms",