in server/server.go [662:699]
func (s *SecureSessionService) EndSession(ctx context.Context, req *sspb.EndSessionRequest) (*sspb.EndSessionResponse, error) {
if err := s.verifyToken(ctx); err != nil {
return nil, fmt.Errorf("failed to verify JWT: %w", err)
}
connID := base64.StdEncoding.EncodeToString(req.SessionContext)
ch, found := s.channels[connID]
if !found {
return nil, fmt.Errorf("session with id: %v not found", connID)
}
if ch.state != ServerStateAttestationAccepted {
return nil, fmt.Errorf("session with id: %v in unexpected state: %d. Expecting: %d", connID, ch.state, ServerStateAttestationAccepted)
}
ch.shim.QueueReceiveBuf(req.TlsRecords)
buf := make([]byte, len(req.TlsRecords))
bufLen, err := ch.conn.Read(buf)
if err != nil {
ch.state = ServerStateFailed
return nil, fmt.Errorf("failed to read from tls connection : %v", err)
}
if !bytes.Equal(buf[:bufLen], []byte(constants.EndSessionString)) {
ch.state = ServerStateFailed
return nil, fmt.Errorf("End of session string mismatch")
}
rep := &sspb.EndSessionResponse{}
glog.Infof("EndSession: %v session ended.", connID)
ch.state = ServerStateEnded
return rep, nil
}