From e9bfa0c51912e6a25ea6d992861fe5abe081417a Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Wed, 12 Nov 2025 22:04:29 +0200 Subject: [PATCH] bridgev2/portal: treat spam checker join rule as public --- bridgev2/portal.go | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/bridgev2/portal.go b/bridgev2/portal.go index 344ca807..c59d21c7 100644 --- a/bridgev2/portal.go +++ b/bridgev2/portal.go @@ -4236,13 +4236,33 @@ func (portal *Portal) updateOtherUser(ctx context.Context, members *ChatMemberLi return false } +func looksDirectlyJoinable(rule *event.JoinRulesEventContent) bool { + switch rule.JoinRule { + case event.JoinRulePublic: + return true + case event.JoinRuleKnockRestricted, event.JoinRuleRestricted: + for _, allow := range rule.Allow { + if allow.Type == "fi.mau.spam_checker" { + return true + } + } + } + return false +} + func (portal *Portal) roomIsPublic(ctx context.Context) bool { evt, err := portal.Bridge.Matrix.(MatrixConnectorWithArbitraryRoomState).GetStateEvent(ctx, portal.MXID, event.StateJoinRules, "") if err != nil { zerolog.Ctx(ctx).Warn().Err(err).Msg("Failed to get join rules to check if room is public") return false + } else if evt == nil { + return false } - return evt != nil && evt.Content.AsJoinRules().JoinRule == event.JoinRulePublic + content, ok := evt.Content.Parsed.(*event.JoinRulesEventContent) + if !ok { + return false + } + return looksDirectlyJoinable(content) } func (portal *Portal) syncParticipants(