Hook in local room join user room key creation

This commit is contained in:
Devon Hudson 2023-06-14 11:42:02 +01:00
parent 1fea303625
commit 2f8972bee8
No known key found for this signature in database
GPG key ID: CD06B18E77F6A628
2 changed files with 57 additions and 57 deletions

View file

@ -65,8 +65,16 @@ func (c *Creator) PerformCreateRoom(ctx context.Context, userID spec.UserID, roo
} }
var senderID spec.SenderID var senderID spec.SenderID
if createRequest.RoomVersion == gomatrixserverlib.RoomVersionPseudoIDs { if createRequest.RoomVersion == gomatrixserverlib.RoomVersionPseudoIDs {
// TODO: pseudoIDs - generate senderID kere! // create user room key if needed
senderID = "pseudo_id.sender.key" key, err := c.RSAPI.GetOrCreateUserRoomPrivateKey(ctx, userID, roomID)
if err != nil {
util.GetLogger(ctx).WithError(err).Error("GetOrCreateUserRoomPrivateKey failed")
return "", &util.JSONResponse{
Code: http.StatusInternalServerError,
JSON: spec.InternalServerError{},
}
}
senderID = spec.SenderID(spec.Base64Bytes(key).Encode())
} else { } else {
senderID = spec.SenderID(userID.String()) senderID = spec.SenderID(userID.String())
} }
@ -363,18 +371,6 @@ func (c *Creator) PerformCreateRoom(ctx context.Context, userID spec.UserID, roo
} }
} }
// create user room key if needed
if createRequest.RoomVersion == gomatrixserverlib.RoomVersionPseudoIDs {
_, err = c.RSAPI.GetOrCreateUserRoomPrivateKey(ctx, userID, roomID)
if err != nil {
util.GetLogger(ctx).WithError(err).Error("GetOrCreateUserRoomPrivateKey failed")
return "", &util.JSONResponse{
Code: http.StatusInternalServerError,
JSON: spec.InternalServerError{},
}
}
}
// send the remaining events // send the remaining events
if err = api.SendInputRoomEvents(ctx, c.RSAPI, userID.Domain(), inputs[1:], false); err != nil { if err = api.SendInputRoomEvents(ctx, c.RSAPI, userID.Domain(), inputs[1:], false); err != nil {
util.GetLogger(ctx).WithError(err).Error("roomserverAPI.SendInputRoomEvents failed") util.GetLogger(ctx).WithError(err).Error("roomserverAPI.SendInputRoomEvents failed")

View file

@ -25,6 +25,7 @@ import (
"github.com/getsentry/sentry-go" "github.com/getsentry/sentry-go"
"github.com/matrix-org/gomatrixserverlib" "github.com/matrix-org/gomatrixserverlib"
"github.com/matrix-org/gomatrixserverlib/spec" "github.com/matrix-org/gomatrixserverlib/spec"
"github.com/matrix-org/util"
"github.com/sirupsen/logrus" "github.com/sirupsen/logrus"
"github.com/tidwall/gjson" "github.com/tidwall/gjson"
@ -191,28 +192,36 @@ func (r *Joiner) performJoinRoomByID(
return "", "", rsAPI.ErrInvalidID{Err: fmt.Errorf("user ID %q is invalid: %w", req.UserID, err)} return "", "", rsAPI.ErrInvalidID{Err: fmt.Errorf("user ID %q is invalid: %w", req.UserID, err)}
} }
// Look up the room NID for the supplied room ID.
var senderID spec.SenderID var senderID spec.SenderID
var roomVersion gomatrixserverlib.RoomVersion checkInvitePending := false
if forceFederatedJoin { info, err := r.DB.RoomInfo(ctx, req.RoomIDOrAlias)
// TODO: pseudoIDs - lookup room version kere! if err == nil && info != nil {
switch info.RoomVersion {
case gomatrixserverlib.RoomVersionPseudoIDs:
senderID, err = r.Queryer.QuerySenderIDForUser(ctx, *roomID, *userID)
if err == nil {
checkInvitePending = true
} else { } else {
roomVersion, err = r.RSAPI.QueryRoomVersionForRoom(ctx, roomID.String()) // create user room key if needed
key, err := r.RSAPI.GetOrCreateUserRoomPrivateKey(ctx, *userID, *roomID)
if err != nil { if err != nil {
return "", "", err util.GetLogger(ctx).WithError(err).Error("GetOrCreateUserRoomPrivateKey failed")
return "", "", fmt.Errorf("GetOrCreateUserRoomPrivateKey failed: %w", err)
}
senderID = spec.SenderID(spec.Base64Bytes(key).Encode())
}
default:
checkInvitePending = true
senderID = spec.SenderID(userID.String())
} }
} }
if roomVersion == gomatrixserverlib.RoomVersionPseudoIDs {
// TODO: pseudoIDs - generate senderID kere!
senderID = "pseudo_id.sender.key"
} else {
senderID = spec.SenderID(userID.String())
}
senderIDString := string(senderID)
userDomain := userID.Domain() userDomain := userID.Domain()
// Force a federated join if we're dealing with a pending invite // Force a federated join if we're dealing with a pending invite
// and we aren't in the room. // and we aren't in the room.
if checkInvitePending {
isInvitePending, inviteSender, _, inviteEvent, err := helpers.IsInvitePending(ctx, r.DB, req.RoomIDOrAlias, senderID) isInvitePending, inviteSender, _, inviteEvent, err := helpers.IsInvitePending(ctx, r.DB, req.RoomIDOrAlias, senderID)
if err == nil && !serverInRoom && isInvitePending { if err == nil && !serverInRoom && isInvitePending {
inviter, queryErr := r.RSAPI.QueryUserIDForSender(ctx, *roomID, inviteSender) inviter, queryErr := r.RSAPI.QueryUserIDForSender(ctx, *roomID, inviteSender)
@ -238,6 +247,7 @@ func (r *Joiner) performJoinRoomByID(
} }
} }
} }
}
// If a guest is trying to join a room, check that the room has a m.room.guest_access event // If a guest is trying to join a room, check that the room has a m.room.guest_access event
if req.IsGuest { if req.IsGuest {
@ -261,6 +271,7 @@ func (r *Joiner) performJoinRoomByID(
// If we should do a forced federated join then do that. // If we should do a forced federated join then do that.
var joinedVia spec.ServerName var joinedVia spec.ServerName
if forceFederatedJoin { if forceFederatedJoin {
// TODO : pseudoIDs - pass through userID here since we don't know what the senderID should be yet
joinedVia, err = r.performFederatedJoinRoomByID(ctx, req, senderID) joinedVia, err = r.performFederatedJoinRoomByID(ctx, req, senderID)
return req.RoomIDOrAlias, joinedVia, err return req.RoomIDOrAlias, joinedVia, err
} }
@ -277,6 +288,8 @@ func (r *Joiner) performJoinRoomByID(
return "", "", fmt.Errorf("error joining local room: %q", err) return "", "", fmt.Errorf("error joining local room: %q", err)
} }
senderIDString := string(senderID)
// Prepare the template for the join event. // Prepare the template for the join event.
proto := gomatrixserverlib.ProtoEvent{ proto := gomatrixserverlib.ProtoEvent{
Type: spec.MRoomMember, Type: spec.MRoomMember,
@ -308,15 +321,6 @@ func (r *Joiner) performJoinRoomByID(
switch err.(type) { switch err.(type) {
case nil: case nil:
// create user room key if needed
if buildRes.RoomVersion == gomatrixserverlib.RoomVersionPseudoIDs {
_, err = r.RSAPI.GetOrCreateUserRoomPrivateKey(ctx, *userID, *roomID)
if err != nil {
logrus.WithError(err).Error("GetOrCreateUserRoomPrivateKey failed")
return "", "", fmt.Errorf("failed to get user room private key: %w", err)
}
}
// The room join is local. Send the new join event into the // The room join is local. Send the new join event into the
// roomserver. First of all check that the user isn't already // roomserver. First of all check that the user isn't already
// a member of the room. This is best-effort (as in we won't // a member of the room. This is best-effort (as in we won't