(ctx context.Context, roomVersion gomatrixserverlib.RoomVersion, _, missingEventID string, localFirst bool)
| 837 | } |
| 838 | |
| 839 | func (t *missingStateReq) lookupEvent(ctx context.Context, roomVersion gomatrixserverlib.RoomVersion, _, missingEventID string, localFirst bool) (*gomatrixserverlib.Event, error) { |
| 840 | span, ctx := opentracing.StartSpanFromContext(ctx, "lookupEvent") |
| 841 | defer span.Finish() |
| 842 | |
| 843 | if localFirst { |
| 844 | // fetch from the roomserver |
| 845 | events, err := t.db.EventsFromIDs(ctx, []string{missingEventID}) |
| 846 | if err != nil { |
| 847 | util.GetLogger(ctx).Warnf("Failed to query roomserver for missing event %s: %s - falling back to remote", missingEventID, err) |
| 848 | } else if len(events) == 1 { |
| 849 | return events[0].Event, nil |
| 850 | } |
| 851 | } |
| 852 | var event *gomatrixserverlib.Event |
| 853 | found := false |
| 854 | for _, serverName := range t.servers { |
| 855 | reqctx, cancel := context.WithTimeout(ctx, time.Second*30) |
| 856 | defer cancel() |
| 857 | txn, err := t.federation.GetEvent(reqctx, serverName, missingEventID) |
| 858 | if err != nil || len(txn.PDUs) == 0 { |
| 859 | util.GetLogger(ctx).WithError(err).WithField("event_id", missingEventID).Warn("Failed to get missing /event for event ID") |
| 860 | if errors.Is(err, context.DeadlineExceeded) { |
| 861 | select { |
| 862 | case <-reqctx.Done(): // this server took too long |
| 863 | continue |
| 864 | case <-ctx.Done(): // the input request timed out |
| 865 | return nil, context.DeadlineExceeded |
| 866 | } |
| 867 | } |
| 868 | continue |
| 869 | } |
| 870 | event, err = gomatrixserverlib.NewEventFromUntrustedJSON(txn.PDUs[0], roomVersion) |
| 871 | if err != nil { |
| 872 | util.GetLogger(ctx).WithError(err).WithField("event_id", missingEventID).Warnf("Failed to parse event JSON of event returned from /event") |
| 873 | continue |
| 874 | } |
| 875 | found = true |
| 876 | break |
| 877 | } |
| 878 | if !found { |
| 879 | util.GetLogger(ctx).WithField("event_id", missingEventID).Warnf("Failed to get missing /event for event ID from %d server(s)", len(t.servers)) |
| 880 | return nil, fmt.Errorf("wasn't able to find event via %d server(s)", len(t.servers)) |
| 881 | } |
| 882 | if err := event.VerifyEventSignatures(ctx, t.keys); err != nil { |
| 883 | util.GetLogger(ctx).WithError(err).Warnf("Couldn't validate signature of event %q from /event", event.EventID()) |
| 884 | return nil, verifySigError{event.EventID(), err} |
| 885 | } |
| 886 | return t.cacheAndReturn(event), nil |
| 887 | } |
| 888 | |
| 889 | func checkAllowedByState(e *gomatrixserverlib.Event, stateEvents []*gomatrixserverlib.Event) error { |
| 890 | authUsingState := gomatrixserverlib.NewAuthEvents(nil) |
no test coverage detected