Browse Source

Apply default user modes just before registration.

Previously, we were applying defaults before the user had completed
registration. This meant that the number of invisible users was
incremented when the user connected, and then the total was incremented
when registration was completed.

Now both counters are updated at the same time. If a user disconnects
prior to registration, +i has not yet been applied so it would not be
decremented.
tags/v2.1.0
Alex Jaspersen 3 years ago
parent
commit
0241e0c31d
6 changed files with 37 additions and 25 deletions
  1. 0
    1
      irc/client.go
  2. 1
    1
      irc/config.go
  3. 17
    14
      irc/modes.go
  4. 7
    7
      irc/modes_test.go
  5. 8
    1
      irc/server.go
  6. 4
    1
      irc/stats.go

+ 0
- 1
irc/client.go View File

@@ -337,7 +337,6 @@ func (server *Server) RunClient(conn IRCConn) {
337 337
 	session.idletimer.Initialize(session)
338 338
 	session.resetFakelag()
339 339
 
340
-	ApplyUserModeChanges(client, config.Accounts.defaultUserModes, false, nil)
341 340
 	if wConn.Secure {
342 341
 		client.SetMode(modes.TLS, true)
343 342
 	}

+ 1
- 1
irc/config.go View File

@@ -256,7 +256,7 @@ type AccountConfig struct {
256 256
 		exemptedNets []net.IPNet
257 257
 	} `yaml:"require-sasl"`
258 258
 	DefaultUserModes    *string `yaml:"default-user-modes"`
259
-	defaultUserModes    modes.ModeChanges
259
+	defaultUserModes    modes.Modes
260 260
 	LDAP                ldap.ServerConfig
261 261
 	LoginThrottling     ThrottleConfig `yaml:"login-throttling"`
262 262
 	SkipServerPassword  bool           `yaml:"skip-server-password"`

+ 17
- 14
irc/modes.go View File

@@ -23,7 +23,7 @@ var (
23 23
 
24 24
 	// DefaultUserModes are set on all users when they login.
25 25
 	// this can be overridden in the `accounts` config, with the `default-user-modes` key
26
-	DefaultUserModes = modes.ModeChanges{}
26
+	DefaultUserModes = modes.Modes{}
27 27
 )
28 28
 
29 29
 // ApplyUserModeChanges applies the given changes, and returns the applied changes.
@@ -110,32 +110,35 @@ func ApplyUserModeChanges(client *Client, changes modes.ModeChanges, force bool,
110 110
 	return applied
111 111
 }
112 112
 
113
+// parseDefaultModes uses the provided mode change parser to parse the rawModes.
114
+func parseDefaultModes(rawModes string, parser func(params ...string) (modes.ModeChanges, map[rune]bool)) modes.Modes {
115
+	modeChangeStrings := strings.Fields(rawModes)
116
+	modeChanges, _ := parser(modeChangeStrings...)
117
+	defaultModes := make(modes.Modes, 0)
118
+	for _, modeChange := range modeChanges {
119
+		if modeChange.Op == modes.Add {
120
+			defaultModes = append(defaultModes, modeChange.Mode)
121
+		}
122
+	}
123
+	return defaultModes
124
+}
125
+
113 126
 // ParseDefaultChannelModes parses the `default-modes` line of the config
114 127
 func ParseDefaultChannelModes(rawModes *string) modes.Modes {
115 128
 	if rawModes == nil {
116 129
 		// not present in config, fall back to compile-time default
117 130
 		return DefaultChannelModes
118 131
 	}
119
-	modeChangeStrings := strings.Fields(*rawModes)
120
-	modeChanges, _ := modes.ParseChannelModeChanges(modeChangeStrings...)
121
-	defaultChannelModes := make(modes.Modes, 0)
122
-	for _, modeChange := range modeChanges {
123
-		if modeChange.Op == modes.Add {
124
-			defaultChannelModes = append(defaultChannelModes, modeChange.Mode)
125
-		}
126
-	}
127
-	return defaultChannelModes
132
+	return parseDefaultModes(*rawModes, modes.ParseChannelModeChanges)
128 133
 }
129 134
 
130 135
 // ParseDefaultUserModes parses the `default-user-modes` line of the config
131
-func ParseDefaultUserModes(rawModes *string) modes.ModeChanges {
136
+func ParseDefaultUserModes(rawModes *string) modes.Modes {
132 137
 	if rawModes == nil {
133 138
 		// not present in config, fall back to compile-time default
134 139
 		return DefaultUserModes
135 140
 	}
136
-	modeChangeStrings := strings.Fields(*rawModes)
137
-	modeChanges, _ := modes.ParseUserModeChanges(modeChangeStrings...)
138
-	return modeChanges
141
+	return parseDefaultModes(*rawModes, modes.ParseUserModeChanges)
139 142
 }
140 143
 
141 144
 // #1021: channel key must be valid as a non-final parameter

+ 7
- 7
irc/modes_test.go View File

@@ -43,19 +43,19 @@ func TestParseDefaultUserModes(t *testing.T) {
43 43
 
44 44
 	var parseTests = []struct {
45 45
 		raw      *string
46
-		expected modes.ModeChanges
46
+		expected modes.Modes
47 47
 	}{
48
-		{&iR, modes.ModeChanges{{Mode: modes.Invisible, Op: modes.Add}, {Mode: modes.RegisteredOnly, Op: modes.Add}}},
49
-		{&i, modes.ModeChanges{{Mode: modes.Invisible, Op: modes.Add}}},
50
-		{&empty, modes.ModeChanges{}},
51
-		{&rminusi, modes.ModeChanges{{Mode: modes.RegisteredOnly, Op: modes.Add}}},
52
-		{nil, modes.ModeChanges{}},
48
+		{&iR, modes.Modes{modes.Invisible, modes.RegisteredOnly}},
49
+		{&i, modes.Modes{modes.Invisible}},
50
+		{&empty, modes.Modes{}},
51
+		{&rminusi, modes.Modes{modes.RegisteredOnly}},
52
+		{nil, modes.Modes{}},
53 53
 	}
54 54
 
55 55
 	for _, testcase := range parseTests {
56 56
 		result := ParseDefaultUserModes(testcase.raw)
57 57
 		if !reflect.DeepEqual(result, testcase.expected) {
58
-			t.Errorf("expected modes %v, got %v", testcase.expected, result)
58
+			t.Errorf("expected modes %s, got %s", testcase.expected, result)
59 59
 		}
60 60
 	}
61 61
 }

+ 8
- 1
irc/server.go View File

@@ -266,11 +266,18 @@ func (server *Server) tryRegister(c *Client, session *Session) (exiting bool) {
266 266
 		return true
267 267
 	}
268 268
 
269
+	// Apply default user modes (without updating the invisible counter)
270
+	// The number of invisible users will be updated by server.stats.Register
271
+	// if we're using default user mode +i.
272
+	for _, defaultMode := range server.Config().Accounts.defaultUserModes {
273
+		c.SetMode(defaultMode, true)
274
+	}
275
+
269 276
 	// registration has succeeded:
270 277
 	c.SetRegistered()
271 278
 
272 279
 	// count new user in statistics
273
-	server.stats.Register()
280
+	server.stats.Register(c.HasMode(modes.Invisible))
274 281
 	server.monitorManager.AlertAbout(c, true)
275 282
 
276 283
 	server.playRegistrationBurst(session)

+ 4
- 1
irc/stats.go View File

@@ -41,9 +41,12 @@ func (s *Stats) AddRegistered(invisible, operator bool) {
41 41
 }
42 42
 
43 43
 // Transition a client from unregistered to registered
44
-func (s *Stats) Register() {
44
+func (s *Stats) Register(invisible bool) {
45 45
 	s.mutex.Lock()
46 46
 	s.Unknown -= 1
47
+	if invisible {
48
+		s.Invisible += 1
49
+	}
47 50
 	s.Total += 1
48 51
 	s.setMax()
49 52
 	s.mutex.Unlock()

Loading…
Cancel
Save