2023-02-15 08:14:59 +00:00
|
|
|
package command
|
|
|
|
|
|
|
|
import (
|
|
|
|
"context"
|
|
|
|
"strings"
|
|
|
|
|
|
|
|
"github.com/zitadel/zitadel/internal/api/authz"
|
|
|
|
"github.com/zitadel/zitadel/internal/command/preparation"
|
|
|
|
"github.com/zitadel/zitadel/internal/crypto"
|
|
|
|
"github.com/zitadel/zitadel/internal/domain"
|
|
|
|
caos_errs "github.com/zitadel/zitadel/internal/errors"
|
|
|
|
"github.com/zitadel/zitadel/internal/eventstore"
|
|
|
|
"github.com/zitadel/zitadel/internal/repository/instance"
|
|
|
|
)
|
|
|
|
|
2023-02-24 14:16:06 +00:00
|
|
|
func (c *Commands) AddInstanceGenericOAuthProvider(ctx context.Context, provider GenericOAuthProvider) (string, *domain.ObjectDetails, error) {
|
|
|
|
instanceID := authz.GetInstance(ctx).InstanceID()
|
|
|
|
instanceAgg := instance.NewAggregate(instanceID)
|
|
|
|
id, err := c.idGenerator.Next()
|
|
|
|
if err != nil {
|
|
|
|
return "", nil, err
|
|
|
|
}
|
|
|
|
writeModel := NewOAuthInstanceIDPWriteModel(instanceID, id)
|
|
|
|
cmds, err := preparation.PrepareCommands(ctx, c.eventstore.Filter, c.prepareAddInstanceOAuthProvider(instanceAgg, writeModel, provider))
|
|
|
|
if err != nil {
|
|
|
|
return "", nil, err
|
|
|
|
}
|
|
|
|
pushedEvents, err := c.eventstore.Push(ctx, cmds...)
|
|
|
|
if err != nil {
|
|
|
|
return "", nil, err
|
|
|
|
}
|
|
|
|
return id, pushedEventsToObjectDetails(pushedEvents), nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (c *Commands) UpdateInstanceGenericOAuthProvider(ctx context.Context, id string, provider GenericOAuthProvider) (*domain.ObjectDetails, error) {
|
|
|
|
instanceID := authz.GetInstance(ctx).InstanceID()
|
|
|
|
instanceAgg := instance.NewAggregate(instanceID)
|
|
|
|
writeModel := NewOAuthInstanceIDPWriteModel(instanceID, id)
|
|
|
|
cmds, err := preparation.PrepareCommands(ctx, c.eventstore.Filter, c.prepareUpdateInstanceOAuthProvider(instanceAgg, writeModel, provider))
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
if len(cmds) == 0 {
|
|
|
|
// no change, so return directly
|
|
|
|
return &domain.ObjectDetails{
|
|
|
|
Sequence: writeModel.ProcessedSequence,
|
|
|
|
EventDate: writeModel.ChangeDate,
|
|
|
|
ResourceOwner: writeModel.ResourceOwner,
|
|
|
|
}, nil
|
|
|
|
}
|
|
|
|
pushedEvents, err := c.eventstore.Push(ctx, cmds...)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
return pushedEventsToObjectDetails(pushedEvents), nil
|
|
|
|
}
|
|
|
|
|
2023-02-27 15:32:18 +00:00
|
|
|
func (c *Commands) AddInstanceGenericOIDCProvider(ctx context.Context, provider GenericOIDCProvider) (string, *domain.ObjectDetails, error) {
|
|
|
|
instanceID := authz.GetInstance(ctx).InstanceID()
|
|
|
|
instanceAgg := instance.NewAggregate(instanceID)
|
|
|
|
id, err := c.idGenerator.Next()
|
|
|
|
if err != nil {
|
|
|
|
return "", nil, err
|
|
|
|
}
|
|
|
|
writeModel := NewOIDCInstanceIDPWriteModel(instanceID, id)
|
|
|
|
cmds, err := preparation.PrepareCommands(ctx, c.eventstore.Filter, c.prepareAddInstanceOIDCProvider(instanceAgg, writeModel, provider))
|
|
|
|
if err != nil {
|
|
|
|
return "", nil, err
|
|
|
|
}
|
|
|
|
pushedEvents, err := c.eventstore.Push(ctx, cmds...)
|
|
|
|
if err != nil {
|
|
|
|
return "", nil, err
|
|
|
|
}
|
|
|
|
return id, pushedEventsToObjectDetails(pushedEvents), nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (c *Commands) UpdateInstanceGenericOIDCProvider(ctx context.Context, id string, provider GenericOIDCProvider) (*domain.ObjectDetails, error) {
|
|
|
|
instanceID := authz.GetInstance(ctx).InstanceID()
|
|
|
|
instanceAgg := instance.NewAggregate(instanceID)
|
|
|
|
writeModel := NewOIDCInstanceIDPWriteModel(instanceID, id)
|
|
|
|
cmds, err := preparation.PrepareCommands(ctx, c.eventstore.Filter, c.prepareUpdateInstanceOIDCProvider(instanceAgg, writeModel, provider))
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
if len(cmds) == 0 {
|
|
|
|
// no change, so return directly
|
|
|
|
return &domain.ObjectDetails{
|
|
|
|
Sequence: writeModel.ProcessedSequence,
|
|
|
|
EventDate: writeModel.ChangeDate,
|
|
|
|
ResourceOwner: writeModel.ResourceOwner,
|
|
|
|
}, nil
|
|
|
|
}
|
|
|
|
pushedEvents, err := c.eventstore.Push(ctx, cmds...)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
return pushedEventsToObjectDetails(pushedEvents), nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (c *Commands) AddInstanceJWTProvider(ctx context.Context, provider JWTProvider) (string, *domain.ObjectDetails, error) {
|
|
|
|
instanceID := authz.GetInstance(ctx).InstanceID()
|
|
|
|
instanceAgg := instance.NewAggregate(instanceID)
|
|
|
|
id, err := c.idGenerator.Next()
|
|
|
|
if err != nil {
|
|
|
|
return "", nil, err
|
|
|
|
}
|
|
|
|
writeModel := NewJWTInstanceIDPWriteModel(instanceID, id)
|
|
|
|
cmds, err := preparation.PrepareCommands(ctx, c.eventstore.Filter, c.prepareAddInstanceJWTProvider(instanceAgg, writeModel, provider))
|
|
|
|
if err != nil {
|
|
|
|
return "", nil, err
|
|
|
|
}
|
|
|
|
pushedEvents, err := c.eventstore.Push(ctx, cmds...)
|
|
|
|
if err != nil {
|
|
|
|
return "", nil, err
|
|
|
|
}
|
|
|
|
return id, pushedEventsToObjectDetails(pushedEvents), nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (c *Commands) UpdateInstanceJWTProvider(ctx context.Context, id string, provider JWTProvider) (*domain.ObjectDetails, error) {
|
|
|
|
instanceID := authz.GetInstance(ctx).InstanceID()
|
|
|
|
instanceAgg := instance.NewAggregate(instanceID)
|
|
|
|
writeModel := NewJWTInstanceIDPWriteModel(instanceID, id)
|
|
|
|
cmds, err := preparation.PrepareCommands(ctx, c.eventstore.Filter, c.prepareUpdateInstanceJWTProvider(instanceAgg, writeModel, provider))
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
if len(cmds) == 0 {
|
|
|
|
// no change, so return directly
|
|
|
|
return &domain.ObjectDetails{
|
|
|
|
Sequence: writeModel.ProcessedSequence,
|
|
|
|
EventDate: writeModel.ChangeDate,
|
|
|
|
ResourceOwner: writeModel.ResourceOwner,
|
|
|
|
}, nil
|
|
|
|
}
|
|
|
|
pushedEvents, err := c.eventstore.Push(ctx, cmds...)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
return pushedEventsToObjectDetails(pushedEvents), nil
|
|
|
|
}
|
|
|
|
|
2023-02-21 17:18:28 +00:00
|
|
|
func (c *Commands) AddInstanceGoogleProvider(ctx context.Context, provider GoogleProvider) (string, *domain.ObjectDetails, error) {
|
2023-02-24 14:16:06 +00:00
|
|
|
instanceID := authz.GetInstance(ctx).InstanceID()
|
|
|
|
instanceAgg := instance.NewAggregate(instanceID)
|
2023-02-21 17:18:28 +00:00
|
|
|
id, err := c.idGenerator.Next()
|
|
|
|
if err != nil {
|
|
|
|
return "", nil, err
|
|
|
|
}
|
2023-02-24 14:16:06 +00:00
|
|
|
writeModel := NewGoogleInstanceIDPWriteModel(instanceID, id)
|
|
|
|
cmds, err := preparation.PrepareCommands(ctx, c.eventstore.Filter, c.prepareAddInstanceGoogleProvider(instanceAgg, writeModel, provider))
|
2023-02-21 17:18:28 +00:00
|
|
|
if err != nil {
|
|
|
|
return "", nil, err
|
|
|
|
}
|
|
|
|
pushedEvents, err := c.eventstore.Push(ctx, cmds...)
|
|
|
|
if err != nil {
|
|
|
|
return "", nil, err
|
|
|
|
}
|
|
|
|
return id, pushedEventsToObjectDetails(pushedEvents), nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (c *Commands) UpdateInstanceGoogleProvider(ctx context.Context, id string, provider GoogleProvider) (*domain.ObjectDetails, error) {
|
2023-02-24 14:16:06 +00:00
|
|
|
instanceID := authz.GetInstance(ctx).InstanceID()
|
|
|
|
instanceAgg := instance.NewAggregate(instanceID)
|
|
|
|
writeModel := NewGoogleInstanceIDPWriteModel(instanceID, id)
|
|
|
|
cmds, err := preparation.PrepareCommands(ctx, c.eventstore.Filter, c.prepareUpdateInstanceGoogleProvider(instanceAgg, writeModel, provider))
|
2023-02-21 17:18:28 +00:00
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
if len(cmds) == 0 {
|
|
|
|
// no change, so return directly
|
2023-02-24 14:16:06 +00:00
|
|
|
return &domain.ObjectDetails{
|
|
|
|
Sequence: writeModel.ProcessedSequence,
|
|
|
|
EventDate: writeModel.ChangeDate,
|
|
|
|
ResourceOwner: writeModel.ResourceOwner,
|
|
|
|
}, nil
|
2023-02-21 17:18:28 +00:00
|
|
|
}
|
|
|
|
pushedEvents, err := c.eventstore.Push(ctx, cmds...)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
return pushedEventsToObjectDetails(pushedEvents), nil
|
|
|
|
}
|
|
|
|
|
2023-02-15 08:14:59 +00:00
|
|
|
func (c *Commands) AddInstanceLDAPProvider(ctx context.Context, provider LDAPProvider) (string, *domain.ObjectDetails, error) {
|
2023-02-24 14:16:06 +00:00
|
|
|
instanceID := authz.GetInstance(ctx).InstanceID()
|
|
|
|
instanceAgg := instance.NewAggregate(instanceID)
|
2023-02-15 08:14:59 +00:00
|
|
|
id, err := c.idGenerator.Next()
|
|
|
|
if err != nil {
|
|
|
|
return "", nil, err
|
|
|
|
}
|
2023-02-24 14:16:06 +00:00
|
|
|
writeModel := NewLDAPInstanceIDPWriteModel(instanceID, id)
|
|
|
|
cmds, err := preparation.PrepareCommands(ctx, c.eventstore.Filter, c.prepareAddInstanceLDAPProvider(instanceAgg, writeModel, provider))
|
2023-02-15 08:14:59 +00:00
|
|
|
if err != nil {
|
|
|
|
return "", nil, err
|
|
|
|
}
|
|
|
|
pushedEvents, err := c.eventstore.Push(ctx, cmds...)
|
|
|
|
if err != nil {
|
|
|
|
return "", nil, err
|
|
|
|
}
|
|
|
|
return id, pushedEventsToObjectDetails(pushedEvents), nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (c *Commands) UpdateInstanceLDAPProvider(ctx context.Context, id string, provider LDAPProvider) (*domain.ObjectDetails, error) {
|
2023-02-24 14:16:06 +00:00
|
|
|
instanceID := authz.GetInstance(ctx).InstanceID()
|
|
|
|
instanceAgg := instance.NewAggregate(instanceID)
|
|
|
|
writeModel := NewLDAPInstanceIDPWriteModel(instanceID, id)
|
|
|
|
cmds, err := preparation.PrepareCommands(ctx, c.eventstore.Filter, c.prepareUpdateInstanceLDAPProvider(instanceAgg, writeModel, provider))
|
2023-02-15 08:14:59 +00:00
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
if len(cmds) == 0 {
|
|
|
|
// no change, so return directly
|
2023-02-24 14:16:06 +00:00
|
|
|
return &domain.ObjectDetails{
|
|
|
|
Sequence: writeModel.ProcessedSequence,
|
|
|
|
EventDate: writeModel.ChangeDate,
|
|
|
|
ResourceOwner: writeModel.ResourceOwner,
|
|
|
|
}, nil
|
2023-02-15 08:14:59 +00:00
|
|
|
}
|
|
|
|
pushedEvents, err := c.eventstore.Push(ctx, cmds...)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
return pushedEventsToObjectDetails(pushedEvents), nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (c *Commands) DeleteInstanceProvider(ctx context.Context, id string) (*domain.ObjectDetails, error) {
|
|
|
|
instanceAgg := instance.NewAggregate(authz.GetInstance(ctx).InstanceID())
|
|
|
|
cmds, err := preparation.PrepareCommands(ctx, c.eventstore.Filter, c.prepareDeleteInstanceProvider(instanceAgg, id))
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
pushedEvents, err := c.eventstore.Push(ctx, cmds...)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
return pushedEventsToObjectDetails(pushedEvents), nil
|
|
|
|
}
|
|
|
|
|
2023-02-24 14:16:06 +00:00
|
|
|
func (c *Commands) prepareAddInstanceOAuthProvider(a *instance.Aggregate, writeModel *InstanceOAuthIDPWriteModel, provider GenericOAuthProvider) preparation.Validation {
|
|
|
|
return func() (preparation.CreateCommands, error) {
|
|
|
|
if provider.Name = strings.TrimSpace(provider.Name); provider.Name == "" {
|
|
|
|
return nil, caos_errs.ThrowInvalidArgument(nil, "INST-D32ef", "Errors.Invalid.Argument")
|
|
|
|
}
|
|
|
|
if provider.ClientID = strings.TrimSpace(provider.ClientID); provider.ClientID == "" {
|
|
|
|
return nil, caos_errs.ThrowInvalidArgument(nil, "INST-Dbgzf", "Errors.Invalid.Argument")
|
|
|
|
}
|
|
|
|
if provider.ClientSecret = strings.TrimSpace(provider.ClientSecret); provider.ClientSecret == "" {
|
|
|
|
return nil, caos_errs.ThrowInvalidArgument(nil, "INST-DF4ga", "Errors.Invalid.Argument")
|
|
|
|
}
|
|
|
|
if provider.AuthorizationEndpoint = strings.TrimSpace(provider.AuthorizationEndpoint); provider.AuthorizationEndpoint == "" {
|
|
|
|
return nil, caos_errs.ThrowInvalidArgument(nil, "INST-B23bs", "Errors.Invalid.Argument")
|
|
|
|
}
|
|
|
|
if provider.TokenEndpoint = strings.TrimSpace(provider.TokenEndpoint); provider.TokenEndpoint == "" {
|
|
|
|
return nil, caos_errs.ThrowInvalidArgument(nil, "INST-D2gj8", "Errors.Invalid.Argument")
|
|
|
|
}
|
|
|
|
if provider.UserEndpoint = strings.TrimSpace(provider.UserEndpoint); provider.UserEndpoint == "" {
|
|
|
|
return nil, caos_errs.ThrowInvalidArgument(nil, "INST-Fb8jk", "Errors.Invalid.Argument")
|
|
|
|
}
|
|
|
|
return func(ctx context.Context, filter preparation.FilterToQueryReducer) ([]eventstore.Command, error) {
|
|
|
|
events, err := filter(ctx, writeModel.Query())
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
writeModel.AppendEvents(events...)
|
|
|
|
if err = writeModel.Reduce(); err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
secret, err := crypto.Encrypt([]byte(provider.ClientSecret), c.idpConfigEncryption)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
return []eventstore.Command{
|
|
|
|
instance.NewOAuthIDPAddedEvent(
|
|
|
|
ctx,
|
|
|
|
&a.Aggregate,
|
|
|
|
writeModel.ID,
|
|
|
|
provider.Name,
|
|
|
|
provider.ClientID,
|
|
|
|
secret,
|
|
|
|
provider.AuthorizationEndpoint,
|
|
|
|
provider.TokenEndpoint,
|
|
|
|
provider.UserEndpoint,
|
|
|
|
provider.Scopes,
|
|
|
|
provider.IDPOptions,
|
|
|
|
),
|
|
|
|
}, nil
|
|
|
|
}, nil
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func (c *Commands) prepareUpdateInstanceOAuthProvider(a *instance.Aggregate, writeModel *InstanceOAuthIDPWriteModel, provider GenericOAuthProvider) preparation.Validation {
|
|
|
|
return func() (preparation.CreateCommands, error) {
|
|
|
|
if provider.Name = strings.TrimSpace(provider.Name); provider.Name == "" {
|
|
|
|
return nil, caos_errs.ThrowInvalidArgument(nil, "INST-D32ef", "Errors.Invalid.Argument")
|
|
|
|
}
|
|
|
|
if provider.ClientID = strings.TrimSpace(provider.ClientID); provider.ClientID == "" {
|
|
|
|
return nil, caos_errs.ThrowInvalidArgument(nil, "INST-Dbgzf", "Errors.Invalid.Argument")
|
|
|
|
}
|
|
|
|
if provider.AuthorizationEndpoint = strings.TrimSpace(provider.AuthorizationEndpoint); provider.AuthorizationEndpoint == "" {
|
|
|
|
return nil, caos_errs.ThrowInvalidArgument(nil, "INST-B23bs", "Errors.Invalid.Argument")
|
|
|
|
}
|
|
|
|
if provider.TokenEndpoint = strings.TrimSpace(provider.TokenEndpoint); provider.TokenEndpoint == "" {
|
|
|
|
return nil, caos_errs.ThrowInvalidArgument(nil, "INST-D2gj8", "Errors.Invalid.Argument")
|
|
|
|
}
|
|
|
|
if provider.UserEndpoint = strings.TrimSpace(provider.UserEndpoint); provider.UserEndpoint == "" {
|
|
|
|
return nil, caos_errs.ThrowInvalidArgument(nil, "INST-Fb8jk", "Errors.Invalid.Argument")
|
|
|
|
}
|
|
|
|
return func(ctx context.Context, filter preparation.FilterToQueryReducer) ([]eventstore.Command, error) {
|
|
|
|
events, err := filter(ctx, writeModel.Query())
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
writeModel.AppendEvents(events...)
|
|
|
|
if err = writeModel.Reduce(); err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
if !writeModel.State.Exists() {
|
|
|
|
return nil, caos_errs.ThrowNotFound(nil, "INST-D3r1s", "Errors.Instance.IDPConfig.NotExisting")
|
|
|
|
}
|
|
|
|
event, err := writeModel.NewChangedEvent(
|
|
|
|
ctx,
|
|
|
|
&a.Aggregate,
|
|
|
|
writeModel.ID,
|
|
|
|
provider.Name,
|
|
|
|
provider.ClientID,
|
|
|
|
provider.ClientSecret,
|
|
|
|
c.idpConfigEncryption,
|
|
|
|
provider.AuthorizationEndpoint,
|
|
|
|
provider.TokenEndpoint,
|
|
|
|
provider.UserEndpoint,
|
|
|
|
provider.Scopes,
|
|
|
|
provider.IDPOptions,
|
|
|
|
)
|
2023-02-27 15:32:18 +00:00
|
|
|
if err != nil || event == nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
return []eventstore.Command{event}, nil
|
|
|
|
}, nil
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func (c *Commands) prepareAddInstanceOIDCProvider(a *instance.Aggregate, writeModel *InstanceOIDCIDPWriteModel, provider GenericOIDCProvider) preparation.Validation {
|
|
|
|
return func() (preparation.CreateCommands, error) {
|
|
|
|
if provider.Name = strings.TrimSpace(provider.Name); provider.Name == "" {
|
|
|
|
return nil, caos_errs.ThrowInvalidArgument(nil, "INST-Sgtj5", "Errors.Invalid.Argument")
|
|
|
|
}
|
|
|
|
if provider.Issuer = strings.TrimSpace(provider.Issuer); provider.Issuer == "" {
|
|
|
|
return nil, caos_errs.ThrowInvalidArgument(nil, "INST-Hz6zj", "Errors.Invalid.Argument")
|
|
|
|
}
|
|
|
|
if provider.ClientID = strings.TrimSpace(provider.ClientID); provider.ClientID == "" {
|
|
|
|
return nil, caos_errs.ThrowInvalidArgument(nil, "INST-fb5jm", "Errors.Invalid.Argument")
|
|
|
|
}
|
|
|
|
if provider.ClientSecret = strings.TrimSpace(provider.ClientSecret); provider.ClientSecret == "" {
|
|
|
|
return nil, caos_errs.ThrowInvalidArgument(nil, "INST-Sfdf4", "Errors.Invalid.Argument")
|
|
|
|
}
|
|
|
|
return func(ctx context.Context, filter preparation.FilterToQueryReducer) ([]eventstore.Command, error) {
|
|
|
|
events, err := filter(ctx, writeModel.Query())
|
2023-02-24 14:16:06 +00:00
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
2023-02-27 15:32:18 +00:00
|
|
|
writeModel.AppendEvents(events...)
|
|
|
|
if err = writeModel.Reduce(); err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
secret, err := crypto.Encrypt([]byte(provider.ClientSecret), c.idpConfigEncryption)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
return []eventstore.Command{
|
|
|
|
instance.NewOIDCIDPAddedEvent(
|
|
|
|
ctx,
|
|
|
|
&a.Aggregate,
|
|
|
|
writeModel.ID,
|
|
|
|
provider.Name,
|
|
|
|
provider.Issuer,
|
|
|
|
provider.ClientID,
|
|
|
|
secret,
|
|
|
|
provider.Scopes,
|
|
|
|
provider.IDPOptions,
|
|
|
|
),
|
|
|
|
}, nil
|
|
|
|
}, nil
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func (c *Commands) prepareUpdateInstanceOIDCProvider(a *instance.Aggregate, writeModel *InstanceOIDCIDPWriteModel, provider GenericOIDCProvider) preparation.Validation {
|
|
|
|
return func() (preparation.CreateCommands, error) {
|
|
|
|
if writeModel.ID = strings.TrimSpace(writeModel.ID); writeModel.ID == "" {
|
|
|
|
return nil, caos_errs.ThrowInvalidArgument(nil, "INST-SAfd3", "Errors.Invalid.Argument")
|
|
|
|
}
|
|
|
|
if provider.Name = strings.TrimSpace(provider.Name); provider.Name == "" {
|
|
|
|
return nil, caos_errs.ThrowInvalidArgument(nil, "INST-Dvf4f", "Errors.Invalid.Argument")
|
|
|
|
}
|
|
|
|
if provider.Issuer = strings.TrimSpace(provider.Issuer); provider.Issuer == "" {
|
|
|
|
return nil, caos_errs.ThrowInvalidArgument(nil, "INST-BDfr3", "Errors.Invalid.Argument")
|
|
|
|
}
|
|
|
|
if provider.ClientID = strings.TrimSpace(provider.ClientID); provider.ClientID == "" {
|
|
|
|
return nil, caos_errs.ThrowInvalidArgument(nil, "INST-Db3bs", "Errors.Invalid.Argument")
|
|
|
|
}
|
|
|
|
return func(ctx context.Context, filter preparation.FilterToQueryReducer) ([]eventstore.Command, error) {
|
|
|
|
events, err := filter(ctx, writeModel.Query())
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
writeModel.AppendEvents(events...)
|
|
|
|
if err = writeModel.Reduce(); err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
if !writeModel.State.Exists() {
|
|
|
|
return nil, caos_errs.ThrowNotFound(nil, "INST-Dg331", "Errors.Instance.IDPConfig.NotExisting")
|
|
|
|
}
|
|
|
|
event, err := writeModel.NewChangedEvent(
|
|
|
|
ctx,
|
|
|
|
&a.Aggregate,
|
|
|
|
writeModel.ID,
|
|
|
|
provider.Name,
|
|
|
|
provider.Issuer,
|
|
|
|
provider.ClientID,
|
|
|
|
provider.ClientSecret,
|
|
|
|
c.idpConfigEncryption,
|
|
|
|
provider.Scopes,
|
|
|
|
provider.IDPOptions,
|
|
|
|
)
|
|
|
|
if err != nil || event == nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
return []eventstore.Command{event}, nil
|
|
|
|
}, nil
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func (c *Commands) prepareAddInstanceJWTProvider(a *instance.Aggregate, writeModel *InstanceJWTIDPWriteModel, provider JWTProvider) preparation.Validation {
|
|
|
|
return func() (preparation.CreateCommands, error) {
|
|
|
|
if provider.Name = strings.TrimSpace(provider.Name); provider.Name == "" {
|
|
|
|
return nil, caos_errs.ThrowInvalidArgument(nil, "INST-JLKef", "Errors.Invalid.Argument")
|
|
|
|
}
|
|
|
|
if provider.Issuer = strings.TrimSpace(provider.Issuer); provider.Issuer == "" {
|
|
|
|
return nil, caos_errs.ThrowInvalidArgument(nil, "INST-WNJK3", "Errors.Invalid.Argument")
|
|
|
|
}
|
|
|
|
if provider.JWTEndpoint = strings.TrimSpace(provider.JWTEndpoint); provider.JWTEndpoint == "" {
|
|
|
|
return nil, caos_errs.ThrowInvalidArgument(nil, "INST-NJKSD", "Errors.Invalid.Argument")
|
|
|
|
}
|
|
|
|
if provider.KeyEndpoint = strings.TrimSpace(provider.KeyEndpoint); provider.KeyEndpoint == "" {
|
|
|
|
return nil, caos_errs.ThrowInvalidArgument(nil, "INST-NJKE3", "Errors.Invalid.Argument")
|
|
|
|
}
|
|
|
|
if provider.HeaderName = strings.TrimSpace(provider.HeaderName); provider.HeaderName == "" {
|
|
|
|
return nil, caos_errs.ThrowInvalidArgument(nil, "INST-2rlks", "Errors.Invalid.Argument")
|
|
|
|
}
|
|
|
|
return func(ctx context.Context, filter preparation.FilterToQueryReducer) ([]eventstore.Command, error) {
|
|
|
|
events, err := filter(ctx, writeModel.Query())
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
writeModel.AppendEvents(events...)
|
|
|
|
if err = writeModel.Reduce(); err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
return []eventstore.Command{
|
|
|
|
instance.NewJWTIDPAddedEvent(
|
|
|
|
ctx,
|
|
|
|
&a.Aggregate,
|
|
|
|
writeModel.ID,
|
|
|
|
provider.Name,
|
|
|
|
provider.Issuer,
|
|
|
|
provider.JWTEndpoint,
|
|
|
|
provider.KeyEndpoint,
|
|
|
|
provider.HeaderName,
|
|
|
|
provider.IDPOptions,
|
|
|
|
),
|
|
|
|
}, nil
|
|
|
|
}, nil
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func (c *Commands) prepareUpdateInstanceJWTProvider(a *instance.Aggregate, writeModel *InstanceJWTIDPWriteModel, provider JWTProvider) preparation.Validation {
|
|
|
|
return func() (preparation.CreateCommands, error) {
|
|
|
|
if writeModel.ID = strings.TrimSpace(writeModel.ID); writeModel.ID == "" {
|
|
|
|
return nil, caos_errs.ThrowInvalidArgument(nil, "INST-HUe3q", "Errors.Invalid.Argument")
|
|
|
|
}
|
|
|
|
if provider.Name = strings.TrimSpace(provider.Name); provider.Name == "" {
|
|
|
|
return nil, caos_errs.ThrowInvalidArgument(nil, "INST-JKLS2", "Errors.Invalid.Argument")
|
|
|
|
}
|
|
|
|
if provider.Issuer = strings.TrimSpace(provider.Issuer); provider.Issuer == "" {
|
|
|
|
return nil, caos_errs.ThrowInvalidArgument(nil, "INST-JKs3f", "Errors.Invalid.Argument")
|
|
|
|
}
|
|
|
|
if provider.JWTEndpoint = strings.TrimSpace(provider.JWTEndpoint); provider.JWTEndpoint == "" {
|
|
|
|
return nil, caos_errs.ThrowInvalidArgument(nil, "INST-NJKS2", "Errors.Invalid.Argument")
|
|
|
|
}
|
|
|
|
if provider.KeyEndpoint = strings.TrimSpace(provider.KeyEndpoint); provider.KeyEndpoint == "" {
|
|
|
|
return nil, caos_errs.ThrowInvalidArgument(nil, "INST-SJk2d", "Errors.Invalid.Argument")
|
|
|
|
}
|
|
|
|
if provider.HeaderName = strings.TrimSpace(provider.HeaderName); provider.HeaderName == "" {
|
|
|
|
return nil, caos_errs.ThrowInvalidArgument(nil, "INST-SJK2f", "Errors.Invalid.Argument")
|
|
|
|
}
|
|
|
|
return func(ctx context.Context, filter preparation.FilterToQueryReducer) ([]eventstore.Command, error) {
|
|
|
|
events, err := filter(ctx, writeModel.Query())
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
writeModel.AppendEvents(events...)
|
|
|
|
if err = writeModel.Reduce(); err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
if !writeModel.State.Exists() {
|
|
|
|
return nil, caos_errs.ThrowNotFound(nil, "INST-Bhju5", "Errors.Instance.IDPConfig.NotExisting")
|
|
|
|
}
|
|
|
|
event, err := writeModel.NewChangedEvent(
|
|
|
|
ctx,
|
|
|
|
&a.Aggregate,
|
|
|
|
writeModel.ID,
|
|
|
|
provider.Name,
|
|
|
|
provider.Issuer,
|
|
|
|
provider.JWTEndpoint,
|
|
|
|
provider.KeyEndpoint,
|
|
|
|
provider.HeaderName,
|
|
|
|
provider.IDPOptions,
|
|
|
|
)
|
|
|
|
if err != nil || event == nil {
|
|
|
|
return nil, err
|
2023-02-24 14:16:06 +00:00
|
|
|
}
|
|
|
|
return []eventstore.Command{event}, nil
|
|
|
|
}, nil
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func (c *Commands) prepareAddInstanceGoogleProvider(a *instance.Aggregate, writeModel *InstanceGoogleIDPWriteModel, provider GoogleProvider) preparation.Validation {
|
2023-02-21 17:18:28 +00:00
|
|
|
return func() (preparation.CreateCommands, error) {
|
|
|
|
if provider.ClientID = strings.TrimSpace(provider.ClientID); provider.ClientID == "" {
|
|
|
|
return nil, caos_errs.ThrowInvalidArgument(nil, "INST-D3fvs", "Errors.Invalid.Argument")
|
|
|
|
}
|
|
|
|
if provider.ClientSecret = strings.TrimSpace(provider.ClientSecret); provider.ClientSecret == "" {
|
|
|
|
return nil, caos_errs.ThrowInvalidArgument(nil, "INST-W2vqs", "Errors.Invalid.Argument")
|
|
|
|
}
|
|
|
|
return func(ctx context.Context, filter preparation.FilterToQueryReducer) ([]eventstore.Command, error) {
|
|
|
|
events, err := filter(ctx, writeModel.Query())
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
writeModel.AppendEvents(events...)
|
|
|
|
if err = writeModel.Reduce(); err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
secret, err := crypto.Encrypt([]byte(provider.ClientSecret), c.idpConfigEncryption)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
return []eventstore.Command{
|
|
|
|
instance.NewGoogleIDPAddedEvent(
|
|
|
|
ctx,
|
|
|
|
&a.Aggregate,
|
2023-02-24 14:16:06 +00:00
|
|
|
writeModel.ID,
|
2023-02-21 17:18:28 +00:00
|
|
|
provider.Name,
|
|
|
|
provider.ClientID,
|
|
|
|
secret,
|
|
|
|
provider.Scopes,
|
|
|
|
provider.IDPOptions,
|
|
|
|
),
|
|
|
|
}, nil
|
|
|
|
}, nil
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-02-24 14:16:06 +00:00
|
|
|
func (c *Commands) prepareUpdateInstanceGoogleProvider(a *instance.Aggregate, writeModel *InstanceGoogleIDPWriteModel, provider GoogleProvider) preparation.Validation {
|
2023-02-21 17:18:28 +00:00
|
|
|
return func() (preparation.CreateCommands, error) {
|
2023-02-24 14:16:06 +00:00
|
|
|
if writeModel.ID = strings.TrimSpace(writeModel.ID); writeModel.ID == "" {
|
2023-02-21 17:18:28 +00:00
|
|
|
return nil, caos_errs.ThrowInvalidArgument(nil, "INST-S32t1", "Errors.Invalid.Argument")
|
|
|
|
}
|
|
|
|
if provider.ClientID = strings.TrimSpace(provider.ClientID); provider.ClientID == "" {
|
|
|
|
return nil, caos_errs.ThrowInvalidArgument(nil, "INST-ds432", "Errors.Invalid.Argument")
|
|
|
|
}
|
|
|
|
return func(ctx context.Context, filter preparation.FilterToQueryReducer) ([]eventstore.Command, error) {
|
|
|
|
events, err := filter(ctx, writeModel.Query())
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
writeModel.AppendEvents(events...)
|
|
|
|
if err = writeModel.Reduce(); err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
if !writeModel.State.Exists() {
|
|
|
|
return nil, caos_errs.ThrowNotFound(nil, "INST-D3r1s", "Errors.Instance.IDPConfig.NotExisting")
|
|
|
|
}
|
|
|
|
event, err := writeModel.NewChangedEvent(
|
|
|
|
ctx,
|
|
|
|
&a.Aggregate,
|
2023-02-24 14:16:06 +00:00
|
|
|
writeModel.ID,
|
2023-02-21 17:18:28 +00:00
|
|
|
provider.Name,
|
|
|
|
provider.ClientID,
|
|
|
|
provider.ClientSecret,
|
|
|
|
c.idpConfigEncryption,
|
|
|
|
provider.Scopes,
|
|
|
|
provider.IDPOptions,
|
|
|
|
)
|
2023-02-27 15:32:18 +00:00
|
|
|
if err != nil || event == nil {
|
2023-02-21 17:18:28 +00:00
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
return []eventstore.Command{event}, nil
|
|
|
|
}, nil
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-02-24 14:16:06 +00:00
|
|
|
func (c *Commands) prepareAddInstanceLDAPProvider(a *instance.Aggregate, writeModel *InstanceLDAPIDPWriteModel, provider LDAPProvider) preparation.Validation {
|
2023-02-15 08:14:59 +00:00
|
|
|
return func() (preparation.CreateCommands, error) {
|
|
|
|
if provider.Name = strings.TrimSpace(provider.Name); provider.Name == "" {
|
|
|
|
return nil, caos_errs.ThrowInvalidArgument(nil, "INST-SAfdd", "Errors.Invalid.Argument")
|
|
|
|
}
|
|
|
|
if provider.Host = strings.TrimSpace(provider.Host); provider.Host == "" {
|
|
|
|
return nil, caos_errs.ThrowInvalidArgument(nil, "INST-SDVg2", "Errors.Invalid.Argument")
|
|
|
|
}
|
|
|
|
if provider.BaseDN = strings.TrimSpace(provider.BaseDN); provider.BaseDN == "" {
|
|
|
|
return nil, caos_errs.ThrowInvalidArgument(nil, "INST-sv31s", "Errors.Invalid.Argument")
|
|
|
|
}
|
|
|
|
if provider.UserObjectClass = strings.TrimSpace(provider.UserObjectClass); provider.UserObjectClass == "" {
|
|
|
|
return nil, caos_errs.ThrowInvalidArgument(nil, "INST-sdgf4", "Errors.Invalid.Argument")
|
|
|
|
}
|
|
|
|
if provider.UserUniqueAttribute = strings.TrimSpace(provider.UserUniqueAttribute); provider.UserUniqueAttribute == "" {
|
|
|
|
return nil, caos_errs.ThrowInvalidArgument(nil, "INST-AEG2w", "Errors.Invalid.Argument")
|
|
|
|
}
|
|
|
|
if provider.Admin = strings.TrimSpace(provider.Admin); provider.Admin == "" {
|
|
|
|
return nil, caos_errs.ThrowInvalidArgument(nil, "INST-SAD5n", "Errors.Invalid.Argument")
|
|
|
|
}
|
|
|
|
if provider.Password = strings.TrimSpace(provider.Password); provider.Password == "" {
|
|
|
|
return nil, caos_errs.ThrowInvalidArgument(nil, "INST-sdf5h", "Errors.Invalid.Argument")
|
|
|
|
}
|
|
|
|
return func(ctx context.Context, filter preparation.FilterToQueryReducer) ([]eventstore.Command, error) {
|
|
|
|
events, err := filter(ctx, writeModel.Query())
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
writeModel.AppendEvents(events...)
|
|
|
|
if err = writeModel.Reduce(); err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
secret, err := crypto.Encrypt([]byte(provider.Password), c.idpConfigEncryption)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
return []eventstore.Command{
|
|
|
|
instance.NewLDAPIDPAddedEvent(
|
|
|
|
ctx,
|
|
|
|
&a.Aggregate,
|
2023-02-24 14:16:06 +00:00
|
|
|
writeModel.ID,
|
2023-02-15 08:14:59 +00:00
|
|
|
provider.Name,
|
|
|
|
provider.Host,
|
|
|
|
provider.Port,
|
|
|
|
provider.TLS,
|
|
|
|
provider.BaseDN,
|
|
|
|
provider.UserObjectClass,
|
|
|
|
provider.UserUniqueAttribute,
|
|
|
|
provider.Admin,
|
|
|
|
secret,
|
|
|
|
provider.LDAPAttributes,
|
|
|
|
provider.IDPOptions,
|
|
|
|
),
|
|
|
|
}, nil
|
|
|
|
}, nil
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-02-24 14:16:06 +00:00
|
|
|
func (c *Commands) prepareUpdateInstanceLDAPProvider(a *instance.Aggregate, writeModel *InstanceLDAPIDPWriteModel, provider LDAPProvider) preparation.Validation {
|
2023-02-15 08:14:59 +00:00
|
|
|
return func() (preparation.CreateCommands, error) {
|
2023-02-24 14:16:06 +00:00
|
|
|
if writeModel.ID = strings.TrimSpace(writeModel.ID); writeModel.ID == "" {
|
2023-02-15 08:14:59 +00:00
|
|
|
return nil, caos_errs.ThrowInvalidArgument(nil, "INST-Dgdbs", "Errors.Invalid.Argument")
|
|
|
|
}
|
|
|
|
if provider.Name = strings.TrimSpace(provider.Name); provider.Name == "" {
|
|
|
|
return nil, caos_errs.ThrowInvalidArgument(nil, "INST-Sffgd", "Errors.Invalid.Argument")
|
|
|
|
}
|
|
|
|
if provider.Host = strings.TrimSpace(provider.Host); provider.Host == "" {
|
|
|
|
return nil, caos_errs.ThrowInvalidArgument(nil, "INST-Dz62d", "Errors.Invalid.Argument")
|
|
|
|
}
|
|
|
|
if provider.BaseDN = strings.TrimSpace(provider.BaseDN); provider.BaseDN == "" {
|
|
|
|
return nil, caos_errs.ThrowInvalidArgument(nil, "INST-vb3ss", "Errors.Invalid.Argument")
|
|
|
|
}
|
|
|
|
if provider.UserObjectClass = strings.TrimSpace(provider.UserObjectClass); provider.UserObjectClass == "" {
|
|
|
|
return nil, caos_errs.ThrowInvalidArgument(nil, "INST-hbere", "Errors.Invalid.Argument")
|
|
|
|
}
|
|
|
|
if provider.UserUniqueAttribute = strings.TrimSpace(provider.UserUniqueAttribute); provider.UserUniqueAttribute == "" {
|
|
|
|
return nil, caos_errs.ThrowInvalidArgument(nil, "INST-ASFt6", "Errors.Invalid.Argument")
|
|
|
|
}
|
|
|
|
if provider.Admin = strings.TrimSpace(provider.Admin); provider.Admin == "" {
|
|
|
|
return nil, caos_errs.ThrowInvalidArgument(nil, "INST-DG45z", "Errors.Invalid.Argument")
|
|
|
|
}
|
|
|
|
return func(ctx context.Context, filter preparation.FilterToQueryReducer) ([]eventstore.Command, error) {
|
|
|
|
events, err := filter(ctx, writeModel.Query())
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
writeModel.AppendEvents(events...)
|
|
|
|
if err = writeModel.Reduce(); err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
if !writeModel.State.Exists() {
|
|
|
|
return nil, caos_errs.ThrowNotFound(nil, "INST-ASF3F", "Errors.Instance.IDPConfig.NotExisting")
|
|
|
|
}
|
|
|
|
event, err := writeModel.NewChangedEvent(
|
|
|
|
ctx,
|
|
|
|
&a.Aggregate,
|
2023-02-24 14:16:06 +00:00
|
|
|
writeModel.ID,
|
2023-02-15 08:14:59 +00:00
|
|
|
writeModel.Name,
|
|
|
|
provider.Name,
|
|
|
|
provider.Host,
|
|
|
|
provider.Port,
|
|
|
|
provider.TLS,
|
|
|
|
provider.BaseDN,
|
|
|
|
provider.UserObjectClass,
|
|
|
|
provider.UserUniqueAttribute,
|
|
|
|
provider.Admin,
|
|
|
|
provider.Password,
|
|
|
|
c.idpConfigEncryption,
|
|
|
|
provider.LDAPAttributes,
|
|
|
|
provider.IDPOptions,
|
|
|
|
)
|
2023-02-27 15:32:18 +00:00
|
|
|
if err != nil || event == nil {
|
2023-02-15 08:14:59 +00:00
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
return []eventstore.Command{event}, nil
|
|
|
|
}, nil
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func (c *Commands) prepareDeleteInstanceProvider(a *instance.Aggregate, id string) preparation.Validation {
|
|
|
|
return func() (preparation.CreateCommands, error) {
|
|
|
|
return func(ctx context.Context, filter preparation.FilterToQueryReducer) ([]eventstore.Command, error) {
|
|
|
|
writeModel := NewInstanceIDPRemoveWriteModel(a.InstanceID, id)
|
|
|
|
events, err := filter(ctx, writeModel.Query())
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
writeModel.AppendEvents(events...)
|
|
|
|
if err = writeModel.Reduce(); err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
if !writeModel.State.Exists() {
|
|
|
|
return nil, caos_errs.ThrowNotFound(nil, "INST-Se3tg", "Errors.Instance.IDPConfig.NotExisting")
|
|
|
|
}
|
2023-02-27 15:32:18 +00:00
|
|
|
return []eventstore.Command{instance.NewIDPRemovedEvent(ctx, &a.Aggregate, id)}, nil
|
2023-02-15 08:14:59 +00:00
|
|
|
}, nil
|
|
|
|
}
|
|
|
|
}
|