mirror of
https://github.com/hoernschen/dendrite.git
synced 2025-07-29 12:42:46 +00:00
Use ProtoEvent where needed instead of EventBuilder (#3075)
They are fundamentally different concepts, so should be represented as such. Proto events are exchanged in /make_xxx calls over federation, and made as "fledgling" events in /createRoom and general event sending. *Building* events is a reasonably complex VERSION SPECIFIC process which needs amongst other things, auth event providers, prev events, signing keys, etc. Requires https://github.com/matrix-org/gomatrixserverlib/pull/379
This commit is contained in:
parent
d5c11a3c86
commit
2b34f88fde
23 changed files with 152 additions and 119 deletions
|
@ -92,7 +92,7 @@ func (r *Admin) PerformAdminEvacuateRoom(
|
|||
memberContent.Membership = spec.Leave
|
||||
|
||||
stateKey := *memberEvent.StateKey()
|
||||
fledglingEvent := &gomatrixserverlib.EventBuilder{
|
||||
fledglingEvent := &gomatrixserverlib.ProtoEvent{
|
||||
RoomID: roomID,
|
||||
Type: spec.MRoomMember,
|
||||
StateKey: &stateKey,
|
||||
|
@ -109,7 +109,7 @@ func (r *Admin) PerformAdminEvacuateRoom(
|
|||
return nil, err
|
||||
}
|
||||
|
||||
eventsNeeded, err = gomatrixserverlib.StateNeededForEventBuilder(fledglingEvent)
|
||||
eventsNeeded, err = gomatrixserverlib.StateNeededForProtoEvent(fledglingEvent)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
@ -283,16 +283,16 @@ func (r *Admin) PerformAdminDownloadState(
|
|||
stateIDs = append(stateIDs, stateEvent.EventID())
|
||||
}
|
||||
|
||||
builder := &gomatrixserverlib.EventBuilder{
|
||||
proto := &gomatrixserverlib.ProtoEvent{
|
||||
Type: "org.matrix.dendrite.state_download",
|
||||
Sender: userID,
|
||||
RoomID: roomID,
|
||||
Content: spec.RawJSON("{}"),
|
||||
}
|
||||
|
||||
eventsNeeded, err := gomatrixserverlib.StateNeededForEventBuilder(builder)
|
||||
eventsNeeded, err := gomatrixserverlib.StateNeededForProtoEvent(proto)
|
||||
if err != nil {
|
||||
return fmt.Errorf("gomatrixserverlib.StateNeededForEventBuilder: %w", err)
|
||||
return fmt.Errorf("gomatrixserverlib.StateNeededForProtoEvent: %w", err)
|
||||
}
|
||||
|
||||
queryRes := &api.QueryLatestEventsAndStateResponse{
|
||||
|
@ -308,7 +308,7 @@ func (r *Admin) PerformAdminDownloadState(
|
|||
return err
|
||||
}
|
||||
|
||||
ev, err := eventutil.BuildEvent(ctx, builder, r.Cfg.Matrix, identity, time.Now(), &eventsNeeded, queryRes)
|
||||
ev, err := eventutil.BuildEvent(ctx, proto, r.Cfg.Matrix, identity, time.Now(), &eventsNeeded, queryRes)
|
||||
if err != nil {
|
||||
return fmt.Errorf("eventutil.BuildEvent: %w", err)
|
||||
}
|
||||
|
|
|
@ -180,14 +180,14 @@ func (r *Joiner) performJoinRoomByID(
|
|||
if err != nil {
|
||||
return "", "", rsAPI.ErrInvalidID{Err: fmt.Errorf("user ID %q is invalid: %w", userID, err)}
|
||||
}
|
||||
eb := gomatrixserverlib.EventBuilder{
|
||||
proto := gomatrixserverlib.ProtoEvent{
|
||||
Type: spec.MRoomMember,
|
||||
Sender: userID,
|
||||
StateKey: &userID,
|
||||
RoomID: req.RoomIDOrAlias,
|
||||
Redacts: "",
|
||||
}
|
||||
if err = eb.SetUnsigned(struct{}{}); err != nil {
|
||||
if err = proto.SetUnsigned(struct{}{}); err != nil {
|
||||
return "", "", fmt.Errorf("eb.SetUnsigned: %w", err)
|
||||
}
|
||||
|
||||
|
@ -203,7 +203,7 @@ func (r *Joiner) performJoinRoomByID(
|
|||
} else if authorisedVia != "" {
|
||||
req.Content["join_authorised_via_users_server"] = authorisedVia
|
||||
}
|
||||
if err = eb.SetContent(req.Content); err != nil {
|
||||
if err = proto.SetContent(req.Content); err != nil {
|
||||
return "", "", fmt.Errorf("eb.SetContent: %w", err)
|
||||
}
|
||||
|
||||
|
@ -284,7 +284,7 @@ func (r *Joiner) performJoinRoomByID(
|
|||
if err != nil {
|
||||
return "", "", fmt.Errorf("error joining local room: %q", err)
|
||||
}
|
||||
event, err := eventutil.QueryAndBuildEvent(ctx, &eb, r.Cfg.Matrix, identity, time.Now(), r.RSAPI, &buildRes)
|
||||
event, err := eventutil.QueryAndBuildEvent(ctx, &proto, r.Cfg.Matrix, identity, time.Now(), r.RSAPI, &buildRes)
|
||||
|
||||
switch err {
|
||||
case nil:
|
||||
|
|
|
@ -154,24 +154,24 @@ func (r *Leaver) performLeaveRoomByID(
|
|||
|
||||
// Prepare the template for the leave event.
|
||||
userID := req.UserID
|
||||
eb := gomatrixserverlib.EventBuilder{
|
||||
proto := gomatrixserverlib.ProtoEvent{
|
||||
Type: spec.MRoomMember,
|
||||
Sender: userID,
|
||||
StateKey: &userID,
|
||||
RoomID: req.RoomID,
|
||||
Redacts: "",
|
||||
}
|
||||
if err = eb.SetContent(map[string]interface{}{"membership": "leave"}); err != nil {
|
||||
if err = proto.SetContent(map[string]interface{}{"membership": "leave"}); err != nil {
|
||||
return nil, fmt.Errorf("eb.SetContent: %w", err)
|
||||
}
|
||||
if err = eb.SetUnsigned(struct{}{}); err != nil {
|
||||
if err = proto.SetUnsigned(struct{}{}); err != nil {
|
||||
return nil, fmt.Errorf("eb.SetUnsigned: %w", err)
|
||||
}
|
||||
|
||||
// Get the sender domain.
|
||||
_, senderDomain, serr := r.Cfg.Matrix.SplitLocalID('@', eb.Sender)
|
||||
_, senderDomain, serr := r.Cfg.Matrix.SplitLocalID('@', proto.Sender)
|
||||
if serr != nil {
|
||||
return nil, fmt.Errorf("sender %q is invalid", eb.Sender)
|
||||
return nil, fmt.Errorf("sender %q is invalid", proto.Sender)
|
||||
}
|
||||
|
||||
// We know that the user is in the room at this point so let's build
|
||||
|
@ -184,7 +184,7 @@ func (r *Leaver) performLeaveRoomByID(
|
|||
if err != nil {
|
||||
return nil, fmt.Errorf("SigningIdentityFor: %w", err)
|
||||
}
|
||||
event, err := eventutil.QueryAndBuildEvent(ctx, &eb, r.Cfg.Matrix, identity, time.Now(), r.RSAPI, &buildRes)
|
||||
event, err := eventutil.QueryAndBuildEvent(ctx, &proto, r.Cfg.Matrix, identity, time.Now(), r.RSAPI, &buildRes)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("eventutil.QueryAndBuildEvent: %w", err)
|
||||
}
|
||||
|
|
|
@ -459,22 +459,33 @@ func (r *Upgrader) sendInitialEvents(ctx context.Context, evTime time.Time, user
|
|||
for i, e := range eventsToMake {
|
||||
depth := i + 1 // depth starts at 1
|
||||
|
||||
builder := gomatrixserverlib.EventBuilder{
|
||||
proto := gomatrixserverlib.ProtoEvent{
|
||||
Sender: userID,
|
||||
RoomID: newRoomID,
|
||||
Type: e.Type,
|
||||
StateKey: &e.StateKey,
|
||||
Depth: int64(depth),
|
||||
}
|
||||
err = builder.SetContent(e.Content)
|
||||
err = proto.SetContent(e.Content)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to set content of new %q event: %w", builder.Type, err)
|
||||
return fmt.Errorf("failed to set content of new %q event: %w", proto.Type, err)
|
||||
}
|
||||
if i > 0 {
|
||||
builder.PrevEvents = []gomatrixserverlib.EventReference{builtEvents[i-1].EventReference()}
|
||||
proto.PrevEvents = []gomatrixserverlib.EventReference{builtEvents[i-1].EventReference()}
|
||||
}
|
||||
|
||||
var verImpl gomatrixserverlib.IRoomVersion
|
||||
verImpl, err = gomatrixserverlib.GetRoomVersion(newVersion)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
builder := verImpl.NewEventBuilderFromProtoEvent(&proto)
|
||||
if err = builder.AddAuthEvents(&authEvents); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
var event gomatrixserverlib.PDU
|
||||
event, err = builder.AddAuthEventsAndBuild(userDomain, &authEvents, evTime, newVersion, r.Cfg.Matrix.KeyID, r.Cfg.Matrix.PrivateKey)
|
||||
event, err = builder.Build(evTime, userDomain, r.Cfg.Matrix.KeyID, r.Cfg.Matrix.PrivateKey)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to build new %q event: %w", builder.Type, err)
|
||||
|
||||
|
@ -524,27 +535,27 @@ func (r *Upgrader) makeTombstoneEvent(
|
|||
}
|
||||
|
||||
func (r *Upgrader) makeHeaderedEvent(ctx context.Context, evTime time.Time, userID, roomID string, event fledglingEvent) (*types.HeaderedEvent, error) {
|
||||
builder := gomatrixserverlib.EventBuilder{
|
||||
proto := gomatrixserverlib.ProtoEvent{
|
||||
Sender: userID,
|
||||
RoomID: roomID,
|
||||
Type: event.Type,
|
||||
StateKey: &event.StateKey,
|
||||
}
|
||||
err := builder.SetContent(event.Content)
|
||||
err := proto.SetContent(event.Content)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to set new %q event content: %w", builder.Type, err)
|
||||
return nil, fmt.Errorf("failed to set new %q event content: %w", proto.Type, err)
|
||||
}
|
||||
// Get the sender domain.
|
||||
_, senderDomain, serr := r.Cfg.Matrix.SplitLocalID('@', builder.Sender)
|
||||
_, senderDomain, serr := r.Cfg.Matrix.SplitLocalID('@', proto.Sender)
|
||||
if serr != nil {
|
||||
return nil, fmt.Errorf("Failed to split user ID %q: %w", builder.Sender, err)
|
||||
return nil, fmt.Errorf("Failed to split user ID %q: %w", proto.Sender, err)
|
||||
}
|
||||
identity, err := r.Cfg.Matrix.SigningIdentityFor(senderDomain)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to get signing identity for %q: %w", senderDomain, err)
|
||||
}
|
||||
var queryRes api.QueryLatestEventsAndStateResponse
|
||||
headeredEvent, err := eventutil.QueryAndBuildEvent(ctx, &builder, r.Cfg.Matrix, identity, evTime, r.URSAPI, &queryRes)
|
||||
headeredEvent, err := eventutil.QueryAndBuildEvent(ctx, &proto, r.Cfg.Matrix, identity, evTime, r.URSAPI, &queryRes)
|
||||
if err == eventutil.ErrRoomNoExists {
|
||||
return nil, err
|
||||
} else if e, ok := err.(gomatrixserverlib.BadJSONError); ok {
|
||||
|
@ -552,7 +563,7 @@ func (r *Upgrader) makeHeaderedEvent(ctx context.Context, evTime time.Time, user
|
|||
} else if e, ok := err.(gomatrixserverlib.EventValidationError); ok {
|
||||
return nil, e
|
||||
} else if err != nil {
|
||||
return nil, fmt.Errorf("failed to build new %q event: %w", builder.Type, err)
|
||||
return nil, fmt.Errorf("failed to build new %q event: %w", proto.Type, err)
|
||||
}
|
||||
// check to see if this user can perform this operation
|
||||
stateEvents := make([]gomatrixserverlib.PDU, len(queryRes.StateEvents))
|
||||
|
@ -561,7 +572,7 @@ func (r *Upgrader) makeHeaderedEvent(ctx context.Context, evTime time.Time, user
|
|||
}
|
||||
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?
|
||||
return nil, api.ErrNotAllowed{Err: fmt.Errorf("failed to auth new %q event: %w", proto.Type, err)} // TODO: Is this error string comprehensible to the client?
|
||||
}
|
||||
|
||||
return headeredEvent, nil
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue