mirror of
https://github.com/gravitational/teleport.git
synced 2026-09-21 05:55:42 +08:00
90 lines
1.9 KiB
Go
90 lines
1.9 KiB
Go
package session
|
|
|
|
import (
|
|
"time"
|
|
|
|
"github.com/gravitational/teleport/backend"
|
|
)
|
|
|
|
type SessionServer interface {
|
|
GetSessions() ([]Session, error)
|
|
GetSession(id string) (*Session, error)
|
|
DeleteSession(id string) error
|
|
UpsertParty(id string, p Party, ttl time.Duration) error
|
|
}
|
|
|
|
type server struct {
|
|
bk backend.JSONCodec
|
|
}
|
|
|
|
func New(bk backend.Backend) *server {
|
|
return &server{
|
|
bk: backend.JSONCodec{bk},
|
|
}
|
|
}
|
|
|
|
func (s *server) GetSessions() ([]Session, error) {
|
|
keys, err := s.bk.GetKeys([]string{"sessions"})
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
out := []Session{}
|
|
for _, sid := range keys {
|
|
se, err := s.GetSession(sid)
|
|
if backend.IsNotFound(err) {
|
|
continue
|
|
}
|
|
out = append(out, *se)
|
|
}
|
|
return out, nil
|
|
}
|
|
|
|
func (s *server) GetSession(id string) (*Session, error) {
|
|
if _, err := s.bk.GetVal([]string{"sessions", id}, "val"); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
parties, err := s.bk.GetKeys([]string{"sessions", id, "parties"})
|
|
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
out := []Party{}
|
|
for _, pk := range parties {
|
|
var p *Party
|
|
err := s.bk.GetJSONVal([]string{"sessions", id, "parties"}, pk, &p)
|
|
if err != nil {
|
|
if backend.IsNotFound(err) { // key was expired
|
|
continue
|
|
}
|
|
return nil, err
|
|
}
|
|
out = append(out, *p)
|
|
}
|
|
return &Session{ID: id, Parties: out}, nil
|
|
}
|
|
|
|
func (s *server) UpsertParty(id string, p Party, ttl time.Duration) error {
|
|
if err := s.bk.UpsertVal([]string{"sessions", id}, "val", []byte("val"), ttl); err != nil {
|
|
return err
|
|
}
|
|
return s.bk.UpsertJSONVal([]string{"sessions", id, "parties"}, p.ID, p, ttl)
|
|
}
|
|
|
|
func (s *server) DeleteSession(id string) error {
|
|
return s.bk.DeleteBucket([]string{"sessions"}, id)
|
|
}
|
|
|
|
type Session struct {
|
|
ID string `json:"id"`
|
|
Parties []Party
|
|
}
|
|
|
|
type Party struct {
|
|
ID string `json:"id"`
|
|
Site string `json:"site"`
|
|
User string `json:"user"`
|
|
Server string `json:"server"`
|
|
LastActive time.Time `json:"last_active"`
|
|
}
|