Преглед на файлове

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 преди 4 години
родител
ревизия
0241e0c31d
променени са 6 файла, в които са добавени 37 реда и са изтрити 25 реда
  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 Целия файл

337
 	session.idletimer.Initialize(session)
337
 	session.idletimer.Initialize(session)
338
 	session.resetFakelag()
338
 	session.resetFakelag()
339
 
339
 
340
-	ApplyUserModeChanges(client, config.Accounts.defaultUserModes, false, nil)
341
 	if wConn.Secure {
340
 	if wConn.Secure {
342
 		client.SetMode(modes.TLS, true)
341
 		client.SetMode(modes.TLS, true)
343
 	}
342
 	}

+ 1
- 1
irc/config.go Целия файл

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

+ 17
- 14
irc/modes.go Целия файл

23
 
23
 
24
 	// DefaultUserModes are set on all users when they login.
24
 	// DefaultUserModes are set on all users when they login.
25
 	// this can be overridden in the `accounts` config, with the `default-user-modes` key
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
 // ApplyUserModeChanges applies the given changes, and returns the applied changes.
29
 // ApplyUserModeChanges applies the given changes, and returns the applied changes.
110
 	return applied
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
 // ParseDefaultChannelModes parses the `default-modes` line of the config
126
 // ParseDefaultChannelModes parses the `default-modes` line of the config
114
 func ParseDefaultChannelModes(rawModes *string) modes.Modes {
127
 func ParseDefaultChannelModes(rawModes *string) modes.Modes {
115
 	if rawModes == nil {
128
 	if rawModes == nil {
116
 		// not present in config, fall back to compile-time default
129
 		// not present in config, fall back to compile-time default
117
 		return DefaultChannelModes
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
 // ParseDefaultUserModes parses the `default-user-modes` line of the config
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
 	if rawModes == nil {
137
 	if rawModes == nil {
133
 		// not present in config, fall back to compile-time default
138
 		// not present in config, fall back to compile-time default
134
 		return DefaultUserModes
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
 // #1021: channel key must be valid as a non-final parameter
144
 // #1021: channel key must be valid as a non-final parameter

+ 7
- 7
irc/modes_test.go Целия файл

43
 
43
 
44
 	var parseTests = []struct {
44
 	var parseTests = []struct {
45
 		raw      *string
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
 	for _, testcase := range parseTests {
55
 	for _, testcase := range parseTests {
56
 		result := ParseDefaultUserModes(testcase.raw)
56
 		result := ParseDefaultUserModes(testcase.raw)
57
 		if !reflect.DeepEqual(result, testcase.expected) {
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 Целия файл

266
 		return true
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
 	// registration has succeeded:
276
 	// registration has succeeded:
270
 	c.SetRegistered()
277
 	c.SetRegistered()
271
 
278
 
272
 	// count new user in statistics
279
 	// count new user in statistics
273
-	server.stats.Register()
280
+	server.stats.Register(c.HasMode(modes.Invisible))
274
 	server.monitorManager.AlertAbout(c, true)
281
 	server.monitorManager.AlertAbout(c, true)
275
 
282
 
276
 	server.playRegistrationBurst(session)
283
 	server.playRegistrationBurst(session)

+ 4
- 1
irc/stats.go Целия файл

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

Loading…
Отказ
Запис