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

Function federatedAuthProvider

federationapi/internal/perform.go:701–760  ·  view source on GitHub ↗

FederatedAuthProvider is an auth chain provider which fetches events from the server provided

(
	ctx context.Context, federation api.FederationClient,
	keyRing gomatrixserverlib.JSONVerifier, server gomatrixserverlib.ServerName,
)

Source from the content-addressed store, hash-verified

699
700// FederatedAuthProvider is an auth chain provider which fetches events from the server provided
701func federatedAuthProvider(
702 ctx context.Context, federation api.FederationClient,
703 keyRing gomatrixserverlib.JSONVerifier, server gomatrixserverlib.ServerName,
704) gomatrixserverlib.AuthChainProvider {
705 // A list of events that we have retried, if they were not included in
706 // the auth events supplied in the send_join.
707 retries := map[string][]*gomatrixserverlib.Event{}
708
709 // Define a function which we can pass to Check to retrieve missing
710 // auth events inline. This greatly increases our chances of not having
711 // to repeat the entire set of checks just for a missing event or two.
712 return func(roomVersion gomatrixserverlib.RoomVersion, eventIDs []string) ([]*gomatrixserverlib.Event, error) {
713 returning := []*gomatrixserverlib.Event{}
714
715 // See if we have retry entries for each of the supplied event IDs.
716 for _, eventID := range eventIDs {
717 // If we've already satisfied a request for this event ID before then
718 // just append the results. We won't retry the request.
719 if retry, ok := retries[eventID]; ok {
720 if retry == nil {
721 return nil, fmt.Errorf("missingAuth: not retrying failed event ID %q", eventID)
722 }
723 returning = append(returning, retry...)
724 continue
725 }
726
727 // Make a note of the fact that we tried to do something with this
728 // event ID, even if we don't succeed.
729 retries[eventID] = nil
730
731 // Try to retrieve the event from the server that sent us the send
732 // join response.
733 tx, txerr := federation.GetEvent(ctx, server, eventID)
734 if txerr != nil {
735 return nil, fmt.Errorf("missingAuth r.federation.GetEvent: %w", txerr)
736 }
737
738 // For each event returned, add it to the set of return events. We
739 // also will populate the retries, in case someone asks for this
740 // event ID again.
741 for _, pdu := range tx.PDUs {
742 // Try to parse the event.
743 ev, everr := gomatrixserverlib.NewEventFromUntrustedJSON(pdu, roomVersion)
744 if everr != nil {
745 return nil, fmt.Errorf("missingAuth gomatrixserverlib.NewEventFromUntrustedJSON: %w", everr)
746 }
747
748 // Check the signatures of the event.
749 if err := ev.VerifyEventSignatures(ctx, keyRing); err != nil {
750 return nil, fmt.Errorf("missingAuth VerifyEventSignatures: %w", err)
751 }
752
753 // If the event is OK then add it to the results and the retry map.
754 returning = append(returning, ev)
755 retries[ev.EventID()] = append(retries[ev.EventID()], ev)
756 }
757 }
758 return returning, nil

Callers 2

Calls 1

GetEventMethod · 0.65

Tested by

no test coverage detected