1
0
Fork 0
mirror of https://github.com/matrix-org/dendrite.git synced 2025-03-31 14:04:27 -05:00

Refactor client event pseudoID swapping

This commit is contained in:
Devon Hudson 2023-09-13 14:23:38 -06:00
parent 8ee7b9de3c
commit 221b98d0b7
No known key found for this signature in database
GPG key ID: CD06B18E77F6A628

View file

@ -173,11 +173,22 @@ func ToClientEvent(se gomatrixserverlib.PDU, format ClientEventFormat, userIDFor
if format != FormatSyncFederation {
if se.Version() == gomatrixserverlib.RoomVersionPseudoIDs {
err := updatePseudoIDs(&ce, se, userIDForSender, format)
if err != nil {
return nil, err
}
}
}
return &ce, nil
}
func updatePseudoIDs(ce *ClientEvent, se gomatrixserverlib.PDU, userIDForSender spec.UserIDForSender, format ClientEventFormat) error {
ce.SenderKey = se.SenderID()
validRoomID, err := spec.NewRoomID(se.RoomID())
if err != nil {
return nil, err
return err
}
userID, err := userIDForSender(*validRoomID, se.SenderID())
if err == nil && userID != nil {
@ -209,15 +220,46 @@ func ToClientEvent(se gomatrixserverlib.PDU, format ClientEventFormat, userIDFor
ce.Unsigned, err = json.Marshal(prev)
if err != nil {
err = fmt.Errorf("Failed to marshal unsigned content for ClientEvent: %s", err.Error())
return nil, err
return err
}
}
// TODO: Refactor all this stuff
if se.Type() == spec.MRoomCreate {
if creator := gjson.GetBytes(se.Content(), "creator"); creator.Exists() {
switch se.Type() {
case spec.MRoomCreate:
updatedContent, err := updateCreateEvent(se.Content(), userIDForSender, *validRoomID)
if err != nil {
err = fmt.Errorf("Failed to update m.room.create event for ClientEvent: %s", err.Error())
return err
}
ce.Content = updatedContent
case spec.MRoomMember:
updatedEvent, err := updateInviteEvent(userIDForSender, se, format)
if err != nil {
err = fmt.Errorf("Failed to update m.room.member event for ClientEvent: %s", err.Error())
return err
}
if updatedEvent != nil {
ce.Unsigned = updatedEvent.Unsigned()
}
case spec.MRoomPowerLevels:
updatedEvent, err := updatePowerLevelEvent(userIDForSender, se, format)
if err != nil {
err = fmt.Errorf("Failed update m.room.power_levels event for ClientEvent: %s", err.Error())
return err
}
if updatedEvent != nil {
ce.Content = updatedEvent.Content()
ce.Unsigned = updatedEvent.Unsigned()
}
}
return nil
}
func updateCreateEvent(content spec.RawJSON, userIDForSender spec.UserIDForSender, roomID spec.RoomID) (spec.RawJSON, error) {
if creator := gjson.GetBytes(content, "creator"); creator.Exists() {
oldCreator := creator.Str
userID, err := userIDForSender(*validRoomID, spec.SenderID(oldCreator))
userID, err := userIDForSender(roomID, spec.SenderID(oldCreator))
if err != nil {
err = fmt.Errorf("Failed to find userID for creator in ClientEvent: %s", err.Error())
return nil, err
@ -230,42 +272,21 @@ func ToClientEvent(se gomatrixserverlib.PDU, format ClientEventFormat, userIDFor
err = fmt.Errorf("Failed to marshal new creator for ClientEvent: %s", err.Error())
return nil, err
}
newContent, err = sjson.SetRawBytes([]byte(se.Content()), "creator", newCreatorBytes)
newContent, err = sjson.SetRawBytes([]byte(content), "creator", newCreatorBytes)
if err != nil {
err = fmt.Errorf("Failed to set new creator for ClientEvent: %s", err.Error())
return nil, err
}
ce.Content = newContent
}
return newContent, nil
}
}
if se.Type() == spec.MRoomMember {
updatedEvent, err := updateInviteRoomState(userIDForSender, se, format)
if err != nil {
err = fmt.Errorf("Failed to update m.room.member event for ClientEvent: %s", err.Error())
return nil, err
}
ce.Unsigned = updatedEvent.Unsigned()
}
if se.Type() == spec.MRoomPowerLevels && se.StateKeyEquals("") {
se, err = updatePowerLevelEvent(userIDForSender, se, format)
if err != nil {
err = fmt.Errorf("Failed update power levels for ClientEvent: %s", err.Error())
return nil, err
}
ce.Content = se.Content()
ce.Unsigned = se.Unsigned()
}
}
}
return &ce, nil
return content, nil
}
func updateInviteRoomState(userIDForSender spec.UserIDForSender, ev gomatrixserverlib.PDU, eventFormat ClientEventFormat) (gomatrixserverlib.PDU, error) {
func updateInviteEvent(userIDForSender spec.UserIDForSender, ev gomatrixserverlib.PDU, eventFormat ClientEventFormat) (gomatrixserverlib.PDU, error) {
if inviteRoomState := gjson.GetBytes(ev.Unsigned(), "invite_room_state"); inviteRoomState.Exists() {
validRoomID, err := spec.NewRoomID(ev.RoomID())
if err != nil {
@ -335,27 +356,12 @@ func getUpdatedInviteRoomState(userIDForSender spec.UserIDForSender, inviteRoomS
}
}
if creator := gjson.GetBytes(ev.Content, "creator"); creator.Exists() {
oldCreator := creator.Str
userID, err := userIDForSender(*validRoomID, spec.SenderID(oldCreator))
updatedContent, err := updateCreateEvent(ev.Content, userIDForSender, *validRoomID)
if err != nil {
err = fmt.Errorf("Failed to update m.room.create event for ClientEvent: %s", err.Error())
return nil, err
}
if userID != nil {
var newCreatorBytes, newContent []byte
newCreatorBytes, err = json.Marshal(userID.String())
if err != nil {
return nil, err
}
newContent, err = sjson.SetRawBytes([]byte(ev.Content), "creator", newCreatorBytes)
if err != nil {
return nil, err
}
inviteStateEvents[i].Content = newContent
}
}
inviteStateEvents[i].Content = updatedContent
}
}
@ -368,6 +374,10 @@ func getUpdatedInviteRoomState(userIDForSender spec.UserIDForSender, inviteRoomS
}
func updatePowerLevelEvent(userIDForSender spec.UserIDForSender, se gomatrixserverlib.PDU, eventFormat ClientEventFormat) (gomatrixserverlib.PDU, error) {
if !se.StateKeyEquals("") {
return se, nil
}
pls, err := gomatrixserverlib.NewPowerLevelContentFromEvent(se)
if err != nil {
return nil, err