mirror of
https://github.com/openziti/ziti.git
synced 2026-09-10 08:45:41 +00:00
7281cb156c
- verifies loadFromBolt accepts a legacy opaque service session token for its owning api session - verifies loadFromBolt rejects an opaque service session token presented under a different api session with an InvalidSessionError
157 lines
4.6 KiB
Go
157 lines
4.6 KiB
Go
package handler_edge_ctrl
|
|
|
|
import (
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/google/uuid"
|
|
"github.com/openziti/channel/v5"
|
|
"github.com/openziti/ziti/v2/controller/change"
|
|
"github.com/openziti/ziti/v2/controller/db"
|
|
"github.com/openziti/ziti/v2/controller/env"
|
|
"github.com/openziti/ziti/v2/controller/model"
|
|
"github.com/openziti/ziti/v2/controller/network"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
type legacySessionTestHandler struct {
|
|
appEnv *env.AppEnv
|
|
}
|
|
|
|
func (self *legacySessionTestHandler) getAppEnv() *env.AppEnv {
|
|
return self.appEnv
|
|
}
|
|
|
|
func (*legacySessionTestHandler) getNetwork() *network.Network {
|
|
return nil
|
|
}
|
|
|
|
func (*legacySessionTestHandler) getChannel() channel.Channel {
|
|
return nil
|
|
}
|
|
|
|
func (*legacySessionTestHandler) Label() string {
|
|
return "legacy-session-test"
|
|
}
|
|
|
|
func newLegacySessionTestEntities(t *testing.T, testCtx *model.TestContext) (*model.Managers, *model.Identity, *model.EdgeService) {
|
|
managers := testCtx.GetManagers()
|
|
identity := &model.Identity{
|
|
Name: uuid.NewString(),
|
|
IdentityTypeId: db.DefaultIdentityType,
|
|
}
|
|
require.NoError(t, managers.Identity.Create(identity, change.New()))
|
|
|
|
service := &model.EdgeService{Name: uuid.NewString()}
|
|
require.NoError(t, managers.EdgeService.Create(service, change.New()))
|
|
|
|
edgeRouter := &model.EdgeRouter{Name: uuid.NewString()}
|
|
require.NoError(t, managers.EdgeRouter.Create(edgeRouter, change.New()))
|
|
|
|
servicePolicy := &model.ServicePolicy{
|
|
Name: uuid.NewString(),
|
|
Semantic: db.SemanticAllOf,
|
|
IdentityRoles: []string{"#all"},
|
|
ServiceRoles: []string{"#all"},
|
|
PolicyType: db.PolicyTypeDialName,
|
|
}
|
|
require.NoError(t, managers.ServicePolicy.Create(servicePolicy, change.New()))
|
|
|
|
edgeRouterPolicy := &model.EdgeRouterPolicy{
|
|
Name: uuid.NewString(),
|
|
Semantic: db.SemanticAllOf,
|
|
IdentityRoles: []string{"#all"},
|
|
EdgeRouterRoles: []string{"#all"},
|
|
}
|
|
require.NoError(t, managers.EdgeRouterPolicy.Create(edgeRouterPolicy, change.New()))
|
|
|
|
serviceEdgeRouterPolicy := &model.ServiceEdgeRouterPolicy{
|
|
Name: uuid.NewString(),
|
|
Semantic: db.SemanticAllOf,
|
|
ServiceRoles: []string{"#all"},
|
|
EdgeRouterRoles: []string{"#all"},
|
|
}
|
|
require.NoError(t, managers.ServiceEdgeRouterPolicy.Create(serviceEdgeRouterPolicy, change.New()))
|
|
|
|
return managers, identity, service
|
|
}
|
|
|
|
func TestLoadFromBoltSupportsOpaqueServiceSessionTokens(t *testing.T) {
|
|
testCtx := model.NewTestContext(t)
|
|
defer testCtx.Cleanup()
|
|
testCtx.Init()
|
|
|
|
managers, identity, service := newLegacySessionTestEntities(t, testCtx)
|
|
|
|
apiSession := &model.ApiSession{
|
|
Token: uuid.NewString(),
|
|
IdentityId: identity.Id,
|
|
Identity: identity,
|
|
LastActivityAt: time.Now(),
|
|
}
|
|
_, err := managers.ApiSession.Create(nil, apiSession, nil)
|
|
require.NoError(t, err)
|
|
|
|
legacySession := &model.Session{
|
|
Token: uuid.NewString(),
|
|
IdentityId: identity.Id,
|
|
ApiSessionId: apiSession.Id,
|
|
ServiceId: service.Id,
|
|
Type: db.SessionTypeDial,
|
|
}
|
|
_, err = managers.Session.Create(legacySession, change.New())
|
|
require.NoError(t, err)
|
|
|
|
handler := &legacySessionTestHandler{
|
|
appEnv: &env.AppEnv{Managers: managers},
|
|
}
|
|
requestCtx := &baseSessionRequestContext{handler: handler}
|
|
|
|
requestCtx.loadFromBolt(legacySession.Token, apiSession.Token)
|
|
|
|
require.NoError(t, requestCtx.err)
|
|
require.Equal(t, legacySession.Id, requestCtx.session.Id)
|
|
require.Equal(t, apiSession.Id, requestCtx.apiSession.Id)
|
|
}
|
|
|
|
func TestLoadFromBoltRejectsOpaqueServiceSessionForDifferentApiSession(t *testing.T) {
|
|
testCtx := model.NewTestContext(t)
|
|
defer testCtx.Cleanup()
|
|
testCtx.Init()
|
|
|
|
managers, identity, service := newLegacySessionTestEntities(t, testCtx)
|
|
|
|
newApiSession := func() *model.ApiSession {
|
|
apiSession := &model.ApiSession{
|
|
Token: uuid.NewString(),
|
|
IdentityId: identity.Id,
|
|
Identity: identity,
|
|
LastActivityAt: time.Now(),
|
|
}
|
|
_, err := managers.ApiSession.Create(nil, apiSession, nil)
|
|
require.NoError(t, err)
|
|
return apiSession
|
|
}
|
|
|
|
ownerApiSession := newApiSession()
|
|
otherApiSession := newApiSession()
|
|
legacySession := &model.Session{
|
|
Token: uuid.NewString(),
|
|
IdentityId: identity.Id,
|
|
ApiSessionId: ownerApiSession.Id,
|
|
ServiceId: service.Id,
|
|
Type: db.SessionTypeDial,
|
|
}
|
|
_, err := managers.Session.Create(legacySession, change.New())
|
|
require.NoError(t, err)
|
|
|
|
handler := &legacySessionTestHandler{
|
|
appEnv: &env.AppEnv{Managers: managers},
|
|
}
|
|
requestCtx := &baseSessionRequestContext{handler: handler}
|
|
|
|
requestCtx.loadFromBolt(legacySession.Token, otherApiSession.Token)
|
|
|
|
require.IsType(t, InvalidSessionError{}, requestCtx.err)
|
|
}
|