aboutsummaryrefslogtreecommitdiff
path: root/roomserver/internal/perform
diff options
context:
space:
mode:
authorNeil Alexander <neilalexander@users.noreply.github.com>2022-06-29 15:29:39 +0100
committerGitHub <noreply@github.com>2022-06-29 15:29:39 +0100
commit519bc1124b051273019aae9b11617ebd796e962f (patch)
tree63445e1384d880e2ab94a1847f6a11553f822547 /roomserver/internal/perform
parent2dea466685d0d4ab74d4cbd84af16b621d1269b3 (diff)
Add `evacuateUser` endpoint, use it when deactivating accounts (#2545)
* Add `evacuateUser` endpoint, use it when deactivating accounts * Populate the API * Clean up user devices when deactivating * Include invites, delete pushers
Diffstat (limited to 'roomserver/internal/perform')
-rw-r--r--roomserver/internal/perform/perform_admin.go70
1 files changed, 70 insertions, 0 deletions
diff --git a/roomserver/internal/perform/perform_admin.go b/roomserver/internal/perform/perform_admin.go
index 2de6477c..d3fb7109 100644
--- a/roomserver/internal/perform/perform_admin.go
+++ b/roomserver/internal/perform/perform_admin.go
@@ -16,6 +16,7 @@ package perform
import (
"context"
+ "database/sql"
"encoding/json"
"fmt"
"time"
@@ -34,6 +35,7 @@ type Admin struct {
Cfg *config.RoomServer
Queryer *query.Queryer
Inputer *input.Inputer
+ Leaver *Leaver
}
// PerformEvacuateRoom will remove all local users from the given room.
@@ -160,3 +162,71 @@ func (r *Admin) PerformAdminEvacuateRoom(
inputRes := &api.InputRoomEventsResponse{}
r.Inputer.InputRoomEvents(ctx, inputReq, inputRes)
}
+
+func (r *Admin) PerformAdminEvacuateUser(
+ ctx context.Context,
+ req *api.PerformAdminEvacuateUserRequest,
+ res *api.PerformAdminEvacuateUserResponse,
+) {
+ _, domain, err := gomatrixserverlib.SplitID('@', req.UserID)
+ if err != nil {
+ res.Error = &api.PerformError{
+ Code: api.PerformErrorBadRequest,
+ Msg: fmt.Sprintf("Malformed user ID: %s", err),
+ }
+ return
+ }
+ if domain != r.Cfg.Matrix.ServerName {
+ res.Error = &api.PerformError{
+ Code: api.PerformErrorBadRequest,
+ Msg: "Can only evacuate local users using this endpoint",
+ }
+ return
+ }
+
+ roomIDs, err := r.DB.GetRoomsByMembership(ctx, req.UserID, gomatrixserverlib.Join)
+ if err != nil && err != sql.ErrNoRows {
+ res.Error = &api.PerformError{
+ Code: api.PerformErrorBadRequest,
+ Msg: fmt.Sprintf("r.DB.GetRoomsByMembership: %s", err),
+ }
+ return
+ }
+
+ inviteRoomIDs, err := r.DB.GetRoomsByMembership(ctx, req.UserID, gomatrixserverlib.Invite)
+ if err != nil && err != sql.ErrNoRows {
+ res.Error = &api.PerformError{
+ Code: api.PerformErrorBadRequest,
+ Msg: fmt.Sprintf("r.DB.GetRoomsByMembership: %s", err),
+ }
+ return
+ }
+
+ for _, roomID := range append(roomIDs, inviteRoomIDs...) {
+ leaveReq := &api.PerformLeaveRequest{
+ RoomID: roomID,
+ UserID: req.UserID,
+ }
+ leaveRes := &api.PerformLeaveResponse{}
+ outputEvents, err := r.Leaver.PerformLeave(ctx, leaveReq, leaveRes)
+ if err != nil {
+ res.Error = &api.PerformError{
+ Code: api.PerformErrorBadRequest,
+ Msg: fmt.Sprintf("r.Leaver.PerformLeave: %s", err),
+ }
+ return
+ }
+ if len(outputEvents) == 0 {
+ continue
+ }
+ if err := r.Inputer.WriteOutputEvents(roomID, outputEvents); err != nil {
+ res.Error = &api.PerformError{
+ Code: api.PerformErrorBadRequest,
+ Msg: fmt.Sprintf("r.Inputer.WriteOutputEvents: %s", err),
+ }
+ return
+ }
+
+ res.Affected = append(res.Affected, roomID)
+ }
+}