feat: register org process (#558)

* feat: register new organisation

* feat: create org request in management

* fix: tests

* Update internal/ui/login/static/i18n/en.yaml

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

* Update internal/ui/login/static/i18n/de.yaml

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

* Update internal/ui/login/static/templates/register_org.html

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

* Update internal/ui/login/handler/register_org_handler.go

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

* Update internal/ui/login/handler/register_org_handler.go

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

* fix: remove autocomplete

* fix: regenerate proto

Co-authored-by: Livio Amstutz <livio.a@gmail.com>
This commit is contained in:
Fabi
2020-08-06 14:38:19 +02:00
committed by GitHub
parent 41fa434439
commit f80367b49a
42 changed files with 15492 additions and 7875 deletions

View File

@@ -9,6 +9,14 @@ import (
"github.com/caos/zitadel/pkg/grpc/management"
)
func (s *Server) CreateOrg(ctx context.Context, request *management.OrgCreateRequest) (_ *management.Org, err error) {
org, err := s.org.CreateOrg(ctx, request.Name)
if err != nil {
return nil, err
}
return orgFromModel(org), err
}
func (s *Server) GetMyOrg(ctx context.Context, _ *empty.Empty) (*management.OrgView, error) {
org, err := s.org.OrgByID(ctx, authz.GetCtxData(ctx).OrgID)
if err != nil {

View File

@@ -0,0 +1,11 @@
package model
import (
org_model "github.com/caos/zitadel/internal/org/model"
usr_model "github.com/caos/zitadel/internal/user/model"
)
type RegisterOrg struct {
*org_model.Org
*usr_model.User
}

View File

@@ -3,15 +3,27 @@ package eventstore
import (
"context"
"github.com/caos/logging"
auth_model "github.com/caos/zitadel/internal/auth/model"
auth_view "github.com/caos/zitadel/internal/auth/repository/eventsourcing/view"
"github.com/caos/zitadel/internal/eventstore/sdk"
org_model "github.com/caos/zitadel/internal/org/model"
org_es "github.com/caos/zitadel/internal/org/repository/eventsourcing"
"github.com/caos/zitadel/internal/org/repository/view/model"
policy_model "github.com/caos/zitadel/internal/policy/model"
policy_es "github.com/caos/zitadel/internal/policy/repository/eventsourcing"
usr_es "github.com/caos/zitadel/internal/user/repository/eventsourcing"
)
const (
orgOwnerRole = "ORG_OWNER"
)
type OrgRepository struct {
SearchLimit uint64
*org_es.OrgEventstore
SearchLimit uint64
OrgEventstore *org_es.OrgEventstore
UserEventstore *usr_es.UserEventstore
PolicyEventstore *policy_es.PolicyEventstore
View *auth_view.View
}
@@ -35,3 +47,43 @@ func (repo *OrgRepository) SearchOrgs(ctx context.Context, request *org_model.Or
}
return result, nil
}
func (repo *OrgRepository) RegisterOrg(ctx context.Context, register *auth_model.RegisterOrg) (*auth_model.RegisterOrg, error) {
pwPolicy, err := repo.PolicyEventstore.GetPasswordComplexityPolicy(ctx, policy_model.DefaultPolicy)
if err != nil {
return nil, err
}
orgPolicy, err := repo.OrgEventstore.GetOrgIamPolicy(ctx, policy_model.DefaultPolicy)
if err != nil {
return nil, err
}
org, aggregates, err := repo.OrgEventstore.PrepareCreateOrg(ctx, register.Org)
if err != nil {
return nil, err
}
user, userAggregates, err := repo.UserEventstore.PrepareRegisterUser(ctx, register.User, pwPolicy, orgPolicy, org.AggregateID)
if err != nil {
return nil, err
}
aggregates = append(aggregates, userAggregates...)
registerModel := &Register{Org: org, User: user}
member := org_model.NewOrgMemberWithRoles(org.AggregateID, user.AggregateID, orgOwnerRole)
_, memberAggregate, err := repo.OrgEventstore.PrepareAddOrgMember(ctx, member, org.AggregateID)
if err != nil {
return nil, err
}
aggregates = append(aggregates, memberAggregate)
err = sdk.PushAggregates(ctx, repo.OrgEventstore.PushAggregates, registerModel.AppendEvents, aggregates...)
if err != nil {
return nil, err
}
return RegisterToModel(registerModel), nil
}
func (repo *OrgRepository) GetOrgIamPolicy(ctx context.Context, orgID string) (*org_model.OrgIamPolicy, error) {
return repo.OrgEventstore.GetOrgIamPolicy(ctx, policy_model.DefaultPolicy)
}

View File

@@ -0,0 +1,36 @@
package eventstore
import (
auth_model "github.com/caos/zitadel/internal/auth/model"
es_models "github.com/caos/zitadel/internal/eventstore/models"
"github.com/caos/zitadel/internal/org/repository/eventsourcing/model"
usr_es "github.com/caos/zitadel/internal/user/repository/eventsourcing/model"
)
type Register struct {
*model.Org
*usr_es.User
}
func (r *Register) AppendEvents(events ...*es_models.Event) error {
for _, event := range events {
var err error
switch event.AggregateType {
case model.OrgAggregate:
err = r.Org.AppendEvent(event)
case usr_es.UserAggregate:
err = r.User.AppendEvent(event)
}
if err != nil {
return err
}
}
return nil
}
func RegisterToModel(register *Register) *auth_model.RegisterOrg {
return &auth_model.RegisterOrg{
Org: model.OrgToModel(register.Org),
User: usr_es.UserToModel(register.User),
}
}

View File

@@ -26,6 +26,7 @@ import (
type Config struct {
SearchLimit uint64
Domain string
Eventstore es_int.Config
AuthRequest cache.Config
View types.SQL
@@ -118,7 +119,7 @@ func Start(conf Config, authZ authz.Config, systemDefaults sd.SystemDefaults, au
if err != nil {
return nil, err
}
org := es_org.StartOrg(es_org.OrgConfig{Eventstore: es}, systemDefaults)
org := es_org.StartOrg(es_org.OrgConfig{Eventstore: es, IAMDomain: conf.Domain}, systemDefaults)
repos := handler.EventstoreRepos{UserEvents: user, ProjectEvents: project, OrgEvents: org, IamEvents: iam}
spool := spooler.StartSpooler(conf.Spooler, es, view, sqlClient, repos, systemDefaults)
@@ -167,8 +168,11 @@ func Start(conf Config, authZ authz.Config, systemDefaults sd.SystemDefaults, au
AuthZRepo: authZRepo,
},
eventstore.OrgRepository{
SearchLimit: conf.SearchLimit,
View: view,
SearchLimit: conf.SearchLimit,
View: view,
OrgEventstore: org,
PolicyEventstore: policy,
UserEventstore: user,
},
eventstore.IamRepository{
IamEvents: iam,

View File

@@ -0,0 +1,12 @@
package repository
import (
"context"
auth_model "github.com/caos/zitadel/internal/auth/model"
org_model "github.com/caos/zitadel/internal/org/model"
)
type OrgRepository interface {
RegisterOrg(context.Context, *auth_model.RegisterOrg) (*auth_model.RegisterOrg, error)
GetOrgIamPolicy(ctx context.Context, orgID string) (*org_model.OrgIamPolicy, error)
}

View File

@@ -14,4 +14,5 @@ type Repository interface {
UserSessionRepository
UserGrantRepository
PolicyRepository
OrgRepository
}

View File

@@ -3,6 +3,8 @@ package eventstore
import (
"context"
"github.com/caos/logging"
"github.com/caos/zitadel/internal/eventstore/sdk"
org_es_model "github.com/caos/zitadel/internal/org/repository/eventsourcing/model"
"strings"
"github.com/caos/zitadel/internal/api/authz"
@@ -15,6 +17,10 @@ import (
usr_es "github.com/caos/zitadel/internal/user/repository/eventsourcing"
)
const (
orgOwnerRole = "ORG_OWNER"
)
type OrgRepository struct {
SearchLimit uint64
*org_es.OrgEventstore
@@ -39,6 +45,27 @@ func (repo *OrgRepository) OrgByDomainGlobal(ctx context.Context, domain string)
return repo.OrgByID(ctx, verifiedDomain.OrgID)
}
func (repo *OrgRepository) CreateOrg(ctx context.Context, name string) (*org_model.Org, error) {
org, aggregates, err := repo.OrgEventstore.PrepareCreateOrg(ctx, &org_model.Org{Name: name})
if err != nil {
return nil, err
}
member := org_model.NewOrgMemberWithRoles(org.AggregateID, authz.GetCtxData(ctx).UserID, orgOwnerRole)
_, memberAggregate, err := repo.OrgEventstore.PrepareAddOrgMember(ctx, member, org.AggregateID)
if err != nil {
return nil, err
}
aggregates = append(aggregates, memberAggregate)
err = sdk.PushAggregates(ctx, repo.Eventstore.PushAggregates, org.AppendEvents, aggregates...)
if err != nil {
return nil, err
}
return org_es_model.OrgToModel(org), nil
}
func (repo *OrgRepository) UpdateOrg(ctx context.Context, org *org_model.Org) (*org_model.Org, error) {
return nil, errors.ThrowUnimplemented(nil, "EVENT-RkurR", "not implemented")
}

View File

@@ -9,6 +9,7 @@ import (
type OrgRepository interface {
OrgByID(ctx context.Context, id string) (*org_model.OrgView, error)
OrgByDomainGlobal(ctx context.Context, domain string) (*org_model.OrgView, error)
CreateOrg(ctx context.Context, name string) (*org_model.Org, error)
UpdateOrg(ctx context.Context, org *org_model.Org) (*org_model.Org, error)
DeactivateOrg(ctx context.Context, id string) (*org_model.Org, error)
ReactivateOrg(ctx context.Context, id string) (*org_model.Org, error)

View File

@@ -11,6 +11,7 @@ type OrgIamPolicy struct {
State PolicyState
UserLoginMustBeDomain bool
Default bool
IamDomain string
}
type PolicyState int32

View File

@@ -32,6 +32,7 @@ type OrgConfig struct {
func StartOrg(conf OrgConfig, defaults systemdefaults.SystemDefaults) *OrgEventstore {
policy := defaults.DefaultPolicies.OrgIam
policy.Default = true
policy.IamDomain = conf.IAMDomain
return &OrgEventstore{
Eventstore: conf.Eventstore,
idGenerator: id.SonyFlakeGenerator,

View File

@@ -0,0 +1,10 @@
package handler
import (
org_model "github.com/caos/zitadel/internal/org/model"
"net/http"
)
func (l *Login) getOrgIamPolicy(r *http.Request, orgID string) (*org_model.OrgIamPolicy, error) {
return l.authRepo.GetOrgIamPolicy(r.Context(), orgID)
}

View File

@@ -0,0 +1,143 @@
package handler
import (
auth_model "github.com/caos/zitadel/internal/auth/model"
"net/http"
"github.com/caos/zitadel/internal/auth_request/model"
caos_errs "github.com/caos/zitadel/internal/errors"
org_model "github.com/caos/zitadel/internal/org/model"
usr_model "github.com/caos/zitadel/internal/user/model"
)
const (
tmplRegisterOrg = "registerorg"
)
type registerOrgFormData struct {
OrgName string `schema:"orgname"`
Email string `schema:"email"`
Username string `schema:"username"`
Firstname string `schema:"firstname"`
Lastname string `schema:"lastname"`
Password string `schema:"register-password"`
Password2 string `schema:"register-password-confirmation"`
}
type registerOrgData struct {
baseData
registerOrgFormData
PasswordPolicyDescription string
MinLength uint64
HasUppercase string
HasLowercase string
HasNumber string
HasSymbol string
UserLoginMustBeDomain bool
IamDomain string
}
func (l *Login) handleRegisterOrg(w http.ResponseWriter, r *http.Request) {
data := new(registerOrgFormData)
authRequest, err := l.getAuthRequestAndParseData(r, data)
if err != nil {
l.renderError(w, r, authRequest, err)
return
}
l.renderRegisterOrg(w, r, authRequest, data, nil)
}
func (l *Login) handleRegisterOrgCheck(w http.ResponseWriter, r *http.Request) {
data := new(registerOrgFormData)
authRequest, err := l.getAuthRequestAndParseData(r, data)
if err != nil {
l.renderError(w, r, authRequest, err)
return
}
if data.Password != data.Password2 {
err := caos_errs.ThrowInvalidArgument(nil, "VIEW-KaGue", "Errors.User.Password.ConfirmationWrong")
l.renderRegisterOrg(w, r, authRequest, data, err)
return
}
registerOrg := &auth_model.RegisterOrg{
User: data.toUserModel(),
Org: data.toOrgModel(),
}
user, err := l.authRepo.RegisterOrg(setContext(r.Context(), ""), registerOrg)
if err != nil {
l.renderRegisterOrg(w, r, authRequest, data, err)
return
}
if authRequest == nil {
http.Redirect(w, r, l.zitadelURL, http.StatusFound)
return
}
authRequest.LoginName = user.PreferredLoginName
l.renderNextStep(w, r, authRequest)
}
func (l *Login) renderRegisterOrg(w http.ResponseWriter, r *http.Request, authRequest *model.AuthRequest, formData *registerOrgFormData, err error) {
var errType, errMessage string
if err != nil {
errMessage = l.getErrorMessage(r, err)
}
if formData == nil {
formData = new(registerOrgFormData)
}
data := registerOrgData{
baseData: l.getBaseData(r, authRequest, "Register", errType, errMessage),
registerOrgFormData: *formData,
}
pwPolicy, description, _ := l.getPasswordComplexityPolicy(r, "0")
if pwPolicy != nil {
data.PasswordPolicyDescription = description
data.MinLength = pwPolicy.MinLength
if pwPolicy.HasUppercase {
data.HasUppercase = UpperCaseRegex
}
if pwPolicy.HasLowercase {
data.HasLowercase = LowerCaseRegex
}
if pwPolicy.HasSymbol {
data.HasSymbol = SymbolRegex
}
if pwPolicy.HasNumber {
data.HasNumber = NumberRegex
}
}
orgPolicy, err := l.getOrgIamPolicy(r, "0")
if orgPolicy != nil {
data.UserLoginMustBeDomain = orgPolicy.UserLoginMustBeDomain
data.IamDomain = orgPolicy.IamDomain
}
l.renderer.RenderTemplate(w, r, l.renderer.Templates[tmplRegisterOrg], data, nil)
}
func (d registerOrgFormData) toUserModel() *usr_model.User {
if d.Username == "" {
d.Username = d.Email
}
return &usr_model.User{
Profile: &usr_model.Profile{
UserName: d.Username,
FirstName: d.Firstname,
LastName: d.Lastname,
},
Password: &usr_model.Password{
SecretString: d.Password,
},
Email: &usr_model.Email{
EmailAddress: d.Email,
},
}
}
func (d registerOrgFormData) toOrgModel() *org_model.Org {
return &org_model.Org{
Name: d.OrgName,
}
}

View File

@@ -52,6 +52,7 @@ func CreateRenderer(pathPrefix string, staticDir http.FileSystem, cookieName str
tmplChangePasswordDone: "change_password_done.html",
tmplRegister: "register.html",
tmplLogoutDone: "logout_done.html",
tmplRegisterOrg: "register_org.html",
}
funcs := map[string]interface{}{
"resourceUrl": func(file string) string {
@@ -108,6 +109,9 @@ func CreateRenderer(pathPrefix string, staticDir http.FileSystem, cookieName str
"registrationUrl": func() string {
return path.Join(r.pathPrefix, EndpointRegister)
},
"orgRegistrationUrl": func() string {
return path.Join(r.pathPrefix, EndpointRegisterOrg)
},
"selectedLanguage": func(l string) bool {
return false
},

View File

@@ -24,6 +24,7 @@ const (
EndpointMailVerification = "/mail/verification"
EndpointMailVerified = "/mail/verified"
EndpointRegister = "/register"
EndpointRegisterOrg = "/register/org"
EndpointLogoutDone = "/logout/done"
EndpointResources = "/resources"
@@ -56,5 +57,7 @@ func CreateRouter(login *Login, staticDir http.FileSystem, interceptors ...mux.M
router.HandleFunc(EndpointRegister, login.handleRegisterCheck).Methods(http.MethodPost)
router.HandleFunc(EndpointLogoutDone, login.handleLogoutDone).Methods(http.MethodGet)
router.PathPrefix(EndpointResources).Handler(login.handleResources(staticDir)).Methods(http.MethodGet)
router.HandleFunc(EndpointRegisterOrg, login.handleRegisterOrg).Methods(http.MethodGet)
router.HandleFunc(EndpointRegisterOrg, login.handleRegisterOrgCheck).Methods(http.MethodPost)
return router
}

View File

@@ -110,6 +110,25 @@ Registration:
Password: Passwort
Password2: Passwort wiederholen
RegistrationOrg:
Title: Organisations Registration
Description: Gib deinen Organisationsnamen und deine Benutzerangaben an.
OrgName: Organisationsname
OrgDomain: Domäne
Email: E-Mail
Username: Benutzername
Firstname: Vorname
Lastname: Nachname
Language: Sprache
German: Deutsch
English: English
Gender: Geschlecht
Female: weiblich
Male: männlich
Diverse: diverse
Password: Passwort
Password2: Passwort wiederholen
LogoutDone:
Title: Ausgeloggt
Description: Du wurdest erfolgreich ausgeloggt.
@@ -123,6 +142,7 @@ Actions:
Register: registrieren
ForgotPassword: Password zurücksetzen
Cancel: Abbrechen
Save: speichern
Errors:
Internal: Es ist ein interner Fehler aufgetreten

View File

@@ -110,6 +110,26 @@ Registration:
Password: Password
Password2: Password confirmation
RegistrationOrg:
Title: Organisation Registration
Description: Enter your organisationname and userdata.
OrgName: Organisationname
OrgDomain: Domäne
Email: E-Mail
Username: Username
Firstname: Firstname
Lastname: Lastname
Language: Language
German: Deutsch
English: English
Gender: Gender
Female: Female
Male: Male
Diverse: diverse / X
Password: Password
Password2: Password confirmation
LogoutDone:
Title: Logged out
Description: You have logged out successfully.
@@ -123,6 +143,7 @@ Actions:
Register: register
ForgotPassword: reset password
Cancel: cancel
Save: save
Errors:

View File

@@ -0,0 +1,21 @@
function RenderDefaultLoginnameSuffix() {
let orgNameText = document.getElementById("orgname").value;
let userName = document.getElementById("username");
let defaultLoginNameSuffix = document.getElementById("default-login-suffix");
let iamDomain = userName.dataset.iamDomain;
let orgDomain = orgNameText.replace(" ", "-");
if (orgDomain !== "") {
defaultLoginNameSuffix.innerText = "@" + orgDomain.toLowerCase() + "." + iamDomain;
} else {
defaultLoginNameSuffix.innerText = "";
}
}
window.addEventListener('DOMContentLoaded', (event) => {
RenderDefaultLoginnameSuffix();
});
document.getElementById("orgname").addEventListener('input', function () {
RenderDefaultLoginnameSuffix();
});

View File

@@ -78,12 +78,12 @@
}
body {
margin: 0;
margin: 0 0 100px 0;
}
html {
height: 100%;
width: 100%;
min-height: 100%;
font-weight: 300;
background-color: #282828;
color: white;
@@ -99,6 +99,13 @@ h1 {
font-size: 40px;
}
h2 {
color: white;
font-family: Aileron;
font-weight: 300;
font-size: 30px;
}
p {
font-weight: 300;
text-align: center;
@@ -358,6 +365,13 @@ form ul#passwordcomplexity li i {
form ul#passwordcomplexity li.invalid i {
color: #F20D6B;
}
form #loginname {
display: flex;
}
form #loginname .loginname-suffix {
padding-left: 5px;
line-height: 50px;
}
#copy-secret {
visibility: hidden;
@@ -383,8 +397,6 @@ footer {
background-image: url("../gradientdeco-full.svg");
width: 100%;
background-size: cover;
height: 44vw;
position: fixed;
bottom: 0;
z-index: -1;
}

View File

@@ -1 +1 @@
{"version":3,"sourceRoot":"","sources":["../../scss/fonts.scss","../../scss/main.scss","../../scss/caos/variables.scss","../../scss/variables.scss"],"names":[],"mappings":"AACA;EACI;EACA;;AAIJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAIJ;EACI;EACA;EACA;EACA;AAA6D;EAC7D;;AC5EJ;EACI;EACA,aCMW;EDLX;EACA;;;AAGJ;EACI;;;AAGJ;EACI;EACA;EACA;EACA,kBCDc;EDEd,OCDQ;EDER;EACA;EACA;;;AAMJ;EACI,OCXQ;EDYR,aClBS;EDmBT;EACA,WEzBS;;;AF4Bb;EACI;EACA;;;AAGJ;EACI;;AAEA;EACI;EACA;EACA;EACA;EACA;;;AAIR;EACI;EACA;EACA;EACA;;;AAGJ;EACI,OCzCW;ED0CX;EACA;;AAEA;EACI,OC7CY;;;ADiDpB;EACI,kBCrDc;EDsDd,OCpDW;EDqDX;EACA;EACA;EACA;EACA,QEtEU;EFuEV;EACA;EACA;;AACA;EACI,kBC7DY;ED8DZ,OCjEU;EDkEV;;AAGJ;EACI,kBCpEO;EDqEP,OCtEI;EDuEJ;;AACA;EACI,kBCvEQ;;AD2EhB;EACI,kBEnEW;EFoEX;;AAEA;EACI,kBEvEO;EFwEP;;;AAKZ;EACI,kBE7EmB;EF8EnB,OC1FQ;ED2FR,QEvGU;EFwGV;EACA;EACA;;;AAIA;EACI;EACA;EACA;EACA;EExGN;;AACA;EFmGE;IElGA;IACA;;;AFyGA;EE5GF;;AACA;EF2GE;IE1GA;IACA;;;;AFgHA;EACI;EACA;;AAGJ;EACI;EACA;;AAEA;EACI,WEtIC;EFuID;;AAGJ;EACI;EACA;EACA;EACA,OEzHC;;;AF+HT;EACI;EACA;;AAGJ;EACI;;AAEA;EACI;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAIR;EACI,OErJK;EFsJL;EACA;EACA;;AAEA;EACI;EACA;;AAIR;EACI;;AAEA;EACI;;AAGJ;EACI;;AAIR;EACI;EACA;EACA,OCzLI;ED0LJ;EACA;EACA;EACA;;AAEA;EACI;EACA,kBErLW;;AFwLf;EACI;;AAIR;EACI;;AAKA;EACI;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA,cE9MO;EF+MP;EACA;EACA;EACA;EACA;;AAEA;EACI;;AAGJ;EACI;;AAKR;EACI;;AAEA;EACI;;AAEA;EACI;;AAEJ;EACI,OE1OP;;AFiPL;EACI;;AAEJ;EACI;EACA;EACA;EACA;EEpQV;;AACA;EF+PM;IE9PJ;IACA;;;AFsQQ;EACI;EACA;EE3Qd;;AACA;EFwQU;IEvQR;IACA;;;AF6QI;EACI;EACA;;AAIR;EACI;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA,OEpRN;;AFyRE;EACI,OE3RL;;;AFiSX;EACI;EACA;;;AAGJ;EACI;;AAEA;EACI,MC1TI;;AD6TR;EACI,MC/TU;;;ADoUd;EACI;EACA;;;AAIR;EAEQ;EAEJ;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;AAAkB;EAClB;EACA;EACA;EACA;EACA;EACA;EACA;AAEA;EACA;AACA;EACA;AAEA;EACA;AAEA;EACA","file":"dark.css"}
{"version":3,"sourceRoot":"","sources":["../../scss/fonts.scss","../../scss/main.scss","../../scss/caos/variables.scss","../../scss/variables.scss"],"names":[],"mappings":"AACA;EACI;EACA;;AAIJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAIJ;EACI;EACA;EACA;EACA;AAA6D;EAC7D;;AC5EJ;EACI;EACA,aCMW;EDLX;EACA;;;AAGJ;EACI;;;AAGJ;EACI;EACA;EACA;EACA,kBCDc;EDEd,OCDQ;EDER;EACA;EACA;;;AAMJ;EACI,OCXQ;EDYR,aClBS;EDmBT;EACA,WEzBS;;;AF4Bb;EACI,OClBQ;EDmBR,aCzBS;ED0BT;EACA,WE/BU;;;AFkCd;EACI;EACA;;;AAGJ;EACI;;AAEA;EACI;EACA;EACA;EACA;EACA;;;AAIR;EACI;EACA;EACA;EACA;;;AAGJ;EACI,OChDW;EDiDX;EACA;;AAEA;EACI,OCpDY;;;ADwDpB;EACI,kBC5Dc;ED6Dd,OC3DW;ED4DX;EACA;EACA;EACA;EACA,QE7EU;EF8EV;EACA;EACA;;AACA;EACI,kBCpEY;EDqEZ,OCxEU;EDyEV;;AAGJ;EACI,kBC3EO;ED4EP,OC7EI;ED8EJ;;AACA;EACI,kBC9EQ;;ADkFhB;EACI,kBEzEW;EF0EX;;AAEA;EACI,kBE7EO;EF8EP;;;AAKZ;EACI,kBEnFmB;EFoFnB,OCjGQ;EDkGR,QE9GU;EF+GV;EACA;EACA;;;AAIA;EACI;EACA;EACA;EACA;EE9GN;;AACA;EFyGE;IExGA;IACA;;;AF+GA;EElHF;;AACA;EFiHE;IEhHA;IACA;;;;AFsHA;EACI;EACA;;AAGJ;EACI;EACA;;AAEA;EACI,WE7IC;EF8ID;;AAGJ;EACI;EACA;EACA;EACA,OE/HC;;;AFqIT;EACI;EACA;;AAGJ;EACI;;AAEA;EACI;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAIR;EACI,OE3JK;EF4JL;EACA;EACA;;AAEA;EACI;EACA;;AAIR;EACI;;AAEA;EACI;;AAGJ;EACI;;AAIR;EACI;EACA;EACA,OChMI;EDiMJ;EACA;EACA;EACA;;AAEA;EACI;EACA,kBE3LW;;AF8Lf;EACI;;AAIR;EACI;;AAKA;EACI;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA,cEpNO;EFqNP;EACA;EACA;EACA;EACA;;AAEA;EACI;;AAGJ;EACI;;AAKR;EACI;;AAEA;EACI;;AAEA;EACI;;AAEJ;EACI,OEhPP;;AFuPL;EACI;;AAEJ;EACI;EACA;EACA;EACA;EE1QV;;AACA;EFqQM;IEpQJ;IACA;;;AF4QQ;EACI;EACA;EEjRd;;AACA;EF8QU;IE7QR;IACA;;;AFmRI;EACI;EACA;;AAIR;EACI;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA,OE1RN;;AF+RE;EACI,OEjSL;;AFsSP;EACI;;AACA;EACI;EACA;;;AAKZ;EACI;EACA;;;AAGJ;EACI;;AAEA;EACI,MCzUI;;AD4UR;EACI,MC9UU;;;ADmVd;EACI;EACA;;;AAIR;EAEQ;EAEJ;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;AAAkB;EAClB;EACA;EACA;EACA;EACA;EACA;EACA;AAEA;EACA;AACA;EACA;AAEA;EACA;AAEA;EACA","file":"dark.css"}

View File

@@ -78,12 +78,12 @@
}
body {
margin: 0;
margin: 0 0 100px 0;
}
html {
height: 100%;
width: 100%;
min-height: 100%;
font-weight: 300;
background-color: #282828;
color: white;
@@ -99,6 +99,13 @@ h1 {
font-size: 40px;
}
h2 {
color: white;
font-family: Aileron;
font-weight: 300;
font-size: 30px;
}
p {
font-weight: 300;
text-align: center;
@@ -358,6 +365,13 @@ form ul#passwordcomplexity li i {
form ul#passwordcomplexity li.invalid i {
color: #F20D6B;
}
form #loginname {
display: flex;
}
form #loginname .loginname-suffix {
padding-left: 5px;
line-height: 50px;
}
#copy-secret {
visibility: hidden;
@@ -383,8 +397,6 @@ footer {
background-image: url("../gradientdeco-full.svg");
width: 100%;
background-size: cover;
height: 44vw;
position: fixed;
bottom: 0;
z-index: -1;
}
@@ -419,7 +431,7 @@ html {
html header .logo {
background-image: url("../logo-light.png");
}
html h1 {
html h1, html h2 {
color: #282828;
}
html button {

View File

@@ -1 +1 @@
{"version":3,"sourceRoot":"","sources":["../../scss/fonts.scss","../../scss/main.scss","../../scss/caos/variables.scss","../../scss/variables.scss","../../scss/light.scss"],"names":[],"mappings":"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","file":"light.css"}
{"version":3,"sourceRoot":"","sources":["../../scss/fonts.scss","../../scss/main.scss","../../scss/caos/variables.scss","../../scss/variables.scss","../../scss/light.scss"],"names":[],"mappings":"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","file":"light.css"}

View File

@@ -10,7 +10,7 @@ html {
background-image: url($logoImgLight);
}
h1 {
h1, h2 {
color: $fontColorLight;
}

View File

@@ -8,12 +8,12 @@
}
body {
margin: 0;
margin: 0 0 100px 0;
}
html {
height: 100%;
width: 100%;
min-height: 100%;
font-weight: 300;
background-color: $backgroundColor;
color: $fontColor;
@@ -32,6 +32,13 @@ h1 {
font-size: $headerSize;
}
h2 {
color: $fontColor;
font-family: $headerFont;
font-weight: 300;
font-size: $header2Size;
}
p {
font-weight: 300;
text-align: center;
@@ -318,6 +325,14 @@ form {
}
}
}
#loginname {
display: flex;
.loginname-suffix {
padding-left: 5px;
line-height: 50px;
}
}
}
#copy-secret {
@@ -350,8 +365,6 @@ footer {
}
width: 100%;
background-size: cover;
height: 44vw;
position: fixed;
bottom: 0;
z-index: -1;
}

View File

@@ -5,6 +5,7 @@ $headerFont: Lato;
// ----- LAYOUT ------------
$inputHeight: 50px;
$headerSize: 40px;
$header2Size: 30px;
$retina: "only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min--moz-device-pixel-ratio: 2), only screen and (-o-min-device-pixel-ratio: 2/1), only screen and (min-device-pixel-ratio: 2), only screen and (min-resolution: 192dpi), only screen and (min-resolution: 2dppx)";
@mixin retina-background-image($file, $type, $hover, $width, $height) {

View File

@@ -78,12 +78,12 @@
}
body {
margin: 0;
margin: 0 0 100px 0;
}
html {
height: 100%;
width: 100%;
min-height: 100%;
font-weight: 300;
background-color: #282828;
color: #BBBBC8;
@@ -100,6 +100,13 @@ h1 {
font-size: 40px;
}
h2 {
color: #BBBBC8;
font-family: Lato;
font-weight: 300;
font-size: 30px;
}
p {
font-weight: 300;
text-align: center;
@@ -359,6 +366,13 @@ form ul#passwordcomplexity li i {
form ul#passwordcomplexity li.invalid i {
color: #F20D6B;
}
form #loginname {
display: flex;
}
form #loginname .loginname-suffix {
padding-left: 5px;
line-height: 50px;
}
#copy-secret {
visibility: hidden;
@@ -383,8 +397,6 @@ form ul#passwordcomplexity li.invalid i {
footer {
width: 100%;
background-size: cover;
height: 44vw;
position: fixed;
bottom: 0;
z-index: -1;
}

View File

@@ -1 +1 @@
{"version":3,"sourceRoot":"","sources":["../../scss/fonts.scss","../../scss/main.scss","../../scss/variables.scss"],"names":[],"mappings":"AACA;EACI;EACA;;AAIJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAIJ;EACI;EACA;EACA;EACA;AAA6D;EAC7D;;AC5EJ;EACI;EACA,aCHW;EDIX;EACA;;;AAGJ;EACI;;;AAGJ;EACI;EACA;EACA;EACA,kBCMc;EDLd,OCMQ;EDLR;EACA;EACA;EAEI;;;AAIR;EACI,OCJQ;EDKR,aC3BS;ED4BT;EACA,WCzBS;;;AD4Bb;EACI;EACA;;;AAGJ;EACI;;AAEA;EACI;EACA;EACA;EACA;EACA;;;AAIR;EACI;EACA;EACA;EACA;;;AAGJ;EACI,OClCW;EDmCX;EACA;;AAEA;EACI,OCtCY;;;AD0CpB;EACI,kBC9Cc;ED+Cd,OC7CW;ED8CX;EACA;EACA;EACA;EACA,QCtEU;EDuEV;EACA;EACA;;AACA;EACI,kBCtDY;EDuDZ,OC1DU;ED2DV;;AAGJ;EACI,kBC7DO;ED8DP,OC/DI;EDgEJ;;AACA;EACI,kBChEQ;;ADoEhB;EACI,kBCnEW;EDoEX;;AAEA;EACI,kBCvEO;EDwEP;;;AAKZ;EACI,kBC7EmB;ED8EnB,OCnFQ;EDoFR,QCvGU;EDwGV;EACA;EACA;;;AAIA;EACI;EACA;EACA;EACA;ECxGN;;AACA;EDmGE;IClGA;IACA;;;ADyGA;EC5GF;;AACA;ED2GE;IC1GA;IACA;;;;ADgHA;EACI;EACA;;AAGJ;EACI;EACA;;AAEA;EACI,WCtIC;EDuID;;AAGJ;EACI;EACA;EACA;EACA,OCzHC;;;AD+HT;EACI;EACA;;AAGJ;EACI;;AAEA;EACI;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAIR;EACI,OCrJK;EDsJL;EACA;EACA;;AAEA;EACI;EACA;;AAIR;EACI;;AAEA;EACI;;AAGJ;EACI;;AAIR;EACI;EACA;EACA,OClLI;EDmLJ;EACA;EACA;EACA;;AAEA;EACI;EACA,kBCrLW;;ADwLf;EACI;;AAIR;EACI;;AAKA;EACI;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA,cC9MO;ED+MP;EACA;EACA;EACA;EACA;;AAEA;EACI;;AAGJ;EACI;;AAKR;EACI;;AAEA;EACI;;AAEA;EACI;;AAEJ;EACI,OC1OP;;ADiPL;EACI;;AAEJ;EACI;EACA;EACA;EACA;ECpQV;;AACA;ED+PM;IC9PJ;IACA;;;ADsQQ;EACI;EACA;EC3Qd;;AACA;EDwQU;ICvQR;IACA;;;AD6QI;EACI;EACA;;AAIR;EACI;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA,OCpRN;;ADyRE;EACI,OC3RL;;;ADiSX;EACI;EACA;;;AAGJ;EACI;;AAEA;EACI,MCnTI;;ADsTR;EACI,MCxTU;;;AD6Td;EACI;EACA;;;AAIR;EAII;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;AAAkB;EAClB;EACA;EACA;EACA;EACA;EACA;EACA;AAEA;EACA;AACA;EACA;AAEA;EACA;AAEA;EACA","file":"dark.css"}
{"version":3,"sourceRoot":"","sources":["../../scss/fonts.scss","../../scss/main.scss","../../scss/variables.scss"],"names":[],"mappings":"AACA;EACI;EACA;;AAIJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAIJ;EACI;EACA;EACA;EACA;AAA6D;EAC7D;;AC5EJ;EACI;EACA,aCHW;EDIX;EACA;;;AAGJ;EACI;;;AAGJ;EACI;EACA;EACA;EACA,kBCOc;EDNd,OCOQ;EDNR;EACA;EACA;EAEI;;;AAIR;EACI,OCHQ;EDIR,aC3BS;ED4BT;EACA,WCzBS;;;AD4Bb;EACI,OCVQ;EDWR,aClCS;EDmCT;EACA,WC/BU;;;ADkCd;EACI;EACA;;;AAGJ;EACI;;AAEA;EACI;EACA;EACA;EACA;EACA;;;AAIR;EACI;EACA;EACA;EACA;;;AAGJ;EACI,OCxCW;EDyCX;EACA;;AAEA;EACI,OC5CY;;;ADgDpB;EACI,kBCpDc;EDqDd,OCnDW;EDoDX;EACA;EACA;EACA;EACA,QC7EU;ED8EV;EACA;EACA;;AACA;EACI,kBC5DY;ED6DZ,OChEU;EDiEV;;AAGJ;EACI,kBCnEO;EDoEP,OCrEI;EDsEJ;;AACA;EACI,kBCtEQ;;AD0EhB;EACI,kBCzEW;ED0EX;;AAEA;EACI,kBC7EO;ED8EP;;;AAKZ;EACI,kBCnFmB;EDoFnB,OCzFQ;ED0FR,QC9GU;ED+GV;EACA;EACA;;;AAIA;EACI;EACA;EACA;EACA;EC9GN;;AACA;EDyGE;ICxGA;IACA;;;AD+GA;EClHF;;AACA;EDiHE;IChHA;IACA;;;;ADsHA;EACI;EACA;;AAGJ;EACI;EACA;;AAEA;EACI,WC7IC;ED8ID;;AAGJ;EACI;EACA;EACA;EACA,OC/HC;;;ADqIT;EACI;EACA;;AAGJ;EACI;;AAEA;EACI;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAIR;EACI,OC3JK;ED4JL;EACA;EACA;;AAEA;EACI;EACA;;AAIR;EACI;;AAEA;EACI;;AAGJ;EACI;;AAIR;EACI;EACA;EACA,OCxLI;EDyLJ;EACA;EACA;EACA;;AAEA;EACI;EACA,kBC3LW;;AD8Lf;EACI;;AAIR;EACI;;AAKA;EACI;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA,cCpNO;EDqNP;EACA;EACA;EACA;EACA;;AAEA;EACI;;AAGJ;EACI;;AAKR;EACI;;AAEA;EACI;;AAEA;EACI;;AAEJ;EACI,OChPP;;ADuPL;EACI;;AAEJ;EACI;EACA;EACA;EACA;EC1QV;;AACA;EDqQM;ICpQJ;IACA;;;AD4QQ;EACI;EACA;ECjRd;;AACA;ED8QU;IC7QR;IACA;;;ADmRI;EACI;EACA;;AAIR;EACI;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA,OC1RN;;AD+RE;EACI,OCjSL;;ADsSP;EACI;;AACA;EACI;EACA;;;AAKZ;EACI;EACA;;;AAGJ;EACI;;AAEA;EACI,MCjUI;;ADoUR;EACI,MCtUU;;;AD2Ud;EACI;EACA;;;AAIR;EAII;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;AAAkB;EAClB;EACA;EACA;EACA;EACA;EACA;EACA;AAEA;EACA;AACA;EACA;AAEA;EACA;AAEA;EACA","file":"dark.css"}

View File

@@ -78,12 +78,12 @@
}
body {
margin: 0;
margin: 0 0 100px 0;
}
html {
height: 100%;
width: 100%;
min-height: 100%;
font-weight: 300;
background-color: #282828;
color: #BBBBC8;
@@ -100,6 +100,13 @@ h1 {
font-size: 40px;
}
h2 {
color: #BBBBC8;
font-family: Lato;
font-weight: 300;
font-size: 30px;
}
p {
font-weight: 300;
text-align: center;
@@ -359,6 +366,13 @@ form ul#passwordcomplexity li i {
form ul#passwordcomplexity li.invalid i {
color: #F20D6B;
}
form #loginname {
display: flex;
}
form #loginname .loginname-suffix {
padding-left: 5px;
line-height: 50px;
}
#copy-secret {
visibility: hidden;
@@ -383,8 +397,6 @@ form ul#passwordcomplexity li.invalid i {
footer {
width: 100%;
background-size: cover;
height: 44vw;
position: fixed;
bottom: 0;
z-index: -1;
}
@@ -420,7 +432,7 @@ html {
html header .logo {
background-image: url("../logo-light.png");
}
html h1 {
html h1, html h2 {
color: #282828;
}
html button {

View File

@@ -1 +1 @@
{"version":3,"sourceRoot":"","sources":["../../scss/fonts.scss","../../scss/main.scss","../../scss/variables.scss","../../scss/light.scss"],"names":[],"mappings":"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","file":"light.css"}
{"version":3,"sourceRoot":"","sources":["../../scss/fonts.scss","../../scss/main.scss","../../scss/variables.scss","../../scss/light.scss"],"names":[],"mappings":"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","file":"light.css"}

View File

@@ -0,0 +1,72 @@
{{template "main-top" .}}
<h1>{{t "RegistrationOrg.Title"}}</h1>
<p>{{t "RegistrationOrg.Description"}}</p>
<form action="{{ orgRegistrationUrl }}" method="POST">
{{ .CSRF }}
<input type="hidden" name="authRequestID" value="{{ .AuthReqID }}" />
<div class="fields">
<div class="field">
<label class="label" for="orgname">{{t "RegistrationOrg.OrgName"}}</label>
<input class="input" type="text" id="orgname" name="orgname" value="{{ .OrgName }}" autofocus required>
</div>
{{if .UserLoginMustBeDomain}}
<div class="field">
<label class="label" for="username">{{t "RegistrationOrg.Username"}}</label>
<span id="loginname">
<input data-iam-domain="{{ .IamDomain }}"
class="input" type="text" id="username" name="username"
value="{{ .Username }}" autofocus required>
<span id="default-login-suffix" class="loginname-suffix"></span>
</span>
</div>
{{end}}
<div class="field">
<label class="label" for="email">{{t "RegistrationOrg.Email"}}</label>
<input class="input" type="text" id="email" name="email" autocomplete="email" value="{{ .Email }}" autofocus required>
</div>
<div class="field">
<label class="label" for="firstname">{{t "RegistrationOrg.Firstname"}}</label>
<input class="input" type="text" id="firstname" name="firstname" autocomplete="given-name" value="{{ .Firstname }}" required>
</div>
<div class="field">
<label class="label" for="lastname">{{t "RegistrationOrg.Lastname"}}</label>
<input class="input" type="text" id="lastname" name="lastname" autocomplete="family-name" value="{{ .Lastname }}" required>
</div>
<div class="field">
<label class="label" for="register-password">{{t "RegistrationOrg.Password"}}</label>
<input data-minlength="{{ .MinLength }}"
data-has-uppercase="{{ .HasUppercase }}"
data-has-lowercase="{{ .HasLowercase }}"
data-has-number="{{ .HasNumber }}"
data-has-symbol="{{ .HasSymbol }}"
class="input" type="password" id="register-password" name="register-password" autocomplete="new-password" required>
{{ .PasswordPolicyDescription }}
</div>
<div class="field">
<label class="label" for="register-password-confirmation">{{t "RegistrationOrg.Password2"}}</label>
<input class="input" type="password" id="register-password-confirmation" name="register-password-confirmation" autocomplete="new-password" required>
</div>
</div>
{{template "error-message" .}}
<div class="actions">
<button class="primary right" id="register-button" type="submit" disabled>{{t "Actions.Save"}}</button>
</div>
</form>
<script src="{{ resourceUrl "scripts/form_submit.js" }}"></script>
<script src="{{ resourceUrl "scripts/password_policy_check.js" }}"></script>
<script src="{{ resourceUrl "scripts/register_check.js" }}"></script>
<script src="{{ resourceUrl "scripts/loginname_suffix.js" }}"></script>
{{template "main-bottom" .}}

View File

@@ -175,15 +175,15 @@ func (es *UserEventstore) PrepareRegisterUser(ctx context.Context, user *usr_mod
if err != nil {
return nil, nil, err
}
err = user.GenerateEmailCodeIfNeeded(es.EmailVerificationCode)
err = user.GenerateInitCodeIfNeeded(es.InitializeUserCode)
if err != nil {
return nil, nil, err
}
repoUser := model.UserFromModel(user)
repoEmailCode := model.EmailCodeFromModel(user.EmailCode)
repoInitCode := model.InitCodeFromModel(user.InitCode)
aggregates, err := UserRegisterAggregate(ctx, es.AggregateCreator(), repoUser, resourceOwner, repoEmailCode, orgIamPolicy.UserLoginMustBeDomain)
aggregates, err := UserRegisterAggregate(ctx, es.AggregateCreator(), repoUser, resourceOwner, repoInitCode, orgIamPolicy.UserLoginMustBeDomain)
return repoUser, aggregates, err
}

View File

@@ -135,6 +135,18 @@ func GetMockManipulateUserWithInitCodeGen(ctrl *gomock.Controller, user model.Us
return GetMockedEventstoreWithPw(ctrl, mockEs, true, false, false, false)
}
func GetMockManipulateUserWithPasswordInitCodeGen(ctrl *gomock.Controller, user model.User) *UserEventstore {
data, _ := json.Marshal(user)
events := []*es_models.Event{
&es_models.Event{AggregateID: "AggregateID", Sequence: 1, Type: model.UserAdded, Data: data},
}
mockEs := mock.NewMockEventstore(ctrl)
mockEs.EXPECT().FilterEvents(gomock.Any(), gomock.Any()).Return(events, nil)
mockEs.EXPECT().AggregateCreator().Return(es_models.NewAggregateCreator("TEST"))
mockEs.EXPECT().PushAggregates(gomock.Any(), gomock.Any()).Return(nil)
return GetMockedEventstoreWithPw(ctrl, mockEs, true, false, false, true)
}
func GetMockManipulateUserWithPasswordAndEmailCodeGen(ctrl *gomock.Controller, user model.User) *UserEventstore {
data, _ := json.Marshal(user)
events := []*es_models.Event{

View File

@@ -329,7 +329,7 @@ func TestRegisterUser(t *testing.T) {
{
name: "register user, ok",
args: args{
es: GetMockManipulateUserWithPasswordAndEmailCodeGen(ctrl, repo_model.User{Profile: &repo_model.Profile{UserName: "UserName", FirstName: "FirstName", LastName: "LastName"}, Email: &repo_model.Email{EmailAddress: "EmailAddress"}}),
es: GetMockManipulateUserWithPasswordInitCodeGen(ctrl, repo_model.User{Profile: &repo_model.Profile{UserName: "UserName", FirstName: "FirstName", LastName: "LastName"}, Email: &repo_model.Email{EmailAddress: "EmailAddress"}}),
ctx: authz.NewMockContext("orgID", "userID"),
user: &model.User{
ObjectRoot: es_models.ObjectRoot{Sequence: 1},
@@ -365,7 +365,7 @@ func TestRegisterUser(t *testing.T) {
{
name: "email as username",
args: args{
es: GetMockManipulateUserWithPasswordAndEmailCodeGen(ctrl, repo_model.User{Profile: &repo_model.Profile{UserName: "EmailAddress", FirstName: "FirstName", LastName: "LastName"}, Email: &repo_model.Email{EmailAddress: "EmailAddress"}}),
es: GetMockManipulateUserWithPasswordInitCodeGen(ctrl, repo_model.User{Profile: &repo_model.Profile{UserName: "EmailAddress", FirstName: "FirstName", LastName: "LastName"}, Email: &repo_model.Email{EmailAddress: "EmailAddress"}}),
ctx: authz.NewMockContext("orgID", "userID"),
user: &model.User{ObjectRoot: es_models.ObjectRoot{Sequence: 1},
Profile: &model.Profile{
@@ -875,7 +875,7 @@ func TestCreateInitCode(t *testing.T) {
{
name: "create init code",
args: args{
es: GetMockManipulateUserWithInitCodeGen(ctrl, repo_model.User{ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 1}}),
es: GetMockManipulateUserWithPasswordInitCodeGen(ctrl, repo_model.User{ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 1}}),
ctx: authz.NewMockContext("orgID", "userID"),
existing: &model.User{ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 1}},
},

View File

@@ -118,9 +118,9 @@ func UserCreateAggregate(ctx context.Context, aggCreator *es_models.AggregateCre
}, nil
}
func UserRegisterAggregate(ctx context.Context, aggCreator *es_models.AggregateCreator, user *model.User, resourceOwner string, emailCode *model.EmailCode, userLoginMustBeDomain bool) ([]*es_models.Aggregate, error) {
if user == nil || resourceOwner == "" || emailCode == nil {
return nil, errors.ThrowPreconditionFailed(nil, "EVENT-duxk2", "user, resourceowner, emailcode should not be nothing")
func UserRegisterAggregate(ctx context.Context, aggCreator *es_models.AggregateCreator, user *model.User, resourceOwner string, initCode *model.InitUserCode, userLoginMustBeDomain bool) ([]*es_models.Aggregate, error) {
if user == nil || resourceOwner == "" || initCode == nil {
return nil, errors.ThrowPreconditionFailed(nil, "EVENT-duxk2", "user, resourceowner, initcode should not be nothing")
}
agg, err := UserAggregateOverwriteContext(ctx, aggCreator, user, resourceOwner, user.AggregateID)
@@ -140,7 +140,7 @@ func UserRegisterAggregate(ctx context.Context, aggCreator *es_models.AggregateC
if err != nil {
return nil, err
}
agg, err = agg.AppendEvent(model.UserEmailCodeAdded, emailCode)
agg, err = agg.AppendEvent(model.InitializedUserCodeAdded, initCode)
if err != nil {
return nil, err
}

View File

@@ -256,7 +256,7 @@ func TestUserRegisterAggregate(t *testing.T) {
type args struct {
ctx context.Context
new *model.User
emailCode *model.EmailCode
initCode *model.InitUserCode
resourceOwner string
aggCreator *models.AggregateCreator
}
@@ -278,13 +278,13 @@ func TestUserRegisterAggregate(t *testing.T) {
Profile: &model.Profile{UserName: "UserName"},
Email: &model.Email{EmailAddress: "EmailAddress"},
},
emailCode: &model.EmailCode{},
initCode: &model.InitUserCode{},
resourceOwner: "newResourceowner",
aggCreator: models.NewAggregateCreator("Test"),
},
res: res{
eventLen: 2,
eventTypes: []models.EventType{model.UserRegistered, model.UserEmailCodeAdded},
eventTypes: []models.EventType{model.UserRegistered, model.InitializedUserCodeAdded},
},
},
{
@@ -292,7 +292,7 @@ func TestUserRegisterAggregate(t *testing.T) {
args: args{
ctx: authz.NewMockContext("orgID", "userID"),
new: nil,
emailCode: &model.EmailCode{},
initCode: &model.InitUserCode{},
resourceOwner: "newResourceowner",
aggCreator: models.NewAggregateCreator("Test"),
},
@@ -316,7 +316,7 @@ func TestUserRegisterAggregate(t *testing.T) {
},
},
{
name: "create with email code",
name: "create with init code",
args: args{
ctx: authz.NewMockContext("orgID", "userID"),
new: &model.User{ObjectRoot: models.ObjectRoot{AggregateID: "ID"},
@@ -324,12 +324,12 @@ func TestUserRegisterAggregate(t *testing.T) {
Email: &model.Email{EmailAddress: "EmailAddress"},
},
resourceOwner: "newResourceowner",
emailCode: &model.EmailCode{},
initCode: &model.InitUserCode{},
aggCreator: models.NewAggregateCreator("Test"),
},
res: res{
eventLen: 2,
eventTypes: []models.EventType{model.UserRegistered, model.UserEmailCodeAdded},
eventTypes: []models.EventType{model.UserRegistered, model.InitializedUserCodeAdded},
},
},
{
@@ -340,7 +340,7 @@ func TestUserRegisterAggregate(t *testing.T) {
Profile: &model.Profile{UserName: "UserName"},
Email: &model.Email{EmailAddress: "EmailAddress"},
},
emailCode: &model.EmailCode{},
initCode: &model.InitUserCode{},
aggCreator: models.NewAggregateCreator("Test"),
},
res: res{
@@ -350,7 +350,7 @@ func TestUserRegisterAggregate(t *testing.T) {
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
aggregates, err := UserRegisterAggregate(tt.args.ctx, tt.args.aggCreator, tt.args.new, tt.args.resourceOwner, tt.args.emailCode, false)
aggregates, err := UserRegisterAggregate(tt.args.ctx, tt.args.aggCreator, tt.args.new, tt.args.resourceOwner, tt.args.initCode, false)
if tt.res.errFunc == nil && len(aggregates[0].Events) != tt.res.eventLen {
t.Errorf("got wrong event len: expected: %v, actual: %v ", tt.res.eventLen, len(aggregates[0].Events))