mirror of
https://github.com/matrix-org/dendrite.git
synced 2026-01-15 10:03:09 -06:00
Hook in local room join user room key creation
This commit is contained in:
parent
1fea303625
commit
2f8972bee8
|
|
@ -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")
|
||||||
|
|
|
||||||
|
|
@ -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,49 +192,58 @@ 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 {
|
||||||
} else {
|
switch info.RoomVersion {
|
||||||
roomVersion, err = r.RSAPI.QueryRoomVersionForRoom(ctx, roomID.String())
|
case gomatrixserverlib.RoomVersionPseudoIDs:
|
||||||
if err != nil {
|
senderID, err = r.Queryer.QuerySenderIDForUser(ctx, *roomID, *userID)
|
||||||
return "", "", err
|
if err == nil {
|
||||||
|
checkInvitePending = true
|
||||||
|
} else {
|
||||||
|
// create user room key if needed
|
||||||
|
key, err := r.RSAPI.GetOrCreateUserRoomPrivateKey(ctx, *userID, *roomID)
|
||||||
|
if err != nil {
|
||||||
|
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.
|
||||||
isInvitePending, inviteSender, _, inviteEvent, err := helpers.IsInvitePending(ctx, r.DB, req.RoomIDOrAlias, senderID)
|
if checkInvitePending {
|
||||||
if err == nil && !serverInRoom && isInvitePending {
|
isInvitePending, inviteSender, _, inviteEvent, err := helpers.IsInvitePending(ctx, r.DB, req.RoomIDOrAlias, senderID)
|
||||||
inviter, queryErr := r.RSAPI.QueryUserIDForSender(ctx, *roomID, inviteSender)
|
if err == nil && !serverInRoom && isInvitePending {
|
||||||
if queryErr != nil {
|
inviter, queryErr := r.RSAPI.QueryUserIDForSender(ctx, *roomID, inviteSender)
|
||||||
return "", "", fmt.Errorf("r.RSAPI.QueryUserIDForSender: %w", queryErr)
|
if queryErr != nil {
|
||||||
}
|
return "", "", fmt.Errorf("r.RSAPI.QueryUserIDForSender: %w", queryErr)
|
||||||
|
}
|
||||||
|
|
||||||
// If we were invited by someone from another server then we can
|
// If we were invited by someone from another server then we can
|
||||||
// assume they are in the room so we can join via them.
|
// assume they are in the room so we can join via them.
|
||||||
if inviter != nil && !r.Cfg.Matrix.IsLocalServerName(inviter.Domain()) {
|
if inviter != nil && !r.Cfg.Matrix.IsLocalServerName(inviter.Domain()) {
|
||||||
req.ServerNames = append(req.ServerNames, inviter.Domain())
|
req.ServerNames = append(req.ServerNames, inviter.Domain())
|
||||||
forceFederatedJoin = true
|
forceFederatedJoin = true
|
||||||
memberEvent := gjson.Parse(string(inviteEvent.JSON()))
|
memberEvent := gjson.Parse(string(inviteEvent.JSON()))
|
||||||
// only set unsigned if we've got a content.membership, which we _should_
|
// only set unsigned if we've got a content.membership, which we _should_
|
||||||
if memberEvent.Get("content.membership").Exists() {
|
if memberEvent.Get("content.membership").Exists() {
|
||||||
req.Unsigned = map[string]interface{}{
|
req.Unsigned = map[string]interface{}{
|
||||||
"prev_sender": memberEvent.Get("sender").Str,
|
"prev_sender": memberEvent.Get("sender").Str,
|
||||||
"prev_content": map[string]interface{}{
|
"prev_content": map[string]interface{}{
|
||||||
"is_direct": memberEvent.Get("content.is_direct").Bool(),
|
"is_direct": memberEvent.Get("content.is_direct").Bool(),
|
||||||
"membership": memberEvent.Get("content.membership").Str,
|
"membership": memberEvent.Get("content.membership").Str,
|
||||||
},
|
},
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue