Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion e
Submodule e updated from fbb63f to 393cd1
49 changes: 25 additions & 24 deletions integration/integration_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ import (
"github.com/gravitational/teleport/api/client/proto"
"github.com/gravitational/teleport/api/constants"
"github.com/gravitational/teleport/api/defaults"
apidefaults "github.com/gravitational/teleport/api/defaults"
tracessh "github.com/gravitational/teleport/api/observability/tracing/ssh"
"github.com/gravitational/teleport/api/profile"
"github.com/gravitational/teleport/api/types"
Expand Down Expand Up @@ -384,7 +385,7 @@ func testAuditOn(t *testing.T, suite *integrationTestSuite) {
require.NoError(t, err)

// should have no sessions:
sessions, err := site.GetSessions(ctx, defaults.Namespace)
sessions, err := site.GetActiveSessionTrackers(ctx)
require.NoError(t, err)
require.Empty(t, sessions)

Expand All @@ -408,27 +409,27 @@ func testAuditOn(t *testing.T, suite *integrationTestSuite) {
}()

// wait until we've found the session in the audit log
getSession := func(site auth.ClientI) (*session.Session, error) {
getSession := func(site auth.ClientI) (types.SessionTracker, error) {
timeout, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()
sessions, err := waitForSessionToBeEstablished(timeout, defaults.Namespace, site)
if err != nil {
return nil, trace.Wrap(err)
}
return &sessions[0], nil
return sessions[0], nil
}
session, err := getSession(site)
tracker, err := getSession(site)
require.NoError(t, err)
sessionID := session.ID
sessionID := tracker.GetSessionID()

// wait for the user to join this session:
for len(session.Parties) == 0 {
for len(tracker.GetParticipants()) == 0 {
time.Sleep(time.Millisecond * 5)
session, err = site.GetSession(ctx, defaults.Namespace, sessionID)
tracker, err = site.GetSessionTracker(ctx, tracker.GetSessionID())
require.NoError(t, err)
}
// make sure it's us who joined! :)
require.Equal(t, suite.Me.Username, session.Parties[0].User)
require.Equal(t, suite.Me.Username, tracker.GetParticipants()[0].User)

// lets type "echo hi" followed by "enter" and then "exit" + "enter":

Expand All @@ -447,23 +448,23 @@ func testAuditOn(t *testing.T, suite *integrationTestSuite) {
for {
select {
case event := <-teleport.UploadEventsC:
if event.SessionID != string(session.ID) {
t.Logf("Skipping mismatching session %v, expecting upload of %v.", event.SessionID, session.ID)
if event.SessionID != tracker.GetSessionID() {
t.Logf("Skipping mismatching session %v, expecting upload of %v.", event.SessionID, tracker.GetSessionID())
continue
}
break loop
case <-timeoutC:
dumpGoroutineProfile()
t.Fatalf("%s: Timeout waiting for upload of session %v to complete to %v",
tt.comment, session.ID, tt.auditSessionsURI)
tt.comment, tracker.GetSessionID(), tt.auditSessionsURI)
}
}

// read back the entire session (we have to try several times until we get back
// everything because the session is closing)
var sessionStream []byte
for i := 0; i < 6; i++ {
sessionStream, err = site.GetSessionChunk(defaults.Namespace, session.ID, 0, events.MaxChunkBytes)
sessionStream, err = site.GetSessionChunk(apidefaults.Namespace, session.ID(tracker.GetSessionID()), 0, events.MaxChunkBytes)
require.NoError(t, err)
if strings.Contains(string(sessionStream), "exit") {
break
Expand Down Expand Up @@ -495,7 +496,7 @@ func testAuditOn(t *testing.T, suite *integrationTestSuite) {
select {
case <-tickCh:
// Get all session events from the backend.
sessionEvents, err := site.GetSessionEvents(defaults.Namespace, session.ID, 0, false)
sessionEvents, err := site.GetSessionEvents(apidefaults.Namespace, session.ID(tracker.GetSessionID()), 0, false)
if err != nil {
return nil, trace.Wrap(err)
}
Expand Down Expand Up @@ -554,7 +555,7 @@ func testAuditOn(t *testing.T, suite *integrationTestSuite) {
start := findByType(events.SessionStartEvent)
require.Equal(t, first, start)
require.Equal(t, 0, start.GetInt("bytes"))
require.Equal(t, string(sessionID), start.GetString(events.SessionEventID))
require.Equal(t, sessionID, start.GetString(events.SessionEventID))
require.NotEmpty(t, start.GetString(events.TerminalSize))

// make sure data is recorded properly
Expand All @@ -570,13 +571,13 @@ func testAuditOn(t *testing.T, suite *integrationTestSuite) {
end := findByType(events.SessionEndEvent)
require.NotNil(t, end)
require.Equal(t, 0, end.GetInt("bytes"))
require.Equal(t, string(sessionID), end.GetString(events.SessionEventID))
require.Equal(t, sessionID, end.GetString(events.SessionEventID))

// there should always be 'session.leave' event
leave := findByType(events.SessionLeaveEvent)
require.NotNil(t, leave)
require.Equal(t, 0, leave.GetInt("bytes"))
require.Equal(t, string(sessionID), leave.GetString(events.SessionEventID))
require.Equal(t, sessionID, leave.GetString(events.SessionEventID))

// all of them should have a proper time
for _, e := range history {
Expand Down Expand Up @@ -1256,7 +1257,7 @@ func verifySessionJoin(t *testing.T, username string, teleport *helpers.TeleInst
return
}

sessionID := string(sessions[0].ID)
sessionID := sessions[0].GetSessionID()
cl, err := teleport.NewClient(helpers.ClientConfig{
Login: username,
Cluster: helpers.Site,
Expand Down Expand Up @@ -3811,7 +3812,7 @@ func testAuditOff(t *testing.T, suite *integrationTestSuite) {
require.NotNil(t, site)

// should have no sessions in it to start with
sessions, _ := site.GetSessions(ctx, defaults.Namespace)
sessions, _ := site.GetActiveSessionTrackers(ctx)
require.Len(t, sessions, 0)

// create interactive session (this goroutine is this user's terminal time)
Expand All @@ -3837,16 +3838,16 @@ func testAuditOff(t *testing.T, suite *integrationTestSuite) {
defer cancel()
sessions, err = waitForSessionToBeEstablished(timeoutCtx, defaults.Namespace, site)
require.NoError(t, err)
session := &sessions[0]
tracker := sessions[0]

// wait for the user to join this session
for len(session.Parties) == 0 {
for len(tracker.GetParticipants()) == 0 {
time.Sleep(time.Millisecond * 5)
session, err = site.GetSession(ctx, defaults.Namespace, sessions[0].ID)
tracker, err = site.GetSessionTracker(ctx, sessions[0].GetSessionID())
require.NoError(t, err)
}
// make sure it's us who joined! :)
require.Equal(t, suite.Me.Username, session.Parties[0].User)
require.Equal(t, suite.Me.Username, tracker.GetParticipants()[0].User)

// lets type "echo hi" followed by "enter" and then "exit" + "enter":
myTerm.Type("\aecho hi\n\r\aexit\n\r\a")
Expand All @@ -3863,7 +3864,7 @@ func testAuditOff(t *testing.T, suite *integrationTestSuite) {

// however, attempts to read the actual sessions should fail because it was
// not actually recorded
_, err = site.GetSessionChunk(defaults.Namespace, session.ID, 0, events.MaxChunkBytes)
_, err = site.GetSessionChunk(apidefaults.Namespace, session.ID(tracker.GetSessionID()), 0, events.MaxChunkBytes)
require.Error(t, err)
}

Expand Down Expand Up @@ -4697,7 +4698,7 @@ func testWindowChange(t *testing.T, suite *integrationTestSuite) {
defer cancel()
sessions, err := waitForSessionToBeEstablished(timeoutCtx, defaults.Namespace, site)
require.NoError(t, err)
sessionID := string(sessions[0].ID)
sessionID := sessions[0].GetSessionID()

cl, err := teleport.NewClient(helpers.ClientConfig{
Login: suite.Me.Username,
Expand Down
5 changes: 2 additions & 3 deletions integration/port_forwarding_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,6 @@ import (
"github.com/gravitational/teleport/integration/helpers"
"github.com/gravitational/teleport/lib/auth"
"github.com/gravitational/teleport/lib/client"
"github.com/gravitational/teleport/lib/session"

"github.com/gravitational/trace"
"github.com/stretchr/testify/require"
Expand All @@ -49,7 +48,7 @@ func extractPort(svr *httptest.Server) (int, error) {
return n, nil
}

func waitForSessionToBeEstablished(ctx context.Context, namespace string, site auth.ClientI) ([]session.Session, error) {
func waitForSessionToBeEstablished(ctx context.Context, namespace string, site auth.ClientI) ([]types.SessionTracker, error) {

ticker := time.NewTicker(100 * time.Millisecond)
defer ticker.Stop()
Expand All @@ -60,7 +59,7 @@ func waitForSessionToBeEstablished(ctx context.Context, namespace string, site a
return nil, ctx.Err()

case <-ticker.C:
ss, err := site.GetSessions(ctx, namespace)
ss, err := site.GetActiveSessionTrackers(ctx)
if err != nil {
return nil, trace.Wrap(err)
}
Expand Down
1 change: 0 additions & 1 deletion integration/utmp_integration_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -268,7 +268,6 @@ func newSrvCtx(ctx context.Context, t *testing.T) *SrvCtx {
regular.SetNamespace(apidefaults.Namespace),
regular.SetEmitter(s.nodeClient),
regular.SetShell("/bin/sh"),
regular.SetSessionServer(s.nodeClient),
regular.SetPAMConfig(&pam.Config{Enabled: false}),
regular.SetLabels(
map[string]string{"foo": "bar"},
Expand Down
83 changes: 0 additions & 83 deletions lib/auth/apiserver.go
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,6 @@ import (
type APIConfig struct {
PluginRegistry plugin.Registry
AuthServer *Server
SessionService session.Service
AuditLog events.IAuditLog
Authorizer Authorizer
Emitter apievents.Emitter
Expand Down Expand Up @@ -154,11 +153,6 @@ func NewAPIServer(config *APIConfig) (http.Handler, error) {
srv.POST("/:version/tokens/register", srv.withAuth(srv.registerUsingToken))

// Active sessions
srv.POST("/:version/namespaces/:namespace/sessions", srv.withAuth(srv.createSession))
srv.PUT("/:version/namespaces/:namespace/sessions/:id", srv.withAuth(srv.updateSession))
srv.DELETE("/:version/namespaces/:namespace/sessions/:id", srv.withAuth(srv.deleteSession))
srv.GET("/:version/namespaces/:namespace/sessions", srv.withAuth(srv.getSessions))
srv.GET("/:version/namespaces/:namespace/sessions/:id", srv.withAuth(srv.getSession))
srv.GET("/:version/namespaces/:namespace/sessions/:id/stream", srv.withAuth(srv.getSessionChunk))
srv.GET("/:version/namespaces/:namespace/sessions/:id/events", srv.withAuth(srv.getSessionEvents))

Expand Down Expand Up @@ -229,7 +223,6 @@ func (s *APIServer) withAuth(handler HandlerWithAuthFunc) httprouter.Handle {
auth := &ServerWithRoles{
authServer: s.AuthServer,
context: *authContext,
sessions: s.SessionService,
alog: s.AuthServer,
}
version := p.ByName("version")
Expand Down Expand Up @@ -867,82 +860,6 @@ func (s *APIServer) deleteCertAuthority(auth ClientI, w http.ResponseWriter, r *
return message(fmt.Sprintf("cert '%v' deleted", id)), nil
}

type createSessionReq struct {
Session session.Session `json:"session"`
}

func (s *APIServer) createSession(auth ClientI, w http.ResponseWriter, r *http.Request, p httprouter.Params, version string) (interface{}, error) {
var req *createSessionReq
if err := httplib.ReadJSON(r, &req); err != nil {
return nil, trace.Wrap(err)
}
namespace := p.ByName("namespace")
if !types.IsValidNamespace(namespace) {
return nil, trace.BadParameter("invalid namespace %q", namespace)
}
req.Session.Namespace = namespace
if err := auth.CreateSession(r.Context(), req.Session); err != nil {
return nil, trace.Wrap(err)
}
return message("ok"), nil
}

type updateSessionReq struct {
Update session.UpdateRequest `json:"update"`
}

func (s *APIServer) updateSession(auth ClientI, w http.ResponseWriter, r *http.Request, p httprouter.Params, version string) (interface{}, error) {
var req *updateSessionReq
if err := httplib.ReadJSON(r, &req); err != nil {
return nil, trace.Wrap(err)
}
namespace := p.ByName("namespace")
if !types.IsValidNamespace(namespace) {
return nil, trace.BadParameter("invalid namespace %q", namespace)
}
req.Update.Namespace = namespace
if err := auth.UpdateSession(r.Context(), req.Update); err != nil {
return nil, trace.Wrap(err)
}
return message("ok"), nil
}

func (s *APIServer) deleteSession(auth ClientI, w http.ResponseWriter, r *http.Request, p httprouter.Params, version string) (interface{}, error) {
err := auth.DeleteSession(r.Context(), p.ByName("namespace"), session.ID(p.ByName("id")))
if err != nil {
return nil, trace.Wrap(err)
}
return message("ok"), nil
}

func (s *APIServer) getSessions(auth ClientI, w http.ResponseWriter, r *http.Request, p httprouter.Params, version string) (interface{}, error) {
namespace := p.ByName("namespace")
if !types.IsValidNamespace(namespace) {
return nil, trace.BadParameter("invalid namespace %q", namespace)
}
sessions, err := auth.GetSessions(r.Context(), namespace)
if err != nil {
return nil, trace.Wrap(err)
}
return sessions, nil
}

func (s *APIServer) getSession(auth ClientI, w http.ResponseWriter, r *http.Request, p httprouter.Params, version string) (interface{}, error) {
sid, err := session.ParseID(p.ByName("id"))
if err != nil {
return nil, trace.Wrap(err)
}
namespace := p.ByName("namespace")
if !types.IsValidNamespace(namespace) {
return nil, trace.BadParameter("invalid namespace %q", namespace)
}
se, err := auth.GetSession(r.Context(), namespace, *sid)
if err != nil {
return nil, trace.Wrap(err)
}
return se, nil
}

type createOIDCAuthRequestReq struct {
Req types.OIDCAuthRequest `json:"req"`
}
Expand Down
Loading