3
0
mirror of https://github.com/ergochat/ergo.git synced 2024-11-21 11:29:31 +01:00

bump irc-go to v0.5.0-rc2 (#2194)

This commit is contained in:
Shivaram Lingamneni 2024-09-27 06:42:09 +02:00 committed by GitHub
parent 7586520032
commit 9577e87d9a
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 46 additions and 24 deletions

2
go.mod
View File

@ -8,7 +8,7 @@ require (
github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815 github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815
github.com/ergochat/confusables v0.0.0-20201108231250-4ab98ab61fb1 github.com/ergochat/confusables v0.0.0-20201108231250-4ab98ab61fb1
github.com/ergochat/go-ident v0.0.0-20230911071154-8c30606d6881 github.com/ergochat/go-ident v0.0.0-20230911071154-8c30606d6881
github.com/ergochat/irc-go v0.5.0-rc1 github.com/ergochat/irc-go v0.5.0-rc2
github.com/go-sql-driver/mysql v1.7.0 github.com/go-sql-driver/mysql v1.7.0
github.com/go-test/deep v1.0.6 // indirect github.com/go-test/deep v1.0.6 // indirect
github.com/gofrs/flock v0.8.1 github.com/gofrs/flock v0.8.1

2
go.sum
View File

@ -12,6 +12,8 @@ github.com/ergochat/go-ident v0.0.0-20230911071154-8c30606d6881 h1:+J5m88nvybxB5
github.com/ergochat/go-ident v0.0.0-20230911071154-8c30606d6881/go.mod h1:ASYJtQujNitna6cVHsNQTGrfWvMPJ5Sa2lZlmsH65uM= github.com/ergochat/go-ident v0.0.0-20230911071154-8c30606d6881/go.mod h1:ASYJtQujNitna6cVHsNQTGrfWvMPJ5Sa2lZlmsH65uM=
github.com/ergochat/irc-go v0.5.0-rc1 h1:kFoIHExoNFQ2CV+iShAVna/H4xrXQB4t4jK5Sep2j9k= github.com/ergochat/irc-go v0.5.0-rc1 h1:kFoIHExoNFQ2CV+iShAVna/H4xrXQB4t4jK5Sep2j9k=
github.com/ergochat/irc-go v0.5.0-rc1/go.mod h1:2vi7KNpIPWnReB5hmLpl92eMywQvuIeIIGdt/FQCph0= github.com/ergochat/irc-go v0.5.0-rc1/go.mod h1:2vi7KNpIPWnReB5hmLpl92eMywQvuIeIIGdt/FQCph0=
github.com/ergochat/irc-go v0.5.0-rc2 h1:VuSQJF5K4hWvYSzGa4b8vgL6kzw8HF6LSOejE+RWpAo=
github.com/ergochat/irc-go v0.5.0-rc2/go.mod h1:2vi7KNpIPWnReB5hmLpl92eMywQvuIeIIGdt/FQCph0=
github.com/ergochat/scram v1.0.2-ergo1 h1:2bYXiRFQH636pT0msOG39fmEYl4Eq+OuutcyDsCix/g= github.com/ergochat/scram v1.0.2-ergo1 h1:2bYXiRFQH636pT0msOG39fmEYl4Eq+OuutcyDsCix/g=
github.com/ergochat/scram v1.0.2-ergo1/go.mod h1:1WAq6h33pAW+iRreB34OORO2Nf7qel3VV3fjBj+hCSs= github.com/ergochat/scram v1.0.2-ergo1/go.mod h1:1WAq6h33pAW+iRreB34OORO2Nf7qel3VV3fjBj+hCSs=
github.com/ergochat/websocket v1.4.2-oragono1 h1:plMUunFBM6UoSCIYCKKclTdy/TkkHfUslhOfJQzfueM= github.com/ergochat/websocket v1.4.2-oragono1 h1:plMUunFBM6UoSCIYCKKclTdy/TkkHfUslhOfJQzfueM=

View File

@ -196,6 +196,15 @@ func trimInitialSpaces(str string) string {
return str[i:] return str[i:]
} }
func isASCII(str string) bool {
for i := 0; i < len(str); i++ {
if str[i] > 127 {
return false
}
}
return true
}
func parseLine(line string, maxTagDataLength int, truncateLen int) (ircmsg Message, err error) { func parseLine(line string, maxTagDataLength int, truncateLen int) (ircmsg Message, err error) {
// remove either \n or \r\n from the end of the line: // remove either \n or \r\n from the end of the line:
line = strings.TrimSuffix(line, "\n") line = strings.TrimSuffix(line, "\n")
@ -265,11 +274,16 @@ func parseLine(line string, maxTagDataLength int, truncateLen int) (ircmsg Messa
commandEnd = len(line) commandEnd = len(line)
paramStart = len(line) paramStart = len(line)
} }
// normalize command to uppercase: baseCommand := line[:commandEnd]
ircmsg.Command = strings.ToUpper(line[:commandEnd]) if len(baseCommand) == 0 {
if len(ircmsg.Command) == 0 {
return ircmsg, ErrorLineIsEmpty return ircmsg, ErrorLineIsEmpty
} }
// technically this must be either letters or a 3-digit numeric:
if !isASCII(baseCommand) {
return ircmsg, ErrorLineContainsBadChar
}
// normalize command to uppercase:
ircmsg.Command = strings.ToUpper(baseCommand)
line = line[paramStart:] line = line[paramStart:]
for { for {

View File

@ -3,7 +3,6 @@ package ircutils
import ( import (
"encoding/base64" "encoding/base64"
"errors" "errors"
"strings"
) )
var ( var (
@ -25,6 +24,7 @@ func EncodeSASLResponse(raw []byte) (result []string) {
} }
response := base64.StdEncoding.EncodeToString(raw) response := base64.StdEncoding.EncodeToString(raw)
result = make([]string, 0, (len(response)/400)+1)
lastLen := 0 lastLen := 0
for len(response) > 0 { for len(response) > 0 {
// TODO once we require go 1.21, this can be: lastLen = min(len(response), 400) // TODO once we require go 1.21, this can be: lastLen = min(len(response), 400)
@ -48,11 +48,11 @@ func EncodeSASLResponse(raw []byte) (result []string) {
// Do not copy a SASLBuffer after first use. // Do not copy a SASLBuffer after first use.
type SASLBuffer struct { type SASLBuffer struct {
maxLength int maxLength int
buffer strings.Builder buf []byte
} }
// NewSASLBuffer returns a new SASLBuffer. maxLength is the maximum amount of // NewSASLBuffer returns a new SASLBuffer. maxLength is the maximum amount of
// base64'ed data to buffer (0 for no limit). // data to buffer (0 for no limit).
func NewSASLBuffer(maxLength int) *SASLBuffer { func NewSASLBuffer(maxLength int) *SASLBuffer {
result := new(SASLBuffer) result := new(SASLBuffer)
result.Initialize(maxLength) result.Initialize(maxLength)
@ -69,37 +69,43 @@ func (b *SASLBuffer) Initialize(maxLength int) {
// response along with any decoding or protocol errors detected. // response along with any decoding or protocol errors detected.
func (b *SASLBuffer) Add(value string) (done bool, output []byte, err error) { func (b *SASLBuffer) Add(value string) (done bool, output []byte, err error) {
if value == "+" { if value == "+" {
output, err = b.getAndReset() // total size is a multiple of 400 (possibly 0)
return true, output, err output = b.buf
b.Clear()
return true, output, nil
} }
if len(value) > 400 { if len(value) > 400 {
b.buffer.Reset() b.Clear()
return true, nil, ErrSASLTooLong return true, nil, ErrSASLTooLong
} }
if b.maxLength != 0 && (b.buffer.Len()+len(value)) > b.maxLength { curLen := len(b.buf)
b.buffer.Reset() chunkDecodedLen := base64.StdEncoding.DecodedLen(len(value))
if b.maxLength != 0 && (curLen+chunkDecodedLen) > b.maxLength {
b.Clear()
return true, nil, ErrSASLLimitExceeded return true, nil, ErrSASLLimitExceeded
} }
b.buffer.WriteString(value) // "append-make pattern" as in the bytes.Buffer implementation:
b.buf = append(b.buf, make([]byte, chunkDecodedLen)...)
n, err := base64.StdEncoding.Decode(b.buf[curLen:], []byte(value))
b.buf = b.buf[0 : curLen+n]
if err != nil {
b.Clear()
return true, nil, err
}
if len(value) < 400 { if len(value) < 400 {
output, err = b.getAndReset() output = b.buf
return true, output, err b.Clear()
return true, output, nil
} else { } else {
// 400 bytes, wait for continuation line or +
return false, nil, nil return false, nil, nil
} }
} }
// Clear resets the buffer state. // Clear resets the buffer state.
func (b *SASLBuffer) Clear() { func (b *SASLBuffer) Clear() {
b.buffer.Reset() // we can't reuse this buffer in general since we may have returned it
} b.buf = nil
func (b *SASLBuffer) getAndReset() (output []byte, err error) {
output, err = base64.StdEncoding.DecodeString(b.buffer.String())
b.buffer.Reset()
return
} }

2
vendor/modules.txt vendored
View File

@ -16,7 +16,7 @@ github.com/ergochat/confusables
# github.com/ergochat/go-ident v0.0.0-20230911071154-8c30606d6881 # github.com/ergochat/go-ident v0.0.0-20230911071154-8c30606d6881
## explicit; go 1.18 ## explicit; go 1.18
github.com/ergochat/go-ident github.com/ergochat/go-ident
# github.com/ergochat/irc-go v0.5.0-rc1 # github.com/ergochat/irc-go v0.5.0-rc2
## explicit; go 1.15 ## explicit; go 1.15
github.com/ergochat/irc-go/ircfmt github.com/ergochat/irc-go/ircfmt
github.com/ergochat/irc-go/ircmsg github.com/ergochat/irc-go/ircmsg