mirror of
https://github.com/zitadel/zitadel.git
synced 2025-08-11 19:07:30 +00:00
feat: Config to eventstore (#3158)
* feat: add default language to eventstore * feat: add secret generator configs events * feat: tests * feat: secret generators in eventstore * feat: secret generators in eventstore * feat: smtp config in eventstore * feat: smtp config in eventstore * feat: smtp config in eventstore * feat: smtp config in eventstore * feat: smtp config in eventstore * fix: migrations * fix migration version * fix test * feat: change secret generator type to enum * feat: change smtp attribute names * feat: change smtp attribute names * feat: remove engryption algorithms from command side * feat: remove engryption algorithms from command side * feat: smtp config * feat: smtp config * format smtp from header Co-authored-by: Livio Amstutz <livio.a@gmail.com>
This commit is contained in:
57
internal/repository/iam/event_default_language.go
Normal file
57
internal/repository/iam/event_default_language.go
Normal file
@@ -0,0 +1,57 @@
|
||||
package iam
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
|
||||
"github.com/caos/zitadel/internal/eventstore"
|
||||
"golang.org/x/text/language"
|
||||
|
||||
"github.com/caos/zitadel/internal/errors"
|
||||
"github.com/caos/zitadel/internal/eventstore/repository"
|
||||
)
|
||||
|
||||
const (
|
||||
DefaultLanguageSetEventType eventstore.EventType = "iam.default.language.set"
|
||||
)
|
||||
|
||||
type DefaultLanguageSetEvent struct {
|
||||
eventstore.BaseEvent `json:"-"`
|
||||
|
||||
Language language.Tag `json:"language"`
|
||||
}
|
||||
|
||||
func (e *DefaultLanguageSetEvent) Data() interface{} {
|
||||
return e
|
||||
}
|
||||
|
||||
func (e *DefaultLanguageSetEvent) UniqueConstraints() []*eventstore.EventUniqueConstraint {
|
||||
return nil
|
||||
}
|
||||
|
||||
func NewDefaultLanguageSetEvent(
|
||||
ctx context.Context,
|
||||
aggregate *eventstore.Aggregate,
|
||||
language language.Tag,
|
||||
) *DefaultLanguageSetEvent {
|
||||
return &DefaultLanguageSetEvent{
|
||||
BaseEvent: *eventstore.NewBaseEventForPush(
|
||||
ctx,
|
||||
aggregate,
|
||||
DefaultLanguageSetEventType,
|
||||
),
|
||||
Language: language,
|
||||
}
|
||||
}
|
||||
|
||||
func DefaultLanguageSetMapper(event *repository.Event) (eventstore.Event, error) {
|
||||
e := &DefaultLanguageSetEvent{
|
||||
BaseEvent: *eventstore.BaseEventFromRepo(event),
|
||||
}
|
||||
err := json.Unmarshal(event.Data, e)
|
||||
if err != nil {
|
||||
return nil, errors.ThrowInternal(err, "IAM-3j9fs", "unable to unmarshal default language set")
|
||||
}
|
||||
|
||||
return e, nil
|
||||
}
|
@@ -9,6 +9,13 @@ func RegisterEventMappers(es *eventstore.Eventstore) {
|
||||
RegisterFilterEventMapper(SetupDoneEventType, SetupStepMapper).
|
||||
RegisterFilterEventMapper(GlobalOrgSetEventType, GlobalOrgSetMapper).
|
||||
RegisterFilterEventMapper(ProjectSetEventType, ProjectSetMapper).
|
||||
RegisterFilterEventMapper(DefaultLanguageSetEventType, DefaultLanguageSetMapper).
|
||||
RegisterFilterEventMapper(SecretGeneratorAddedEventType, SecretGeneratorAddedEventMapper).
|
||||
RegisterFilterEventMapper(SecretGeneratorChangedEventType, SecretGeneratorChangedEventMapper).
|
||||
RegisterFilterEventMapper(SecretGeneratorRemovedEventType, SecretGeneratorRemovedEventMapper).
|
||||
RegisterFilterEventMapper(SMTPConfigAddedEventType, SMTPConfigAddedEventMapper).
|
||||
RegisterFilterEventMapper(SMTPConfigChangedEventType, SMTPConfigChangedEventMapper).
|
||||
RegisterFilterEventMapper(SMTPConfigPasswordChangedEventType, SMTPConfigPasswordChangedEventMapper).
|
||||
RegisterFilterEventMapper(UniqueConstraintsMigratedEventType, MigrateUniqueConstraintEventMapper).
|
||||
RegisterFilterEventMapper(LabelPolicyAddedEventType, LabelPolicyAddedEventMapper).
|
||||
RegisterFilterEventMapper(LabelPolicyChangedEventType, LabelPolicyChangedEventMapper).
|
||||
|
228
internal/repository/iam/secret_generator.go
Normal file
228
internal/repository/iam/secret_generator.go
Normal file
@@ -0,0 +1,228 @@
|
||||
package iam
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"time"
|
||||
|
||||
"github.com/caos/zitadel/internal/domain"
|
||||
"github.com/caos/zitadel/internal/errors"
|
||||
"github.com/caos/zitadel/internal/eventstore"
|
||||
"github.com/caos/zitadel/internal/eventstore/repository"
|
||||
)
|
||||
|
||||
const (
|
||||
UniqueSecretGeneratorType = "secret_generator"
|
||||
secretGeneratorPrefix = "secret.generator."
|
||||
SecretGeneratorAddedEventType = iamEventTypePrefix + secretGeneratorPrefix + "added"
|
||||
SecretGeneratorChangedEventType = iamEventTypePrefix + secretGeneratorPrefix + "changed"
|
||||
SecretGeneratorRemovedEventType = iamEventTypePrefix + secretGeneratorPrefix + "removed"
|
||||
)
|
||||
|
||||
func NewAddSecretGeneratorTypeUniqueConstraint(generatorType domain.SecretGeneratorType) *eventstore.EventUniqueConstraint {
|
||||
return eventstore.NewAddEventUniqueConstraint(
|
||||
UniqueSecretGeneratorType,
|
||||
string(generatorType),
|
||||
"Errors.SecretGenerator.AlreadyExists")
|
||||
}
|
||||
|
||||
func NewRemoveSecretGeneratorTypeUniqueConstraint(generatorType domain.SecretGeneratorType) *eventstore.EventUniqueConstraint {
|
||||
return eventstore.NewRemoveEventUniqueConstraint(
|
||||
UniqueSecretGeneratorType,
|
||||
string(generatorType))
|
||||
}
|
||||
|
||||
type SecretGeneratorAddedEvent struct {
|
||||
eventstore.BaseEvent `json:"-"`
|
||||
|
||||
GeneratorType domain.SecretGeneratorType `json:"generatorType"`
|
||||
Length uint `json:"length,omitempty"`
|
||||
Expiry time.Duration `json:"expiry,omitempty"`
|
||||
IncludeLowerLetters bool `json:"includeLowerLetters,omitempty"`
|
||||
IncludeUpperLetters bool `json:"includeUpperLetters,omitempty"`
|
||||
IncludeDigits bool `json:"includeDigits,omitempty"`
|
||||
IncludeSymbols bool `json:"includeSymbols,omitempty"`
|
||||
}
|
||||
|
||||
func NewSecretGeneratorAddedEvent(
|
||||
ctx context.Context,
|
||||
aggregate *eventstore.Aggregate,
|
||||
generatorType domain.SecretGeneratorType,
|
||||
length uint,
|
||||
expiry time.Duration,
|
||||
includeLowerLetters,
|
||||
includeUpperLetters,
|
||||
includeDigits,
|
||||
includeSymbols bool,
|
||||
) *SecretGeneratorAddedEvent {
|
||||
return &SecretGeneratorAddedEvent{
|
||||
BaseEvent: *eventstore.NewBaseEventForPush(
|
||||
ctx,
|
||||
aggregate,
|
||||
SecretGeneratorAddedEventType,
|
||||
),
|
||||
GeneratorType: generatorType,
|
||||
Length: length,
|
||||
Expiry: expiry,
|
||||
IncludeLowerLetters: includeLowerLetters,
|
||||
IncludeUpperLetters: includeUpperLetters,
|
||||
IncludeDigits: includeDigits,
|
||||
IncludeSymbols: includeSymbols,
|
||||
}
|
||||
}
|
||||
|
||||
func (e *SecretGeneratorAddedEvent) Data() interface{} {
|
||||
return e
|
||||
}
|
||||
|
||||
func (e *SecretGeneratorAddedEvent) UniqueConstraints() []*eventstore.EventUniqueConstraint {
|
||||
return []*eventstore.EventUniqueConstraint{NewAddSecretGeneratorTypeUniqueConstraint(e.GeneratorType)}
|
||||
}
|
||||
|
||||
func SecretGeneratorAddedEventMapper(event *repository.Event) (eventstore.Event, error) {
|
||||
secretGeneratorAdded := &SecretGeneratorAddedEvent{
|
||||
BaseEvent: *eventstore.BaseEventFromRepo(event),
|
||||
}
|
||||
err := json.Unmarshal(event.Data, secretGeneratorAdded)
|
||||
if err != nil {
|
||||
return nil, errors.ThrowInternal(err, "IAM-en9f4", "unable to unmarshal secret generator added")
|
||||
}
|
||||
|
||||
return secretGeneratorAdded, nil
|
||||
}
|
||||
|
||||
type SecretGeneratorChangedEvent struct {
|
||||
eventstore.BaseEvent `json:"-"`
|
||||
|
||||
GeneratorType domain.SecretGeneratorType `json:"generatorType"`
|
||||
Length *uint `json:"length,omitempty"`
|
||||
Expiry *time.Duration `json:"expiry,omitempty"`
|
||||
IncludeLowerLetters *bool `json:"includeLowerLetters,omitempty"`
|
||||
IncludeUpperLetters *bool `json:"includeUpperLetters,omitempty"`
|
||||
IncludeDigits *bool `json:"includeDigits,omitempty"`
|
||||
IncludeSymbols *bool `json:"includeSymbols,omitempty"`
|
||||
}
|
||||
|
||||
func (e *SecretGeneratorChangedEvent) Data() interface{} {
|
||||
return e
|
||||
}
|
||||
|
||||
func (e *SecretGeneratorChangedEvent) UniqueConstraints() []*eventstore.EventUniqueConstraint {
|
||||
return nil
|
||||
}
|
||||
|
||||
func NewSecretGeneratorChangeEvent(
|
||||
ctx context.Context,
|
||||
aggregate *eventstore.Aggregate,
|
||||
generatorType domain.SecretGeneratorType,
|
||||
changes []SecretGeneratorChanges,
|
||||
) (*SecretGeneratorChangedEvent, error) {
|
||||
if len(changes) == 0 {
|
||||
return nil, errors.ThrowPreconditionFailed(nil, "IAM-j2jfw", "Errors.NoChangesFound")
|
||||
}
|
||||
changeEvent := &SecretGeneratorChangedEvent{
|
||||
BaseEvent: *eventstore.NewBaseEventForPush(
|
||||
ctx,
|
||||
aggregate,
|
||||
SecretGeneratorChangedEventType,
|
||||
),
|
||||
GeneratorType: generatorType,
|
||||
}
|
||||
for _, change := range changes {
|
||||
change(changeEvent)
|
||||
}
|
||||
return changeEvent, nil
|
||||
}
|
||||
|
||||
type SecretGeneratorChanges func(event *SecretGeneratorChangedEvent)
|
||||
|
||||
func ChangeSecretGeneratorLength(length uint) func(event *SecretGeneratorChangedEvent) {
|
||||
return func(e *SecretGeneratorChangedEvent) {
|
||||
e.Length = &length
|
||||
}
|
||||
}
|
||||
|
||||
func ChangeSecretGeneratorExpiry(expiry time.Duration) func(event *SecretGeneratorChangedEvent) {
|
||||
return func(e *SecretGeneratorChangedEvent) {
|
||||
e.Expiry = &expiry
|
||||
}
|
||||
}
|
||||
|
||||
func ChangeSecretGeneratorIncludeLowerLetters(includeLowerLetters bool) func(event *SecretGeneratorChangedEvent) {
|
||||
return func(e *SecretGeneratorChangedEvent) {
|
||||
e.IncludeLowerLetters = &includeLowerLetters
|
||||
}
|
||||
}
|
||||
|
||||
func ChangeSecretGeneratorIncludeUpperLetters(includeUpperLetters bool) func(event *SecretGeneratorChangedEvent) {
|
||||
return func(e *SecretGeneratorChangedEvent) {
|
||||
e.IncludeUpperLetters = &includeUpperLetters
|
||||
}
|
||||
}
|
||||
|
||||
func ChangeSecretGeneratorIncludeDigits(includeDigits bool) func(event *SecretGeneratorChangedEvent) {
|
||||
return func(e *SecretGeneratorChangedEvent) {
|
||||
e.IncludeDigits = &includeDigits
|
||||
}
|
||||
}
|
||||
|
||||
func ChangeSecretGeneratorIncludeSymbols(includeSymbols bool) func(event *SecretGeneratorChangedEvent) {
|
||||
return func(e *SecretGeneratorChangedEvent) {
|
||||
e.IncludeDigits = &includeSymbols
|
||||
}
|
||||
}
|
||||
|
||||
func SecretGeneratorChangedEventMapper(event *repository.Event) (eventstore.Event, error) {
|
||||
e := &SecretGeneratorChangedEvent{
|
||||
BaseEvent: *eventstore.BaseEventFromRepo(event),
|
||||
}
|
||||
|
||||
err := json.Unmarshal(event.Data, e)
|
||||
if err != nil {
|
||||
return nil, errors.ThrowInternal(err, "IAM-2m09e", "unable to unmarshal secret generator changed")
|
||||
}
|
||||
|
||||
return e, nil
|
||||
}
|
||||
|
||||
type SecretGeneratorRemovedEvent struct {
|
||||
eventstore.BaseEvent `json:"-"`
|
||||
|
||||
GeneratorType domain.SecretGeneratorType `json:"generatorType"`
|
||||
}
|
||||
|
||||
func (e *SecretGeneratorRemovedEvent) Data() interface{} {
|
||||
return e
|
||||
}
|
||||
|
||||
func (e *SecretGeneratorRemovedEvent) UniqueConstraints() []*eventstore.EventUniqueConstraint {
|
||||
return []*eventstore.EventUniqueConstraint{NewRemoveSecretGeneratorTypeUniqueConstraint(e.GeneratorType)}
|
||||
}
|
||||
|
||||
func NewSecretGeneratorRemovedEvent(
|
||||
ctx context.Context,
|
||||
aggregate *eventstore.Aggregate,
|
||||
generatorType domain.SecretGeneratorType,
|
||||
) *SecretGeneratorRemovedEvent {
|
||||
return &SecretGeneratorRemovedEvent{
|
||||
BaseEvent: *eventstore.NewBaseEventForPush(
|
||||
ctx,
|
||||
aggregate,
|
||||
SecretGeneratorRemovedEventType,
|
||||
),
|
||||
GeneratorType: generatorType,
|
||||
}
|
||||
}
|
||||
|
||||
func SecretGeneratorRemovedEventMapper(event *repository.Event) (eventstore.Event, error) {
|
||||
e := &SecretGeneratorRemovedEvent{
|
||||
BaseEvent: *eventstore.BaseEventFromRepo(event),
|
||||
}
|
||||
|
||||
err := json.Unmarshal(event.Data, e)
|
||||
if err != nil {
|
||||
return nil, errors.ThrowInternal(err, "IAM-m09ke", "unable to unmarshal secret generator removed")
|
||||
}
|
||||
|
||||
return e, nil
|
||||
}
|
199
internal/repository/iam/smtp_config.go
Normal file
199
internal/repository/iam/smtp_config.go
Normal file
@@ -0,0 +1,199 @@
|
||||
package iam
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
|
||||
"github.com/caos/zitadel/internal/crypto"
|
||||
"github.com/caos/zitadel/internal/errors"
|
||||
"github.com/caos/zitadel/internal/eventstore"
|
||||
"github.com/caos/zitadel/internal/eventstore/repository"
|
||||
)
|
||||
|
||||
const (
|
||||
smtpConfigPrefix = "smtp.config"
|
||||
SMTPConfigAddedEventType = iamEventTypePrefix + smtpConfigPrefix + "added"
|
||||
SMTPConfigChangedEventType = iamEventTypePrefix + smtpConfigPrefix + "changed"
|
||||
SMTPConfigPasswordChangedEventType = iamEventTypePrefix + smtpConfigPrefix + "password.changed"
|
||||
)
|
||||
|
||||
type SMTPConfigAddedEvent struct {
|
||||
eventstore.BaseEvent `json:"-"`
|
||||
|
||||
SenderAddress string `json:"senderAddress,omitempty"`
|
||||
SenderName string `json:"senderName,omitempty"`
|
||||
TLS bool `json:"tls,omitempty"`
|
||||
Host string `json:"host,omitempty"`
|
||||
User string `json:"user,omitempty"`
|
||||
Password *crypto.CryptoValue `json:"password,omitempty"`
|
||||
}
|
||||
|
||||
func NewSMTPConfigAddedEvent(
|
||||
ctx context.Context,
|
||||
aggregate *eventstore.Aggregate,
|
||||
tls bool,
|
||||
senderAddress,
|
||||
senderName,
|
||||
host,
|
||||
user string,
|
||||
password *crypto.CryptoValue,
|
||||
) *SMTPConfigAddedEvent {
|
||||
return &SMTPConfigAddedEvent{
|
||||
BaseEvent: *eventstore.NewBaseEventForPush(
|
||||
ctx,
|
||||
aggregate,
|
||||
SMTPConfigAddedEventType,
|
||||
),
|
||||
TLS: tls,
|
||||
SenderAddress: senderAddress,
|
||||
SenderName: senderName,
|
||||
Host: host,
|
||||
User: user,
|
||||
Password: password,
|
||||
}
|
||||
}
|
||||
|
||||
func (e *SMTPConfigAddedEvent) Data() interface{} {
|
||||
return e
|
||||
}
|
||||
|
||||
func (e *SMTPConfigAddedEvent) UniqueConstraints() []*eventstore.EventUniqueConstraint {
|
||||
return nil
|
||||
}
|
||||
|
||||
func SMTPConfigAddedEventMapper(event *repository.Event) (eventstore.Event, error) {
|
||||
smtpConfigAdded := &SMTPConfigAddedEvent{
|
||||
BaseEvent: *eventstore.BaseEventFromRepo(event),
|
||||
}
|
||||
err := json.Unmarshal(event.Data, smtpConfigAdded)
|
||||
if err != nil {
|
||||
return nil, errors.ThrowInternal(err, "IAM-39fks", "unable to unmarshal smtp config added")
|
||||
}
|
||||
|
||||
return smtpConfigAdded, nil
|
||||
}
|
||||
|
||||
type SMTPConfigChangedEvent struct {
|
||||
eventstore.BaseEvent `json:"-"`
|
||||
|
||||
FromAddress *string `json:"senderAddress,omitempty"`
|
||||
FromName *string `json:"senderName,omitempty"`
|
||||
TLS *bool `json:"tls,omitempty"`
|
||||
Host *string `json:"host,omitempty"`
|
||||
User *string `json:"user,omitempty"`
|
||||
}
|
||||
|
||||
func (e *SMTPConfigChangedEvent) Data() interface{} {
|
||||
return e
|
||||
}
|
||||
|
||||
func (e *SMTPConfigChangedEvent) UniqueConstraints() []*eventstore.EventUniqueConstraint {
|
||||
return nil
|
||||
}
|
||||
|
||||
func NewSMTPConfigChangeEvent(
|
||||
ctx context.Context,
|
||||
aggregate *eventstore.Aggregate,
|
||||
changes []SMTPConfigChanges,
|
||||
) (*SMTPConfigChangedEvent, error) {
|
||||
if len(changes) == 0 {
|
||||
return nil, errors.ThrowPreconditionFailed(nil, "IAM-o0pWf", "Errors.NoChangesFound")
|
||||
}
|
||||
changeEvent := &SMTPConfigChangedEvent{
|
||||
BaseEvent: *eventstore.NewBaseEventForPush(
|
||||
ctx,
|
||||
aggregate,
|
||||
SMTPConfigChangedEventType,
|
||||
),
|
||||
}
|
||||
for _, change := range changes {
|
||||
change(changeEvent)
|
||||
}
|
||||
return changeEvent, nil
|
||||
}
|
||||
|
||||
type SMTPConfigChanges func(event *SMTPConfigChangedEvent)
|
||||
|
||||
func ChangeSMTPConfigTLS(tls bool) func(event *SMTPConfigChangedEvent) {
|
||||
return func(e *SMTPConfigChangedEvent) {
|
||||
e.TLS = &tls
|
||||
}
|
||||
}
|
||||
|
||||
func ChangeSMTPConfigFromAddress(senderAddress string) func(event *SMTPConfigChangedEvent) {
|
||||
return func(e *SMTPConfigChangedEvent) {
|
||||
e.FromAddress = &senderAddress
|
||||
}
|
||||
}
|
||||
|
||||
func ChangeSMTPConfigFromName(senderName string) func(event *SMTPConfigChangedEvent) {
|
||||
return func(e *SMTPConfigChangedEvent) {
|
||||
e.FromName = &senderName
|
||||
}
|
||||
}
|
||||
|
||||
func ChangeSMTPConfigSMTPHost(smtpHost string) func(event *SMTPConfigChangedEvent) {
|
||||
return func(e *SMTPConfigChangedEvent) {
|
||||
e.Host = &smtpHost
|
||||
}
|
||||
}
|
||||
|
||||
func ChangeSMTPConfigSMTPUser(smtpUser string) func(event *SMTPConfigChangedEvent) {
|
||||
return func(e *SMTPConfigChangedEvent) {
|
||||
e.User = &smtpUser
|
||||
}
|
||||
}
|
||||
|
||||
func SMTPConfigChangedEventMapper(event *repository.Event) (eventstore.Event, error) {
|
||||
e := &SMTPConfigChangedEvent{
|
||||
BaseEvent: *eventstore.BaseEventFromRepo(event),
|
||||
}
|
||||
|
||||
err := json.Unmarshal(event.Data, e)
|
||||
if err != nil {
|
||||
return nil, errors.ThrowInternal(err, "IAM-m09oo", "unable to unmarshal smtp changed")
|
||||
}
|
||||
|
||||
return e, nil
|
||||
}
|
||||
|
||||
type SMTPConfigPasswordChangedEvent struct {
|
||||
eventstore.BaseEvent `json:"-"`
|
||||
|
||||
Password *crypto.CryptoValue `json:"password,omitempty"`
|
||||
}
|
||||
|
||||
func NewSMTPConfigPasswordChangedEvent(
|
||||
ctx context.Context,
|
||||
aggregate *eventstore.Aggregate,
|
||||
password *crypto.CryptoValue,
|
||||
) *SMTPConfigPasswordChangedEvent {
|
||||
return &SMTPConfigPasswordChangedEvent{
|
||||
BaseEvent: *eventstore.NewBaseEventForPush(
|
||||
ctx,
|
||||
aggregate,
|
||||
SMTPConfigPasswordChangedEventType,
|
||||
),
|
||||
Password: password,
|
||||
}
|
||||
}
|
||||
|
||||
func (e *SMTPConfigPasswordChangedEvent) Data() interface{} {
|
||||
return e
|
||||
}
|
||||
|
||||
func (e *SMTPConfigPasswordChangedEvent) UniqueConstraints() []*eventstore.EventUniqueConstraint {
|
||||
return nil
|
||||
}
|
||||
|
||||
func SMTPConfigPasswordChangedEventMapper(event *repository.Event) (eventstore.Event, error) {
|
||||
smtpConfigPasswordChagned := &SMTPConfigPasswordChangedEvent{
|
||||
BaseEvent: *eventstore.BaseEventFromRepo(event),
|
||||
}
|
||||
err := json.Unmarshal(event.Data, smtpConfigPasswordChagned)
|
||||
if err != nil {
|
||||
return nil, errors.ThrowInternal(err, "IAM-99iNF", "unable to unmarshal smtp config password changed")
|
||||
}
|
||||
|
||||
return smtpConfigPasswordChagned, nil
|
||||
}
|
Reference in New Issue
Block a user