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, )
| 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. |
| 277 | func 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 |
no test coverage detected