diff --git a/cmd/defaults.yaml b/cmd/defaults.yaml
index 625a03dafc..8996e384c6 100644
--- a/cmd/defaults.yaml
+++ b/cmd/defaults.yaml
@@ -554,7 +554,7 @@ DefaultInstance:
Title: Zitadel - User initialisieren
PreHeader: User initialisieren
Subject: User initialisieren
- Greeting: Hallo {{.FirstName}} {{.LastName}},
+ Greeting: Hallo {{.DisplayName}},
Text: Dieser Benutzer wurde soeben im Zitadel erstellt. Mit dem Benutzernamen <br><strong>{{.PreferredLoginName}}</strong><br> kannst du dich anmelden. Nutze den untenstehenden Button, um die Initialisierung abzuschliessen <br>(Code <strong>{{.Code}}</strong>).<br> Falls du dieses Mail nicht angefordert hast, kannst du es einfach ignorieren.
ButtonText: Initialisierung abschliessen
- MessageTextType: PasswordReset
@@ -562,7 +562,7 @@ DefaultInstance:
Title: Zitadel - Passwort zurücksetzen
PreHeader: Passwort zurücksetzen
Subject: Passwort zurücksetzen
- Greeting: Hallo {{.FirstName}} {{.LastName}},
+ Greeting: Hallo {{.DisplayName}},
Text: Wir haben eine Anfrage für das Zurücksetzen deines Passwortes bekommen. Du kannst den untenstehenden Button verwenden, um dein Passwort zurückzusetzen <br>(Code <strong>{{.Code}}</strong>).<br> Falls du dieses Mail nicht angefordert hast, kannst du es ignorieren.
ButtonText: Passwort zurücksetzen
- MessageTextType: VerifyEmail
@@ -570,7 +570,7 @@ DefaultInstance:
Title: Zitadel - Email verifizieren
PreHeader: Email verifizieren
Subject: Email verifizieren
- Greeting: Hallo {{.FirstName}} {{.LastName}},
+ Greeting: Hallo {{.DisplayName}},
Text: Eine neue E-Mail Adresse wurde hinzugefügt. Bitte verwende den untenstehenden Button um diese zu verifizieren <br>(Code <strong>{{.Code}}</strong>).<br> Falls du deine E-Mail Adresse nicht selber hinzugefügt hast, kannst du dieses E-Mail ignorieren.
ButtonText: Email verifizieren
- MessageTextType: VerifyPhone
@@ -578,7 +578,7 @@ DefaultInstance:
Title: Zitadel - Telefonnummer verifizieren
PreHeader: Telefonnummer verifizieren
Subject: Telefonnummer verifizieren
- Greeting: Hallo {{.FirstName}} {{.LastName}},
+ Greeting: Hallo {{.DisplayName}},
Text: Eine Telefonnummer wurde hinzugefügt. Bitte verifiziere diese in dem du folgenden Code eingibst (Code {{.Code}})
ButtonText: Telefon verifizieren
- MessageTextType: DomainClaimed
@@ -586,7 +586,7 @@ DefaultInstance:
Title: Zitadel - Domain wurde beansprucht
PreHeader: Email / Username ändern
Subject: Domain wurde beansprucht
- Greeting: Hallo {{.FirstName}} {{.LastName}},
+ Greeting: Hallo {{.DisplayName}},
Text: Die Domain {{.Domain}} wurde von einer Organisation beansprucht. Dein derzeitiger User {{.Username}} ist nicht Teil dieser Organisation. Daher musst du beim nächsten Login eine neue Email hinterlegen. Für diesen Login haben wir dir einen temporären Usernamen ({{.TempUsername}}) erstellt.
ButtonText: Login
- MessageTextType: PasswordChange
@@ -594,7 +594,7 @@ DefaultInstance:
Title: ZITADEL - Passwort von Benutzer wurde geändert
PreHeader: Passwort Änderung
Subject: Passwort von Benutzer wurde geändert
- Greeting: Hallo {{.FirstName}} {{.LastName}},
+ Greeting: Hallo {{.DisplayName}},
Text: Das Password vom Benutzer wurde geändert. Wenn diese Änderung von jemand anderem gemacht wurde, empfehlen wir die sofortige Zurücksetzung ihres Passworts.
ButtonText: Login
- MessageTextType: InitCode
@@ -602,7 +602,7 @@ DefaultInstance:
Title: Zitadel - Initialize User
PreHeader: Initialize User
Subject: Initialize User
- Greeting: Hello {{.FirstName}} {{.LastName}},
+ Greeting: Hello {{.DisplayName}},
Text: This user was created in Zitadel. Use the username {{.PreferredLoginName}} to login. Please click the button below to finish the initialization process. (Code {{.Code}}) If you didn't ask for this mail, please ignore it.
ButtonText: Finish initialization
- MessageTextType: PasswordReset
@@ -610,7 +610,7 @@ DefaultInstance:
Title: Zitadel - Reset password
PreHeader: Reset password
Subject: Reset password
- Greeting: Hello {{.FirstName}} {{.LastName}},
+ Greeting: Hello {{.DisplayName}},
Text: We received a password reset request. Please use the button below to reset your password. (Code {{.Code}}) If you didn't ask for this mail, please ignore it.
ButtonText: Reset password
- MessageTextType: VerifyEmail
@@ -618,7 +618,7 @@ DefaultInstance:
Title: Zitadel - Verify email
PreHeader: Verify email
Subject: Verify email
- Greeting: Hello {{.FirstName}} {{.LastName}},
+ Greeting: Hello {{.DisplayName}},
Text: A new email has been added. Please use the button below to verify your mail. (Code {{.Code}}) If you din't add a new email, please ignore this email.
ButtonText: Verify email
- MessageTextType: VerifyPhone
@@ -626,7 +626,7 @@ DefaultInstance:
Title: Zitadel - Verify phone
PreHeader: Verify phone
Subject: Verify phone
- Greeting: Hello {{.FirstName}} {{.LastName}},
+ Greeting: Hello {{.DisplayName}},
Text: A new phonenumber has been added. Please use the following code to verify it {{.Code}}.
ButtonText: Verify phone
- MessageTextType: DomainClaimed
@@ -634,7 +634,7 @@ DefaultInstance:
Title: Zitadel - Domain has been claimed
PreHeader: Change email / username
Subject: Domain has been claimed
- Greeting: Hello {{.FirstName}} {{.LastName}},
+ Greeting: Hello {{.DisplayName}},
Text: The domain {{.Domain}} has been claimed by an organisation. Your current user {{.UserName}} is not part of this organisation. Therefore you'll have to change your email when you login. We have created a temporary username ({{.TempUsername}}) for this login.
ButtonText: Login
- MessageTextType: PasswordChange
@@ -642,7 +642,7 @@ DefaultInstance:
Title: ZITADEL - Password of user has changed
PreHeader: Change password
Subject: Password of user has changed
- Greeting: Hello {{.FirstName}} {{.LastName}},
+ Greeting: Hello {{.DisplayName}},
Text: The password of your user has changed. If this change was not done by you, please be advised to immediately reset your password.
ButtonText: Login
diff --git a/console/src/app/modules/accounts-card/accounts-card.component.html b/console/src/app/modules/accounts-card/accounts-card.component.html
index 7780fd323f..b4a9439c36 100644
--- a/console/src/app/modules/accounts-card/accounts-card.component.html
+++ b/console/src/app/modules/accounts-card/accounts-card.component.html
@@ -1,16 +1,12 @@
diff --git a/console/src/app/modules/contributors/contributors.component.html b/console/src/app/modules/contributors/contributors.component.html
index 58d6f6355a..0ef25b708c 100644
--- a/console/src/app/modules/contributors/contributors.component.html
+++ b/console/src/app/modules/contributors/contributors.component.html
@@ -13,10 +13,10 @@
data-e2e="member-avatar"
>
diff --git a/console/src/app/modules/contributors/contributors.component.ts b/console/src/app/modules/contributors/contributors.component.ts
index d0dd487fd8..bdb3fe4540 100644
--- a/console/src/app/modules/contributors/contributors.component.ts
+++ b/console/src/app/modules/contributors/contributors.component.ts
@@ -2,6 +2,7 @@ import { animate, animateChild, keyframes, query, stagger, style, transition, tr
import { Component, EventEmitter, Input, Output } from '@angular/core';
import { BehaviorSubject } from 'rxjs';
import { Member } from 'src/app/proto/generated/zitadel/member_pb';
+import { Type } from 'src/app/proto/generated/zitadel/user_pb';
@Component({
selector: 'cnsl-contributors',
@@ -36,6 +37,8 @@ export class ContributorsComponent {
@Output() showDetailClicked: EventEmitter = new EventEmitter();
@Output() refreshClicked: EventEmitter = new EventEmitter();
+ public UserType: any = Type;
+
public emitAddMember(): void {
this.addClicked.emit();
}
diff --git a/console/src/app/modules/header/header.component.html b/console/src/app/modules/header/header.component.html
index d9043c1381..de31e202eb 100644
--- a/console/src/app/modules/header/header.component.html
+++ b/console/src/app/modules/header/header.component.html
@@ -197,9 +197,7 @@
-
+
diff --git a/console/src/app/modules/members-table/members-table.component.html b/console/src/app/modules/members-table/members-table.component.html
index f49008dc5d..f92b598674 100644
--- a/console/src/app/modules/members-table/members-table.component.html
+++ b/console/src/app/modules/members-table/members-table.component.html
@@ -36,7 +36,7 @@
[checked]="selection.isSelected(row)"
>
= new Subject();
public displayedColumns: string[] = ['select', 'userId', 'displayName', 'loginname', 'email', 'roles'];
+ public UserType: any = Type;
constructor(private dialog: MatDialog) {
this.selection.changed.pipe(takeUntil(this.destroyed)).subscribe((_) => {
diff --git a/console/src/app/modules/search-user-autocomplete/search-user-autocomplete.component.html b/console/src/app/modules/search-user-autocomplete/search-user-autocomplete.component.html
index 6d725ed13c..6662b786cc 100644
--- a/console/src/app/modules/search-user-autocomplete/search-user-autocomplete.component.html
+++ b/console/src/app/modules/search-user-autocomplete/search-user-autocomplete.component.html
@@ -2,14 +2,7 @@
diff --git a/console/src/app/pages/users/user-list/user-table/user-table.component.html b/console/src/app/pages/users/user-list/user-table/user-table.component.html
index 034482d98f..347b738e99 100644
--- a/console/src/app/pages/users/user-list/user-table/user-table.component.html
+++ b/console/src/app/pages/users/user-list/user-table/user-table.component.html
@@ -92,17 +92,11 @@
[checked]="selection.isSelected(user)"
>
diff --git a/internal/api/grpc/auth/user_grant.go b/internal/api/grpc/auth/user_grant.go
index 7816e66476..242a54b044 100644
--- a/internal/api/grpc/auth/user_grant.go
+++ b/internal/api/grpc/auth/user_grant.go
@@ -5,6 +5,7 @@ import (
"github.com/zitadel/zitadel/internal/api/authz"
"github.com/zitadel/zitadel/internal/api/grpc/object"
+ "github.com/zitadel/zitadel/internal/api/grpc/user"
"github.com/zitadel/zitadel/internal/query"
auth_pb "github.com/zitadel/zitadel/pkg/grpc/auth"
)
@@ -53,5 +54,6 @@ func UserGrantToPb(grant *query.UserGrant) *auth_pb.UserGrant {
ProjectName: grant.ProjectName,
ProjectGrantId: grant.GrantID,
RoleKeys: grant.Roles,
+ UserType: user.TypeToPb(grant.UserType),
}
}
diff --git a/internal/api/grpc/member/converter.go b/internal/api/grpc/member/converter.go
index df53409aa5..a62e2c3238 100644
--- a/internal/api/grpc/member/converter.go
+++ b/internal/api/grpc/member/converter.go
@@ -2,6 +2,7 @@ package member
import (
"github.com/zitadel/zitadel/internal/api/grpc/object"
+ "github.com/zitadel/zitadel/internal/api/grpc/user"
"github.com/zitadel/zitadel/internal/domain"
"github.com/zitadel/zitadel/internal/errors"
"github.com/zitadel/zitadel/internal/query"
@@ -33,6 +34,7 @@ func MemberToPb(assetAPIPrefix string, m *query.Member) *member_pb.Member {
LastName: m.LastName,
DisplayName: m.DisplayName,
AvatarUrl: domain.AvatarURL(assetAPIPrefix, m.ResourceOwner, m.AvatarURL),
+ UserType: user.TypeToPb(m.UserType),
Details: object.ToViewDetailsPb(
m.Sequence,
m.CreationDate,
diff --git a/internal/api/grpc/user/converter.go b/internal/api/grpc/user/converter.go
index 9d0cadd993..6b56ad6632 100644
--- a/internal/api/grpc/user/converter.go
+++ b/internal/api/grpc/user/converter.go
@@ -254,3 +254,16 @@ func ExternalIDPViewsToExternalIDPs(externalIDPs []*query.IDPUserLink) []*domain
}
return idps
}
+
+func TypeToPb(userType domain.UserType) user_pb.Type {
+ switch userType {
+ case domain.UserTypeHuman:
+ return user_pb.Type_TYPE_HUMAN
+ case domain.UserTypeMachine:
+ return user_pb.Type_TYPE_MACHINE
+ case domain.UserTypeUnspecified:
+ return user_pb.Type_TYPE_UNSPECIFIED
+ default:
+ return user_pb.Type_TYPE_UNSPECIFIED
+ }
+}
diff --git a/internal/api/grpc/user/user_grant.go b/internal/api/grpc/user/user_grant.go
index 42292966bf..52d75326ea 100644
--- a/internal/api/grpc/user/user_grant.go
+++ b/internal/api/grpc/user/user_grant.go
@@ -38,6 +38,7 @@ func UserGrantToPb(assetPrefix string, grant *query.UserGrant) *user_pb.UserGran
ProjectName: grant.ProjectName,
AvatarUrl: domain.AvatarURL(assetPrefix, grant.UserResourceOwner, grant.AvatarURL),
PreferredLoginName: grant.PreferredLoginName,
+ UserType: TypeToPb(grant.UserType),
Details: object.ToViewDetailsPb(
grant.Sequence,
grant.CreationDate,
diff --git a/internal/command/user_human.go b/internal/command/user_human.go
index d11a793b8e..3d55ccf53e 100644
--- a/internal/command/user_human.go
+++ b/internal/command/user_human.go
@@ -272,7 +272,15 @@ func (h *AddHuman) ensureDisplayName() {
if strings.TrimSpace(h.DisplayName) != "" {
return
}
- h.DisplayName = h.FirstName + " " + h.LastName
+ if strings.TrimSpace(h.FirstName) != "" && strings.TrimSpace(h.LastName) != "" {
+ h.DisplayName = h.FirstName + " " + h.LastName
+ return
+ }
+ if strings.TrimSpace(string(h.Email.Address)) != "" {
+ h.DisplayName = string(h.Email.Address)
+ return
+ }
+ h.DisplayName = h.Username
}
// shouldAddInitCode returns true for all added Humans which:
@@ -464,7 +472,7 @@ func (c *Commands) createHuman(ctx context.Context, orgID string, human *domain.
human.AggregateID = userID
}
- human.SetNamesAsDisplayname()
+ human.EnsureDisplayName()
if human.Password != nil {
if err := human.HashPasswordIfExisting(pwPolicy, c.userPasswordAlg, human.Password.ChangeRequired); err != nil {
return nil, nil, err
diff --git a/internal/domain/human.go b/internal/domain/human.go
index 677842d6aa..188a0813c8 100644
--- a/internal/domain/human.go
+++ b/internal/domain/human.go
@@ -1,6 +1,7 @@
package domain
import (
+ "strings"
"time"
"github.com/zitadel/zitadel/internal/crypto"
@@ -89,10 +90,16 @@ func (u *Human) CheckDomainPolicy(policy *DomainPolicy) error {
return nil
}
-func (u *Human) SetNamesAsDisplayname() {
+func (u *Human) EnsureDisplayName() {
if u.Profile != nil && u.DisplayName == "" && u.FirstName != "" && u.LastName != "" {
u.DisplayName = u.FirstName + " " + u.LastName
+ return
}
+ if u.Email != nil && strings.TrimSpace(string(u.Email.EmailAddress)) != "" {
+ u.DisplayName = string(u.Email.EmailAddress)
+ return
+ }
+ u.DisplayName = u.Username
}
func (u *Human) HashPasswordIfExisting(policy *PasswordComplexityPolicy, passwordAlg crypto.HashAlgorithm, onetime bool) error {
diff --git a/internal/notification/static/i18n/de.yaml b/internal/notification/static/i18n/de.yaml
index 332528ffe6..fca2f04f2d 100644
--- a/internal/notification/static/i18n/de.yaml
+++ b/internal/notification/static/i18n/de.yaml
@@ -2,48 +2,48 @@ InitCode:
Title: ZITADEL - User initialisieren
PreHeader: User initialisieren
Subject: User initialisieren
- Greeting: Hallo {{.FirstName}} {{.LastName}},
+ Greeting: Hallo {{.DisplayName}},
Text: Dieser Benutzer wurde soeben in ZITADEL erstellt. Mit dem Benutzernamen <br><strong>{{.PreferredLoginName}}</strong><br> kannst du dich anmelden. Nutze den untenstehenden Button, um die Initialisierung abzuschliessen <br>(Code <strong>{{.Code}}</strong>).<br> Falls du dieses Mail nicht angefordert hast, kannst du es einfach ignorieren.
ButtonText: Initialisierung abschliessen
PasswordReset:
Title: ZITADEL - Passwort zurücksetzen
PreHeader: Passwort zurücksetzen
Subject: Passwort zurücksetzen
- Greeting: Hallo {{.FirstName}} {{.LastName}},
+ Greeting: Hallo {{.DisplayName}},
Text: Wir haben eine Anfrage für das Zurücksetzen deines Passwortes bekommen. Du kannst den untenstehenden Button verwenden, um dein Passwort zurückzusetzen <br>(Code <strong>{{.Code}}</strong>).<br> Falls du dieses Mail nicht angefordert hast, kannst du es ignorieren.
ButtonText: Passwort zurücksetzen
VerifyEmail:
Title: ZITADEL - Email verifizieren
PreHeader: Email verifizieren
Subject: Email verifizieren
- Greeting: Hallo {{.FirstName}} {{.LastName}},
+ Greeting: Hallo {{.DisplayName}},
Text: Eine neue E-Mail Adresse wurde hinzugefügt. Bitte verwende den untenstehenden Button um diese zu verifizieren <br>(Code <strong>{{.Code}}</strong>).<br> Falls du deine E-Mail Adresse nicht selber hinzugefügt hast, kannst du dieses E-Mail ignorieren.
ButtonText: Email verifizieren
VerifyPhone:
Title: ZITADEL - Telefonnummer verifizieren
PreHeader: Telefonnummer verifizieren
Subject: Telefonnummer verifizieren
- Greeting: Hallo {{.FirstName}} {{.LastName}},
+ Greeting: Hallo {{.DisplayName}},
Text: Eine Telefonnummer wurde hinzugefügt. Bitte verifiziere diese in dem du folgenden Code eingibst<br>(Code <strong>{{.Code}}</strong>).<br>
ButtonText: Telefon verifizieren
DomainClaimed:
Title: ZITADEL - Domain wurde beansprucht
PreHeader: Email / Username ändern
Subject: Domain wurde beansprucht
- Greeting: Hallo {{.FirstName}} {{.LastName}},
+ Greeting: Hallo {{.DisplayName}},
Text: Die Domain {{.Domain}} wurde von einer Organisation beansprucht. Dein derzeitiger User {{.Username}} ist nicht Teil dieser Organisation. Daher musst du beim nächsten Login eine neue Email hinterlegen. Für diesen Login haben wir dir einen temporären Usernamen ({{.TempUsername}}) erstellt.
ButtonText: Login
PasswordlessRegistration:
Title: ZITADEL - Passwortlosen Login hinzufügen
PreHeader: Passwortlosen Login hinzufügen
Subject: Passwortlosen Login hinzufügen
- Greeting: Hallo {{.FirstName}} {{.LastName}},
+ Greeting: Hallo {{.DisplayName}},
Text: Wir haben eine Anfrage für das Hinzufügen eines Token für den passwortlosen Login erhalten. Du kannst den untenstehenden Button verwenden, um dein Token oder Gerät hinzuzufügen.
ButtonText: Passwortlosen Login hinzufügen
PasswordChange:
Title: ZITADEL - Passwort von Benutzer wurde geändert
PreHeader: Passwort Änderung
Subject: Passwort von Benutzer wurde geändert
- Greeting: Hallo {{.FirstName}} {{.LastName}},
+ Greeting: Hallo {{.DisplayName}},
Text: Das Password vom Benutzer wurde geändert, wenn diese Änderung von jemand anderem gemacht wurde, empfehlen wir die sofortige Zurücksetzung ihres Passworts.
- ButtonText: Login
\ No newline at end of file
+ ButtonText: Login
diff --git a/internal/notification/static/i18n/en.yaml b/internal/notification/static/i18n/en.yaml
index 0608fdbd8b..e5a68e29f2 100644
--- a/internal/notification/static/i18n/en.yaml
+++ b/internal/notification/static/i18n/en.yaml
@@ -2,48 +2,48 @@ InitCode:
Title: ZITADEL - Initialize User
PreHeader: Initialize User
Subject: Initialize User
- Greeting: Hello {{.FirstName}} {{.LastName}},
+ Greeting: Hello {{.DisplayName}},
Text: This user was created in ZITADEL. Use the username {{.PreferredLoginName}} to login. Please click the button below to finish the initialization process. (Code {{.Code}}) If you didn't ask for this mail, please ignore it.
ButtonText: Finish initialization
PasswordReset:
Title: ZITADEL - Reset password
PreHeader: Reset password
Subject: Reset password
- Greeting: Hello {{.FirstName}} {{.LastName}},
+ Greeting: Hello {{.DisplayName}},
Text: We received a password reset request. Please use the button below to reset your password. (Code {{.Code}}) If you didn't ask for this mail, please ignore it.
ButtonText: Reset password
VerifyEmail:
Title: ZITADEL - Verify email
PreHeader: Verify email
Subject: Verify email
- Greeting: Hello {{.FirstName}} {{.LastName}},
+ Greeting: Hello {{.DisplayName}},
Text: A new email has been added. Please use the button below to verify your mail. (Code {{.Code}}) If you didn't add a new email, please ignore this email.
ButtonText: Verify email
VerifyPhone:
Title: ZITADEL - Verify phone
PreHeader: Verify phone
Subject: Verify phone
- Greeting: Hello {{.FirstName}} {{.LastName}},
+ Greeting: Hello {{.DisplayName}},
Text: A new phone number has been added. Please use the following code to verify it {{.Code}}
ButtonText: Verify phone
DomainClaimed:
Title: ZITADEL - Domain has been claimed
PreHeader: Change email / username
Subject: Domain has been claimed
- Greeting: Hello {{.FirstName}} {{.LastName}},
+ Greeting: Hello {{.DisplayName}},
Text: The domain {{.Domain}} has been claimed by an organization. Your current user {{.Username}} is not part of this organization. Therefore you'll have to change your email when you login. We have created a temporary username ({{.TempUsername}}) for this login.
ButtonText: Login
PasswordlessRegistration:
Title: ZITADEL - Add Passwordless Login
PreHeader: Add Passwordless Login
Subject: Add Passwordless Login
- Greeting: Hello {{.FirstName}} {{.LastName}},
+ Greeting: Hello {{.DisplayName}},
Text: We received a request to add a token for passwordless login. Please use the button below to add your token or device for passwordless login.
ButtonText: Add Passwordless Login
PasswordChange:
Title: ZITADEL - Password of user has changed
PreHeader: Change password
Subject: Password of user has changed
- Greeting: Hello {{.FirstName}} {{.LastName}},
+ Greeting: Hello {{.DisplayName}},
Text: The password of your user has changed, if this change was not done by you, please be advised to immediately reset your password.
- ButtonText: Login
\ No newline at end of file
+ ButtonText: Login
diff --git a/internal/notification/static/i18n/fr.yaml b/internal/notification/static/i18n/fr.yaml
index 4bf7d2eb3c..a80e2350fe 100644
--- a/internal/notification/static/i18n/fr.yaml
+++ b/internal/notification/static/i18n/fr.yaml
@@ -2,48 +2,48 @@ InitCode:
Title: ZITADEL - Initialiser l'utilisateur
PreHeader: Initialiser l'utilisateur
Subject: Initialiser l'utilisateur
- Greeting: Bonjour {{.FirstName}} {{.LastName}},
+ Greeting: Bonjour {{.DisplayName}},
Text: Cet utilisateur a été créé dans ZITADEL. Utilisez le nom d'utilisateur {{.PreferredLoginName}} pour vous connecter. Veuillez cliquer sur le bouton ci-dessous pour terminer le processus d'initialisation. (Code {{.Code}}) Si vous n'avez pas demandé ce courrier, veuillez l'ignorer.
ButtonText: Terminer l'initialisation
PasswordReset:
Title: ZITADEL - Réinitialiser le mot de passe
PreHeader: Réinitialiser le mot de passe
Subject: Réinitialiser le mot de passe
- Greeting: Bonjour {{.FirstName}} {{.LastName}},
+ Greeting: Bonjour {{.DisplayName}},
Text: Nous avons reçu une demande de réinitialisation du mot de passe. Veuillez utiliser le bouton ci-dessous pour réinitialiser votre mot de passe. (Code {{.Code}}) Si vous n'avez pas demandé cet e-mail, veuillez l'ignorer.
ButtonText: Réinitialiser le mot de passe
VerifyEmail:
Title: ZITADEL - Vérifier l'email
PreHeader: Vérifier l'email
Subject: Vérifier l'email
- Greeting: Bonjour {{.FirstName}} {{.LastName}},
+ Greeting: Bonjour {{.DisplayName}},
Text: Un nouveau courriel a été ajouté. Veuillez utiliser le bouton ci-dessous pour vérifier votre e-mail. (Code {{.Code}}) Si vous n'avez pas ajouté de nouvelle adresse e-mail, veuillez ignorer cet e-mail.
ButtonText: Vérifier l'email
VerifyPhone:
Title: ZITADEL - Vérifier le téléphone
PreHeader: Vérifier le téléphone
Subject: Vérifier le téléphone
- Greeting: Bonjour {{.FirstName}} {{.LastName}},
+ Greeting: Bonjour {{.DisplayName}},
Text: Un nouveau numéro de téléphone a été ajouté. Veuillez utiliser le code suivant pour le vérifier {{.Code}}
ButtonText: Vérifier le téléphone
DomainClaimed:
Title: ZITADEL - Le domaine a été réclamé
PreHeader: Modifier l'email / le nom d'utilisateur
Subject: Le domaine a été réclamé
- Greeting: Bonjour {{.FirstName}} {{.LastName}},
+ Greeting: Bonjour {{.DisplayName}},
Text: Le domaine {{.Domain}} a été revendiqué par une organisation. Votre utilisateur actuel {{.Username}} ne fait pas partie de cette organisation. Par conséquent, vous devrez changer votre adresse électronique lors de votre connexion. Nous avons créé un nom d'utilisateur temporaire ({{.TempUsername}}) pour cette connexion.
ButtonText: Connexion
PasswordlessRegistration:
Title: ZITADEL - Ajouter une connexion sans mot de passe
PreHeader: Ajouter une connexion sans mot de passe
Subject: Ajouter une connexion sans mot de passe
- Greeting: Bonjour {{.FirstName}} {{.LastName}},
+ Greeting: Bonjour {{.DisplayName}},
Text: Nous avons reçu une demande d'ajout d'un jeton pour la connexion sans mot de passe. Veuillez utiliser le bouton ci-dessous pour ajouter votre jeton ou dispositif pour la connexion sans mot de passe.
ButtonText: Ajouter une connexion sans mot de passe
PasswordChange:
Title: ZITADEL - Le mot de passe de l'utilisateur a changé
PreHeader: Modifier le mot de passe
Subject: Le mot de passe de l'utilisateur a changé
- Greeting: Bonjour {{.FirstName}} {{.LastName}},
+ Greeting: Bonjour {{.DisplayName}},
Text: Le mot de passe de votre utilisateur a changé, si ce changement n'a pas été fait par vous, nous vous conseillons de réinitialiser immédiatement votre mot de passe.
ButtonText: Login
diff --git a/internal/notification/static/i18n/it.yaml b/internal/notification/static/i18n/it.yaml
index 97b541d8b2..599228358d 100644
--- a/internal/notification/static/i18n/it.yaml
+++ b/internal/notification/static/i18n/it.yaml
@@ -2,48 +2,48 @@ InitCode:
Title: ZITADEL - Inizializzare l'utente
PreHeader: Inizializzare l'utente
Subject: Inizializzare l'utente
- Greeting: 'Ciao {{.FirstName}} {{.LastName}},'
+ Greeting: 'Ciao {{.DisplayName}},'
Text: Questo utente è stato creato in ZITADEL. Usa il nome utente {{.PreferredLoginName}} per accedere. Per favore, clicca il pulsante per finire il processo di inizializzazione. (Codice {{.Codice}}) Se non hai richiesto questa mail, per favore ignorala.
ButtonText: Termina
PasswordReset:
Title: ZITADEL - Ripristina la password
PreHeader: Ripristina la password
Subject: Ripristina la password
- Greeting: 'Ciao {{.FirstName}} {{.LastName}},'
+ Greeting: 'Ciao {{.DisplayName}},'
Text: Abbiamo ricevuto una richiesta di reimpostazione della password. Per favore clicca il pulsante per resettare la tua password. (Codice {{.Codice}}) Se non hai richiesto questa mail, ignorala.
ButtonText: Ripristina
VerifyEmail:
Title: ZITADEL - Verifica l'e-mail
PreHeader: Verifica l'e-mail
Subject: Verifica l'e-mail
- Greeting: 'Ciao {{.FirstName}} {{.LastName}},'
+ Greeting: 'Ciao {{.DisplayName}},'
Text: È stata aggiunta una nuova email. Per favore fai clic sul pulsante per verificare la tua mail. (Codice {{.Codice}}) Se non hai aggiunto una nuova email, ignora questa email.
ButtonText: Verifica
VerifyPhone:
Title: ZITADEL - Verifica il telefono
PreHeader: Verifica il telefono
Subject: Verifica il telefono
- Greeting: 'Ciao {{.FirstName}} {{.LastName}},'
+ Greeting: 'Ciao {{.DisplayName}},'
Text: È stato aggiunto un nuovo numero di telefono. Usa il seguente codice per verificarlo {{.Code}}
ButtonText: Verifica
DomainClaimed:
Title: ZITADEL - Il dominio è stato rivendicato
PreHeader: Cambiare email / nome utente
Subject: Il dominio è stato rivendicato
- Greeting: 'Ciao {{.FirstName}} {{.LastName}},'
+ Greeting: 'Ciao {{.DisplayName}},'
Text: Il dominio {{.Domain}} è stato rivendicato da un'organizzazione. Il tuo attuale utente {{.Username}} non fa parte di questa organizzazione. Perciò dovrai cambiare la tua email quando farai il login. Abbiamo creato un nome utente temporaneo ({{.TempUsername}}) per questo login.
ButtonText: Accedi
PasswordlessRegistration:
Title: ZITADEL - Aggiungere autenticazione passwordless
PreHeader: Aggiungi l'autenticazione passwordless
Subject: Aggiungi l'autenticazione passwordless
- Greeting: 'Ciao {{.FirstName}} {{.LastName}},'
+ Greeting: 'Ciao {{.DisplayName}},'
Text: Abbiamo ricevuto una richiesta per aggiungere l'autenticazione passwordless. Usa il pulsante qui sotto per aggiungere il tuo token o dispositivo per il login senza password.
ButtonText: Attiva passwordless
PasswordChange:
Title: ZITADEL - La password dell'utente è stata modificata
PreHeader: Modifica della password
Subject: La password dell'utente è stata modificata
- Greeting: Ciao {{.FirstName}} {{.LastName}},
+ Greeting: Ciao {{.DisplayName}},
Text: La password del vostro utente è cambiata; se questa modifica non è stata fatta da voi, vi consigliamo di reimpostare immediatamente la vostra password.
- ButtonText: Login
\ No newline at end of file
+ ButtonText: Login
diff --git a/internal/notification/static/i18n/ja.yaml b/internal/notification/static/i18n/ja.yaml
index fdc0386ac7..c1e37eb721 100644
--- a/internal/notification/static/i18n/ja.yaml
+++ b/internal/notification/static/i18n/ja.yaml
@@ -2,48 +2,48 @@ InitCode:
Title: ZITADEL - ユーザーの初期セットアップ
PreHeader: ユーザーの初期セットアップ
Subject: ユーザーの初期セットアップ
- Greeting: こんにちは {{.LastName}} {{.FirstName}} さん、
+ Greeting: こんにちは {{.DisplayName}} さん、
Text: このユーザーはZITADELで作成されました。ユーザー名 {{.PreferredLoginName}} を使用してログインします。以下のボタンから、初期セットアップを完了してください。(コード {{.Code}})このメールの受信を希望していない場合は、無視してください。
ButtonText: 初期セットアップを完了する
PasswordReset:
Title: ZITADEL - パスワードをリセットします
PreHeader: パスワードの再設定
Subject: パスワードの再設定
- Greeting: こんにちは {{.LastName}} {{.FirstName}} さん、
+ Greeting: こんにちは {{.DisplayName}} さん、
Text: パスワードリセットのリクエストを受け取りました。以下のボタンから、パスワードをリセットしてください。(コード {{.Code}})このメールの受信を希望していない場合は、無視してください。
ButtonText: パスワードを再設定
VerifyEmail:
Title: ZITADEL - メールアドレスの認証
PreHeader: メールアドレスの認証
Subject: メールアドレスの認証
- Greeting: こんにちは {{.LastName}} {{.FirstName}} さん、
+ Greeting: こんにちは {{.DisplayName}} さん、
Text: 新しいメールアドレスが追加されました。以下のボタンから、メールアドレスを認証してください。(コード {{.Code}})新しいメールアドレスを追加していない場合は、このメールを無視してください。
ButtonText: メールアドレスを認証
VerifyPhone:
Title: ZITADEL - 電話番号の認証
PreHeader: 電話番号の認証
Subject: 電話番号の認証
- Greeting: こんにちは {{.LastName}} {{.FirstName}} さん、
+ Greeting: こんにちは {{.DisplayName}} さん、
Text: 新しい電話番号が追加されました。次のコードを使用してを認証してください {{.Code}}
ButtonText: 電話番号を認証
DomainClaimed:
Title: ZITADEL - ドメインの登録
PreHeader: メールアドレス・ユーザー名の変更
Subject: ドメインの登録
- Greeting: こんにちは {{.LastName}} {{.FirstName}} さん、
+ Greeting: こんにちは {{.DisplayName}} さん、
Text: ドメイン {{.Domain}} が組織によって登録されました。現在のユーザー {{.Username}} はこの組織のメンバーでないため、ログイン時にメールアドレスを変更する必要があります。一時的なユーザー名({{.TempUsername}})を使用してログインし、設定を進めてください。
ButtonText: ログイン
PasswordlessRegistration:
Title: ZITADEL - パスワードレスログインの追加
PreHeader: パスワードレスログインの追加
Subject: パスワードレスログインの追加
- Greeting: こんにちは {{.LastName}} {{.FirstName}} さん、
+ Greeting: こんにちは {{.DisplayName}} さん、
Text: パスワードレスログイン用のトークンを追加するリクエストを受け取りました。以下のボタンから、パスワードレスログイン用のトークンやデバイスを追加してください。
ButtonText: パスワードレスログインを追加
PasswordChange:
Title: ZITADEL - ユーザーのパスワードが変更されました
PreHeader: パスワードの変更
Subject: ユーザーのパスワードが変更されました
- Greeting: こんにちは {{.LastName}} {{.FirstName}} さん、
+ Greeting: こんにちは {{.DisplayName}} さん、
Text: ユーザーのパスワードが変更されました。この変更があなたによって行われなかった場合は、すぐにパスワードをリセットすることをお勧めします。
ButtonText: ログイン
diff --git a/internal/notification/static/i18n/pl.yaml b/internal/notification/static/i18n/pl.yaml
index 1474c16f6d..16debb2a84 100644
--- a/internal/notification/static/i18n/pl.yaml
+++ b/internal/notification/static/i18n/pl.yaml
@@ -2,48 +2,48 @@ InitCode:
Title: ZITADEL - Inicjalizacja użytkownika
PreHeader: Inicjalizacja użytkownika
Subject: Inicjalizacja użytkownika
- Greeting: Witaj {{.FirstName}} {{.LastName}},
+ Greeting: Witaj {{.DisplayName}},
Text: Ten użytkownik został utworzony w ZITADEL. Aby się zalogować, użyj nazwy użytkownika {{.PreferredLoginName}}. Kliknij poniższy przycisk, aby zakończyć proces inicjalizacji. (Kod {{.Code}}) Jeśli nie wystąpiła prośba o ten e-mail, proszę go zignorować.
ButtonText: Zakończ inicjalizację
PasswordReset:
Title: ZITADEL - Resetowanie hasła
PreHeader: Resetowanie hasła
Subject: Resetowanie hasła
- Greeting: Witaj {{.FirstName}} {{.LastName}},
+ Greeting: Witaj {{.DisplayName}},
Text: Otrzymaliśmy prośbę o resetowanie hasła. Kliknij poniższy przycisk, aby zresetować swoje hasło. (Kod {{.Code}}) Jeśli nie wystąpiła prośba o ten e-mail, proszę go zignorować.
ButtonText: Zresetuj hasło
VerifyEmail:
Title: ZITADEL - Weryfikacja adresu e-mail
PreHeader: Weryfikacja adresu e-mail
Subject: Weryfikacja adresu e-mail
- Greeting: Witaj {{.FirstName}} {{.LastName}},
+ Greeting: Witaj {{.DisplayName}},
Text: Został dodany nowy adres e-mail. Użyj poniższego przycisku, aby zweryfikować swój adres e-mail. (Kod {{.Code}}) Jeśli nie dodałeś nowego adresu e-mail, proszę zignoruj ten e-mail.
ButtonText: Zweryfikuj adres e-mail
VerifyPhone:
Title: ZITADEL - Weryfikacja numeru telefonu
PreHeader: Weryfikacja numeru telefonu
Subject: Weryfikacja numeru telefonu
- Greeting: Witaj {{.FirstName}} {{.LastName}},
+ Greeting: Witaj {{.DisplayName}},
Text: Został dodany nowy numer telefonu. Użyj następującego kodu, aby go zweryfikować {{.Code}}
ButtonText: Zweryfikuj numer telefonu
DomainClaimed:
Title: ZITADEL - Domena została zarejestrowana
PreHeader: Zmiana adresu e-mail / nazwy użytkownika
Subject: Domena została zarejestrowana
- Greeting: Witaj {{.FirstName}} {{.LastName}},
+ Greeting: Witaj {{.DisplayName}},
Text: Domena {{.Domain}} została zarejestrowana przez organizację. Twój obecny użytkownik {{.Username}} nie jest członkiem tej organizacji. Dlatego będziesz musiał zmienić swój adres e-mail podczas logowania. Stworzyliśmy tymczasową nazwę użytkownika ({{.TempUsername}}) dla tego logowania.
ButtonText: Zaloguj się
PasswordlessRegistration:
Title: ZITADEL - Dodaj logowanie bez hasła
PreHeader: Dodaj logowanie bez hasła
Subject: Dodaj logowanie bez hasła
- Greeting: Witaj {{.FirstName}} {{.LastName}},
+ Greeting: Witaj {{.DisplayName}},
Text: Otrzymaliśmy prośbę o dodanie tokenu do logowania bez hasła. Użyj poniższego przycisku, aby dodać swój token lub urządzenie do logowania bez hasła.
ButtonText: Dodaj logowanie bez hasła
PasswordChange:
Title: ZITADEL - Hasło użytkownika zostało zmienione
PreHeader: Zmiana hasła
Subject: Hasło użytkownika zostało zmienione
- Greeting: Witaj {{.FirstName}} {{.LastName}},
+ Greeting: Witaj {{.DisplayName}},
Text: Hasło Twojego użytkownika zostało zmienione, jeśli ta zmiana nie została dokonana przez Ciebie, zalecamy natychmiastowe zresetowanie hasła.
ButtonText: Zaloguj się
diff --git a/internal/notification/static/i18n/zh.yaml b/internal/notification/static/i18n/zh.yaml
index e3f9907596..ce76a153cb 100644
--- a/internal/notification/static/i18n/zh.yaml
+++ b/internal/notification/static/i18n/zh.yaml
@@ -2,48 +2,48 @@ InitCode:
Title: ZITADEL - 初始化用户
PreHeader: 初始化用户
Subject: 初始化用户
- Greeting: 你好 {{.FirstName}} {{.LastName}},
+ Greeting: 你好 {{.DisplayName}},
Text: 此用户是在 ZITADEL 中创建的。使用用户名 {{.PreferredLoginName}} 登录。请单击下面的按钮完成初始化过程。(代码 {{.Code}})如果不是您本人操作,请忽略它。
ButtonText: 完成初始化
PasswordReset:
Title: ZITADEL - 重置密码
PreHeader: 重置密码
Subject: 重置密码
- Greeting: 你好 {{.FirstName}} {{.LastName}},
+ Greeting: 你好 {{.DisplayName}},
Text: 我们收到了密码重置请求。请使用下面的按钮重置您的密码。(验证码 {{.Code}})如果不是您本人操作,请忽略它。
ButtonText: 重置密码
VerifyEmail:
Title: ZITADEL - 验证电子邮箱
PreHeader: 验证电子邮箱
Subject: 验证电子邮箱
- Greeting: 你好 {{.FirstName}} {{.LastName}},
+ Greeting: 你好 {{.DisplayName}},
Text: 已添加新电子邮件。请使用下面的按钮来验证您的邮件。(验证码 {{.Code}})如果不是您本人操作,请忽略此电子邮件。
ButtonText: 验证电子邮箱
VerifyPhone:
Title: ZITADEL - 验证手机号码
PreHeader: 验证手机号码
Subject: 验证手机号码
- Greeting: 你好 {{.FirstName}} {{.LastName}},
+ Greeting: 你好 {{.DisplayName}},
Text: 您的用户中添加了一个新的手机号码,请使用以下验证码进行验证 {{.Code}}
ButtonText: 验证手机号码
DomainClaimed:
Title: ZITADEL - 域名所有权验证
PreHeader: 更改电子邮件/用户名
Subject: 域名所有权验证
- Greeting: 你好 {{.FirstName}} {{.LastName}},
+ Greeting: 你好 {{.DisplayName}},
Text: 域 {{.Domain}} 已被组织使用。您当前的用户 {{.Username}} 不属于此组织。因此,您必须在登录时更改您的电子邮件。我们为此登录创建了一个临时用户名 ({{.TempUsername}})。
ButtonText: 登录
PasswordlessRegistration:
Title: ZITADEL - 添加无密码登录
PreHeader: 添加无密码登录
Subject: 添加无密码登录
- Greeting: 你好 {{.FirstName}} {{.LastName}},
+ Greeting: 你好 {{.DisplayName}},
Text: 我们收到了为无密码登录添加令牌的请求。请使用下面的按钮添加您的令牌或设备以进行无密码登录。
ButtonText: 添加无密码登录
PasswordChange:
Title: ZITADEL - 用户的密码已经改变
PreHeader: 更改密码
Subject: 用户的密码已经改变
- Greeting: 你好 {{.FirstName}} {{.LastName}},
+ Greeting: 你好 {{.DisplayName}},
Text: 您的用户的密码已经改变,如果这个改变不是由您做的,请注意立即重新设置您的密码。
ButtonText: 登录
diff --git a/internal/query/iam_member.go b/internal/query/iam_member.go
index 38bbe13fc5..ae8e601ab8 100644
--- a/internal/query/iam_member.go
+++ b/internal/query/iam_member.go
@@ -8,6 +8,7 @@ import (
"github.com/zitadel/zitadel/internal/api/authz"
"github.com/zitadel/zitadel/internal/api/call"
+ "github.com/zitadel/zitadel/internal/domain"
"github.com/zitadel/zitadel/internal/errors"
"github.com/zitadel/zitadel/internal/query/projection"
"github.com/zitadel/zitadel/internal/telemetry/tracing"
@@ -122,10 +123,12 @@ func prepareInstanceMembersQuery(ctx context.Context, db prepareDatabase) (sq.Se
HumanDisplayNameCol.identifier(),
MachineNameCol.identifier(),
HumanAvatarURLCol.identifier(),
+ UserTypeCol.identifier(),
countColumn.identifier(),
).From(instanceMemberTable.identifier()).
LeftJoin(join(HumanUserIDCol, InstanceMemberUserID)).
LeftJoin(join(MachineUserIDCol, InstanceMemberUserID)).
+ LeftJoin(join(UserIDCol, InstanceMemberUserID)).
LeftJoin(join(LoginNameUserIDCol, InstanceMemberUserID) + db.Timetravel(call.Took(ctx))).
Where(
sq.Eq{LoginNameIsPrimaryCol.identifier(): true},
@@ -145,6 +148,7 @@ func prepareInstanceMembersQuery(ctx context.Context, db prepareDatabase) (sq.Se
displayName = sql.NullString{}
machineName = sql.NullString{}
avatarURL = sql.NullString{}
+ userType = sql.NullInt32{}
)
err := rows.Scan(
@@ -161,6 +165,7 @@ func prepareInstanceMembersQuery(ctx context.Context, db prepareDatabase) (sq.Se
&displayName,
&machineName,
&avatarURL,
+ &userType,
&count,
)
@@ -179,6 +184,7 @@ func prepareInstanceMembersQuery(ctx context.Context, db prepareDatabase) (sq.Se
} else {
member.DisplayName = machineName.String
}
+ member.UserType = domain.UserType(userType.Int32)
members = append(members, member)
}
diff --git a/internal/query/iam_member_test.go b/internal/query/iam_member_test.go
index 15fd2c16ad..849f420ceb 100644
--- a/internal/query/iam_member_test.go
+++ b/internal/query/iam_member_test.go
@@ -9,6 +9,7 @@ import (
"testing"
"github.com/zitadel/zitadel/internal/database"
+ "github.com/zitadel/zitadel/internal/domain"
)
var (
@@ -26,12 +27,15 @@ var (
", projections.users8_humans.display_name" +
", projections.users8_machines.name" +
", projections.users8_humans.avatar_key" +
+ ", projections.users8.type" +
", COUNT(*) OVER () " +
"FROM projections.instance_members3 AS members " +
"LEFT JOIN projections.users8_humans " +
"ON members.user_id = projections.users8_humans.user_id AND members.instance_id = projections.users8_humans.instance_id " +
"LEFT JOIN projections.users8_machines " +
"ON members.user_id = projections.users8_machines.user_id AND members.instance_id = projections.users8_machines.instance_id " +
+ "LEFT JOIN projections.users8 " +
+ "ON members.user_id = projections.users8.id AND members.instance_id = projections.users8.instance_id " +
"LEFT JOIN projections.login_names2 " +
"ON members.user_id = projections.login_names2.user_id AND members.instance_id = projections.login_names2.instance_id " +
"AS OF SYSTEM TIME '-1 ms' " +
@@ -50,6 +54,7 @@ var (
"display_name",
"name",
"avatar_key",
+ "type",
"count",
}
)
@@ -101,6 +106,7 @@ func Test_IAMMemberPrepares(t *testing.T) {
"display name",
nil,
nil,
+ domain.UserTypeHuman,
},
},
),
@@ -123,6 +129,7 @@ func Test_IAMMemberPrepares(t *testing.T) {
LastName: "last-name",
DisplayName: "display name",
AvatarURL: "",
+ UserType: domain.UserTypeHuman,
},
},
},
@@ -149,6 +156,7 @@ func Test_IAMMemberPrepares(t *testing.T) {
nil,
"machine-name",
nil,
+ domain.UserTypeMachine,
},
},
),
@@ -171,6 +179,7 @@ func Test_IAMMemberPrepares(t *testing.T) {
LastName: "",
DisplayName: "machine-name",
AvatarURL: "",
+ UserType: domain.UserTypeMachine,
},
},
},
@@ -197,6 +206,7 @@ func Test_IAMMemberPrepares(t *testing.T) {
"display name",
nil,
nil,
+ domain.UserTypeHuman,
},
{
testNow,
@@ -212,6 +222,7 @@ func Test_IAMMemberPrepares(t *testing.T) {
nil,
"machine-name",
nil,
+ domain.UserTypeMachine,
},
},
),
@@ -234,6 +245,7 @@ func Test_IAMMemberPrepares(t *testing.T) {
LastName: "last-name",
DisplayName: "display name",
AvatarURL: "",
+ UserType: domain.UserTypeHuman,
},
{
CreationDate: testNow,
@@ -248,6 +260,7 @@ func Test_IAMMemberPrepares(t *testing.T) {
LastName: "",
DisplayName: "machine-name",
AvatarURL: "",
+ UserType: domain.UserTypeMachine,
},
},
},
diff --git a/internal/query/member.go b/internal/query/member.go
index 2ee98a5d57..f2f99ff932 100644
--- a/internal/query/member.go
+++ b/internal/query/member.go
@@ -4,6 +4,7 @@ import (
"time"
"github.com/zitadel/zitadel/internal/database"
+ "github.com/zitadel/zitadel/internal/domain"
"github.com/zitadel/zitadel/internal/query/projection"
sq "github.com/Masterminds/squirrel"
@@ -60,6 +61,7 @@ type Member struct {
LastName string
DisplayName string
AvatarURL string
+ UserType domain.UserType
}
var (
diff --git a/internal/query/org_member.go b/internal/query/org_member.go
index 859bbc0988..91bd2d30f3 100644
--- a/internal/query/org_member.go
+++ b/internal/query/org_member.go
@@ -8,6 +8,7 @@ import (
"github.com/zitadel/zitadel/internal/api/authz"
"github.com/zitadel/zitadel/internal/api/call"
+ "github.com/zitadel/zitadel/internal/domain"
"github.com/zitadel/zitadel/internal/errors"
"github.com/zitadel/zitadel/internal/query/projection"
"github.com/zitadel/zitadel/internal/telemetry/tracing"
@@ -124,10 +125,12 @@ func prepareOrgMembersQuery(ctx context.Context, db prepareDatabase) (sq.SelectB
HumanDisplayNameCol.identifier(),
MachineNameCol.identifier(),
HumanAvatarURLCol.identifier(),
+ UserTypeCol.identifier(),
countColumn.identifier(),
).From(orgMemberTable.identifier()).
LeftJoin(join(HumanUserIDCol, OrgMemberUserID)).
LeftJoin(join(MachineUserIDCol, OrgMemberUserID)).
+ LeftJoin(join(UserIDCol, OrgMemberUserID)).
LeftJoin(join(LoginNameUserIDCol, OrgMemberUserID) + db.Timetravel(call.Took(ctx))).
Where(
sq.Eq{LoginNameIsPrimaryCol.identifier(): true},
@@ -147,6 +150,7 @@ func prepareOrgMembersQuery(ctx context.Context, db prepareDatabase) (sq.SelectB
displayName = sql.NullString{}
machineName = sql.NullString{}
avatarURL = sql.NullString{}
+ userType = sql.NullInt32{}
)
err := rows.Scan(
@@ -163,6 +167,7 @@ func prepareOrgMembersQuery(ctx context.Context, db prepareDatabase) (sq.SelectB
&displayName,
&machineName,
&avatarURL,
+ &userType,
&count,
)
@@ -181,6 +186,7 @@ func prepareOrgMembersQuery(ctx context.Context, db prepareDatabase) (sq.SelectB
} else {
member.DisplayName = machineName.String
}
+ member.UserType = domain.UserType(userType.Int32)
members = append(members, member)
}
diff --git a/internal/query/org_member_test.go b/internal/query/org_member_test.go
index c8cfd7e3e4..a8bb7739da 100644
--- a/internal/query/org_member_test.go
+++ b/internal/query/org_member_test.go
@@ -9,6 +9,7 @@ import (
"testing"
"github.com/zitadel/zitadel/internal/database"
+ "github.com/zitadel/zitadel/internal/domain"
)
var (
@@ -26,6 +27,7 @@ var (
", projections.users8_humans.display_name" +
", projections.users8_machines.name" +
", projections.users8_humans.avatar_key" +
+ ", projections.users8.type" +
", COUNT(*) OVER () " +
"FROM projections.org_members3 AS members " +
"LEFT JOIN projections.users8_humans " +
@@ -34,6 +36,9 @@ var (
"LEFT JOIN projections.users8_machines " +
"ON members.user_id = projections.users8_machines.user_id " +
"AND members.instance_id = projections.users8_machines.instance_id " +
+ "LEFT JOIN projections.users8 " +
+ "ON members.user_id = projections.users8.id " +
+ "AND members.instance_id = projections.users8.instance_id " +
"LEFT JOIN projections.login_names2 " +
"ON members.user_id = projections.login_names2.user_id " +
"AND members.instance_id = projections.login_names2.instance_id " +
@@ -53,6 +58,7 @@ var (
"display_name",
"name",
"avatar_key",
+ "type",
"count",
}
)
@@ -104,6 +110,7 @@ func Test_OrgMemberPrepares(t *testing.T) {
"display name",
nil,
nil,
+ domain.UserTypeHuman,
},
},
),
@@ -126,6 +133,7 @@ func Test_OrgMemberPrepares(t *testing.T) {
LastName: "last-name",
DisplayName: "display name",
AvatarURL: "",
+ UserType: domain.UserTypeHuman,
},
},
},
@@ -152,6 +160,7 @@ func Test_OrgMemberPrepares(t *testing.T) {
nil,
"machine-name",
nil,
+ domain.UserTypeMachine,
},
},
),
@@ -174,6 +183,7 @@ func Test_OrgMemberPrepares(t *testing.T) {
LastName: "",
DisplayName: "machine-name",
AvatarURL: "",
+ UserType: domain.UserTypeMachine,
},
},
},
@@ -200,6 +210,7 @@ func Test_OrgMemberPrepares(t *testing.T) {
"display name",
nil,
nil,
+ domain.UserTypeHuman,
},
{
testNow,
@@ -215,6 +226,7 @@ func Test_OrgMemberPrepares(t *testing.T) {
nil,
"machine-name",
nil,
+ domain.UserTypeMachine,
},
},
),
@@ -237,6 +249,7 @@ func Test_OrgMemberPrepares(t *testing.T) {
LastName: "last-name",
DisplayName: "display name",
AvatarURL: "",
+ UserType: domain.UserTypeHuman,
},
{
CreationDate: testNow,
@@ -251,6 +264,7 @@ func Test_OrgMemberPrepares(t *testing.T) {
LastName: "",
DisplayName: "machine-name",
AvatarURL: "",
+ UserType: domain.UserTypeMachine,
},
},
},
diff --git a/internal/query/project_grant_member.go b/internal/query/project_grant_member.go
index 5e0176207b..0f21679080 100644
--- a/internal/query/project_grant_member.go
+++ b/internal/query/project_grant_member.go
@@ -8,6 +8,7 @@ import (
"github.com/zitadel/zitadel/internal/api/authz"
"github.com/zitadel/zitadel/internal/api/call"
+ "github.com/zitadel/zitadel/internal/domain"
"github.com/zitadel/zitadel/internal/errors"
"github.com/zitadel/zitadel/internal/query/projection"
)
@@ -138,10 +139,12 @@ func prepareProjectGrantMembersQuery(ctx context.Context, db prepareDatabase) (s
HumanDisplayNameCol.identifier(),
MachineNameCol.identifier(),
HumanAvatarURLCol.identifier(),
+ UserTypeCol.identifier(),
countColumn.identifier(),
).From(projectGrantMemberTable.identifier()).
LeftJoin(join(HumanUserIDCol, ProjectGrantMemberUserID)).
LeftJoin(join(MachineUserIDCol, ProjectGrantMemberUserID)).
+ LeftJoin(join(UserIDCol, ProjectGrantMemberUserID)).
LeftJoin(join(LoginNameUserIDCol, ProjectGrantMemberUserID)).
LeftJoin(join(ProjectGrantColumnGrantID, ProjectGrantMemberGrantID) + db.Timetravel(call.Took(ctx))).
Where(
@@ -162,6 +165,7 @@ func prepareProjectGrantMembersQuery(ctx context.Context, db prepareDatabase) (s
displayName = sql.NullString{}
machineName = sql.NullString{}
avatarURL = sql.NullString{}
+ userType = sql.NullInt32{}
)
err := rows.Scan(
@@ -178,6 +182,7 @@ func prepareProjectGrantMembersQuery(ctx context.Context, db prepareDatabase) (s
&displayName,
&machineName,
&avatarURL,
+ &userType,
&count,
)
@@ -196,6 +201,7 @@ func prepareProjectGrantMembersQuery(ctx context.Context, db prepareDatabase) (s
} else {
member.DisplayName = machineName.String
}
+ member.UserType = domain.UserType(userType.Int32)
members = append(members, member)
}
diff --git a/internal/query/project_grant_member_test.go b/internal/query/project_grant_member_test.go
index 8a50d09337..686fe778a6 100644
--- a/internal/query/project_grant_member_test.go
+++ b/internal/query/project_grant_member_test.go
@@ -9,6 +9,7 @@ import (
"testing"
"github.com/zitadel/zitadel/internal/database"
+ "github.com/zitadel/zitadel/internal/domain"
)
var (
@@ -26,6 +27,7 @@ var (
", projections.users8_humans.display_name" +
", projections.users8_machines.name" +
", projections.users8_humans.avatar_key" +
+ ", projections.users8.type" +
", COUNT(*) OVER () " +
"FROM projections.project_grant_members3 AS members " +
"LEFT JOIN projections.users8_humans " +
@@ -34,6 +36,9 @@ var (
"LEFT JOIN projections.users8_machines " +
"ON members.user_id = projections.users8_machines.user_id " +
"AND members.instance_id = projections.users8_machines.instance_id " +
+ "LEFT JOIN projections.users8 " +
+ "ON members.user_id = projections.users8.id " +
+ "AND members.instance_id = projections.users8.instance_id " +
"LEFT JOIN projections.login_names2 " +
"ON members.user_id = projections.login_names2.user_id " +
"AND members.instance_id = projections.login_names2.instance_id " +
@@ -56,6 +61,7 @@ var (
"display_name",
"name",
"avatar_key",
+ "type",
"count",
}
)
@@ -107,6 +113,7 @@ func Test_ProjectGrantMemberPrepares(t *testing.T) {
"display name",
nil,
nil,
+ domain.UserTypeHuman,
},
},
),
@@ -129,6 +136,7 @@ func Test_ProjectGrantMemberPrepares(t *testing.T) {
LastName: "last-name",
DisplayName: "display name",
AvatarURL: "",
+ UserType: domain.UserTypeHuman,
},
},
},
@@ -155,6 +163,7 @@ func Test_ProjectGrantMemberPrepares(t *testing.T) {
nil,
"machine-name",
nil,
+ domain.UserTypeMachine,
},
},
),
@@ -177,6 +186,7 @@ func Test_ProjectGrantMemberPrepares(t *testing.T) {
LastName: "",
DisplayName: "machine-name",
AvatarURL: "",
+ UserType: domain.UserTypeMachine,
},
},
},
@@ -203,6 +213,7 @@ func Test_ProjectGrantMemberPrepares(t *testing.T) {
"display name",
nil,
nil,
+ domain.UserTypeHuman,
},
{
testNow,
@@ -218,6 +229,7 @@ func Test_ProjectGrantMemberPrepares(t *testing.T) {
nil,
"machine-name",
nil,
+ domain.UserTypeMachine,
},
},
),
@@ -240,6 +252,7 @@ func Test_ProjectGrantMemberPrepares(t *testing.T) {
LastName: "last-name",
DisplayName: "display name",
AvatarURL: "",
+ UserType: domain.UserTypeHuman,
},
{
CreationDate: testNow,
@@ -254,6 +267,7 @@ func Test_ProjectGrantMemberPrepares(t *testing.T) {
LastName: "",
DisplayName: "machine-name",
AvatarURL: "",
+ UserType: domain.UserTypeMachine,
},
},
},
diff --git a/internal/query/project_member.go b/internal/query/project_member.go
index 09c8f9e479..15d5f83251 100644
--- a/internal/query/project_member.go
+++ b/internal/query/project_member.go
@@ -8,6 +8,7 @@ import (
"github.com/zitadel/zitadel/internal/api/authz"
"github.com/zitadel/zitadel/internal/api/call"
+ "github.com/zitadel/zitadel/internal/domain"
"github.com/zitadel/zitadel/internal/errors"
"github.com/zitadel/zitadel/internal/query/projection"
"github.com/zitadel/zitadel/internal/telemetry/tracing"
@@ -124,10 +125,12 @@ func prepareProjectMembersQuery(ctx context.Context, db prepareDatabase) (sq.Sel
HumanDisplayNameCol.identifier(),
MachineNameCol.identifier(),
HumanAvatarURLCol.identifier(),
+ UserTypeCol.identifier(),
countColumn.identifier(),
).From(projectMemberTable.identifier()).
LeftJoin(join(HumanUserIDCol, ProjectMemberUserID)).
LeftJoin(join(MachineUserIDCol, ProjectMemberUserID)).
+ LeftJoin(join(UserIDCol, ProjectMemberUserID)).
LeftJoin(join(LoginNameUserIDCol, ProjectMemberUserID) + db.Timetravel(call.Took(ctx))).
Where(
sq.Eq{LoginNameIsPrimaryCol.identifier(): true},
@@ -147,6 +150,7 @@ func prepareProjectMembersQuery(ctx context.Context, db prepareDatabase) (sq.Sel
displayName = sql.NullString{}
machineName = sql.NullString{}
avatarURL = sql.NullString{}
+ userType = sql.NullInt32{}
)
err := rows.Scan(
@@ -163,6 +167,7 @@ func prepareProjectMembersQuery(ctx context.Context, db prepareDatabase) (sq.Sel
&displayName,
&machineName,
&avatarURL,
+ &userType,
&count,
)
@@ -181,6 +186,7 @@ func prepareProjectMembersQuery(ctx context.Context, db prepareDatabase) (sq.Sel
} else {
member.DisplayName = machineName.String
}
+ member.UserType = domain.UserType(userType.Int32)
members = append(members, member)
}
diff --git a/internal/query/project_member_test.go b/internal/query/project_member_test.go
index 960a3c1ce5..fa9181d359 100644
--- a/internal/query/project_member_test.go
+++ b/internal/query/project_member_test.go
@@ -9,6 +9,7 @@ import (
"testing"
"github.com/zitadel/zitadel/internal/database"
+ "github.com/zitadel/zitadel/internal/domain"
)
var (
@@ -26,6 +27,7 @@ var (
", projections.users8_humans.display_name" +
", projections.users8_machines.name" +
", projections.users8_humans.avatar_key" +
+ ", projections.users8.type" +
", COUNT(*) OVER () " +
"FROM projections.project_members3 AS members " +
"LEFT JOIN projections.users8_humans " +
@@ -34,6 +36,9 @@ var (
"LEFT JOIN projections.users8_machines " +
"ON members.user_id = projections.users8_machines.user_id " +
"AND members.instance_id = projections.users8_machines.instance_id " +
+ "LEFT JOIN projections.users8 " +
+ "ON members.user_id = projections.users8.id " +
+ "AND members.instance_id = projections.users8.instance_id " +
"LEFT JOIN projections.login_names2 " +
"ON members.user_id = projections.login_names2.user_id " +
"AND members.instance_id = projections.login_names2.instance_id " +
@@ -53,6 +58,7 @@ var (
"display_name",
"name",
"avatar_key",
+ "type",
"count",
}
)
@@ -104,6 +110,7 @@ func Test_ProjectMemberPrepares(t *testing.T) {
"display name",
nil,
nil,
+ domain.UserTypeHuman,
},
},
),
@@ -126,6 +133,7 @@ func Test_ProjectMemberPrepares(t *testing.T) {
LastName: "last-name",
DisplayName: "display name",
AvatarURL: "",
+ UserType: domain.UserTypeHuman,
},
},
},
@@ -152,6 +160,7 @@ func Test_ProjectMemberPrepares(t *testing.T) {
nil,
"machine-name",
nil,
+ domain.UserTypeMachine,
},
},
),
@@ -174,6 +183,7 @@ func Test_ProjectMemberPrepares(t *testing.T) {
LastName: "",
DisplayName: "machine-name",
AvatarURL: "",
+ UserType: domain.UserTypeMachine,
},
},
},
@@ -200,6 +210,7 @@ func Test_ProjectMemberPrepares(t *testing.T) {
"display name",
nil,
nil,
+ domain.UserTypeHuman,
},
{
testNow,
@@ -215,6 +226,7 @@ func Test_ProjectMemberPrepares(t *testing.T) {
nil,
"machine-name",
nil,
+ domain.UserTypeMachine,
},
},
),
@@ -237,6 +249,7 @@ func Test_ProjectMemberPrepares(t *testing.T) {
LastName: "last-name",
DisplayName: "display name",
AvatarURL: "",
+ UserType: domain.UserTypeHuman,
},
{
CreationDate: testNow,
@@ -251,6 +264,7 @@ func Test_ProjectMemberPrepares(t *testing.T) {
LastName: "",
DisplayName: "machine-name",
AvatarURL: "",
+ UserType: domain.UserTypeMachine,
},
},
},
diff --git a/proto/zitadel/auth.proto b/proto/zitadel/auth.proto
index 2bb8488261..a8e0b38d20 100644
--- a/proto/zitadel/auth.proto
+++ b/proto/zitadel/auth.proto
@@ -1466,6 +1466,11 @@ message UserGrant {
example: "[\"RoleKey1\", \"RoleKey2\"]",
}
];
+ zitadel.user.v1.Type user_type = 12 [
+ (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = {
+ description: "type of the user (human / machine)"
+ }
+ ];
}
message ListMyProjectOrgsRequest {
diff --git a/proto/zitadel/member.proto b/proto/zitadel/member.proto
index 82e99c23fa..940ffcd5a2 100644
--- a/proto/zitadel/member.proto
+++ b/proto/zitadel/member.proto
@@ -1,6 +1,7 @@
syntax = "proto3";
import "zitadel/object.proto";
+import "zitadel/user.proto";
import "validate/validate.proto";
import "protoc-gen-openapiv2/options/annotations.proto";
@@ -57,6 +58,11 @@ message Member {
example: "\"https://api.zitadel.ch/assets/v1/avatar-32432jkh4kj32\"";
}
];
+ zitadel.user.v1.Type user_type = 10 [
+ (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = {
+ description: "type of the user (human / machine)"
+ }
+ ];
}
message SearchQuery {
diff --git a/proto/zitadel/user.proto b/proto/zitadel/user.proto
index 21a8361c71..73cc14f7a7 100644
--- a/proto/zitadel/user.proto
+++ b/proto/zitadel/user.proto
@@ -723,6 +723,11 @@ message UserGrant {
example: "\"gigi@zitadel.com\"";
}
];
+ Type user_type = 19 [
+ (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = {
+ description: "type of the user (human / machine)"
+ }
+ ];
}
enum UserGrantState {