Fix issue with SASL auth on some servers
On some servers SASL auth would fail because we didn't fully comply with the spec. Multiple caps can be returned in a `CAP ACK`, and sometimes servers add a trailing space. Parse these responses more correctly.
This commit is contained in:
		
							parent
							
								
									98931bbadb
								
							
						
					
					
						commit
						6e51f3a4d0
					
				
							
								
								
									
										14
									
								
								irc_sasl.go
									
									
									
									
									
								
							
							
						
						
									
										14
									
								
								irc_sasl.go
									
									
									
									
									
								
							| @ -12,15 +12,25 @@ type SASLResult struct { | |||||||
| 	Err    error | 	Err    error | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | // Check if a space-separated list of arguments contains a value.
 | ||||||
|  | func listContains(list string, value string) bool { | ||||||
|  | 	for _, arg_name := range strings.Split(strings.TrimSpace(list), " ") { | ||||||
|  | 		if arg_name == value { | ||||||
|  | 			return true | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	return false | ||||||
|  | } | ||||||
|  | 
 | ||||||
| func (irc *Connection) setupSASLCallbacks(result chan<- *SASLResult) { | func (irc *Connection) setupSASLCallbacks(result chan<- *SASLResult) { | ||||||
| 	irc.AddCallback("CAP", func(e *Event) { | 	irc.AddCallback("CAP", func(e *Event) { | ||||||
| 		if len(e.Arguments) == 3 { | 		if len(e.Arguments) == 3 { | ||||||
| 			if e.Arguments[1] == "LS" { | 			if e.Arguments[1] == "LS" { | ||||||
| 				if !strings.Contains(e.Arguments[2], "sasl") { | 				if !listContains(e.Arguments[2], "sasl") { | ||||||
| 					result <- &SASLResult{true, errors.New("no SASL capability " + e.Arguments[2])} | 					result <- &SASLResult{true, errors.New("no SASL capability " + e.Arguments[2])} | ||||||
| 				} | 				} | ||||||
| 			} | 			} | ||||||
| 			if e.Arguments[1] == "ACK" && e.Arguments[2] == "sasl" { | 			if e.Arguments[1] == "ACK" && listContains(e.Arguments[2], "sasl") { | ||||||
| 				if irc.SASLMech != "PLAIN" { | 				if irc.SASLMech != "PLAIN" { | ||||||
| 					result <- &SASLResult{true, errors.New("only PLAIN is supported")} | 					result <- &SASLResult{true, errors.New("only PLAIN is supported")} | ||||||
| 				} | 				} | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user