mirror of
https://github.com/matrix-org/dendrite.git
synced 2025-03-28 04:24:28 -05:00
Refactor client event pseudoID swapping
This commit is contained in:
parent
8ee7b9de3c
commit
221b98d0b7
|
@ -173,99 +173,120 @@ func ToClientEvent(se gomatrixserverlib.PDU, format ClientEventFormat, userIDFor
|
|||
|
||||
if format != FormatSyncFederation {
|
||||
if se.Version() == gomatrixserverlib.RoomVersionPseudoIDs {
|
||||
ce.SenderKey = se.SenderID()
|
||||
|
||||
validRoomID, err := spec.NewRoomID(se.RoomID())
|
||||
err := updatePseudoIDs(&ce, se, userIDForSender, format)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
userID, err := userIDForSender(*validRoomID, se.SenderID())
|
||||
if err == nil && userID != nil {
|
||||
ce.Sender = userID.String()
|
||||
}
|
||||
|
||||
sk := se.StateKey()
|
||||
if sk != nil && *sk != "" {
|
||||
skUserID, err := userIDForSender(*validRoomID, spec.SenderID(*sk))
|
||||
if err == nil && skUserID != nil {
|
||||
skString := skUserID.String()
|
||||
ce.StateKey = &skString
|
||||
}
|
||||
}
|
||||
|
||||
var prev PrevEventRef
|
||||
if err := json.Unmarshal(se.Unsigned(), &prev); err == nil && prev.PrevSenderID != "" {
|
||||
prevUserID, err := userIDForSender(*validRoomID, spec.SenderID(prev.PrevSenderID))
|
||||
if err == nil && userID != nil {
|
||||
prev.PrevSenderID = prevUserID.String()
|
||||
} else {
|
||||
errString := "userID unknown"
|
||||
if err != nil {
|
||||
errString = err.Error()
|
||||
}
|
||||
logrus.Warnf("Failed to find userID for prev_sender in ClientEvent: %s", errString)
|
||||
// NOTE: Not much can be done here, so leave the previous value in place.
|
||||
}
|
||||
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
|
||||
}
|
||||
}
|
||||
|
||||
// TODO: Refactor all this stuff
|
||||
if se.Type() == spec.MRoomCreate {
|
||||
if creator := gjson.GetBytes(se.Content(), "creator"); creator.Exists() {
|
||||
oldCreator := creator.Str
|
||||
userID, err := userIDForSender(*validRoomID, spec.SenderID(oldCreator))
|
||||
if err != nil {
|
||||
err = fmt.Errorf("Failed to find userID for creator in ClientEvent: %s", err.Error())
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if userID != nil {
|
||||
var newCreatorBytes, newContent []byte
|
||||
newCreatorBytes, err = json.Marshal(userID.String())
|
||||
if err != nil {
|
||||
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)
|
||||
if err != nil {
|
||||
err = fmt.Errorf("Failed to set new creator for ClientEvent: %s", err.Error())
|
||||
return nil, err
|
||||
}
|
||||
|
||||
ce.Content = newContent
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
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
|
||||
}
|
||||
|
||||
func updateInviteRoomState(userIDForSender spec.UserIDForSender, ev gomatrixserverlib.PDU, eventFormat ClientEventFormat) (gomatrixserverlib.PDU, error) {
|
||||
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 err
|
||||
}
|
||||
userID, err := userIDForSender(*validRoomID, se.SenderID())
|
||||
if err == nil && userID != nil {
|
||||
ce.Sender = userID.String()
|
||||
}
|
||||
|
||||
sk := se.StateKey()
|
||||
if sk != nil && *sk != "" {
|
||||
skUserID, err := userIDForSender(*validRoomID, spec.SenderID(*sk))
|
||||
if err == nil && skUserID != nil {
|
||||
skString := skUserID.String()
|
||||
ce.StateKey = &skString
|
||||
}
|
||||
}
|
||||
|
||||
var prev PrevEventRef
|
||||
if err := json.Unmarshal(se.Unsigned(), &prev); err == nil && prev.PrevSenderID != "" {
|
||||
prevUserID, err := userIDForSender(*validRoomID, spec.SenderID(prev.PrevSenderID))
|
||||
if err == nil && userID != nil {
|
||||
prev.PrevSenderID = prevUserID.String()
|
||||
} else {
|
||||
errString := "userID unknown"
|
||||
if err != nil {
|
||||
errString = err.Error()
|
||||
}
|
||||
logrus.Warnf("Failed to find userID for prev_sender in ClientEvent: %s", errString)
|
||||
// NOTE: Not much can be done here, so leave the previous value in place.
|
||||
}
|
||||
ce.Unsigned, err = json.Marshal(prev)
|
||||
if err != nil {
|
||||
err = fmt.Errorf("Failed to marshal unsigned content for ClientEvent: %s", err.Error())
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
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(roomID, spec.SenderID(oldCreator))
|
||||
if err != nil {
|
||||
err = fmt.Errorf("Failed to find userID for creator in ClientEvent: %s", err.Error())
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if userID != nil {
|
||||
var newCreatorBytes, newContent []byte
|
||||
newCreatorBytes, err = json.Marshal(userID.String())
|
||||
if err != nil {
|
||||
err = fmt.Errorf("Failed to marshal new creator for ClientEvent: %s", err.Error())
|
||||
return nil, err
|
||||
}
|
||||
|
||||
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
|
||||
}
|
||||
|
||||
return newContent, nil
|
||||
}
|
||||
}
|
||||
|
||||
return content, nil
|
||||
}
|
||||
|
||||
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))
|
||||
if err != nil {
|
||||
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
|
||||
}
|
||||
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
|
||||
}
|
||||
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
|
||||
|
|
Loading…
Reference in a new issue