aboutsummaryrefslogtreecommitdiff
path: root/syncapi/routing
diff options
context:
space:
mode:
authorS7evinK <tfaelligen@gmail.com>2020-11-05 11:19:23 +0100
committerGitHub <noreply@github.com>2020-11-05 10:19:23 +0000
commiteccd0d2c1b8bd4b921bafca4585aa09d32ae561f (patch)
tree6a37ea3d0d67785cc9a51b132b25158c941dc899 /syncapi/routing
parent2ce2112ddb783ab9a589f2897dc60d24c68e34f0 (diff)
Implement forgetting about rooms (#1572)
* Add basic storage methods * Add internal api handler * Add check for forgotten room * Add /rooms/{roomID}/forget endpoint * Add missing rsAPI method * Remove unused parameters * Add passing tests Signed-off-by: Till Faelligen <tfaelligen@gmail.com> * Add missing file * Add postgres migration * Add sqlite migration * Use Forgetter to forget room * Remove empty line * Update HTTP status codes It looks like the spec calls for these to be 400, rather than 403: https://matrix.org/docs/spec/client_server/r0.6.1#post-matrix-client-r0-rooms-roomid-forget Co-authored-by: Neil Alexander <neilalexander@users.noreply.github.com>
Diffstat (limited to 'syncapi/routing')
-rw-r--r--syncapi/routing/messages.go27
1 files changed, 27 insertions, 0 deletions
diff --git a/syncapi/routing/messages.go b/syncapi/routing/messages.go
index e5299f20..2f79ed5c 100644
--- a/syncapi/routing/messages.go
+++ b/syncapi/routing/messages.go
@@ -59,6 +59,7 @@ const defaultMessagesLimit = 10
// OnIncomingMessagesRequest implements the /messages endpoint from the
// client-server API.
// See: https://matrix.org/docs/spec/client_server/latest.html#get-matrix-client-r0-rooms-roomid-messages
+// nolint:gocyclo
func OnIncomingMessagesRequest(
req *http.Request, db storage.Database, roomID string, device *userapi.Device,
federation *gomatrixserverlib.FederationClient,
@@ -67,6 +68,19 @@ func OnIncomingMessagesRequest(
) util.JSONResponse {
var err error
+ // check if the user has already forgotten about this room
+ isForgotten, err := checkIsRoomForgotten(req.Context(), roomID, device.UserID, rsAPI)
+ if err != nil {
+ return jsonerror.InternalServerError()
+ }
+
+ if isForgotten {
+ return util.JSONResponse{
+ Code: http.StatusForbidden,
+ JSON: jsonerror.Forbidden("user already forgot about this room"),
+ }
+ }
+
// Extract parameters from the request's URL.
// Pagination tokens.
var fromStream *types.StreamingToken
@@ -182,6 +196,19 @@ func OnIncomingMessagesRequest(
}
}
+func checkIsRoomForgotten(ctx context.Context, roomID, userID string, rsAPI api.RoomserverInternalAPI) (bool, error) {
+ req := api.QueryMembershipForUserRequest{
+ RoomID: roomID,
+ UserID: userID,
+ }
+ resp := api.QueryMembershipForUserResponse{}
+ if err := rsAPI.QueryMembershipForUser(ctx, &req, &resp); err != nil {
+ return false, err
+ }
+
+ return resp.IsRoomForgotten, nil
+}
+
// retrieveEvents retrieves events from the local database for a request on
// /messages. If there's not enough events to retrieve, it asks another
// homeserver in the room for older events.