mirror of
https://github.com/andwati/zitadel.git
synced 2026-10-18 05:52:51 +00:00
# Which Problems Are Solved As part of #11035 , this PR implements the IDP intent check logic for session validation # How the Problems Are Solved - Inject encryption algorithm for IDP intent tokens at DB initialization - Add the IDP intent repository as an invoke option - Rework crypto mocks using gomock - Implement IDP intent check logic - minor - DB: expand IDP Intent deletion testing table with a test case where IDP intent is not found # Noteworthy I did not implement `domain.Transactional` given the doubts that @adlerhurst expressed in https://github.com/zitadel/zitadel/pull/11804 . So, there is no transaction AT ALL in here because the `Execute()` method contains one single DB call (Delete) and `Validate()` just does Get calls. # Additional Context This is a cherry-picked PR + minor changes, coming from https://github.com/zitadel/zitadel/pull/11164 - Relates to #11035 - Depends on https://github.com/zitadel/zitadel/pull/11804
146 lines
3.7 KiB
Go
146 lines
3.7 KiB
Go
package domain
|
|
|
|
import (
|
|
"context"
|
|
|
|
"github.com/zitadel/zitadel/backend/v3/storage/database"
|
|
"github.com/zitadel/zitadel/backend/v3/storage/eventstore"
|
|
)
|
|
|
|
type InvokeOpt func(*InvokeOpts)
|
|
|
|
func WithOrganizationRepo(repo OrganizationRepository) InvokeOpt {
|
|
return func(opts *InvokeOpts) {
|
|
opts.organizationRepo = repo
|
|
}
|
|
}
|
|
|
|
func WithOrganizationDomainRepo(repo OrganizationDomainRepository) InvokeOpt {
|
|
return func(opts *InvokeOpts) {
|
|
opts.organizationDomainRepo = repo
|
|
}
|
|
}
|
|
|
|
func WithProjectRepo(repo ProjectRepository) InvokeOpt {
|
|
return func(opts *InvokeOpts) {
|
|
opts.projectRepo = repo
|
|
}
|
|
}
|
|
|
|
func WithInstanceRepo(repo InstanceRepository) InvokeOpt {
|
|
return func(opts *InvokeOpts) {
|
|
opts.instanceRepo = repo
|
|
}
|
|
}
|
|
|
|
func WithInstanceDomainRepo(repo InstanceDomainRepository) InvokeOpt {
|
|
return func(opts *InvokeOpts) {
|
|
opts.instanceDomainRepo = repo
|
|
}
|
|
}
|
|
|
|
func WithSessionRepo(repo SessionRepository) InvokeOpt {
|
|
return func(opts *InvokeOpts) {
|
|
opts.sessionRepo = repo
|
|
}
|
|
}
|
|
|
|
func WithUserRepo(repo UserRepository) InvokeOpt {
|
|
return func(opts *InvokeOpts) {
|
|
opts.userRepo = repo
|
|
}
|
|
}
|
|
|
|
func WithLockoutSettingsRepo(repo LockoutSettingsRepository) InvokeOpt {
|
|
return func(opts *InvokeOpts) {
|
|
opts.lockoutSettingRepo = repo
|
|
}
|
|
}
|
|
|
|
func WithPermissionChecker(checker PermissionChecker) InvokeOpt {
|
|
return func(opts *InvokeOpts) {
|
|
opts.Permissions = checker
|
|
}
|
|
}
|
|
|
|
func WithIDPIntentRepo(repo IDPIntentRepository) InvokeOpt {
|
|
return func(opts *InvokeOpts) {
|
|
opts.idpIntentRepo = repo
|
|
}
|
|
}
|
|
|
|
// WithQueryExecutor sets the database client to be used by the command.
|
|
// If not set, the default pool will be used.
|
|
// This is mainly used for testing.
|
|
func WithQueryExecutor(executor database.QueryExecutor) InvokeOpt {
|
|
return func(opts *InvokeOpts) {
|
|
opts.db = executor
|
|
}
|
|
}
|
|
|
|
// WithLegacyEventstore sets the eventstore to be used by the command.
|
|
// If not set, the default one will be used.
|
|
// This is mainly used for testing.
|
|
func WithLegacyEventstore(es eventstore.LegacyEventstore) InvokeOpt {
|
|
return func(opts *InvokeOpts) {
|
|
opts.legacyEventstore = es
|
|
}
|
|
}
|
|
|
|
// InvokeOpts are passed to each command
|
|
type InvokeOpts struct {
|
|
// db is the database client.
|
|
// [Executor]s MUST NOT access this field directly, use [InvokeOpts.DB] to access it.
|
|
//
|
|
// [Invoker]s may manipulate this field for example changing it to a transaction.
|
|
// Its their responsibility to restore it after ending the transaction.
|
|
db database.QueryExecutor
|
|
legacyEventstore eventstore.LegacyEventstore
|
|
Invoker Invoker
|
|
Permissions PermissionChecker
|
|
organizationRepo OrganizationRepository
|
|
organizationDomainRepo OrganizationDomainRepository
|
|
projectRepo ProjectRepository
|
|
instanceRepo InstanceRepository
|
|
instanceDomainRepo InstanceDomainRepository
|
|
sessionRepo SessionRepository
|
|
userRepo UserRepository
|
|
idpIntentRepo IDPIntentRepository
|
|
|
|
// Settings repos
|
|
lockoutSettingRepo LockoutSettingsRepository
|
|
}
|
|
|
|
func (o *InvokeOpts) DB() database.QueryExecutor {
|
|
if o.db != nil {
|
|
return o.db
|
|
}
|
|
o.db = pool
|
|
return o.db
|
|
}
|
|
|
|
func (o *InvokeOpts) LegacyEventstore() eventstore.LegacyEventstore {
|
|
if o.legacyEventstore != nil {
|
|
return o.legacyEventstore
|
|
}
|
|
o.legacyEventstore = legacyEventstore
|
|
return o.legacyEventstore
|
|
}
|
|
|
|
func (o *InvokeOpts) Invoke(ctx context.Context, executor Executor) error {
|
|
if o.Invoker == nil {
|
|
return executor.Execute(ctx, o)
|
|
}
|
|
return o.Invoker.Invoke(ctx, executor, o)
|
|
}
|
|
|
|
func DefaultOpts(invoker Invoker) *InvokeOpts {
|
|
if invoker == nil {
|
|
invoker = &noopInvoker{}
|
|
}
|
|
return &InvokeOpts{
|
|
Invoker: invoker,
|
|
Permissions: &noopPermissionChecker{}, // prevent panics for now
|
|
}
|
|
}
|