mirror of
https://github.com/hoernschen/dendrite.git
synced 2024-12-25 14:38:28 +00:00
Complement fixes for pseudoIDs (#3206)
This commit is contained in:
parent
d065219de1
commit
16d922de70
5 changed files with 91 additions and 66 deletions
|
@ -263,7 +263,11 @@ func SendEvent(
|
|||
}
|
||||
|
||||
func updatePowerLevels(req *http.Request, r map[string]interface{}, roomID string, rsAPI api.ClientRoomserverAPI) error {
|
||||
userMap := r["users"].(map[string]interface{})
|
||||
users, ok := r["users"]
|
||||
if !ok {
|
||||
return nil
|
||||
}
|
||||
userMap := users.(map[string]interface{})
|
||||
validRoomID, err := spec.NewRoomID(roomID)
|
||||
if err != nil {
|
||||
return err
|
||||
|
@ -277,7 +281,8 @@ func updatePowerLevels(req *http.Request, r map[string]interface{}, roomID strin
|
|||
if err != nil {
|
||||
return err
|
||||
} else if senderID == nil {
|
||||
return fmt.Errorf("sender ID not found for %s in %s", uID, *validRoomID)
|
||||
util.GetLogger(req.Context()).Warnf("sender ID not found for %s in %s", uID, *validRoomID)
|
||||
continue
|
||||
}
|
||||
userMap[string(*senderID)] = level
|
||||
delete(userMap, user)
|
||||
|
|
4
go.mod
4
go.mod
|
@ -22,7 +22,7 @@ require (
|
|||
github.com/matrix-org/dugong v0.0.0-20210921133753-66e6b1c67e2e
|
||||
github.com/matrix-org/go-sqlite3-js v0.0.0-20220419092513-28aa791a1c91
|
||||
github.com/matrix-org/gomatrix v0.0.0-20220926102614-ceba4d9f7530
|
||||
github.com/matrix-org/gomatrixserverlib v0.0.0-20230915142004-095d10f3a87a
|
||||
github.com/matrix-org/gomatrixserverlib v0.0.0-20230926023021-d4830c9bfa49
|
||||
github.com/matrix-org/pinecone v0.11.1-0.20230810010612-ea4c33717fd7
|
||||
github.com/matrix-org/util v0.0.0-20221111132719-399730281e66
|
||||
github.com/mattn/go-sqlite3 v1.14.17
|
||||
|
@ -36,7 +36,7 @@ require (
|
|||
github.com/prometheus/client_golang v1.16.0
|
||||
github.com/sirupsen/logrus v1.9.3
|
||||
github.com/stretchr/testify v1.8.2
|
||||
github.com/tidwall/gjson v1.16.0
|
||||
github.com/tidwall/gjson v1.17.0
|
||||
github.com/tidwall/sjson v1.2.5
|
||||
github.com/uber/jaeger-client-go v2.30.0+incompatible
|
||||
github.com/uber/jaeger-lib v2.4.1+incompatible
|
||||
|
|
8
go.sum
8
go.sum
|
@ -208,8 +208,8 @@ github.com/matrix-org/go-sqlite3-js v0.0.0-20220419092513-28aa791a1c91 h1:s7fexw
|
|||
github.com/matrix-org/go-sqlite3-js v0.0.0-20220419092513-28aa791a1c91/go.mod h1:e+cg2q7C7yE5QnAXgzo512tgFh1RbQLC0+jozuegKgo=
|
||||
github.com/matrix-org/gomatrix v0.0.0-20220926102614-ceba4d9f7530 h1:kHKxCOLcHH8r4Fzarl4+Y3K5hjothkVW5z7T1dUM11U=
|
||||
github.com/matrix-org/gomatrix v0.0.0-20220926102614-ceba4d9f7530/go.mod h1:/gBX06Kw0exX1HrwmoBibFA98yBk/jxKpGVeyQbff+s=
|
||||
github.com/matrix-org/gomatrixserverlib v0.0.0-20230915142004-095d10f3a87a h1:+RC9Ddmt5v4y58qmdz5WuEEWCJ9gBWuYLyndnWkGfXU=
|
||||
github.com/matrix-org/gomatrixserverlib v0.0.0-20230915142004-095d10f3a87a/go.mod h1:H9V9N3Uqn1bBJqYJNGK1noqtgJTaCEhtTdcH/mp50uU=
|
||||
github.com/matrix-org/gomatrixserverlib v0.0.0-20230926023021-d4830c9bfa49 h1:o4mdKYYIYCi/QplAjBAJ5kvu3NXXkutZF88gTTpZjj4=
|
||||
github.com/matrix-org/gomatrixserverlib v0.0.0-20230926023021-d4830c9bfa49/go.mod h1:H9V9N3Uqn1bBJqYJNGK1noqtgJTaCEhtTdcH/mp50uU=
|
||||
github.com/matrix-org/pinecone v0.11.1-0.20230810010612-ea4c33717fd7 h1:6t8kJr8i1/1I5nNttw6nn1ryQJgzVlBmSGgPiiaTdw4=
|
||||
github.com/matrix-org/pinecone v0.11.1-0.20230810010612-ea4c33717fd7/go.mod h1:ReWMS/LoVnOiRAdq9sNUC2NZnd1mZkMNB52QhpTRWjg=
|
||||
github.com/matrix-org/util v0.0.0-20221111132719-399730281e66 h1:6z4KxomXSIGWqhHcfzExgkH3Z3UkIXry4ibJS4Aqz2Y=
|
||||
|
@ -318,8 +318,8 @@ github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO
|
|||
github.com/stretchr/testify v1.8.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8=
|
||||
github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
|
||||
github.com/tidwall/gjson v1.14.2/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=
|
||||
github.com/tidwall/gjson v1.16.0 h1:SyXa+dsSPpUlcwEDuKuEBJEz5vzTvOea+9rjyYodQFg=
|
||||
github.com/tidwall/gjson v1.16.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=
|
||||
github.com/tidwall/gjson v1.17.0 h1:/Jocvlh98kcTfpN2+JzGQWQcqrPQwDrVEMApx/M5ZwM=
|
||||
github.com/tidwall/gjson v1.17.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=
|
||||
github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=
|
||||
github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=
|
||||
github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=
|
||||
|
|
|
@ -93,11 +93,21 @@ func (r *Leaver) performLeaveRoomByID(
|
|||
isInvitePending, senderUser, eventID, _, err := helpers.IsInvitePending(ctx, r.DB, req.RoomID, *leaver)
|
||||
if err == nil && isInvitePending {
|
||||
sender, serr := r.RSAPI.QueryUserIDForSender(ctx, *roomID, senderUser)
|
||||
if serr != nil || sender == nil {
|
||||
return nil, fmt.Errorf("sender %q has no matching userID", senderUser)
|
||||
if serr != nil {
|
||||
return nil, fmt.Errorf("failed looking up userID for sender %q: %w", senderUser, serr)
|
||||
}
|
||||
if !r.Cfg.Matrix.IsLocalServerName(sender.Domain()) {
|
||||
return r.performFederatedRejectInvite(ctx, req, res, *sender, eventID, *leaver)
|
||||
|
||||
var domain spec.ServerName
|
||||
if sender == nil {
|
||||
// TODO: Currently a federated invite has no way of knowing the mxid_mapping of the inviter.
|
||||
// Should we add the inviter's m.room.member event (with mxid_mapping) to invite_room_state to allow
|
||||
// the invited user to leave via the inviter's server?
|
||||
domain = roomID.Domain()
|
||||
} else {
|
||||
domain = sender.Domain()
|
||||
}
|
||||
if !r.Cfg.Matrix.IsLocalServerName(domain) {
|
||||
return r.performFederatedRejectInvite(ctx, req, res, domain, eventID, *leaver)
|
||||
}
|
||||
// check that this is not a "server notice room"
|
||||
accData := &userapi.QueryAccountDataResponse{}
|
||||
|
@ -219,14 +229,14 @@ func (r *Leaver) performFederatedRejectInvite(
|
|||
ctx context.Context,
|
||||
req *api.PerformLeaveRequest,
|
||||
res *api.PerformLeaveResponse, // nolint:unparam
|
||||
inviteSender spec.UserID, eventID string,
|
||||
inviteDomain spec.ServerName, eventID string,
|
||||
leaver spec.SenderID,
|
||||
) ([]api.OutputEvent, error) {
|
||||
// Ask the federation sender to perform a federated leave for us.
|
||||
leaveReq := fsAPI.PerformLeaveRequest{
|
||||
RoomID: req.RoomID,
|
||||
UserID: req.Leaver.String(),
|
||||
ServerNames: []spec.ServerName{inviteSender.Domain()},
|
||||
ServerNames: []spec.ServerName{inviteDomain},
|
||||
}
|
||||
leaveRes := fsAPI.PerformLeaveResponse{}
|
||||
if err := r.FSAPI.PerformLeave(ctx, &leaveReq, &leaveRes); err != nil {
|
||||
|
|
|
@ -347,71 +347,81 @@ func updatePowerLevelEvent(userIDForSender spec.UserIDForSender, se gomatrixserv
|
|||
return se, nil
|
||||
}
|
||||
|
||||
pls, err := gomatrixserverlib.NewPowerLevelContentFromEvent(se)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
newPls := make(map[string]int64)
|
||||
var userID *spec.UserID
|
||||
for user, level := range pls.Users {
|
||||
if eventFormat != FormatSyncFederation {
|
||||
userID, err = userIDForSender(se.RoomID(), spec.SenderID(user))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
user = userID.String()
|
||||
}
|
||||
newPls[user] = level
|
||||
}
|
||||
var newPlBytes, newEv []byte
|
||||
newPlBytes, err = json.Marshal(newPls)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
newEv, err = sjson.SetRawBytes(se.JSON(), "content.users", newPlBytes)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
newEv := se.JSON()
|
||||
|
||||
// do the same for prev content
|
||||
prevContent := gjson.GetBytes(se.JSON(), "unsigned.prev_content")
|
||||
if !prevContent.Exists() {
|
||||
var evNew gomatrixserverlib.PDU
|
||||
evNew, err = gomatrixserverlib.MustGetRoomVersion(se.Version()).NewEventFromTrustedJSON(newEv, false)
|
||||
usersField := gjson.GetBytes(se.JSON(), "content.users")
|
||||
if usersField.Exists() {
|
||||
pls, err := gomatrixserverlib.NewPowerLevelContentFromEvent(se)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return evNew, err
|
||||
}
|
||||
pls = gomatrixserverlib.PowerLevelContent{}
|
||||
err = json.Unmarshal([]byte(prevContent.Raw), &pls)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
newPls := make(map[string]int64)
|
||||
var userID *spec.UserID
|
||||
for user, level := range pls.Users {
|
||||
if eventFormat != FormatSyncFederation {
|
||||
userID, err = userIDForSender(se.RoomID(), spec.SenderID(user))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
user = userID.String()
|
||||
}
|
||||
newPls[user] = level
|
||||
}
|
||||
|
||||
var newPlBytes []byte
|
||||
newPlBytes, err = json.Marshal(newPls)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
newEv, err = sjson.SetRawBytes(se.JSON(), "content.users", newPlBytes)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
|
||||
newPls = make(map[string]int64)
|
||||
for user, level := range pls.Users {
|
||||
if eventFormat != FormatSyncFederation {
|
||||
userID, err = userIDForSender(se.RoomID(), spec.SenderID(user))
|
||||
// do the same for prev content
|
||||
prevUsersField := gjson.GetBytes(se.JSON(), "unsigned.prev_content.users")
|
||||
if prevUsersField.Exists() {
|
||||
prevContent := gjson.GetBytes(se.JSON(), "unsigned.prev_content")
|
||||
if !prevContent.Exists() {
|
||||
evNew, err := gomatrixserverlib.MustGetRoomVersion(se.Version()).NewEventFromTrustedJSON(newEv, false)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
user = userID.String()
|
||||
|
||||
return evNew, err
|
||||
}
|
||||
pls := gomatrixserverlib.PowerLevelContent{}
|
||||
err := json.Unmarshal([]byte(prevContent.Raw), &pls)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
newPls := make(map[string]int64)
|
||||
for user, level := range pls.Users {
|
||||
if eventFormat != FormatSyncFederation {
|
||||
userID, userErr := userIDForSender(se.RoomID(), spec.SenderID(user))
|
||||
if userErr != nil {
|
||||
return nil, userErr
|
||||
}
|
||||
user = userID.String()
|
||||
}
|
||||
newPls[user] = level
|
||||
}
|
||||
|
||||
var newPlBytes []byte
|
||||
newPlBytes, err = json.Marshal(newPls)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
newEv, err = sjson.SetRawBytes(newEv, "unsigned.prev_content.users", newPlBytes)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
newPls[user] = level
|
||||
}
|
||||
newPlBytes, err = json.Marshal(newPls)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
newEv, err = sjson.SetRawBytes(newEv, "unsigned.prev_content.users", newPlBytes)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
var evNew gomatrixserverlib.PDU
|
||||
evNew, err = gomatrixserverlib.MustGetRoomVersion(se.Version()).NewEventFromTrustedJSONWithEventID(se.EventID(), newEv, false)
|
||||
evNew, err := gomatrixserverlib.MustGetRoomVersion(se.Version()).NewEventFromTrustedJSONWithEventID(se.EventID(), newEv, false)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue