diff --git a/appservice/consumers/roomserver.go b/appservice/consumers/roomserver.go index 634031fe7..97dd90deb 100644 --- a/appservice/consumers/roomserver.go +++ b/appservice/consumers/roomserver.go @@ -233,17 +233,10 @@ func (s *appserviceState) backoffAndPause(err error) error { // // TODO: This should be cached, see https://github.com/matrix-org/dendrite/issues/1682 func (s *OutputRoomEventConsumer) appserviceIsInterestedInEvent(ctx context.Context, event *types.HeaderedEvent, appservice *config.ApplicationService) bool { - userID, err := event.UserID() - if err != nil { - log.WithFields(log.Fields{ - "appservice": appservice.ID, - "room_id": event.RoomID(), - }).WithError(err).Errorf("invalid userID") - } switch { case appservice.URL == "": return false - case appservice.IsInterestedInUserID(userID.String()): + case appservice.IsInterestedInUserID(event.SenderID()): return true case appservice.IsInterestedInRoomID(event.RoomID()): return true diff --git a/clientapi/routing/redaction.go b/clientapi/routing/redaction.go index 76377a5bd..bd3a79ebc 100644 --- a/clientapi/routing/redaction.go +++ b/clientapi/routing/redaction.go @@ -76,14 +76,7 @@ func SendRedaction( // "Users may redact their own events, and any user with a power level greater than or equal // to the redact power level of the room may redact events there" // https://matrix.org/docs/spec/client_server/r0.6.1#put-matrix-client-r0-rooms-roomid-redact-eventid-txnid - userID, err := ev.UserID() - if err != nil { - return util.JSONResponse{ - Code: 400, - JSON: spec.BadJSON("invalid userID"), - } - } - allowedToRedact := userID.String() == device.UserID + allowedToRedact := ev.SenderID() == device.UserID if !allowedToRedact { plEvent := roomserverAPI.GetStateEvent(req.Context(), rsAPI, roomID, gomatrixserverlib.StateKeyTuple{ EventType: spec.MRoomPowerLevels, @@ -126,7 +119,7 @@ func SendRedaction( Type: spec.MRoomRedaction, Redacts: eventID, } - err = proto.SetContent(r) + err := proto.SetContent(r) if err != nil { util.GetLogger(req.Context()).WithError(err).Error("proto.SetContent failed") return util.JSONResponse{ diff --git a/federationapi/internal/perform.go b/federationapi/internal/perform.go index 70fa2b841..960a4461e 100644 --- a/federationapi/internal/perform.go +++ b/federationapi/internal/perform.go @@ -509,7 +509,7 @@ func (r *FederationInternalAPI) SendInvite( event gomatrixserverlib.PDU, strippedState []gomatrixserverlib.InviteStrippedState, ) (gomatrixserverlib.PDU, error) { - originUser, err := event.UserID() + _, origin, err := r.cfg.Matrix.SplitLocalID('@', event.SenderID()) if err != nil { return nil, err } @@ -542,7 +542,7 @@ func (r *FederationInternalAPI) SendInvite( return nil, fmt.Errorf("gomatrixserverlib.NewInviteV2Request: %w", err) } - inviteRes, err := r.federation.SendInviteV2(ctx, originUser.Domain(), destination, inviteReq) + inviteRes, err := r.federation.SendInviteV2(ctx, origin, destination, inviteReq) if err != nil { return nil, fmt.Errorf("r.federation.SendInviteV2: failed to send invite: %w", err) } diff --git a/federationapi/routing/leave.go b/federationapi/routing/leave.go index 91b05e382..84976901a 100644 --- a/federationapi/routing/leave.go +++ b/federationapi/routing/leave.go @@ -224,14 +224,12 @@ func SendLeave( // the request. By this point we've already asserted that the sender // and the state key are equal so we don't need to check both. var serverName spec.ServerName - userID, err := event.UserID() - if err != nil { + if _, serverName, err = gomatrixserverlib.SplitID('@', event.SenderID()); err != nil { return util.JSONResponse{ - Code: http.StatusBadRequest, + Code: http.StatusForbidden, JSON: spec.Forbidden("The sender of the join is invalid"), } - } - if userID.Domain() != request.Origin() { + } else if serverName != request.Origin() { return util.JSONResponse{ Code: http.StatusForbidden, JSON: spec.Forbidden("The sender does not match the server that originated the request"), diff --git a/go.mod b/go.mod index 88aaf7f4a..71e6ffc7a 100644 --- a/go.mod +++ b/go.mod @@ -22,7 +22,7 @@ require ( github.com/matrix-org/dugong v0.0.0-20210921133753-66e6b1c67e2e github.com/matrix-org/go-sqlite3-js v0.0.0-20220419092513-28aa791a1c91 github.com/matrix-org/gomatrix v0.0.0-20220926102614-ceba4d9f7530 - github.com/matrix-org/gomatrixserverlib v0.0.0-20230601235030-c4138953b254 + github.com/matrix-org/gomatrixserverlib v0.0.0-20230602163838-69e05dbabdad github.com/matrix-org/pinecone v0.11.1-0.20230210171230-8c3b24f2649a github.com/matrix-org/util v0.0.0-20221111132719-399730281e66 github.com/mattn/go-sqlite3 v1.14.16 diff --git a/go.sum b/go.sum index fc1293a29..565057b44 100644 --- a/go.sum +++ b/go.sum @@ -323,8 +323,8 @@ github.com/matrix-org/go-sqlite3-js v0.0.0-20220419092513-28aa791a1c91 h1:s7fexw github.com/matrix-org/go-sqlite3-js v0.0.0-20220419092513-28aa791a1c91/go.mod h1:e+cg2q7C7yE5QnAXgzo512tgFh1RbQLC0+jozuegKgo= github.com/matrix-org/gomatrix v0.0.0-20220926102614-ceba4d9f7530 h1:kHKxCOLcHH8r4Fzarl4+Y3K5hjothkVW5z7T1dUM11U= github.com/matrix-org/gomatrix v0.0.0-20220926102614-ceba4d9f7530/go.mod h1:/gBX06Kw0exX1HrwmoBibFA98yBk/jxKpGVeyQbff+s= -github.com/matrix-org/gomatrixserverlib v0.0.0-20230601235030-c4138953b254 h1:javi7tINJfP86mdYeVg7IzDmeRLeaLA0kRzIbEZlK/I= -github.com/matrix-org/gomatrixserverlib v0.0.0-20230601235030-c4138953b254/go.mod h1:H9V9N3Uqn1bBJqYJNGK1noqtgJTaCEhtTdcH/mp50uU= +github.com/matrix-org/gomatrixserverlib v0.0.0-20230602163838-69e05dbabdad h1:l+mNyh4S3v0z320VOFuTIGZLjCAeTenVjYBiUNTZm/o= +github.com/matrix-org/gomatrixserverlib v0.0.0-20230602163838-69e05dbabdad/go.mod h1:H9V9N3Uqn1bBJqYJNGK1noqtgJTaCEhtTdcH/mp50uU= github.com/matrix-org/pinecone v0.11.1-0.20230210171230-8c3b24f2649a h1:awrPDf9LEFySxTLKYBMCiObelNx/cBuv/wzllvCCH3A= github.com/matrix-org/pinecone v0.11.1-0.20230210171230-8c3b24f2649a/go.mod h1:HchJX9oKMXaT2xYFs0Ha/6Zs06mxLU8k6F1ODnrGkeQ= github.com/matrix-org/util v0.0.0-20221111132719-399730281e66 h1:6z4KxomXSIGWqhHcfzExgkH3Z3UkIXry4ibJS4Aqz2Y= diff --git a/roomserver/internal/alias.go b/roomserver/internal/alias.go index 407f4014f..0951172a0 100644 --- a/roomserver/internal/alias.go +++ b/roomserver/internal/alias.go @@ -173,7 +173,7 @@ func (r *RoomserverInternalAPI) RemoveRoomAlias( } sender := request.UserID - if sender != ev.SenderID() { + if request.UserID != ev.SenderID() { sender = ev.SenderID() } diff --git a/roomserver/internal/input/input_events.go b/roomserver/internal/input/input_events.go index 52051f7a4..e203ebf3a 100644 --- a/roomserver/internal/input/input_events.go +++ b/roomserver/internal/input/input_events.go @@ -128,7 +128,7 @@ func (r *Inputer) processRoomEvent( if roomInfo == nil && !isCreateEvent { return fmt.Errorf("room %s does not exist for event %s", event.RoomID(), event.EventID()) } - sender, err := event.UserID() + _, senderDomain, err := gomatrixserverlib.SplitID('@', event.SenderID()) if err != nil { return fmt.Errorf("event has invalid sender %q", event.SenderID()) } @@ -193,9 +193,9 @@ func (r *Inputer) processRoomEvent( serverRes.ServerNames = append(serverRes.ServerNames, input.Origin) delete(servers, input.Origin) } - if sender.Domain() != input.Origin && sender.Domain() != r.Cfg.Matrix.ServerName { - serverRes.ServerNames = append(serverRes.ServerNames, sender.Domain()) - delete(servers, sender.Domain()) + if senderDomain != input.Origin && senderDomain != r.Cfg.Matrix.ServerName { + serverRes.ServerNames = append(serverRes.ServerNames, senderDomain) + delete(servers, senderDomain) } for server := range servers { serverRes.ServerNames = append(serverRes.ServerNames, server) @@ -451,7 +451,7 @@ func (r *Inputer) processRoomEvent( } // Handle remote room upgrades, e.g. remove published room - if event.Type() == "m.room.tombstone" && event.StateKeyEquals("") && !r.Cfg.Matrix.IsLocalServerName(sender.Domain()) { + if event.Type() == "m.room.tombstone" && event.StateKeyEquals("") && !r.Cfg.Matrix.IsLocalServerName(senderDomain) { if err = r.handleRemoteRoomUpgrade(ctx, event); err != nil { return fmt.Errorf("failed to handle remote room upgrade: %w", err) } diff --git a/roomserver/internal/perform/perform_backfill.go b/roomserver/internal/perform/perform_backfill.go index e9318235f..9b6d7f678 100644 --- a/roomserver/internal/perform/perform_backfill.go +++ b/roomserver/internal/perform/perform_backfill.go @@ -484,11 +484,9 @@ FindSuccessor: // Store the server names in a temporary map to avoid duplicates. serverSet := make(map[spec.ServerName]bool) for _, event := range memberEvents { - sender, err := event.UserID() - if err != nil { - continue + if _, senderDomain, err := gomatrixserverlib.SplitID('@', event.SenderID()); err == nil { + serverSet[senderDomain] = true } - serverSet[sender.Domain()] = true } var servers []spec.ServerName for server := range serverSet { diff --git a/roomserver/internal/perform/perform_invite.go b/roomserver/internal/perform/perform_invite.go index 34984eea6..bb41e0dfc 100644 --- a/roomserver/internal/perform/perform_invite.go +++ b/roomserver/internal/perform/perform_invite.go @@ -125,7 +125,7 @@ func (r *Inviter) PerformInvite( ) error { event := req.Event - sender, err := event.UserID() + sender, err := spec.NewUserID(event.SenderID(), true) if err != nil { return spec.InvalidParam("The user ID is invalid") } diff --git a/roomserver/storage/shared/storage.go b/roomserver/storage/shared/storage.go index 78cc15c91..1ee436f99 100644 --- a/roomserver/storage/shared/storage.go +++ b/roomserver/storage/shared/storage.go @@ -988,14 +988,8 @@ func (d *EventDatabase) MaybeRedactEvent( return nil } - sender1, err := redactedEvent.UserID() - if err != nil { - return err - } - sender2, err := redactionEvent.UserID() - if err != nil { - return err - } + _, sender1, _ := gomatrixserverlib.SplitID('@', redactedEvent.SenderID()) + _, sender2, _ := gomatrixserverlib.SplitID('@', redactionEvent.SenderID()) var powerlevels *gomatrixserverlib.PowerLevelContent powerlevels, err = plResolver.Resolve(ctx, redactionEvent.EventID()) if err != nil { @@ -1005,7 +999,7 @@ func (d *EventDatabase) MaybeRedactEvent( switch { case powerlevels.UserLevel(redactionEvent.SenderID()) >= powerlevels.Redact: // 1. The power level of the redaction event’s sender is greater than or equal to the redact level. - case sender1.Domain() == sender2.Domain(): + case sender1 == sender2: // 2. The domain of the redaction event’s sender matches that of the original event’s sender. default: ignoreRedaction = true diff --git a/syncapi/storage/shared/storage_consumer.go b/syncapi/storage/shared/storage_consumer.go index 3a4758337..2211c257c 100644 --- a/syncapi/storage/shared/storage_consumer.go +++ b/syncapi/storage/shared/storage_consumer.go @@ -195,14 +195,7 @@ func (d *Database) StreamEventsToEvents(device *userapi.Device, in []types.Strea for i := 0; i < len(in); i++ { out[i] = in[i].HeaderedEvent if device != nil && in[i].TransactionID != nil { - userID, err := in[i].UserID() - if err != nil { - logrus.WithFields(logrus.Fields{ - "event_id": out[i].EventID(), - }).WithError(err).Warnf("Event has invalid userID") - continue - } - if device.UserID == userID.String() && device.SessionID == in[i].TransactionID.SessionID { + if device.UserID == in[i].SenderID() && device.SessionID == in[i].TransactionID.SessionID { err := out[i].SetUnsignedField( "transaction_id", in[i].TransactionID.TransactionID, ) diff --git a/syncapi/streams/stream_invite.go b/syncapi/streams/stream_invite.go index b35c24fac..2f05382bb 100644 --- a/syncapi/streams/stream_invite.go +++ b/syncapi/streams/stream_invite.go @@ -63,11 +63,7 @@ func (p *InviteStreamProvider) IncrementalSync( for roomID, inviteEvent := range invites { // skip ignored user events - userID, err := inviteEvent.UserID() - if err != nil { - continue - } - if _, ok := req.IgnoredUsers.List[userID.String()]; ok { + if _, ok := req.IgnoredUsers.List[inviteEvent.SenderID()]; ok { continue } ir := types.NewInviteResponse(inviteEvent) diff --git a/syncapi/synctypes/clientevent.go b/syncapi/synctypes/clientevent.go index 2d5daa282..bbd4a75c7 100644 --- a/syncapi/synctypes/clientevent.go +++ b/syncapi/synctypes/clientevent.go @@ -57,13 +57,9 @@ func ToClientEvents(serverEvs []gomatrixserverlib.PDU, format ClientEventFormat) // ToClientEvent converts a single server event to a client event. func ToClientEvent(se gomatrixserverlib.PDU, format ClientEventFormat) ClientEvent { - sender, err := se.UserID() - if err != nil { - panic("uh oh! userID does not exist...") - } ce := ClientEvent{ Content: spec.RawJSON(se.Content()), - Sender: sender.String(), + Sender: se.SenderID(), Type: se.Type(), StateKey: se.StateKey(), Unsigned: spec.RawJSON(se.Unsigned()), diff --git a/userapi/consumers/roomserver.go b/userapi/consumers/roomserver.go index b74f84374..a4cb3defe 100644 --- a/userapi/consumers/roomserver.go +++ b/userapi/consumers/roomserver.go @@ -615,11 +615,7 @@ func (s *OutputRoomEventConsumer) notifyLocal(ctx context.Context, event *rstype // evaluatePushRules fetches and evaluates the push rules of a local // user. Returns actions (including dont_notify). func (s *OutputRoomEventConsumer) evaluatePushRules(ctx context.Context, event *rstypes.HeaderedEvent, mem *localMembership, roomSize int) ([]*pushrules.Action, error) { - userID, err := event.UserID() - if err != nil { - return nil, err - } - if userID.String() == mem.UserID { + if event.SenderID() == mem.UserID { // SPEC: Homeservers MUST NOT notify the Push Gateway for // events that the user has sent themselves. return nil, nil