aboutsummaryrefslogtreecommitdiff
path: root/clientapi/routing
diff options
context:
space:
mode:
authorTill <2353100+S7evinK@users.noreply.github.com>2023-06-28 20:29:49 +0200
committerGitHub <noreply@github.com>2023-06-28 20:29:49 +0200
commit23cd7877a14bca5315467591cd47a7d51aec22ce (patch)
tree8176360a4366e7b4670839b6581b7ff728599a02 /clientapi/routing
parent4722f12fab65f3247cd253825d86206bfbfc6f95 (diff)
Add `MXIDMapping` for pseudoID rooms (#3112)
Add `MXIDMapping` on membership events when creating/joining rooms.
Diffstat (limited to 'clientapi/routing')
-rw-r--r--clientapi/routing/membership.go18
-rw-r--r--clientapi/routing/profile.go20
-rw-r--r--clientapi/routing/redaction.go4
-rw-r--r--clientapi/routing/sendevent.go53
-rw-r--r--clientapi/routing/server_notices.go4
5 files changed, 68 insertions, 31 deletions
diff --git a/clientapi/routing/membership.go b/clientapi/routing/membership.go
index bafc37b6..60b120b9 100644
--- a/clientapi/routing/membership.go
+++ b/clientapi/routing/membership.go
@@ -22,10 +22,6 @@ import (
"time"
"github.com/getsentry/sentry-go"
- "github.com/matrix-org/gomatrixserverlib"
- "github.com/matrix-org/gomatrixserverlib/fclient"
- "github.com/matrix-org/gomatrixserverlib/spec"
-
appserviceAPI "github.com/matrix-org/dendrite/appservice/api"
"github.com/matrix-org/dendrite/clientapi/auth/authtypes"
"github.com/matrix-org/dendrite/clientapi/httputil"
@@ -36,6 +32,9 @@ import (
"github.com/matrix-org/dendrite/roomserver/types"
"github.com/matrix-org/dendrite/setup/config"
userapi "github.com/matrix-org/dendrite/userapi/api"
+ "github.com/matrix-org/gomatrixserverlib"
+ "github.com/matrix-org/gomatrixserverlib/fclient"
+ "github.com/matrix-org/gomatrixserverlib/spec"
"github.com/matrix-org/util"
)
@@ -433,11 +432,6 @@ func buildMembershipEvent(
return nil, err
}
- identity, err := cfg.Matrix.SigningIdentityFor(device.UserDomain())
- if err != nil {
- return nil, err
- }
-
userID, err := spec.NewUserID(device.UserID, true)
if err != nil {
return nil, err
@@ -459,6 +453,12 @@ func buildMembershipEvent(
if err != nil {
return nil, err
}
+
+ identity, err := rsAPI.SigningIdentityFor(ctx, *validRoomID, *userID)
+ if err != nil {
+ return nil, err
+ }
+
return buildMembershipEventDirect(ctx, targetSenderID, reason, profile.DisplayName, profile.AvatarURL,
senderID, device.UserDomain(), membership, roomID, isDirect, identity.KeyID, identity.PrivateKey, evTime, rsAPI)
}
diff --git a/clientapi/routing/profile.go b/clientapi/routing/profile.go
index c89ece41..35da15e0 100644
--- a/clientapi/routing/profile.go
+++ b/clientapi/routing/profile.go
@@ -145,7 +145,7 @@ func SetAvatarURL(
}
}
- response, err := updateProfile(req.Context(), rsAPI, device, profile, userID, cfg, evTime)
+ response, err := updateProfile(req.Context(), rsAPI, device, profile, userID, evTime)
if err != nil {
return response
}
@@ -234,7 +234,7 @@ func SetDisplayName(
}
}
- response, err := updateProfile(req.Context(), rsAPI, device, profile, userID, cfg, evTime)
+ response, err := updateProfile(req.Context(), rsAPI, device, profile, userID, evTime)
if err != nil {
return response
}
@@ -248,7 +248,7 @@ func SetDisplayName(
func updateProfile(
ctx context.Context, rsAPI api.ClientRoomserverAPI, device *userapi.Device,
profile *authtypes.Profile,
- userID string, cfg *config.ClientAPI, evTime time.Time,
+ userID string, evTime time.Time,
) (util.JSONResponse, error) {
var res api.QueryRoomsForUserResponse
err := rsAPI.QueryRoomsForUser(ctx, &api.QueryRoomsForUserRequest{
@@ -273,7 +273,7 @@ func updateProfile(
}
events, err := buildMembershipEvents(
- ctx, device, res.RoomIDs, *profile, userID, cfg, evTime, rsAPI,
+ ctx, res.RoomIDs, *profile, userID, evTime, rsAPI,
)
switch e := err.(type) {
case nil:
@@ -344,9 +344,8 @@ func getProfile(
func buildMembershipEvents(
ctx context.Context,
- device *userapi.Device,
roomIDs []string,
- newProfile authtypes.Profile, userID string, cfg *config.ClientAPI,
+ newProfile authtypes.Profile, userID string,
evTime time.Time, rsAPI api.ClientRoomserverAPI,
) ([]*types.HeaderedEvent, error) {
evs := []*types.HeaderedEvent{}
@@ -383,12 +382,17 @@ func buildMembershipEvents(
return nil, err
}
- identity, err := cfg.Matrix.SigningIdentityFor(device.UserDomain())
+ user, err := spec.NewUserID(userID, true)
if err != nil {
return nil, err
}
- event, err := eventutil.QueryAndBuildEvent(ctx, &proto, identity, evTime, rsAPI, nil)
+ identity, err := rsAPI.SigningIdentityFor(ctx, *validRoomID, *user)
+ if err != nil {
+ return nil, err
+ }
+
+ event, err := eventutil.QueryAndBuildEvent(ctx, &proto, &identity, evTime, rsAPI, nil)
if err != nil {
return nil, err
}
diff --git a/clientapi/routing/redaction.go b/clientapi/routing/redaction.go
index 42f02939..1b9a5a81 100644
--- a/clientapi/routing/redaction.go
+++ b/clientapi/routing/redaction.go
@@ -150,7 +150,7 @@ func SendRedaction(
}
}
- identity, err := cfg.Matrix.SigningIdentityFor(device.UserDomain())
+ identity, err := rsAPI.SigningIdentityFor(req.Context(), *validRoomID, *deviceUserID)
if err != nil {
return util.JSONResponse{
Code: http.StatusInternalServerError,
@@ -159,7 +159,7 @@ func SendRedaction(
}
var queryRes roomserverAPI.QueryLatestEventsAndStateResponse
- e, err := eventutil.QueryAndBuildEvent(req.Context(), &proto, identity, time.Now(), rsAPI, &queryRes)
+ e, err := eventutil.QueryAndBuildEvent(req.Context(), &proto, &identity, time.Now(), rsAPI, &queryRes)
if errors.Is(err, eventutil.ErrRoomNoExists{}) {
return util.JSONResponse{
Code: http.StatusNotFound,
diff --git a/clientapi/routing/sendevent.go b/clientapi/routing/sendevent.go
index d51a570d..41a3793a 100644
--- a/clientapi/routing/sendevent.go
+++ b/clientapi/routing/sendevent.go
@@ -23,12 +23,6 @@ import (
"sync"
"time"
- "github.com/matrix-org/gomatrixserverlib"
- "github.com/matrix-org/gomatrixserverlib/spec"
- "github.com/matrix-org/util"
- "github.com/prometheus/client_golang/prometheus"
- "github.com/sirupsen/logrus"
-
"github.com/matrix-org/dendrite/clientapi/httputil"
"github.com/matrix-org/dendrite/internal/eventutil"
"github.com/matrix-org/dendrite/internal/transactions"
@@ -36,6 +30,11 @@ import (
"github.com/matrix-org/dendrite/roomserver/types"
"github.com/matrix-org/dendrite/setup/config"
userapi "github.com/matrix-org/dendrite/userapi/api"
+ "github.com/matrix-org/gomatrixserverlib"
+ "github.com/matrix-org/gomatrixserverlib/spec"
+ "github.com/matrix-org/util"
+ "github.com/prometheus/client_golang/prometheus"
+ "github.com/sirupsen/logrus"
)
// http://matrix.org/docs/spec/client_server/r0.2.0.html#put-matrix-client-r0-rooms-roomid-send-eventtype-txnid
@@ -68,6 +67,8 @@ var sendEventDuration = prometheus.NewHistogramVec(
// /rooms/{roomID}/send/{eventType}
// /rooms/{roomID}/send/{eventType}/{txnID}
// /rooms/{roomID}/state/{eventType}/{stateKey}
+//
+// nolint: gocyclo
func SendEvent(
req *http.Request,
device *userapi.Device,
@@ -121,6 +122,17 @@ func SendEvent(
delete(r, "join_authorised_via_users_server")
}
+ // for power level events we need to replace the userID with the pseudoID
+ if roomVersion == gomatrixserverlib.RoomVersionPseudoIDs && eventType == spec.MRoomPowerLevels {
+ err = updatePowerLevels(req, r, roomID, rsAPI)
+ if err != nil {
+ return util.JSONResponse{
+ Code: http.StatusInternalServerError,
+ JSON: spec.InternalServerError{Err: err.Error()},
+ }
+ }
+ }
+
evTime, err := httputil.ParseTSParam(req)
if err != nil {
return util.JSONResponse{
@@ -129,7 +141,7 @@ func SendEvent(
}
}
- e, resErr := generateSendEvent(req.Context(), r, device, roomID, eventType, stateKey, cfg, rsAPI, evTime)
+ e, resErr := generateSendEvent(req.Context(), r, device, roomID, eventType, stateKey, rsAPI, evTime)
if resErr != nil {
return *resErr
}
@@ -225,6 +237,28 @@ func SendEvent(
return res
}
+func updatePowerLevels(req *http.Request, r map[string]interface{}, roomID string, rsAPI api.ClientRoomserverAPI) error {
+ userMap := r["users"].(map[string]interface{})
+ validRoomID, err := spec.NewRoomID(roomID)
+ if err != nil {
+ return err
+ }
+ for user, level := range userMap {
+ uID, err := spec.NewUserID(user, true)
+ if err != nil {
+ continue // we're modifying the map in place, so we're going to have invalid userIDs after the first iteration
+ }
+ senderID, err := rsAPI.QuerySenderIDForUser(req.Context(), *validRoomID, *uID)
+ if err != nil {
+ return err
+ }
+ userMap[string(senderID)] = level
+ delete(userMap, user)
+ }
+ r["users"] = userMap
+ return nil
+}
+
// stateEqual compares the new and the existing state event content. If they are equal, returns a *util.JSONResponse
// with the existing event_id, making this an idempotent request.
func stateEqual(ctx context.Context, rsAPI api.ClientRoomserverAPI, eventType, stateKey, roomID string, newContent map[string]interface{}) *util.JSONResponse {
@@ -261,7 +295,6 @@ func generateSendEvent(
r map[string]interface{},
device *userapi.Device,
roomID, eventType string, stateKey *string,
- cfg *config.ClientAPI,
rsAPI api.ClientRoomserverAPI,
evTime time.Time,
) (gomatrixserverlib.PDU, *util.JSONResponse) {
@@ -304,7 +337,7 @@ func generateSendEvent(
}
}
- identity, err := cfg.Matrix.SigningIdentityFor(device.UserDomain())
+ identity, err := rsAPI.SigningIdentityFor(ctx, *validRoomID, *fullUserID)
if err != nil {
return nil, &util.JSONResponse{
Code: http.StatusInternalServerError,
@@ -313,7 +346,7 @@ func generateSendEvent(
}
var queryRes api.QueryLatestEventsAndStateResponse
- e, err := eventutil.QueryAndBuildEvent(ctx, &proto, identity, evTime, rsAPI, &queryRes)
+ e, err := eventutil.QueryAndBuildEvent(ctx, &proto, &identity, evTime, rsAPI, &queryRes)
switch specificErr := err.(type) {
case nil:
case eventutil.ErrRoomNoExists:
diff --git a/clientapi/routing/server_notices.go b/clientapi/routing/server_notices.go
index 7006ced4..66258a68 100644
--- a/clientapi/routing/server_notices.go
+++ b/clientapi/routing/server_notices.go
@@ -221,7 +221,7 @@ func SendServerNotice(
"body": r.Content.Body,
"msgtype": r.Content.MsgType,
}
- e, resErr := generateSendEvent(ctx, request, senderDevice, roomID, "m.room.message", nil, cfgClient, rsAPI, time.Now())
+ e, resErr := generateSendEvent(ctx, request, senderDevice, roomID, "m.room.message", nil, rsAPI, time.Now())
if resErr != nil {
logrus.Errorf("failed to send message: %+v", resErr)
return *resErr
@@ -350,7 +350,7 @@ func getSenderDevice(
if len(deviceRes.Devices) > 0 {
// If there were changes to the profile, create a new membership event
if displayNameChanged || avatarChanged {
- _, err = updateProfile(ctx, rsAPI, &deviceRes.Devices[0], profile, accRes.Account.UserID, cfg, time.Now())
+ _, err = updateProfile(ctx, rsAPI, &deviceRes.Devices[0], profile, accRes.Account.UserID, time.Now())
if err != nil {
return nil, err
}