mirror of
https://github.com/andwati/zitadel.git
synced 2026-10-18 05:52:51 +00:00
* Inject DenyList from config to `StartCommands()` * Implementation draft * Move address checker to separate package * Migrate usages of actions.AddressChecker to denylist.AddressChecker * Rename denylist package files * Pass []denylist.AddressChecker to StartCommand * Add DenyList to defaults.yaml and add custom config parser * net: add HostnameToIPList function * denylist: Add IsHostBlocked() * actions: use denylist.IsHostBlocked() * command: Inject ip lookup function + extend add target validationt test * command: Unexport ChangeTarget.IsValid() * command: Add denyList check on ChangeTarget validation * command: Export ActionsV2DenyList and IPLookupFunction params * Lint fix * Check denylist during action execution * Fix integration tests * Apply suggestions * Add `mapstructure.StringToSliceHookFunc()` to decode `HTTPConfigDecodeHook`
114 lines
3.4 KiB
Go
114 lines
3.4 KiB
Go
package mirror
|
|
|
|
import (
|
|
_ "embed"
|
|
"fmt"
|
|
"time"
|
|
|
|
"github.com/mitchellh/mapstructure"
|
|
"github.com/spf13/cobra"
|
|
"github.com/spf13/viper"
|
|
old_logging "github.com/zitadel/logging" //nolint:staticcheck
|
|
|
|
"github.com/zitadel/zitadel/backend/v3/instrumentation"
|
|
"github.com/zitadel/zitadel/backend/v3/instrumentation/logging"
|
|
"github.com/zitadel/zitadel/cmd/hooks"
|
|
"github.com/zitadel/zitadel/internal/actions"
|
|
internal_authz "github.com/zitadel/zitadel/internal/api/authz"
|
|
"github.com/zitadel/zitadel/internal/command"
|
|
"github.com/zitadel/zitadel/internal/config/hook"
|
|
"github.com/zitadel/zitadel/internal/database"
|
|
"github.com/zitadel/zitadel/internal/denylist"
|
|
"github.com/zitadel/zitadel/internal/domain"
|
|
"github.com/zitadel/zitadel/internal/id"
|
|
)
|
|
|
|
type Migration struct {
|
|
Source database.Config
|
|
Destination database.Config
|
|
|
|
EventBulkSize uint32
|
|
MaxAuthRequestAge time.Duration
|
|
|
|
Log *old_logging.Config
|
|
Machine *id.Config
|
|
Instrumentation instrumentation.Config
|
|
Metrics instrumentation.LegacyMetricConfig
|
|
}
|
|
|
|
var (
|
|
//go:embed defaults.yaml
|
|
defaultConfig []byte
|
|
)
|
|
|
|
func newMigrationConfig(cmd *cobra.Command, v *viper.Viper) (*Migration, instrumentation.ShutdownFunc, error) {
|
|
config := new(Migration)
|
|
err := newConfig(v, config)
|
|
if err != nil {
|
|
return nil, nil, err
|
|
}
|
|
shutdown, err := startInstrumentation(cmd, config.Instrumentation, config.Log)
|
|
if err != nil {
|
|
return nil, nil, err
|
|
}
|
|
id.Configure(config.Machine)
|
|
return config, shutdown, nil
|
|
}
|
|
|
|
func newProjectionsConfig(cmd *cobra.Command, v *viper.Viper) (*ProjectionsConfig, instrumentation.ShutdownFunc, error) {
|
|
config := new(ProjectionsConfig)
|
|
err := newConfig(v, config)
|
|
if err != nil {
|
|
return nil, nil, err
|
|
}
|
|
shutdown, err := startInstrumentation(cmd, config.Instrumentation, config.Log)
|
|
if err != nil {
|
|
return nil, nil, err
|
|
}
|
|
id.Configure(config.Machine)
|
|
return config, shutdown, nil
|
|
}
|
|
|
|
func startInstrumentation(cmd *cobra.Command, cfg instrumentation.Config, logConfig *old_logging.Config) (instrumentation.ShutdownFunc, error) {
|
|
cfg.Log.SetLegacyConfig(logConfig)
|
|
shutdown, err := instrumentation.Start(cmd.Context(), cfg)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("unable to start instrumentation: %w", err)
|
|
}
|
|
// Legacy logger
|
|
err = logConfig.SetLogger()
|
|
if err != nil {
|
|
return nil, fmt.Errorf("unable to set logger: %w", err)
|
|
}
|
|
cmd.SetContext(logging.NewCtx(cmd.Context(), logging.StreamRuntime))
|
|
return shutdown, nil
|
|
}
|
|
|
|
func newConfig(v *viper.Viper, config any) error {
|
|
err := v.Unmarshal(config,
|
|
viper.DecodeHook(mapstructure.ComposeDecodeHookFunc(
|
|
hooks.SliceTypeStringDecode[*domain.CustomMessageText],
|
|
hooks.SliceTypeStringDecode[*command.SetQuota],
|
|
hooks.SliceTypeStringDecode[internal_authz.RoleMapping],
|
|
hooks.MapTypeStringDecode[string, *internal_authz.SystemAPIUser],
|
|
hooks.MapTypeStringDecode[domain.Feature, any],
|
|
hooks.MapHTTPHeaderStringDecode,
|
|
hook.Base64ToBytesHookFunc(),
|
|
hook.TagToLanguageHookFunc(),
|
|
hook.StringToURLHookFunc(),
|
|
mapstructure.StringToTimeDurationHookFunc(),
|
|
mapstructure.StringToTimeHookFunc(time.RFC3339),
|
|
mapstructure.StringToSliceHookFunc(","),
|
|
database.DecodeHook(true),
|
|
actions.HTTPConfigDecodeHook,
|
|
denylist.DenyListDecodeHook,
|
|
hook.EnumHookFunc(internal_authz.MemberTypeString),
|
|
mapstructure.TextUnmarshallerHookFunc(),
|
|
)),
|
|
)
|
|
if err != nil {
|
|
return fmt.Errorf("unable to decode config: %w", err)
|
|
}
|
|
return nil
|
|
}
|