From f9745381e54a5b0a0eae486eb5ca6a20894ed790 Mon Sep 17 00:00:00 2001 From: Tristian Celestin Date: Wed, 19 Mar 2025 08:43:25 -0400 Subject: [PATCH 1/2] Use visibility to determine the room preset if it isn't otherwise specified --- .../internal/perform/perform_create_room.go | 41 ++++++++++++------- 1 file changed, 26 insertions(+), 15 deletions(-) diff --git a/roomserver/internal/perform/perform_create_room.go b/roomserver/internal/perform/perform_create_room.go index 020e7495..8f820fba 100644 --- a/roomserver/internal/perform/perform_create_room.go +++ b/roomserver/internal/perform/perform_create_room.go @@ -114,23 +114,34 @@ func (c *Creator) PerformCreateRoom(ctx context.Context, userID spec.UserID, roo } var guestsCanJoin bool - switch createRequest.StatePreset { - case spec.PresetPrivateChat: - joinRuleContent.JoinRule = spec.Invite - historyVisibilityContent.HistoryVisibility = historyVisibilityShared - guestsCanJoin = true - case spec.PresetTrustedPrivateChat: - joinRuleContent.JoinRule = spec.Invite - historyVisibilityContent.HistoryVisibility = historyVisibilityShared - for _, invitee := range createRequest.InvitedUsers { - powerLevelContent.Users[invitee] = 100 + if createRequest.StatePreset == "" { + switch createRequest.Visibility { + case "private", "": + joinRuleContent.JoinRule = spec.Invite + historyVisibilityContent.HistoryVisibility = historyVisibilityShared + guestsCanJoin = true + case "public": + joinRuleContent.JoinRule = spec.Public + historyVisibilityContent.HistoryVisibility = historyVisibilityShared + } + } else { + switch createRequest.StatePreset { + case spec.PresetPrivateChat: + joinRuleContent.JoinRule = spec.Invite + historyVisibilityContent.HistoryVisibility = historyVisibilityShared + guestsCanJoin = true + case spec.PresetTrustedPrivateChat: + joinRuleContent.JoinRule = spec.Invite + historyVisibilityContent.HistoryVisibility = historyVisibilityShared + for _, invitee := range createRequest.InvitedUsers { + powerLevelContent.Users[invitee] = 100 + } + guestsCanJoin = true + case spec.PresetPublicChat: + joinRuleContent.JoinRule = spec.Public + historyVisibilityContent.HistoryVisibility = historyVisibilityShared } - guestsCanJoin = true - case spec.PresetPublicChat: - joinRuleContent.JoinRule = spec.Public - historyVisibilityContent.HistoryVisibility = historyVisibilityShared } - createEvent := gomatrixserverlib.FledglingEvent{ Type: spec.MRoomCreate, Content: createContent, From 2849080417c10719e0f6064532d99cce2f1b95b7 Mon Sep 17 00:00:00 2001 From: Tristian Celestin Date: Sun, 23 Mar 2025 10:00:47 -0400 Subject: [PATCH 2/2] Add check to confirm that state preset is effectively private when present and visibility are unset --- clientapi/clientapi_test.go | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/clientapi/clientapi_test.go b/clientapi/clientapi_test.go index ad2d4ad4..cf86e024 100644 --- a/clientapi/clientapi_test.go +++ b/clientapi/clientapi_test.go @@ -2330,8 +2330,23 @@ func TestCreateRoomInvite(t *testing.T) { roomID := gjson.GetBytes(w.Body.Bytes(), "room_id").Str validRoomID, _ := spec.NewRoomID(roomID) + + // Confirm that the room matches the private state preset + ev, err := rsAPI.CurrentStateEvent(context.Background(), *validRoomID, spec.MRoomJoinRules, spec.Invite) + if err != nil { + t.Fatal(err) + } + ev, err = rsAPI.CurrentStateEvent(context.Background(), *validRoomID, spec.MRoomHistoryVisibility, string(gomatrixserverlib.HistoryVisibilityShared)) + if err != nil { + t.Fatal(err) + } + ev, err = rsAPI.CurrentStateEvent(context.Background(), *validRoomID, spec.MRoomGuestAccess, "can_join") + if err != nil { + t.Fatal(err) + } + // Now ask the roomserver about the membership event of Bob - ev, err := rsAPI.CurrentStateEvent(context.Background(), *validRoomID, spec.MRoomMember, bob.ID) + ev, err = rsAPI.CurrentStateEvent(context.Background(), *validRoomID, spec.MRoomMember, bob.ID) if err != nil { t.Fatal(err) }