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

Method lookupEvent

roomserver/internal/input/input_missing.go:839–887  ·  view source on GitHub ↗
(ctx context.Context, roomVersion gomatrixserverlib.RoomVersion, _, missingEventID string, localFirst bool)

Source from the content-addressed store, hash-verified

837}
838
839func (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
889func checkAllowedByState(e *gomatrixserverlib.Event, stateEvents []*gomatrixserverlib.Event) error {
890 authUsingState := gomatrixserverlib.NewAuthEvents(nil)

Callers 3

lookupStateAfterEventMethod · 0.95
resolveStatesAndCheckMethod · 0.95

Calls 3

cacheAndReturnMethod · 0.95
EventsFromIDsMethod · 0.65
GetEventMethod · 0.65

Tested by

no test coverage detected