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

Method fetchAuthEvents

roomserver/internal/input/input_events.go:523–639  ·  view source on GitHub ↗

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,
)

Source from the content-addressed store, hash-verified

521// an error is returned) or we've successfully retrieved them all and
522// they are now in the database.
523func (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

Callers 1

processRoomEventMethod · 0.95

Calls 4

EventsFromIDsMethod · 0.65
GetEventAuthMethod · 0.65
KeyRingMethod · 0.65
StoreEventMethod · 0.65

Tested by

no test coverage detected