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, )
| 699 | |
| 700 | // FederatedAuthProvider is an auth chain provider which fetches events from the server provided |
| 701 | func 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 |
no test coverage detected