feat: multiple domains (#188)

* check uniqueness on create and register user

* change user email, reserve release unique email

* usergrant unique aggregate

* usergrant uniqueness

* validate UserGrant

* fix tests

* domain is set on username in all orgs

* domain in admin

* org domain sql

* zitadel domain org name

* org domains

* org iam policy

* default org iam policy

* SETUP

* load login names

* login by login name

* login name

* fix: merge master

* fix: merge master

* Update internal/user/repository/eventsourcing/user.go

Co-authored-by: Livio Amstutz <livio.a@gmail.com>

* fix: fix unique domains

* fix: rename env variable

Co-authored-by: adlerhurst <silvan.reusser@gmail.com>
Co-authored-by: Livio Amstutz <livio.a@gmail.com>
This commit is contained in:
Fabi
2020-06-16 11:40:18 +02:00
committed by GitHub
parent 64b14b4e19
commit 7a6ca24625
109 changed files with 12578 additions and 6025 deletions

View File

@@ -43,6 +43,7 @@ func Register(configs Configs, bulkLimit, errorCount uint64, view *view.View, ev
&UserGrant{handler: handler{view, bulkLimit, configs.cycleDuration("UserGrant"), errorCount}, projectEvents: repos.ProjectEvents, userEvents: repos.UserEvents, orgEvents: repos.OrgEvents},
&Org{handler: handler{view, bulkLimit, configs.cycleDuration("Org"), errorCount}},
&OrgMember{handler: handler{view, bulkLimit, configs.cycleDuration("OrgMember"), errorCount}, userEvents: repos.UserEvents},
&OrgDomain{handler: handler{view, bulkLimit, configs.cycleDuration("OrgDomain"), errorCount}},
}
}

View File

@@ -2,13 +2,13 @@ package handler
import (
"github.com/caos/zitadel/internal/org/repository/eventsourcing/model"
org_model "github.com/caos/zitadel/internal/org/repository/view/model"
"time"
"github.com/caos/logging"
es_models "github.com/caos/zitadel/internal/eventstore/models"
"github.com/caos/zitadel/internal/eventstore/spooler"
"github.com/caos/zitadel/internal/org/repository/eventsourcing"
"github.com/caos/zitadel/internal/org/repository/view"
)
type Org struct {
@@ -34,7 +34,7 @@ func (o *Org) EventQuery() (*es_models.SearchQuery, error) {
}
func (o *Org) Process(event *es_models.Event) error {
org := new(view.OrgView)
org := new(org_model.OrgView)
switch event.Type {
case model.OrgAdded:

View File

@@ -0,0 +1,100 @@
package handler
import (
"github.com/caos/zitadel/internal/org/repository/eventsourcing/model"
org_model "github.com/caos/zitadel/internal/org/repository/view/model"
"time"
"github.com/caos/logging"
"github.com/caos/zitadel/internal/eventstore/models"
es_models "github.com/caos/zitadel/internal/eventstore/models"
"github.com/caos/zitadel/internal/eventstore/spooler"
)
type OrgDomain struct {
handler
}
const (
orgDomainTable = "management.org_domains"
)
func (d *OrgDomain) MinimumCycleDuration() time.Duration { return d.cycleDuration }
func (d *OrgDomain) ViewModel() string {
return orgDomainTable
}
func (d *OrgDomain) EventQuery() (*models.SearchQuery, error) {
sequence, err := d.view.GetLatestOrgDomainSequence()
if err != nil {
return nil, err
}
return es_models.NewSearchQuery().
AggregateTypeFilter(model.OrgAggregate).
LatestSequenceFilter(sequence), nil
}
func (d *OrgDomain) Process(event *models.Event) (err error) {
switch event.AggregateType {
case model.OrgAggregate:
err = d.processOrgDomain(event)
}
return err
}
func (d *OrgDomain) processOrgDomain(event *models.Event) (err error) {
domain := new(org_model.OrgDomainView)
switch event.Type {
case model.OrgDomainAdded:
domain.AppendEvent(event)
case model.OrgDomainVerified:
err = domain.SetData(event)
if err != nil {
return err
}
domain, err = d.view.OrgDomainByOrgIDAndDomain(event.AggregateID, domain.Domain)
if err != nil {
return err
}
domain.AppendEvent(event)
case model.OrgDomainPrimarySet:
err = domain.SetData(event)
if err != nil {
return err
}
domain, err = d.view.OrgDomainByOrgIDAndDomain(event.AggregateID, domain.Domain)
if err != nil {
return err
}
existingDomains, err := d.view.OrgDomainsByOrgID(event.AggregateID)
if err != nil {
return err
}
for _, existing := range existingDomains {
existing.Primary = false
err := d.view.PutOrgDomain(existing, 0)
if err != nil {
return err
}
}
domain.AppendEvent(event)
case model.OrgDomainRemoved:
err = domain.SetData(event)
if err != nil {
return err
}
return d.view.DeleteOrgDomain(domain.Domain, event.Sequence)
default:
return d.view.ProcessedOrgDomainSequence(event.Sequence)
}
if err != nil {
return err
}
return d.view.PutOrgDomain(domain, domain.Sequence)
}
func (d *OrgDomain) OnError(event *models.Event, err error) error {
logging.LogWithFields("SPOOL-us4sj", "id", event.AggregateID).WithError(err).Warn("something went wrong in orgdomain handler")
return spooler.HandleError(event, err, d.view.GetLatestOrgDomainFailedEvent, d.view.ProcessedOrgDomainFailedEvent, d.view.ProcessedOrgDomainSequence, d.errorCountUntilSkip)
}

View File

@@ -3,13 +3,13 @@ package handler
import (
"context"
"github.com/caos/zitadel/internal/org/repository/eventsourcing/model"
org_model "github.com/caos/zitadel/internal/org/repository/view/model"
"time"
"github.com/caos/logging"
"github.com/caos/zitadel/internal/eventstore/models"
es_models "github.com/caos/zitadel/internal/eventstore/models"
"github.com/caos/zitadel/internal/eventstore/spooler"
view_model "github.com/caos/zitadel/internal/org/repository/view"
usr_model "github.com/caos/zitadel/internal/user/model"
usr_event "github.com/caos/zitadel/internal/user/repository/eventsourcing"
usr_es_model "github.com/caos/zitadel/internal/user/repository/eventsourcing/model"
@@ -51,7 +51,7 @@ func (m *OrgMember) Process(event *models.Event) (err error) {
}
func (m *OrgMember) processOrgMember(event *models.Event) (err error) {
member := new(view_model.OrgMemberView)
member := new(org_model.OrgMemberView)
switch event.Type {
case model.OrgMemberAdded:
member.AppendEvent(event)
@@ -106,7 +106,7 @@ func (m *OrgMember) processUser(event *models.Event) (err error) {
return nil
}
func (m *OrgMember) fillData(member *view_model.OrgMemberView) (err error) {
func (m *OrgMember) fillData(member *org_model.OrgMemberView) (err error) {
user, err := m.userEvents.UserByID(context.Background(), member.UserID)
if err != nil {
return err
@@ -115,7 +115,7 @@ func (m *OrgMember) fillData(member *view_model.OrgMemberView) (err error) {
return nil
}
func (m *OrgMember) fillUserData(member *view_model.OrgMemberView, user *usr_model.User) {
func (m *OrgMember) fillUserData(member *org_model.OrgMemberView, user *usr_model.User) {
member.UserName = user.UserName
member.FirstName = user.FirstName
member.LastName = user.LastName

View File

@@ -95,7 +95,6 @@ func (p *ProjectGrant) Process(event *models.Event) (err error) {
}
func (p *ProjectGrant) fillOrgData(grantedProject *view_model.ProjectGrantView, org *org_model.Org) {
grantedProject.OrgDomain = org.Domain
grantedProject.OrgName = org.Name
}

View File

@@ -169,7 +169,6 @@ func (u *UserGrant) fillProjectData(grant *view_model.UserGrantView, project *pr
}
func (u *UserGrant) fillOrgData(grant *view_model.UserGrantView, org *org_model.Org) {
grant.OrgDomain = org.Domain
grant.OrgName = org.Name
}