mirror of
https://github.com/refraction-networking/uquic.git
synced 2025-04-06 21:57:36 +03:00
Merge pull request #2042 from lucas-clemente/token-cache
implement a store for address validation tokes
This commit is contained in:
commit
f1d14ecdea
11 changed files with 457 additions and 4 deletions
22
session.go
22
session.go
|
@ -118,6 +118,7 @@ type session struct {
|
|||
framer framer
|
||||
windowUpdateQueue *windowUpdateQueue
|
||||
connFlowController flowcontrol.ConnectionFlowController
|
||||
tokenStoreKey string // only set for the client
|
||||
tokenGenerator *handshake.TokenGenerator // only set for the server
|
||||
|
||||
unpacker unpacker
|
||||
|
@ -334,6 +335,16 @@ var newClientSession = func(
|
|||
s.perspective,
|
||||
s.version,
|
||||
)
|
||||
if len(tlsConf.ServerName) > 0 {
|
||||
s.tokenStoreKey = tlsConf.ServerName
|
||||
} else {
|
||||
s.tokenStoreKey = conn.RemoteAddr().String()
|
||||
}
|
||||
if s.config.TokenStore != nil {
|
||||
if token := s.config.TokenStore.Pop(s.tokenStoreKey); token != nil {
|
||||
s.packer.SetToken(token.data)
|
||||
}
|
||||
}
|
||||
return s, s.postSetup()
|
||||
}
|
||||
|
||||
|
@ -775,6 +786,7 @@ func (s *session) handleFrame(f wire.Frame, pn protocol.PacketNumber, encLevel p
|
|||
// since we don't send PATH_CHALLENGEs, we don't expect PATH_RESPONSEs
|
||||
err = errors.New("unexpected PATH_RESPONSE frame")
|
||||
case *wire.NewTokenFrame:
|
||||
err = s.handleNewTokenFrame(frame)
|
||||
case *wire.NewConnectionIDFrame:
|
||||
case *wire.RetireConnectionIDFrame:
|
||||
// since we don't send new connection IDs, we don't expect retirements
|
||||
|
@ -901,6 +913,16 @@ func (s *session) handlePathChallengeFrame(frame *wire.PathChallengeFrame) {
|
|||
s.queueControlFrame(&wire.PathResponseFrame{Data: frame.Data})
|
||||
}
|
||||
|
||||
func (s *session) handleNewTokenFrame(frame *wire.NewTokenFrame) error {
|
||||
if s.perspective == protocol.PerspectiveServer {
|
||||
return qerr.Error(qerr.ProtocolViolation, "Received NEW_TOKEN frame from the client.")
|
||||
}
|
||||
if s.config.TokenStore != nil {
|
||||
s.config.TokenStore.Put(s.tokenStoreKey, &ClientToken{data: frame.Token})
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s *session) handleAckFrame(frame *wire.AckFrame, pn protocol.PacketNumber, encLevel protocol.EncryptionLevel) error {
|
||||
if err := s.sentPacketHandler.ReceivedAck(frame, pn, encLevel, s.lastPacketReceivedTime); err != nil {
|
||||
return err
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue