44 lines
1018 B
Go
44 lines
1018 B
Go
package handshake
|
|
|
|
import (
|
|
"net"
|
|
|
|
"github.com/bifurcation/mint"
|
|
"github.com/lucas-clemente/quic-go/internal/utils"
|
|
)
|
|
|
|
type CookieHandler struct {
|
|
callback func(net.Addr, *Cookie) bool
|
|
|
|
cookieGenerator *CookieGenerator
|
|
}
|
|
|
|
var _ mint.CookieHandler = &CookieHandler{}
|
|
|
|
func NewCookieHandler(callback func(net.Addr, *Cookie) bool) (*CookieHandler, error) {
|
|
cookieGenerator, err := NewCookieGenerator()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return &CookieHandler{
|
|
callback: callback,
|
|
cookieGenerator: cookieGenerator,
|
|
}, nil
|
|
}
|
|
|
|
func (h *CookieHandler) Generate(conn *mint.Conn) ([]byte, error) {
|
|
if h.callback(conn.RemoteAddr(), nil) {
|
|
return nil, nil
|
|
}
|
|
return h.cookieGenerator.NewToken(conn.RemoteAddr())
|
|
}
|
|
|
|
func (h *CookieHandler) Validate(conn *mint.Conn, token []byte) bool {
|
|
data, err := h.cookieGenerator.DecodeToken(token)
|
|
if err != nil {
|
|
utils.Debugf("Couldn't decode cookie from %s: %s", conn.RemoteAddr(), err.Error())
|
|
return false
|
|
}
|
|
return h.callback(conn.RemoteAddr(), data)
|
|
}
|