Add enable-user-on-auth config directive

This commit is contained in:
Simon Ser 2023-01-26 19:51:35 +01:00
parent 9df9880301
commit db49bc120f
5 changed files with 27 additions and 0 deletions

View File

@ -92,6 +92,7 @@ func loadConfig() (*config.Server, *soju.Config, error) {
MaxUserNetworks: raw.MaxUserNetworks, MaxUserNetworks: raw.MaxUserNetworks,
UpstreamUserIPs: raw.UpstreamUserIPs, UpstreamUserIPs: raw.UpstreamUserIPs,
DisableInactiveUsersDelay: raw.DisableInactiveUsersDelay, DisableInactiveUsersDelay: raw.DisableInactiveUsersDelay,
EnableUsersOnAuth: raw.EnableUsersOnAuth,
MOTD: motd, MOTD: motd,
} }
return raw, cfg, nil return raw, cfg, nil

View File

@ -74,6 +74,7 @@ type Server struct {
MaxUserNetworks int MaxUserNetworks int
UpstreamUserIPs []*net.IPNet UpstreamUserIPs []*net.IPNet
DisableInactiveUsersDelay time.Duration DisableInactiveUsersDelay time.Duration
EnableUsersOnAuth bool
} }
func Defaults() *Server { func Defaults() *Server {
@ -207,6 +208,16 @@ func parse(cfg scfg.Block) (*Server, error) {
return nil, fmt.Errorf("directive %q: duration must be positive", d.Name) return nil, fmt.Errorf("directive %q: duration must be positive", d.Name)
} }
srv.DisableInactiveUsersDelay = dur srv.DisableInactiveUsersDelay = dur
case "enable-user-on-auth":
var s string
if err := d.ParseParams(&s); err != nil {
return nil, err
}
b, err := strconv.ParseBool(s)
if err != nil {
return nil, fmt.Errorf("directive %q: %v", d.Name, err)
}
srv.EnableUsersOnAuth = b
default: default:
return nil, fmt.Errorf("unknown directive %q", d.Name) return nil, fmt.Errorf("unknown directive %q", d.Name)
} }

View File

@ -179,6 +179,12 @@ The following directives are supported:
For instance, "30d" disables users 30 days after they last disconnect from For instance, "30d" disables users 30 days after they last disconnect from
the bouncer. the bouncer.
*enable-user-on-auth* true|false
Enable users when they successfully authenticate.
This can be used together with _disable-inactive-user_ to seamlessly
disable and re-enable users during lengthy inactivity.
# IRC SERVICE # IRC SERVICE
soju exposes an IRC service called *BouncerServ* to manage the bouncer. soju exposes an IRC service called *BouncerServ* to manage the bouncer.

View File

@ -142,6 +142,7 @@ type Config struct {
MOTD string MOTD string
UpstreamUserIPs []*net.IPNet UpstreamUserIPs []*net.IPNet
DisableInactiveUsersDelay time.Duration DisableInactiveUsersDelay time.Duration
EnableUsersOnAuth bool
} }
type Server struct { type Server struct {

View File

@ -692,6 +692,14 @@ func (u *user) run() {
dc.monitored.SetCasemapping(dc.network.casemap) dc.monitored.SetCasemapping(dc.network.casemap)
} }
if !u.Enabled && u.srv.Config().EnableUsersOnAuth {
record := u.User
record.Enabled = true
if err := u.updateUser(ctx, &record); err != nil {
dc.logger.Printf("failed to enable user after successful authentication: %v", err)
}
}
if !u.Enabled { if !u.Enabled {
dc.SendMessage(&irc.Message{ dc.SendMessage(&irc.Message{
Command: "ERROR", Command: "ERROR",