Use PDU not *Event in HeaderedEvent (#3073)

Requires https://github.com/matrix-org/gomatrixserverlib/pull/376

This has numerous upsides:
 - Less type casting to `*Event` is required.
- Making Dendrite work with `PDU` interfaces means we can swap out Event
impls more easily.
 - Tests which represent weird event shapes are easier to write.

Part of a series of refactors on GMSL.
This commit is contained in:
kegsay 2023-05-02 15:03:16 +01:00 committed by GitHub
parent 696cbb70b8
commit f5b3144dc3
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
64 changed files with 296 additions and 284 deletions

View file

@ -248,8 +248,8 @@ func (r *Admin) PerformAdminDownloadState(
return err
}
authEventMap := map[string]*gomatrixserverlib.Event{}
stateEventMap := map[string]*gomatrixserverlib.Event{}
authEventMap := map[string]gomatrixserverlib.PDU{}
stateEventMap := map[string]gomatrixserverlib.PDU{}
for _, fwdExtremity := range fwdExtremities {
var state gomatrixserverlib.StateResponse
@ -276,10 +276,10 @@ func (r *Admin) PerformAdminDownloadState(
stateIDs := make([]string, 0, len(stateEventMap))
for _, authEvent := range authEventMap {
authEvents = append(authEvents, &types.HeaderedEvent{Event: authEvent})
authEvents = append(authEvents, &types.HeaderedEvent{PDU: authEvent})
}
for _, stateEvent := range stateEventMap {
stateEvents = append(stateEvents, &types.HeaderedEvent{Event: stateEvent})
stateEvents = append(stateEvents, &types.HeaderedEvent{PDU: stateEvent})
stateIDs = append(stateIDs, stateEvent.EventID())
}

View file

@ -86,7 +86,7 @@ func (r *Backfiller) PerformBackfill(
// Retrieve events from the list that was filled previously. If we fail to get
// events from the database then attempt once to get them from federation instead.
var loadedEvents []*gomatrixserverlib.Event
var loadedEvents []gomatrixserverlib.PDU
loadedEvents, err = helpers.LoadEvents(ctx, r.DB, info, resultNIDs)
if err != nil {
if _, ok := err.(types.MissingEventError); ok {
@ -99,7 +99,7 @@ func (r *Backfiller) PerformBackfill(
if _, ok := redactEventIDs[event.EventID()]; ok {
event.Redact()
}
response.Events = append(response.Events, &types.HeaderedEvent{Event: event})
response.Events = append(response.Events, &types.HeaderedEvent{PDU: event})
}
return err
@ -133,7 +133,7 @@ func (r *Backfiller) backfillViaFederation(ctx context.Context, req *api.Perform
logrus.WithError(err).WithField("room_id", req.RoomID).Infof("backfilled %d events", len(events))
// persist these new events - auth checks have already been done
roomNID, backfilledEventMap := persistEvents(ctx, r.DB, gomatrixserverlib.TempCastToEvents(events))
roomNID, backfilledEventMap := persistEvents(ctx, r.DB, events)
for _, ev := range backfilledEventMap {
// now add state for these events
@ -170,7 +170,7 @@ func (r *Backfiller) backfillViaFederation(ctx context.Context, req *api.Perform
res.Events = make([]*types.HeaderedEvent, len(events))
for i := range events {
res.Events[i] = &types.HeaderedEvent{Event: events[i].(*gomatrixserverlib.Event)}
res.Events[i] = &types.HeaderedEvent{PDU: events[i]}
}
res.HistoryVisibility = requester.historyVisiblity
return nil
@ -230,15 +230,15 @@ func (r *Backfiller) fetchAndStoreMissingEvents(ctx context.Context, roomVer gom
logger.WithError(err).Warn("event failed PDU checks")
continue
}
missingMap[id] = &types.HeaderedEvent{Event: res.Event.(*gomatrixserverlib.Event)}
missingMap[id] = &types.HeaderedEvent{PDU: res.Event}
}
}
}
var newEvents []*gomatrixserverlib.Event
var newEvents []gomatrixserverlib.PDU
for _, ev := range missingMap {
if ev != nil {
newEvents = append(newEvents, ev.Event)
newEvents = append(newEvents, ev.PDU)
}
}
util.GetLogger(ctx).Infof("Persisting %d new events", len(newEvents))
@ -540,7 +540,7 @@ func (b *backfillRequester) ProvideEvents(roomVer gomatrixserverlib.RoomVersion,
}
events := make([]gomatrixserverlib.PDU, len(eventsWithNids))
for i := range eventsWithNids {
events[i] = eventsWithNids[i].Event
events[i] = eventsWithNids[i].PDU
}
return events, nil
}
@ -569,9 +569,9 @@ func joinEventsFromHistoryVisibility(
// feels more secure here.
return nil, gomatrixserverlib.HistoryVisibilityJoined, err
}
events := make([]*gomatrixserverlib.Event, len(stateEvents))
events := make([]gomatrixserverlib.PDU, len(stateEvents))
for i := range stateEvents {
events[i] = stateEvents[i].Event
events[i] = stateEvents[i].PDU
}
// Can we see events in the room?
@ -590,7 +590,7 @@ func joinEventsFromHistoryVisibility(
return evs, visibility, err
}
func persistEvents(ctx context.Context, db storage.Database, events []*gomatrixserverlib.Event) (types.RoomNID, map[string]types.Event) {
func persistEvents(ctx context.Context, db storage.Database, events []gomatrixserverlib.PDU) (types.RoomNID, map[string]types.Event) {
var roomNID types.RoomNID
var eventNID types.EventNID
backfilledEventMap := make(map[string]types.Event)
@ -648,7 +648,7 @@ func persistEvents(ctx context.Context, db storage.Database, events []*gomatrixs
}
backfilledEventMap[ev.EventID()] = types.Event{
EventNID: eventNID,
Event: ev,
PDU: ev,
}
}
return roomNID, backfilledEventMap

View file

@ -56,7 +56,7 @@ func (r *InboundPeeker) PerformInboundPeek(
response.RoomExists = true
response.RoomVersion = info.RoomVersion
var stateEvents []*gomatrixserverlib.Event
var stateEvents []gomatrixserverlib.PDU
var currentStateSnapshotNID types.StateSnapshotNID
latestEventRefs, currentStateSnapshotNID, _, err :=
@ -70,13 +70,13 @@ func (r *InboundPeeker) PerformInboundPeek(
}
var sortedLatestEvents []gomatrixserverlib.PDU
for _, ev := range latestEvents {
sortedLatestEvents = append(sortedLatestEvents, ev.Event)
sortedLatestEvents = append(sortedLatestEvents, ev.PDU)
}
sortedLatestEvents = gomatrixserverlib.ReverseTopologicalOrdering(
sortedLatestEvents,
gomatrixserverlib.TopologicalOrderByPrevEvents,
)
response.LatestEvent = &types.HeaderedEvent{Event: sortedLatestEvents[0].(*gomatrixserverlib.Event)}
response.LatestEvent = &types.HeaderedEvent{PDU: sortedLatestEvents[0]}
// XXX: do we actually need to do a state resolution here?
roomState := state.NewStateResolution(r.DB, info)
@ -106,11 +106,11 @@ func (r *InboundPeeker) PerformInboundPeek(
}
for _, event := range stateEvents {
response.StateEvents = append(response.StateEvents, &types.HeaderedEvent{Event: event})
response.StateEvents = append(response.StateEvents, &types.HeaderedEvent{PDU: event})
}
for _, event := range authEvents {
response.AuthChainEvents = append(response.AuthChainEvents, &types.HeaderedEvent{Event: event})
response.AuthChainEvents = append(response.AuthChainEvents, &types.HeaderedEvent{PDU: event})
}
err = r.Inputer.OutputProducer.ProduceRoomEvents(request.RoomID, []api.OutputEvent{

View file

@ -110,7 +110,7 @@ func (r *Inviter) PerformInvite(
}
outputUpdates, err = helpers.UpdateToInviteMembership(updater, &types.Event{
EventNID: 0,
Event: event.Event,
PDU: event.PDU,
}, outputUpdates, req.Event.Version())
if err != nil {
return nil, fmt.Errorf("updateToInviteMembership: %w", err)
@ -274,11 +274,11 @@ func buildInviteStrippedState(
return nil, err
}
inviteState := []fclient.InviteV2StrippedState{
fclient.NewInviteV2StrippedState(input.Event.Event),
fclient.NewInviteV2StrippedState(input.Event.PDU),
}
stateEvents = append(stateEvents, types.Event{Event: input.Event.Event})
stateEvents = append(stateEvents, types.Event{PDU: input.Event.PDU})
for _, event := range stateEvents {
inviteState = append(inviteState, fclient.NewInviteV2StrippedState(event.Event))
inviteState = append(inviteState, fclient.NewInviteV2StrippedState(event.PDU))
}
return inviteState, nil
}

View file

@ -485,7 +485,7 @@ func (r *Upgrader) sendInitialEvents(ctx context.Context, evTime time.Time, user
}
// Add the event to the list of auth events
builtEvents = append(builtEvents, &types.HeaderedEvent{Event: event})
builtEvents = append(builtEvents, &types.HeaderedEvent{PDU: event})
err = authEvents.AddEvent(event)
if err != nil {
return fmt.Errorf("failed to add new %q event to auth set: %w", builder.Type, err)
@ -555,12 +555,12 @@ func (r *Upgrader) makeHeaderedEvent(ctx context.Context, evTime time.Time, user
return nil, fmt.Errorf("failed to build new %q event: %w", builder.Type, err)
}
// check to see if this user can perform this operation
stateEvents := make([]*gomatrixserverlib.Event, len(queryRes.StateEvents))
stateEvents := make([]gomatrixserverlib.PDU, len(queryRes.StateEvents))
for i := range queryRes.StateEvents {
stateEvents[i] = queryRes.StateEvents[i].Event
stateEvents[i] = queryRes.StateEvents[i].PDU
}
provider := gomatrixserverlib.NewAuthEvents(gomatrixserverlib.ToPDUs(stateEvents))
if err = gomatrixserverlib.Allowed(headeredEvent.Event, &provider); err != nil {
provider := gomatrixserverlib.NewAuthEvents(stateEvents)
if err = gomatrixserverlib.Allowed(headeredEvent.PDU, &provider); err != nil {
return nil, api.ErrNotAllowed{Err: fmt.Errorf("failed to auth new %q event: %w", builder.Type, err)} // TODO: Is this error string comprehensible to the client?
}