Still send back errors for rejected events

Instead, discard them at the federationapi /send layer rather than
re-implementing checks at the clientapi/PerformJoin layer.
This commit is contained in:
Kegan Dougal 2020-09-15 17:14:11 +01:00
parent b4ce2bd4f5
commit 6649528a7a
2 changed files with 17 additions and 5 deletions

View file

@ -17,6 +17,7 @@ package routing
import ( import (
"context" "context"
"encoding/json" "encoding/json"
"errors"
"fmt" "fmt"
"net/http" "net/http"
"time" "time"
@ -378,7 +379,7 @@ func (t *txnReq) processEvent(ctx context.Context, e gomatrixserverlib.Event, is
} }
// pass the event to the roomserver // pass the event to the roomserver
return api.SendEvents( err := api.SendEvents(
context.Background(), context.Background(),
t.rsAPI, t.rsAPI,
[]gomatrixserverlib.HeaderedEvent{ []gomatrixserverlib.HeaderedEvent{
@ -387,6 +388,12 @@ func (t *txnReq) processEvent(ctx context.Context, e gomatrixserverlib.Event, is
api.DoNotSendToOtherServers, api.DoNotSendToOtherServers,
nil, nil,
) )
var notAllowed *gomatrixserverlib.NotAllowed
if errors.As(err, &notAllowed) {
// the event was rejected, silently ignore.
err = nil
}
return err
} }
func checkAllowedByState(e gomatrixserverlib.Event, stateEvents []gomatrixserverlib.Event) error { func checkAllowedByState(e gomatrixserverlib.Event, stateEvents []gomatrixserverlib.Event) error {

View file

@ -47,9 +47,9 @@ func (r *Inputer) processRoomEvent(
// Check that the event passes authentication checks and work out // Check that the event passes authentication checks and work out
// the numeric IDs for the auth events. // the numeric IDs for the auth events.
isRejected := false isRejected := false
authEventNIDs, err := helpers.CheckAuthEvents(ctx, r.DB, headered, input.AuthEventIDs) authEventNIDs, rejectionErr := helpers.CheckAuthEvents(ctx, r.DB, headered, input.AuthEventIDs)
if err != nil { if rejectionErr != nil {
logrus.WithError(err).WithField("event_id", event.EventID()).WithField("auth_event_ids", input.AuthEventIDs).Error("processRoomEvent.checkAuthEvents failed for event, rejecting event") logrus.WithError(rejectionErr).WithField("event_id", event.EventID()).WithField("auth_event_ids", input.AuthEventIDs).Error("processRoomEvent.checkAuthEvents failed for event, rejecting event")
isRejected = true isRejected = true
} }
@ -72,7 +72,12 @@ func (r *Inputer) processRoomEvent(
} }
// We stop here if the event is rejected: We've stored it but won't update forward extremities or notify anyone about it. // We stop here if the event is rejected: We've stored it but won't update forward extremities or notify anyone about it.
if isRejected { if isRejected {
return event.EventID(), nil logrus.WithFields(logrus.Fields{
"event_id": event.EventID(),
"type": event.Type(),
"room": event.RoomID(),
}).Debug("Stored rejected event")
return event.EventID(), rejectionErr
} }
// if storing this event results in it being redacted then do so. // if storing this event results in it being redacted then do so.
if redactedEventID == event.EventID() { if redactedEventID == event.EventID() {