mirror of
https://github.com/matrix-org/dendrite.git
synced 2025-12-07 15:03:09 -06:00
Merge branch 'main' of github.com:matrix-org/dendrite into s7evink/v11
This commit is contained in:
commit
8ed7d64bbd
|
|
@ -263,7 +263,11 @@ func SendEvent(
|
||||||
}
|
}
|
||||||
|
|
||||||
func updatePowerLevels(req *http.Request, r map[string]interface{}, roomID string, rsAPI api.ClientRoomserverAPI) error {
|
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)
|
validRoomID, err := spec.NewRoomID(roomID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
|
@ -277,7 +281,8 @@ func updatePowerLevels(req *http.Request, r map[string]interface{}, roomID strin
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
} else if senderID == nil {
|
} 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
|
userMap[string(*senderID)] = level
|
||||||
delete(userMap, user)
|
delete(userMap, user)
|
||||||
|
|
|
||||||
2
go.mod
2
go.mod
|
|
@ -36,7 +36,7 @@ require (
|
||||||
github.com/prometheus/client_golang v1.16.0
|
github.com/prometheus/client_golang v1.16.0
|
||||||
github.com/sirupsen/logrus v1.9.3
|
github.com/sirupsen/logrus v1.9.3
|
||||||
github.com/stretchr/testify v1.8.2
|
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/tidwall/sjson v1.2.5
|
||||||
github.com/uber/jaeger-client-go v2.30.0+incompatible
|
github.com/uber/jaeger-client-go v2.30.0+incompatible
|
||||||
github.com/uber/jaeger-lib v2.4.1+incompatible
|
github.com/uber/jaeger-lib v2.4.1+incompatible
|
||||||
|
|
|
||||||
4
go.sum
4
go.sum
|
|
@ -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 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8=
|
||||||
github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
|
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.14.2/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=
|
||||||
github.com/tidwall/gjson v1.16.0 h1:SyXa+dsSPpUlcwEDuKuEBJEz5vzTvOea+9rjyYodQFg=
|
github.com/tidwall/gjson v1.17.0 h1:/Jocvlh98kcTfpN2+JzGQWQcqrPQwDrVEMApx/M5ZwM=
|
||||||
github.com/tidwall/gjson v1.16.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=
|
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 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=
|
||||||
github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=
|
github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=
|
||||||
github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=
|
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)
|
isInvitePending, senderUser, eventID, _, err := helpers.IsInvitePending(ctx, r.DB, req.RoomID, *leaver)
|
||||||
if err == nil && isInvitePending {
|
if err == nil && isInvitePending {
|
||||||
sender, serr := r.RSAPI.QueryUserIDForSender(ctx, *roomID, senderUser)
|
sender, serr := r.RSAPI.QueryUserIDForSender(ctx, *roomID, senderUser)
|
||||||
if serr != nil || sender == nil {
|
if serr != nil {
|
||||||
return nil, fmt.Errorf("sender %q has no matching userID", senderUser)
|
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"
|
// check that this is not a "server notice room"
|
||||||
accData := &userapi.QueryAccountDataResponse{}
|
accData := &userapi.QueryAccountDataResponse{}
|
||||||
|
|
@ -219,14 +229,14 @@ func (r *Leaver) performFederatedRejectInvite(
|
||||||
ctx context.Context,
|
ctx context.Context,
|
||||||
req *api.PerformLeaveRequest,
|
req *api.PerformLeaveRequest,
|
||||||
res *api.PerformLeaveResponse, // nolint:unparam
|
res *api.PerformLeaveResponse, // nolint:unparam
|
||||||
inviteSender spec.UserID, eventID string,
|
inviteDomain spec.ServerName, eventID string,
|
||||||
leaver spec.SenderID,
|
leaver spec.SenderID,
|
||||||
) ([]api.OutputEvent, error) {
|
) ([]api.OutputEvent, error) {
|
||||||
// Ask the federation sender to perform a federated leave for us.
|
// Ask the federation sender to perform a federated leave for us.
|
||||||
leaveReq := fsAPI.PerformLeaveRequest{
|
leaveReq := fsAPI.PerformLeaveRequest{
|
||||||
RoomID: req.RoomID,
|
RoomID: req.RoomID,
|
||||||
UserID: req.Leaver.String(),
|
UserID: req.Leaver.String(),
|
||||||
ServerNames: []spec.ServerName{inviteSender.Domain()},
|
ServerNames: []spec.ServerName{inviteDomain},
|
||||||
}
|
}
|
||||||
leaveRes := fsAPI.PerformLeaveResponse{}
|
leaveRes := fsAPI.PerformLeaveResponse{}
|
||||||
if err := r.FSAPI.PerformLeave(ctx, &leaveReq, &leaveRes); err != nil {
|
if err := r.FSAPI.PerformLeave(ctx, &leaveReq, &leaveRes); err != nil {
|
||||||
|
|
|
||||||
|
|
@ -347,71 +347,81 @@ func updatePowerLevelEvent(userIDForSender spec.UserIDForSender, se gomatrixserv
|
||||||
return se, nil
|
return se, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
pls, err := gomatrixserverlib.NewPowerLevelContentFromEvent(se)
|
newEv := se.JSON()
|
||||||
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
|
|
||||||
}
|
|
||||||
|
|
||||||
// do the same for prev content
|
usersField := gjson.GetBytes(se.JSON(), "content.users")
|
||||||
prevContent := gjson.GetBytes(se.JSON(), "unsigned.prev_content")
|
if usersField.Exists() {
|
||||||
if !prevContent.Exists() {
|
pls, err := gomatrixserverlib.NewPowerLevelContentFromEvent(se)
|
||||||
var evNew gomatrixserverlib.PDU
|
|
||||||
evNew, err = gomatrixserverlib.MustGetRoomVersion(se.Version()).NewEventFromTrustedJSON(newEv, false)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
return evNew, err
|
newPls := make(map[string]int64)
|
||||||
}
|
var userID *spec.UserID
|
||||||
pls = gomatrixserverlib.PowerLevelContent{}
|
for user, level := range pls.Users {
|
||||||
err = json.Unmarshal([]byte(prevContent.Raw), &pls)
|
if eventFormat != FormatSyncFederation {
|
||||||
if err != nil {
|
userID, err = userIDForSender(se.RoomID(), spec.SenderID(user))
|
||||||
return nil, err
|
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)
|
// do the same for prev content
|
||||||
for user, level := range pls.Users {
|
prevUsersField := gjson.GetBytes(se.JSON(), "unsigned.prev_content.users")
|
||||||
if eventFormat != FormatSyncFederation {
|
if prevUsersField.Exists() {
|
||||||
userID, err = userIDForSender(se.RoomID(), spec.SenderID(user))
|
prevContent := gjson.GetBytes(se.JSON(), "unsigned.prev_content")
|
||||||
|
if !prevContent.Exists() {
|
||||||
|
evNew, err := gomatrixserverlib.MustGetRoomVersion(se.Version()).NewEventFromTrustedJSON(newEv, false)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
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 {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue