MCPcopy Create free account
hub / github.com/daodst/chat / buildMembershipEvent

Function buildMembershipEvent

federationapi/routing/threepid.go:277–335  ·  view source on GitHub ↗

buildMembershipEvent uses a builder for a m.room.member invite event derived from a third-party invite to auth and build the said event. Returns the said event. Returns errNotInRoom if the server is not in the room the invite is for. Returns an error if something failed during the process.

(
	ctx context.Context,
	builder *gomatrixserverlib.EventBuilder, rsAPI api.FederationRoomserverAPI,
	cfg *config.FederationAPI,
)

Source from the content-addressed store, hash-verified

275// Returns errNotInRoom if the server is not in the room the invite is for.
276// Returns an error if something failed during the process.
277func buildMembershipEvent(
278 ctx context.Context,
279 builder *gomatrixserverlib.EventBuilder, rsAPI api.FederationRoomserverAPI,
280 cfg *config.FederationAPI,
281) (*gomatrixserverlib.Event, error) {
282 eventsNeeded, err := gomatrixserverlib.StateNeededForEventBuilder(builder)
283 if err != nil {
284 return nil, err
285 }
286
287 if len(eventsNeeded.Tuples()) == 0 {
288 return nil, errors.New("expecting state tuples for event builder, got none")
289 }
290
291 // Ask the roomserver for information about this room
292 queryReq := api.QueryLatestEventsAndStateRequest{
293 RoomID: builder.RoomID,
294 StateToFetch: eventsNeeded.Tuples(),
295 }
296 var queryRes api.QueryLatestEventsAndStateResponse
297 if err = rsAPI.QueryLatestEventsAndState(ctx, &queryReq, &queryRes); err != nil {
298 return nil, err
299 }
300
301 if !queryRes.RoomExists {
302 // Use federation to auth the event
303 return nil, errNotInRoom
304 }
305
306 // Auth the event locally
307 builder.Depth = queryRes.Depth
308 builder.PrevEvents = queryRes.LatestEvents
309
310 authEvents := gomatrixserverlib.NewAuthEvents(nil)
311
312 for i := range queryRes.StateEvents {
313 err = authEvents.AddEvent(queryRes.StateEvents[i].Event)
314 if err != nil {
315 return nil, err
316 }
317 }
318
319 if err = fillDisplayName(builder, authEvents); err != nil {
320 return nil, err
321 }
322
323 refs, err := eventsNeeded.AuthEventReferences(&authEvents)
324 if err != nil {
325 return nil, err
326 }
327 builder.AuthEvents = refs
328
329 event, err := builder.Build(
330 time.Now(), cfg.Matrix.ServerName, cfg.Matrix.KeyID,
331 cfg.Matrix.PrivateKey, queryRes.RoomVersion,
332 )
333
334 return event, err

Callers 2

ExchangeThirdPartyInviteFunction · 0.70

Calls 2

fillDisplayNameFunction · 0.85

Tested by

no test coverage detected