zitadel/internal/domain/action.go
Stefan Benz 0c87a96e2c
feat: actions v2 for functions (#9420)
# Which Problems Are Solved

Actions v2 are not executed in different functions, as provided by the
actions v1.

# How the Problems Are Solved

Add functionality to call actions v2 through OIDC and SAML logic to
complement tokens and SAMLResponses.

# Additional Changes

- Corrected testing for retrieved intent information
- Added testing for IDP types
- Corrected handling of context for issuer in SAML logic

# Additional Context

- Closes #7247 
- Dependent on https://github.com/zitadel/saml/pull/97
- docs for migration are done in separate issue:
https://github.com/zitadel/zitadel/issues/9456

---------

Co-authored-by: Silvan <27845747+adlerhurst@users.noreply.github.com>
2025-03-04 11:09:30 +00:00

97 lines
1.8 KiB
Go

package domain
import (
"slices"
"time"
"github.com/zitadel/zitadel/internal/eventstore/v1/models"
)
type Action struct {
models.ObjectRoot
Name string
Script string
Timeout time.Duration
AllowedToFail bool
State ActionState
}
func (a *Action) IsValid() bool {
return a.Name != ""
}
type ActionState int32
const (
ActionStateUnspecified ActionState = iota
ActionStateActive
ActionStateInactive
ActionStateRemoved
actionStateCount
)
func (s ActionState) Valid() bool {
return s >= 0 && s < actionStateCount
}
func (s ActionState) Exists() bool {
return s != ActionStateUnspecified && s != ActionStateRemoved
}
type ActionsAllowed int32
const (
ActionsNotAllowed ActionsAllowed = iota
ActionsMaxAllowed
ActionsAllowedUnlimited
)
type ActionFunction int32
const (
ActionFunctionUnspecified ActionFunction = iota
ActionFunctionPreUserinfo
ActionFunctionPreAccessToken
ActionFunctionPreSAMLResponse
actionFunctionCount
)
func (s ActionFunction) Valid() bool {
return s >= 0 && s < actionFunctionCount
}
func (s ActionFunction) LocalizationKey() string {
if !s.Valid() {
return ActionFunctionUnspecified.LocalizationKey()
}
switch s {
case ActionFunctionPreUserinfo:
return "preuserinfo"
case ActionFunctionPreAccessToken:
return "preaccesstoken"
case ActionFunctionPreSAMLResponse:
return "presamlresponse"
case ActionFunctionUnspecified, actionFunctionCount:
fallthrough
default:
return "unspecified"
}
}
func AllActionFunctions() []string {
return []string{
ActionFunctionPreUserinfo.LocalizationKey(),
ActionFunctionPreAccessToken.LocalizationKey(),
ActionFunctionPreSAMLResponse.LocalizationKey(),
}
}
func ActionFunctionExists() func(string) bool {
functions := AllActionFunctions()
return func(s string) bool {
return slices.Contains(functions, s)
}
}