Merge remote-tracking branch 'origin/master' into new-eventstore

This commit is contained in:
adlerhurst
2020-11-26 13:14:12 +01:00
204 changed files with 3743 additions and 2134 deletions

View File

@@ -221,6 +221,11 @@ func (s *Server) GetUserMfas(ctx context.Context, userID *management.UserID) (*m
return &management.UserMultiFactors{Mfas: mfasFromModel(mfas)}, nil
}
func (s *Server) RemoveMfaOTP(ctx context.Context, userID *management.UserID) (*empty.Empty, error) {
err := s.user.RemoveOTP(ctx, userID.Id)
return &empty.Empty{}, err
}
func (s *Server) SearchUserMemberships(ctx context.Context, in *management.UserMembershipSearchRequest) (*management.UserMembershipSearchResponse, error) {
request := userMembershipSearchRequestsToModel(in)
request.AppendUserIDQuery(in.UserId)

View File

@@ -223,6 +223,10 @@ func (repo *UserRepo) UserMfas(ctx context.Context, userID string) ([]*usr_model
return []*usr_model.MultiFactor{{Type: usr_model.MfaTypeOTP, State: user.OTPState}}, nil
}
func (repo *UserRepo) RemoveOTP(ctx context.Context, userID string) error {
return repo.UserEvents.RemoveOTP(ctx, userID)
}
func (repo *UserRepo) SetOneTimePassword(ctx context.Context, password *usr_model.Password) (*usr_model.Password, error) {
policy, err := repo.View.PasswordComplexityPolicyByAggregateID(authz.GetCtxData(ctx).OrgID)
if err != nil && caos_errs.IsNotFound(err) {

View File

@@ -31,6 +31,7 @@ type UserRepository interface {
ChangeProfile(ctx context.Context, profile *model.Profile) (*model.Profile, error)
UserMfas(ctx context.Context, userID string) ([]*model.MultiFactor, error)
RemoveOTP(ctx context.Context, userID string) error
SearchExternalIDPs(ctx context.Context, request *model.ExternalIDPSearchRequest) (*model.ExternalIDPSearchResponse, error)
RemoveExternalIDP(ctx context.Context, externalIDP *model.ExternalIDP) error

View File

@@ -85,13 +85,13 @@ func (o *Org) GetPrimaryDomain() *OrgDomain {
return nil
}
func (o *Org) ContainsMember(userID string) bool {
for _, member := range o.Members {
func (o *Org) MemeberByUserID(userID string) (*OrgMember, int) {
for i, member := range o.Members {
if member.UserID == userID {
return true
return member, i
}
}
return false
return nil, -1
}
func (o *Org) nameForDomain(iamDomain string) string {

View File

@@ -429,16 +429,20 @@ func (es *OrgEventstore) ChangeOrgMember(ctx context.Context, member *org_model.
return nil, errors.ThrowPreconditionFailed(nil, "EVENT-ara6l", "Errors.Org.InvalidMember")
}
existingMember, err := es.OrgMemberByIDs(ctx, member)
org, err := es.OrgByID(ctx, &org_model.Org{ObjectRoot: es_models.ObjectRoot{AggregateID: member.AggregateID, Sequence: member.Sequence}})
if err != nil {
return nil, err
}
existingMember, _ := org.MemeberByUserID(member.UserID)
if existingMember == nil {
return nil, errors.ThrowNotFound(nil, "EVENT-VB2Pn", "Errors.Org.MemberNotExisting")
}
member.ObjectRoot = existingMember.ObjectRoot
repoOrg := model.OrgFromModel(org)
repoMember := model.OrgMemberFromModel(member)
repoExistingMember := model.OrgMemberFromModel(existingMember)
orgAggregate := orgMemberChangedAggregate(es.Eventstore.AggregateCreator(), repoExistingMember, repoMember)
orgAggregate := orgMemberChangedAggregate(es.Eventstore.AggregateCreator(), repoOrg, repoExistingMember, repoMember)
err = es_sdk.Push(ctx, es.PushAggregates, repoMember.AppendEvents, orgAggregate)
if err != nil {
return nil, err
@@ -452,18 +456,19 @@ func (es *OrgEventstore) RemoveOrgMember(ctx context.Context, member *org_model.
return errors.ThrowInvalidArgument(nil, "EVENT-d43fs", "Errors.Org.UserIDMissing")
}
existingMember, err := es.OrgMemberByIDs(ctx, member)
if errors.IsNotFound(err) {
return nil
}
org, err := es.OrgByID(ctx, &org_model.Org{ObjectRoot: es_models.ObjectRoot{AggregateID: member.AggregateID, Sequence: member.Sequence}})
if err != nil {
return err
}
existingMember, _ := org.MemeberByUserID(member.UserID)
if existingMember == nil {
return nil
}
member.ObjectRoot = existingMember.ObjectRoot
repoOrg := model.OrgFromModel(org)
repoMember := model.OrgMemberFromModel(member)
orgAggregate := orgMemberRemovedAggregate(es.Eventstore.AggregateCreator(), repoMember)
orgAggregate := orgMemberRemovedAggregate(es.Eventstore.AggregateCreator(), repoOrg, repoMember)
return es_sdk.Push(ctx, es.PushAggregates, repoMember.AppendEvents, orgAggregate)
}

View File

@@ -2,6 +2,7 @@ package eventsourcing
import (
"context"
"github.com/caos/zitadel/internal/org/repository/eventsourcing/model"
"github.com/caos/zitadel/internal/errors"
@@ -31,9 +32,9 @@ func orgMemberAddedAggregate(ctx context.Context, aggCreator *es_models.Aggregat
return agg.SetPrecondition(validationQuery, validation).AppendEvent(model.OrgMemberAdded, member)
}
func orgMemberChangedAggregate(aggCreator *es_models.AggregateCreator, existingMember *model.OrgMember, member *model.OrgMember) func(ctx context.Context) (*es_models.Aggregate, error) {
func orgMemberChangedAggregate(aggCreator *es_models.AggregateCreator, org *model.Org, existingMember, member *model.OrgMember) func(ctx context.Context) (*es_models.Aggregate, error) {
return func(ctx context.Context) (*es_models.Aggregate, error) {
if member == nil || existingMember == nil {
if member == nil || org == nil || existingMember == nil {
return nil, errors.ThrowPreconditionFailed(nil, "EVENT-d34fs", "Errors.Internal")
}
@@ -42,7 +43,7 @@ func orgMemberChangedAggregate(aggCreator *es_models.AggregateCreator, existingM
return nil, errors.ThrowInvalidArgument(nil, "EVENT-VLMGn", "Errors.NoChangesFound")
}
agg, err := OrgAggregate(ctx, aggCreator, existingMember.AggregateID, existingMember.Sequence)
agg, err := OrgAggregate(ctx, aggCreator, org.AggregateID, org.Sequence)
if err != nil {
return nil, err
}
@@ -50,13 +51,13 @@ func orgMemberChangedAggregate(aggCreator *es_models.AggregateCreator, existingM
}
}
func orgMemberRemovedAggregate(aggCreator *es_models.AggregateCreator, member *model.OrgMember) func(ctx context.Context) (*es_models.Aggregate, error) {
func orgMemberRemovedAggregate(aggCreator *es_models.AggregateCreator, org *model.Org, member *model.OrgMember) func(ctx context.Context) (*es_models.Aggregate, error) {
return func(ctx context.Context) (*es_models.Aggregate, error) {
if member == nil {
return nil, errors.ThrowPreconditionFailed(nil, "EVENT-dieu7", "member must not be nil")
return nil, errors.ThrowPreconditionFailed(nil, "EVENT-vNPVX", "Errors.Internal")
}
agg, err := OrgAggregate(ctx, aggCreator, member.AggregateID, member.Sequence)
agg, err := OrgAggregate(ctx, aggCreator, org.AggregateID, org.Sequence)
if err != nil {
return nil, err
}

View File

@@ -78,6 +78,7 @@ func TestOrgMemberChangedAggregate(t *testing.T) {
}
type args struct {
aggCreator *es_models.AggregateCreator
org *model.Org
existingMember *model.OrgMember
member *model.OrgMember
ctx context.Context
@@ -92,6 +93,7 @@ func TestOrgMemberChangedAggregate(t *testing.T) {
args: args{
aggCreator: es_models.NewAggregateCreator("test"),
ctx: authz.NewMockContext("org", "user"),
org: &model.Org{},
member: nil,
existingMember: &model.OrgMember{},
},
@@ -104,6 +106,7 @@ func TestOrgMemberChangedAggregate(t *testing.T) {
args: args{
aggCreator: es_models.NewAggregateCreator("test"),
ctx: authz.NewMockContext("org", "user"),
org: &model.Org{},
existingMember: nil,
member: &model.OrgMember{},
},
@@ -122,6 +125,7 @@ func TestOrgMemberChangedAggregate(t *testing.T) {
existingMember: &model.OrgMember{
ObjectRoot: es_models.ObjectRoot{AggregateID: "asdf", Sequence: 234},
},
org: &model.Org{},
},
res: res{
isErr: errors.IsErrorInvalidArgument,
@@ -140,6 +144,9 @@ func TestOrgMemberChangedAggregate(t *testing.T) {
ObjectRoot: es_models.ObjectRoot{AggregateID: "asdf", Sequence: 234},
Roles: []string{"asdf", "woeri"},
},
org: &model.Org{
ObjectRoot: es_models.ObjectRoot{AggregateID: "asdf", Sequence: 234},
},
},
res: res{
isErr: nil,
@@ -149,7 +156,7 @@ func TestOrgMemberChangedAggregate(t *testing.T) {
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
aggregateCreator := orgMemberChangedAggregate(tt.args.aggCreator, tt.args.existingMember, tt.args.member)
aggregateCreator := orgMemberChangedAggregate(tt.args.aggCreator, tt.args.org, tt.args.existingMember, tt.args.member)
aggregate, err := aggregateCreator(tt.args.ctx)
if tt.res.isErr == nil && err != nil {
t.Errorf("no error expected got: %v", err)
@@ -174,6 +181,7 @@ func TestOrgMemberRemovedAggregate(t *testing.T) {
}
type args struct {
aggCreator *es_models.AggregateCreator
org *model.Org
member *model.OrgMember
ctx context.Context
}
@@ -187,6 +195,7 @@ func TestOrgMemberRemovedAggregate(t *testing.T) {
args: args{
aggCreator: es_models.NewAggregateCreator("test"),
ctx: authz.NewMockContext("org", "user"),
org: &model.Org{},
member: nil,
},
res: res{
@@ -198,6 +207,9 @@ func TestOrgMemberRemovedAggregate(t *testing.T) {
args: args{
aggCreator: es_models.NewAggregateCreator("test"),
ctx: authz.NewMockContext("org", "user"),
org: &model.Org{
ObjectRoot: es_models.ObjectRoot{AggregateID: "asdf", Sequence: 234},
},
member: &model.OrgMember{
ObjectRoot: es_models.ObjectRoot{AggregateID: "asdf", Sequence: 234},
},
@@ -210,7 +222,7 @@ func TestOrgMemberRemovedAggregate(t *testing.T) {
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
aggregateCreator := orgMemberRemovedAggregate(tt.args.aggCreator, tt.args.member)
aggregateCreator := orgMemberRemovedAggregate(tt.args.aggCreator, tt.args.org, tt.args.member)
aggregate, err := aggregateCreator(tt.args.ctx)
if tt.res.isErr == nil && err != nil {
t.Errorf("no error expected got: %v", err)

View File

@@ -294,6 +294,7 @@ EventTypes:
code:
added: Telefon Code hinzugefügt
sent: Telefon Code versendet
removed: Telefonnummer gelöscht
profile:
changed: Benutzerprofil geändert
address:

View File

@@ -282,6 +282,7 @@ EventTypes:
code:
added: Phone number code generated
sent: Phone number code sent
removed: Phone number removed
profile:
changed: User profile changed
address:

View File

@@ -86,11 +86,18 @@ func (key *MachineKey) AppendEvents(events ...*es_models.Event) error {
return nil
}
func (key *MachineKey) AppendEvent(event *es_models.Event) error {
func (key *MachineKey) AppendEvent(event *es_models.Event) (err error) {
key.ObjectRoot.AppendEvent(event)
switch event.Type {
case MachineKeyAdded:
err = json.Unmarshal(event.Data, key)
if err != nil {
return errors.ThrowInternal(err, "MODEL-SjI4S", "Errors.Internal")
}
case MachineKeyRemoved:
key.ExpirationDate = event.CreationDate
}
return nil
return err
}
func MachineKeyFromModel(machine *model.MachineKey) *MachineKey {