From 3941f67380ebd706cbb8f1c7a642d4222a7efd4f Mon Sep 17 00:00:00 2001 From: Simon Ser Date: Wed, 17 Nov 2021 11:41:11 +0100 Subject: [PATCH] Add config option to globally disable multi-upstream mode Closes: https://todo.sr.ht/~emersion/soju/122 --- cmd/soju/main.go | 1 + config/config.go | 12 ++++++++++++ doc/soju.1.scd | 4 ++++ downstream.go | 2 +- server.go | 7 ++++++- 5 files changed, 24 insertions(+), 2 deletions(-) diff --git a/cmd/soju/main.go b/cmd/soju/main.go index 42cb811..ae193f7 100644 --- a/cmd/soju/main.go +++ b/cmd/soju/main.go @@ -92,6 +92,7 @@ func loadConfig() (*config.Server, *soju.Config, error) { HTTPOrigins: raw.HTTPOrigins, AcceptProxyIPs: raw.AcceptProxyIPs, MaxUserNetworks: raw.MaxUserNetworks, + MultiUpstream: raw.MultiUpstream, Debug: debug, MOTD: motd, } diff --git a/config/config.go b/config/config.go index 560b651..410d9c2 100644 --- a/config/config.go +++ b/config/config.go @@ -51,6 +51,7 @@ type Server struct { AcceptProxyIPs IPSet MaxUserNetworks int + MultiUpstream bool } func Defaults() *Server { @@ -63,6 +64,7 @@ func Defaults() *Server { SQLDriver: "sqlite3", SQLSource: "soju.db", MaxUserNetworks: -1, + MultiUpstream: true, } } @@ -138,6 +140,16 @@ func parse(cfg scfg.Block) (*Server, error) { if srv.MaxUserNetworks, err = strconv.Atoi(max); err != nil { return nil, fmt.Errorf("directive %q: %v", d.Name, err) } + case "multi-upstream-mode": + var str string + if err := d.ParseParams(&str); err != nil { + return nil, err + } + v, err := strconv.ParseBool(str) + if err != nil { + return nil, fmt.Errorf("directive %q: %v", d.Name, err) + } + srv.MultiUpstream = v default: return nil, fmt.Errorf("unknown directive %q", d.Name) } diff --git a/doc/soju.1.scd b/doc/soju.1.scd index de70b6c..12442b1 100644 --- a/doc/soju.1.scd +++ b/doc/soju.1.scd @@ -152,6 +152,10 @@ The following directives are supported: Path to the MOTD file. The bouncer MOTD is sent to clients which aren't bound to a specific network. By default, no MOTD is sent. +*multi-upstream-mode* true|false + Globally enable or disable multi-upstream mode. By default, multi-upstream + mode is enabled. + # IRC SERVICE soju exposes an IRC service called *BouncerServ* to manage the bouncer. diff --git a/downstream.go b/downstream.go index 2f3733d..d2e3b35 100644 --- a/downstream.go +++ b/downstream.go @@ -1171,7 +1171,7 @@ func (dc *downstreamConn) welcome() error { return err } - if dc.network == nil && !dc.caps["soju.im/bouncer-networks"] { + if dc.network == nil && !dc.caps["soju.im/bouncer-networks"] && dc.srv.Config().MultiUpstream { dc.isMultiUpstream = true } diff --git a/server.go b/server.go index 4505de9..1a83208 100644 --- a/server.go +++ b/server.go @@ -61,6 +61,7 @@ type Config struct { HTTPOrigins []string AcceptProxyIPs config.IPSet MaxUserNetworks int + MultiUpstream bool MOTD string } @@ -85,7 +86,11 @@ func NewServer(db Database) *Server { listeners: make(map[net.Listener]struct{}), users: make(map[string]*user), } - srv.config.Store(&Config{Hostname: "localhost", MaxUserNetworks: -1}) + srv.config.Store(&Config{ + Hostname: "localhost", + MaxUserNetworks: -1, + MultiUpstream: true, + }) return srv }