diff --git a/src/github.com/matrix-org/dendrite/clientapi/events/events.go b/src/github.com/matrix-org/dendrite/clientapi/events/events.go index 3bdfd9207..49746adcc 100644 --- a/src/github.com/matrix-org/dendrite/clientapi/events/events.go +++ b/src/github.com/matrix-org/dendrite/clientapi/events/events.go @@ -16,28 +16,33 @@ package events import ( "errors" + "fmt" + "time" + "github.com/matrix-org/dendrite/common/config" "github.com/matrix-org/dendrite/roomserver/api" + "github.com/matrix-org/gomatrixserverlib" + "github.com/matrix-org/util" ) // ErrRoomNoExists is returned when trying to lookup the state of a room that // doesn't exist var ErrRoomNoExists = errors.New("Room does not exist") -// FillBuilder fills the PrevEvents, AuthEvents and Depth fields of an event builder -// using the roomserver query API client provided. Also fills roomserver query API -// response (if provided) in case the function calling FillBuilder needs to use it. +// BuildEvent builds a Matrix event using the event builder and roomserver query +// API client provided. If also fills roomserver query API response (if provided) +// in case the function calling FillBuilder needs to use it. // Returns ErrRoomNoExists if the state of the room could not be retrieved because // the room doesn't exist // Returns an error if something else went wrong -func FillBuilder( - builder *gomatrixserverlib.EventBuilder, queryAPI api.RoomserverQueryAPI, - queryRes *api.QueryLatestEventsAndStateResponse, -) error { +func BuildEvent( + builder *gomatrixserverlib.EventBuilder, cfg config.Dendrite, + queryAPI api.RoomserverQueryAPI, queryRes *api.QueryLatestEventsAndStateResponse, +) (*gomatrixserverlib.Event, error) { eventsNeeded, err := gomatrixserverlib.StateNeededForEventBuilder(builder) if err != nil { - return err + return nil, err } // Ask the roomserver for information about this room @@ -49,11 +54,11 @@ func FillBuilder( queryRes = &api.QueryLatestEventsAndStateResponse{} } if queryErr := queryAPI.QueryLatestEventsAndState(&queryReq, queryRes); queryErr != nil { - return err + return nil, err } if !queryRes.RoomExists { - return ErrRoomNoExists + return nil, ErrRoomNoExists } builder.Depth = queryRes.Depth @@ -67,9 +72,16 @@ func FillBuilder( refs, err := eventsNeeded.AuthEventReferences(&authEvents) if err != nil { - return err + return nil, err } builder.AuthEvents = refs - return nil + eventID := fmt.Sprintf("$%s:%s", util.RandomString(16), cfg.Matrix.ServerName) + now := time.Now() + event, err := builder.Build(eventID, now, cfg.Matrix.ServerName, cfg.Matrix.KeyID, cfg.Matrix.PrivateKey) + if err != nil { + return nil, err + } + + return &event, nil } diff --git a/src/github.com/matrix-org/dendrite/clientapi/readers/profile.go b/src/github.com/matrix-org/dendrite/clientapi/readers/profile.go index 971c6484b..15ca4961b 100644 --- a/src/github.com/matrix-org/dendrite/clientapi/readers/profile.go +++ b/src/github.com/matrix-org/dendrite/clientapi/readers/profile.go @@ -15,9 +15,7 @@ package readers import ( - "fmt" "net/http" - "time" "github.com/matrix-org/dendrite/clientapi/auth/authtypes" "github.com/matrix-org/dendrite/clientapi/auth/storage/accounts" @@ -284,18 +282,12 @@ func buildMembershipEvents( return nil, err } - if err := events.FillBuilder(&builder, queryAPI, nil); err != nil { - return nil, err - } - - eventID := fmt.Sprintf("$%s:%s", util.RandomString(16), cfg.Matrix.ServerName) - now := time.Now() - event, err := builder.Build(eventID, now, cfg.Matrix.ServerName, cfg.Matrix.KeyID, cfg.Matrix.PrivateKey) + event, err := events.BuildEvent(&builder, *cfg, queryAPI, nil) if err != nil { return nil, err } - evs = append(evs, event) + evs = append(evs, *event) } return evs, nil diff --git a/src/github.com/matrix-org/dendrite/clientapi/writers/membership.go b/src/github.com/matrix-org/dendrite/clientapi/writers/membership.go index b73d4ab28..e075d69e1 100644 --- a/src/github.com/matrix-org/dendrite/clientapi/writers/membership.go +++ b/src/github.com/matrix-org/dendrite/clientapi/writers/membership.go @@ -15,9 +15,7 @@ package writers import ( - "fmt" "net/http" - "time" "github.com/matrix-org/dendrite/clientapi/auth/authtypes" "github.com/matrix-org/dendrite/clientapi/auth/storage/accounts" @@ -77,7 +75,8 @@ func SendMembership( return httputil.LogThenError(req, err) } - if err = events.FillBuilder(&builder, queryAPI, nil); err == events.ErrRoomNoExists { + event, err := events.BuildEvent(&builder, cfg, queryAPI, nil) + if err == events.ErrRoomNoExists { return util.JSONResponse{ Code: 404, JSON: jsonerror.NotFound(err.Error()), @@ -86,14 +85,7 @@ func SendMembership( return httputil.LogThenError(req, err) } - eventID := fmt.Sprintf("$%s:%s", util.RandomString(16), cfg.Matrix.ServerName) - now := time.Now() - event, err := builder.Build(eventID, now, cfg.Matrix.ServerName, cfg.Matrix.KeyID, cfg.Matrix.PrivateKey) - if err != nil { - return httputil.LogThenError(req, err) - } - - if err := producer.SendEvents([]gomatrixserverlib.Event{event}, cfg.Matrix.ServerName); err != nil { + if err := producer.SendEvents([]gomatrixserverlib.Event{*event}, cfg.Matrix.ServerName); err != nil { return httputil.LogThenError(req, err) } diff --git a/src/github.com/matrix-org/dendrite/clientapi/writers/sendevent.go b/src/github.com/matrix-org/dendrite/clientapi/writers/sendevent.go index ea94fb4ae..868700f55 100644 --- a/src/github.com/matrix-org/dendrite/clientapi/writers/sendevent.go +++ b/src/github.com/matrix-org/dendrite/clientapi/writers/sendevent.go @@ -17,9 +17,6 @@ package writers import ( "net/http" - "fmt" - "time" - "github.com/matrix-org/dendrite/clientapi/auth/authtypes" "github.com/matrix-org/dendrite/clientapi/events" "github.com/matrix-org/dendrite/clientapi/httputil" @@ -66,7 +63,8 @@ func SendEvent( builder.SetContent(r) var queryRes api.QueryLatestEventsAndStateResponse - if err := events.FillBuilder(&builder, queryAPI, &queryRes); err == events.ErrRoomNoExists { + e, err := events.BuildEvent(&builder, cfg, queryAPI, &queryRes) + if err == events.ErrRoomNoExists { return util.JSONResponse{ Code: 404, JSON: jsonerror.NotFound("Room does not exist"), @@ -75,21 +73,13 @@ func SendEvent( return httputil.LogThenError(req, err) } - eventID := fmt.Sprintf("$%s:%s", util.RandomString(16), cfg.Matrix.ServerName) - e, err := builder.Build( - eventID, time.Now(), cfg.Matrix.ServerName, cfg.Matrix.KeyID, cfg.Matrix.PrivateKey, - ) - if err != nil { - return httputil.LogThenError(req, err) - } - // check to see if this user can perform this operation stateEvents := make([]*gomatrixserverlib.Event, len(queryRes.StateEvents)) for i := range queryRes.StateEvents { stateEvents[i] = &queryRes.StateEvents[i] } provider := gomatrixserverlib.NewAuthEvents(stateEvents) - if err = gomatrixserverlib.Allowed(e, &provider); err != nil { + if err = gomatrixserverlib.Allowed(*e, &provider); err != nil { return util.JSONResponse{ Code: 403, JSON: jsonerror.Forbidden(err.Error()), // TODO: Is this error string comprehensible to the client? @@ -97,7 +87,7 @@ func SendEvent( } // pass the new event to the roomserver - if err := producer.SendEvents([]gomatrixserverlib.Event{e}, cfg.Matrix.ServerName); err != nil { + if err := producer.SendEvents([]gomatrixserverlib.Event{*e}, cfg.Matrix.ServerName); err != nil { return httputil.LogThenError(req, err) }