瀏覽代碼

Merge remote-tracking branch 'origin/master' into monoffline

tags/v2.1.0
Shivaram Lingamneni 4 年之前
父節點
當前提交
aafc89feaa
共有 12 個檔案被更改,包括 81 行新增34 行删除
  1. 0
    1
      irc/client.go
  2. 1
    1
      irc/config.go
  3. 2
    0
      irc/handlers.go
  4. 17
    14
      irc/modes.go
  5. 25
    0
      irc/modes/modes.go
  6. 7
    7
      irc/modes_test.go
  7. 3
    0
      irc/nickname.go
  8. 11
    7
      irc/server.go
  9. 4
    1
      irc/stats.go
  10. 1
    1
      irc/utils/args.go
  11. 8
    0
      irc/utils/args_test.go
  12. 2
    2
      languages/ro-RO-irc.lang.json

+ 0
- 1
irc/client.go 查看文件

@@ -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 查看文件

@@ -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"`

+ 2
- 0
irc/handlers.go 查看文件

@@ -2724,6 +2724,8 @@ func whoisHandler(server *Server, client *Client, msg ircmsg.IrcMessage, rb *Res
2724 2724
 		}
2725 2725
 		clientNick := client.Nick()
2726 2726
 		rb.Add(nil, client.server.name, RPL_WHOISUSER, clientNick, service.Name, service.Name, "localhost", "*", fmt.Sprintf(client.t("Network service, for more info /msg %s HELP"), service.Name))
2727
+		// #1080:
2728
+		rb.Add(nil, client.server.name, RPL_WHOISOPERATOR, clientNick, service.Name, client.t("is a network service"))
2727 2729
 		// hehe
2728 2730
 		if client.HasMode(modes.TLS) {
2729 2731
 			rb.Add(nil, client.server.name, RPL_WHOISSECURE, clientNick, service.Name, client.t("is using a secure connection"))

+ 17
- 14
irc/modes.go 查看文件

@@ -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

+ 25
- 0
irc/modes/modes.go 查看文件

@@ -6,6 +6,7 @@
6 6
 package modes
7 7
 
8 8
 import (
9
+	"sort"
9 10
 	"strings"
10 11
 
11 12
 	"github.com/oragono/oragono/irc/utils"
@@ -418,3 +419,27 @@ func (set *ModeSet) HighestChannelUserMode() (result Mode) {
418 419
 	}
419 420
 	return
420 421
 }
422
+
423
+type ByCodepoint Modes
424
+
425
+func (a ByCodepoint) Len() int           { return len(a) }
426
+func (a ByCodepoint) Swap(i, j int)      { a[i], a[j] = a[j], a[i] }
427
+func (a ByCodepoint) Less(i, j int) bool { return a[i] < a[j] }
428
+
429
+func RplMyInfo() (param1, param2, param3 string) {
430
+	userModes := make(Modes, len(SupportedUserModes))
431
+	copy(userModes, SupportedUserModes)
432
+	sort.Sort(ByCodepoint(userModes))
433
+
434
+	channelModes := make(Modes, len(SupportedChannelModes)+len(ChannelUserModes))
435
+	copy(channelModes, SupportedChannelModes)
436
+	copy(channelModes[len(SupportedChannelModes):], ChannelUserModes)
437
+	sort.Sort(ByCodepoint(channelModes))
438
+
439
+	// XXX enumerate these by hand, i can't see any way to DRY this
440
+	channelParametrizedModes := Modes{BanMask, ExceptMask, InviteMask, Key, UserLimit}
441
+	channelParametrizedModes = append(channelParametrizedModes, ChannelUserModes...)
442
+	sort.Sort(ByCodepoint(channelParametrizedModes))
443
+
444
+	return userModes.String(), channelModes.String(), channelParametrizedModes.String()
445
+}

+ 7
- 7
irc/modes_test.go 查看文件

@@ -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
 }

+ 3
- 0
irc/nickname.go 查看文件

@@ -18,6 +18,9 @@ import (
18 18
 var (
19 19
 	restrictedNicknames = []string{
20 20
 		"=scene=", // used for rp commands
21
+		"Global",  // global announcements on some networks
22
+		// common services not implemented by us:
23
+		"MemoServ", "BotServ", "OperServ",
21 24
 	}
22 25
 
23 26
 	restrictedCasefoldedNicks = make(map[string]bool)

+ 11
- 7
irc/server.go 查看文件

@@ -36,10 +36,8 @@ var (
36 36
 	// common error line to sub values into
37 37
 	errorMsg = "ERROR :%s\r\n"
38 38
 
39
-	// supportedUserModesString acts as a cache for when we introduce users
40
-	supportedUserModesString = modes.SupportedUserModes.String()
41
-	// supportedChannelModesString acts as a cache for when we introduce users
42
-	supportedChannelModesString = modes.SupportedChannelModes.String()
39
+	// three final parameters of 004 RPL_MYINFO, enumerating our supported modes
40
+	rplMyInfo1, rplMyInfo2, rplMyInfo3 = modes.RplMyInfo()
43 41
 
44 42
 	// whitelist of caps to serve on the STS-only listener. In particular,
45 43
 	// never advertise SASL, to discourage people from sending their passwords:
@@ -266,11 +264,18 @@ func (server *Server) tryRegister(c *Client, session *Session) (exiting bool) {
266 264
 		return true
267 265
 	}
268 266
 
267
+	// Apply default user modes (without updating the invisible counter)
268
+	// The number of invisible users will be updated by server.stats.Register
269
+	// if we're using default user mode +i.
270
+	for _, defaultMode := range server.Config().Accounts.defaultUserModes {
271
+		c.SetMode(defaultMode, true)
272
+	}
273
+
269 274
 	// registration has succeeded:
270 275
 	c.SetRegistered()
271 276
 
272 277
 	// count new user in statistics
273
-	server.stats.Register()
278
+	server.stats.Register(c.HasMode(modes.Invisible))
274 279
 	server.monitorManager.AlertAbout(c.Nick(), c.NickCasefolded(), true)
275 280
 
276 281
 	server.playRegistrationBurst(session)
@@ -290,8 +295,7 @@ func (server *Server) playRegistrationBurst(session *Session) {
290 295
 	session.Send(nil, server.name, RPL_WELCOME, d.nick, fmt.Sprintf(c.t("Welcome to the Internet Relay Network %s"), d.nick))
291 296
 	session.Send(nil, server.name, RPL_YOURHOST, d.nick, fmt.Sprintf(c.t("Your host is %[1]s, running version %[2]s"), server.name, Ver))
292 297
 	session.Send(nil, server.name, RPL_CREATED, d.nick, fmt.Sprintf(c.t("This server was created %s"), server.ctime.Format(time.RFC1123)))
293
-	//TODO(dan): Look at adding last optional [<channel modes with a parameter>] parameter
294
-	session.Send(nil, server.name, RPL_MYINFO, d.nick, server.name, Ver, supportedUserModesString, supportedChannelModesString)
298
+	session.Send(nil, server.name, RPL_MYINFO, d.nick, server.name, Ver, rplMyInfo1, rplMyInfo2, rplMyInfo3)
295 299
 
296 300
 	if c.isSTSOnly {
297 301
 		for _, line := range server.Config().Server.STS.bannerLines {

+ 4
- 1
irc/stats.go 查看文件

@@ -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()

+ 1
- 1
irc/utils/args.go 查看文件

@@ -35,7 +35,7 @@ func ArgsToStrings(maxLength int, arguments []string, delim string) []string {
35 35
 			continue
36 36
 		}
37 37
 
38
-		if len(buffer) > 1 {
38
+		if len(buffer) > 0 {
39 39
 			buffer += delim
40 40
 		}
41 41
 		buffer += arguments[0]

+ 8
- 0
irc/utils/args_test.go 查看文件

@@ -5,6 +5,14 @@ package utils
5 5
 
6 6
 import "testing"
7 7
 
8
+func TestArgsToStrings(t *testing.T) {
9
+	val := ArgsToStrings(512, []string{"a", "b", "c"}, ",")
10
+	assertEqual(val, []string{"a,b,c"}, t)
11
+
12
+	val = ArgsToStrings(10, []string{"abcd", "efgh", "ijkl"}, ",")
13
+	assertEqual(val, []string{"abcd,efgh", "ijkl"}, t)
14
+}
15
+
8 16
 func TestStringToBool(t *testing.T) {
9 17
 	val, err := StringToBool("on")
10 18
 	assertEqual(val, true, t)

+ 2
- 2
languages/ro-RO-irc.lang.json 查看文件

@@ -235,7 +235,7 @@
235 235
   "That nickname is already reserved by someone else": "Pseudonimul este rezervat de altcineva",
236 236
   "That nickname is not registered": "Pseudonimul nu este înregistrat",
237 237
   "That vhost isn't being offered by the server": "Gazda virtuală nu este oferită de către server",
238
-  "The following vhosts are available and can be chosen with /HOSTSERV TAKE:": "",
238
+  "The following vhosts are available and can be chosen with /HOSTSERV TAKE:": "Următoarele gazde virtuale sunt disponibile și pot fi alese cu comanda /HOSTSERV TAKE:",
239 239
   "The server does not offer any vhosts": "Serverul nu oferă nici o gazdă virtuală",
240 240
   "The server does not offer any vhosts, but you can request one with /HOSTSERV REQUEST": "Serverul nu oferă nici o gazdă virtuală, actualmente. Poți cere una, cu comanda /HOSTSERV REQUEST",
241 241
   "The stored channel history setting is: %s": "Setarea pentru stocarea istoricului mesajelor canalului este: %s",
@@ -317,7 +317,7 @@
317 317
   "You're not logged into an account": "Nu te-ai autentificat la niciun cont",
318 318
   "You're not on that channel": "Nu te afli pe acel canal",
319 319
   "You're now logged in as %s": "Te-ai autentificat ca: %s",
320
-  "Your account credentials are managed externally and cannot be changed here": "",
320
+  "Your account credentials are managed externally and cannot be changed here": "Credențialele contului tău sunt administrate extern și nu pot fi modificate aici",
321 321
   "Your account is not configured to receive autoreplayed missed messages": "Contul tău nu este configurat pentru derularea automată a mesajelor pierdute",
322 322
   "Your client does not support BRB": "Clientul folosit de tine nu suportă BRB",
323 323
   "Your host is %[1]s, running version %[2]s": "Gazda ta este %[1]s, rulând versiunea %[2]s",

Loading…
取消
儲存