aboutsummaryrefslogtreecommitdiff
path: root/clientapi
diff options
context:
space:
mode:
authorMatthew Hodgson <matthew@matrix.org>2020-09-10 14:39:18 +0100
committerGitHub <noreply@github.com>2020-09-10 14:39:18 +0100
commit39507bacc3dbfc532e0d69b42957c87f27af4c77 (patch)
tree7ad845e1b25e03e7b7d7cd2d49278fe843c2ff86 /clientapi
parent35564dd73c48b16b97cd1a972a9b9bc65ec6d7ef (diff)
Peeking via MSC2753 (#1370)
Initial implementation of MSC2753, as tested by https://github.com/matrix-org/sytest/pull/944. Doesn't yet handle unpeeks, peeked EDUs, or history viz changing during a peek - these will follow. https://github.com/matrix-org/dendrite/pull/1370 has full details.
Diffstat (limited to 'clientapi')
-rw-r--r--clientapi/routing/joinroom.go2
-rw-r--r--clientapi/routing/peekroom.go79
-rw-r--r--clientapi/routing/routing.go11
3 files changed, 91 insertions, 1 deletions
diff --git a/clientapi/routing/joinroom.go b/clientapi/routing/joinroom.go
index 6e159b2a..c1011357 100644
--- a/clientapi/routing/joinroom.go
+++ b/clientapi/routing/joinroom.go
@@ -52,7 +52,7 @@ func JoinRoomByIDOrAlias(
}
}
- // If content was provided in the request then incude that
+ // If content was provided in the request then include that
// in the request. It'll get used as a part of the membership
// event content.
_ = httputil.UnmarshalJSONRequest(req, &joinReq.Content)
diff --git a/clientapi/routing/peekroom.go b/clientapi/routing/peekroom.go
new file mode 100644
index 00000000..d96f91d0
--- /dev/null
+++ b/clientapi/routing/peekroom.go
@@ -0,0 +1,79 @@
+// Copyright 2020 New Vector Ltd
+//
+// 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"
+
+ roomserverAPI "github.com/matrix-org/dendrite/roomserver/api"
+ "github.com/matrix-org/dendrite/userapi/api"
+ "github.com/matrix-org/dendrite/userapi/storage/accounts"
+ "github.com/matrix-org/gomatrixserverlib"
+ "github.com/matrix-org/util"
+)
+
+func PeekRoomByIDOrAlias(
+ req *http.Request,
+ device *api.Device,
+ rsAPI roomserverAPI.RoomserverInternalAPI,
+ accountDB accounts.Database,
+ roomIDOrAlias string,
+) util.JSONResponse {
+ // if this is a remote roomIDOrAlias, we have to ask the roomserver (or federation sender?) to
+ // to call /peek and /state on the remote server.
+ // TODO: in future we could skip this if we know we're already participating in the room,
+ // but this is fiddly in case we stop participating in the room.
+
+ // then we create a local peek.
+ peekReq := roomserverAPI.PerformPeekRequest{
+ RoomIDOrAlias: roomIDOrAlias,
+ UserID: device.UserID,
+ DeviceID: device.ID,
+ }
+ peekRes := roomserverAPI.PerformPeekResponse{}
+
+ // Check to see if any ?server_name= query parameters were
+ // given in the request.
+ if serverNames, ok := req.URL.Query()["server_name"]; ok {
+ for _, serverName := range serverNames {
+ peekReq.ServerNames = append(
+ peekReq.ServerNames,
+ gomatrixserverlib.ServerName(serverName),
+ )
+ }
+ }
+
+ // Ask the roomserver to perform the peek.
+ rsAPI.PerformPeek(req.Context(), &peekReq, &peekRes)
+ if peekRes.Error != nil {
+ return peekRes.Error.JSONResponse()
+ }
+
+ // if this user is already joined to the room, we let them peek anyway
+ // (given they might be about to part the room, and it makes things less fiddly)
+
+ // Peeking stops if none of the devices who started peeking have been
+ // /syncing for a while, or if everyone who was peeking calls /leave
+ // (or /unpeek with a server_name param? or DELETE /peek?)
+ // on the peeked room.
+
+ return util.JSONResponse{
+ Code: http.StatusOK,
+ // TODO: Put the response struct somewhere internal.
+ JSON: struct {
+ RoomID string `json:"room_id"`
+ }{peekRes.RoomID},
+ }
+}
diff --git a/clientapi/routing/routing.go b/clientapi/routing/routing.go
index 326ef70c..999946a6 100644
--- a/clientapi/routing/routing.go
+++ b/clientapi/routing/routing.go
@@ -103,6 +103,17 @@ func Setup(
)
}),
).Methods(http.MethodPost, http.MethodOptions)
+ r0mux.Handle("/peek/{roomIDOrAlias}",
+ httputil.MakeAuthAPI(gomatrixserverlib.Peek, userAPI, func(req *http.Request, device *userapi.Device) util.JSONResponse {
+ vars, err := httputil.URLDecodeMapValues(mux.Vars(req))
+ if err != nil {
+ return util.ErrorResponse(err)
+ }
+ return PeekRoomByIDOrAlias(
+ req, device, rsAPI, accountDB, vars["roomIDOrAlias"],
+ )
+ }),
+ ).Methods(http.MethodPost, http.MethodOptions)
r0mux.Handle("/joined_rooms",
httputil.MakeAuthAPI("joined_rooms", userAPI, func(req *http.Request, device *userapi.Device) util.JSONResponse {
return GetJoinedRooms(req, device, rsAPI)