fetchAuthEvents will check to see if any of the auth events specified by the given event are unknown. If they are then we will go off and request them from the federation and then store them in the database. By the time this function ends, either we've failed to retrieve the auth chain altogether (i
( ctx context.Context, logger *logrus.Entry, event *gomatrixserverlib.HeaderedEvent, auth *gomatrixserverlib.AuthEvents, known map[string]*types.Event, servers []gomatrixserverlib.ServerName, )
| 521 | // an error is returned) or we've successfully retrieved them all and |
| 522 | // they are now in the database. |
| 523 | func (r *Inputer) fetchAuthEvents( |
| 524 | ctx context.Context, |
| 525 | logger *logrus.Entry, |
| 526 | event *gomatrixserverlib.HeaderedEvent, |
| 527 | auth *gomatrixserverlib.AuthEvents, |
| 528 | known map[string]*types.Event, |
| 529 | servers []gomatrixserverlib.ServerName, |
| 530 | ) error { |
| 531 | span, ctx := opentracing.StartSpanFromContext(ctx, "fetchAuthEvents") |
| 532 | defer span.Finish() |
| 533 | |
| 534 | unknown := map[string]struct{}{} |
| 535 | authEventIDs := event.AuthEventIDs() |
| 536 | if len(authEventIDs) == 0 { |
| 537 | return nil |
| 538 | } |
| 539 | |
| 540 | for _, authEventID := range authEventIDs { |
| 541 | authEvents, err := r.DB.EventsFromIDs(ctx, []string{authEventID}) |
| 542 | if err != nil || len(authEvents) == 0 || authEvents[0].Event == nil { |
| 543 | unknown[authEventID] = struct{}{} |
| 544 | continue |
| 545 | } |
| 546 | ev := authEvents[0] |
| 547 | known[authEventID] = &ev // don't take the pointer of the iterated event |
| 548 | if err = auth.AddEvent(ev.Event); err != nil { |
| 549 | return fmt.Errorf("auth.AddEvent: %w", err) |
| 550 | } |
| 551 | } |
| 552 | |
| 553 | // If there are no missing auth events then there is nothing more |
| 554 | // to do — we've loaded everything that we need. |
| 555 | if len(unknown) == 0 { |
| 556 | return nil |
| 557 | } |
| 558 | |
| 559 | var err error |
| 560 | var res gomatrixserverlib.RespEventAuth |
| 561 | var found bool |
| 562 | for _, serverName := range servers { |
| 563 | // Request the entire auth chain for the event in question. This should |
| 564 | // contain all of the auth events — including ones that we already know — |
| 565 | // so we'll need to filter through those in the next section. |
| 566 | res, err = r.FSAPI.GetEventAuth(ctx, serverName, event.RoomVersion, event.RoomID(), event.EventID()) |
| 567 | if err != nil { |
| 568 | logger.WithError(err).Warnf("Failed to get event auth from federation for %q: %s", event.EventID(), err) |
| 569 | continue |
| 570 | } |
| 571 | found = true |
| 572 | break |
| 573 | } |
| 574 | if !found { |
| 575 | return fmt.Errorf("no servers provided event auth for event ID %q, tried servers %v", event.EventID(), servers) |
| 576 | } |
| 577 | |
| 578 | // Reuse these to reduce allocations. |
| 579 | authEventNIDs := make([]types.EventNID, 0, 5) |
| 580 | isRejected := false |
no test coverage detected