bridgev2/portal: only allow setting receiver as relay in split portals

This commit is contained in:
Tulir Asokan 2025-11-25 14:23:09 +02:00
commit eaa4e07eae
2 changed files with 16 additions and 3 deletions

View file

@ -37,7 +37,7 @@ func fnSetRelay(ce *Event) {
}
onlySetDefaultRelays := !ce.User.Permissions.Admin && ce.Bridge.Config.Relay.AdminOnly
var relay *bridgev2.UserLogin
if len(ce.Args) == 0 {
if len(ce.Args) == 0 && ce.Portal.Receiver == "" {
relay = ce.User.GetDefaultLogin()
isLoggedIn := relay != nil
if onlySetDefaultRelays {
@ -73,9 +73,19 @@ func fnSetRelay(ce *Event) {
}
}
} else {
relay = ce.Bridge.GetCachedUserLoginByID(networkid.UserLoginID(ce.Args[0]))
var targetID networkid.UserLoginID
if ce.Portal.Receiver != "" {
targetID = ce.Portal.Receiver
if len(ce.Args) > 0 && ce.Args[0] != string(targetID) {
ce.Reply("In split portals, only the receiver (%s) can be set as relay", targetID)
return
}
} else {
targetID = networkid.UserLoginID(ce.Args[0])
}
relay = ce.Bridge.GetCachedUserLoginByID(targetID)
if relay == nil {
ce.Reply("User login with ID `%s` not found", ce.Args[0])
ce.Reply("User login with ID `%s` not found", targetID)
return
} else if slices.Contains(ce.Bridge.Config.Relay.DefaultRelays, relay.ID) {
// All good

View file

@ -5153,6 +5153,9 @@ func (portal *Portal) Save(ctx context.Context) error {
}
func (portal *Portal) SetRelay(ctx context.Context, relay *UserLogin) error {
if portal.Receiver != "" && relay.ID != portal.Receiver {
return fmt.Errorf("can't set non-receiver login as relay")
}
portal.Relay = relay
if relay == nil {
portal.RelayLoginID = ""