commit 1859f66

Hubert Hirtz  ·  2021-11-16 09:00:34 +0000 UTC
parent ccc5351
Authenticate on CAP NEW sasl
1 files changed,  +36, -33
+36, -33
 1@@ -476,34 +476,6 @@ func (s *Session) HandleMessage(msg Message) (Event, error) {
 2 
 3 func (s *Session) handleUnregistered(msg Message) (Event, error) {
 4 	switch msg.Command {
 5-	case "AUTHENTICATE":
 6-		if s.auth == nil {
 7-			break
 8-		}
 9-
10-		var payload string
11-		if err := msg.ParseParams(&payload); err != nil {
12-			return nil, err
13-		}
14-
15-		res, err := s.auth.Respond(payload)
16-		if err != nil {
17-			s.out <- NewMessage("AUTHENTICATE", "*")
18-		} else {
19-			s.out <- NewMessage("AUTHENTICATE", res)
20-		}
21-	case rplLoggedin:
22-		var nuh string
23-		if err := msg.ParseParams(nil, &nuh, &s.acct); err != nil {
24-			return nil, err
25-		}
26-
27-		s.endRegistration()
28-		prefix := ParsePrefix(nuh)
29-		s.user = prefix.User
30-		s.host = prefix.Host
31-	case errNicklocked, errSaslfail, errSasltoolong, errSaslaborted, errSaslalready, rplSaslmechs:
32-		s.endRegistration()
33 	case errNicknameinuse:
34 		var nick string
35 		if err := msg.ParseParams(nil, &nick); err != nil {
36@@ -535,6 +507,39 @@ func (s *Session) handleRegistered(msg Message) (Event, error) {
37 	}
38 
39 	switch msg.Command {
40+	case "AUTHENTICATE":
41+		if s.auth == nil {
42+			break
43+		}
44+
45+		var payload string
46+		if err := msg.ParseParams(&payload); err != nil {
47+			return nil, err
48+		}
49+
50+		res, err := s.auth.Respond(payload)
51+		if err != nil {
52+			s.out <- NewMessage("AUTHENTICATE", "*")
53+		} else {
54+			s.out <- NewMessage("AUTHENTICATE", res)
55+		}
56+	case rplLoggedin:
57+		var nuh string
58+		if err := msg.ParseParams(nil, &nuh, &s.acct); err != nil {
59+			return nil, err
60+		}
61+
62+		s.endRegistration()
63+		prefix := ParsePrefix(nuh)
64+		s.user = prefix.User
65+		s.host = prefix.Host
66+	case errNicklocked, errSaslfail, errSasltoolong, errSaslaborted, errSaslalready, rplSaslmechs:
67+		s.endRegistration()
68+		return ErrorEvent{
69+			Severity: SeverityFail,
70+			Code:     msg.Command,
71+			Message:  fmt.Sprintf("Registration failed: %s", strings.Join(msg.Params[1:], " ")),
72+		}, nil
73 	case rplWelcome:
74 		if err := msg.ParseParams(&s.nick); err != nil {
75 			return nil, err
76@@ -609,11 +614,6 @@ func (s *Session) handleRegistered(msg Message) (Event, error) {
77 				}
78 				s.out <- NewMessage("CAP", "REQ", c.Name)
79 			}
80-
81-			_, ok := s.availableCaps["sasl"]
82-			if s.acct == "" && ok {
83-				// TODO authenticate
84-			}
85 		case "DEL":
86 			for _, c := range ParseCaps(caps) {
87 				delete(s.availableCaps, c.Name)
88@@ -1204,6 +1204,9 @@ func (s *Session) updateFeatures(features []string) {
89 }
90 
91 func (s *Session) endRegistration() {
92+	if s.registered {
93+		return
94+	}
95 	if _, ok := s.enabledCaps["soju.im/bouncer-networks"]; !ok {
96 		s.out <- NewMessage("CAP", "END")
97 	} else if s.netID == "" {