chore(console): remove first and lastName fallback from user (#5629)

* chore(console): remove first and lastName fallback from user

* use display name and ensure it's set without required name fields

* add user type to user grant and memberships responses

* contributor, members

* fix avatar display checks

---------

Co-authored-by: Livio Spring <livio.a@gmail.com>
This commit is contained in:
Max Peintner 2023-04-11 17:56:51 +02:00 committed by GitHub
parent 8bf36301ed
commit 1c1d66cbe8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
37 changed files with 218 additions and 114 deletions

View File

@ -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 &lt;br&gt;&lt;strong&gt;{{.PreferredLoginName}}&lt;/strong&gt;&lt;br&gt; kannst du dich anmelden. Nutze den untenstehenden Button, um die Initialisierung abzuschliessen &lt;br&gt;(Code &lt;strong&gt;{{.Code}}&lt;/strong&gt;).&lt;br&gt; 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 &lt;br&gt;(Code &lt;strong&gt;{{.Code}}&lt;/strong&gt;).&lt;br&gt; 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 &lt;br&gt;(Code &lt;strong&gt;{{.Code}}&lt;/strong&gt;).&lt;br&gt; 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

View File

@ -1,16 +1,12 @@
<div class="accounts-card">
<cnsl-avatar
(click)="editUserProfile()"
*ngIf="user && user.human?.profile && user.human?.profile?.displayName"
*ngIf="user"
class="avatar"
[ngClass]="{ 'iam-user': iamuser }"
[forColor]="user.preferredLoginName"
[avatarUrl]="user.human?.profile?.avatarUrl || ''"
[name]="
user.human && user.human.profile && user.human.profile.displayName
? user.human.profile.displayName
: user.human?.profile?.firstName + ' ' + user.human?.profile?.lastName
"
[name]="user.human?.profile?.displayName ?? ''"
[size]="80"
>
</cnsl-avatar>

View File

@ -13,10 +13,10 @@
data-e2e="member-avatar"
>
<cnsl-avatar
*ngIf="member && member.displayName && member.firstName && member.lastName; else cog"
*ngIf="member && member.userType === UserType.TYPE_HUMAN; else cog"
class="contributor-avatar dontcloseonclick"
[avatarUrl]="member.avatarUrl || ''"
[name]="member.displayName ? member.displayName : member.firstName + ' ' + member.lastName"
[name]="member.displayName"
[forColor]="member.preferredLoginName"
[size]="32"
>

View File

@ -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<void> = new EventEmitter();
@Output() refreshClicked: EventEmitter<void> = new EventEmitter();
public UserType: any = Type;
public emitAddMember(): void {
this.addClicked.emit();
}

View File

@ -197,9 +197,7 @@
</a>
</div>
<ng-container
*ngIf="user && (user.human?.profile?.displayName || (user.human?.profile?.firstName && user.human?.profile?.lastName))"
>
<ng-container *ngIf="user">
<div class="account-card-wrapper">
<button
cdkOverlayOrigin
@ -214,11 +212,7 @@
[active]="showAccount"
[avatarUrl]="user.human?.profile?.avatarUrl || ''"
[forColor]="user.preferredLoginName || ''"
[name]="
user.human?.profile?.displayName
? user.human?.profile?.displayName ?? ''
: user.human?.profile?.firstName + ' ' + user.human?.profile?.lastName
"
[name]="user.human?.profile?.displayName ?? ''"
[size]="38"
>
</cnsl-avatar>

View File

@ -36,7 +36,7 @@
[checked]="selection.isSelected(row)"
>
<cnsl-avatar
*ngIf="row?.displayName && row.firstName && row.lastName; else cog"
*ngIf="row?.userType === UserType.TYPE_HUMAN; else cog"
class="avatar"
[name]="row.displayName"
[avatarUrl]="row.avatarUrl || ''"

View File

@ -10,6 +10,7 @@ import { ProjectGrantMembersDataSource } from 'src/app/pages/projects/owned-proj
import { Member } from 'src/app/proto/generated/zitadel/member_pb';
import { getMembershipColor } from 'src/app/utils/color';
import { Type } from 'src/app/proto/generated/zitadel/user_pb';
import { AddMemberRolesDialogComponent } from '../add-member-roles-dialog/add-member-roles-dialog.component';
import { PageEvent, PaginatorComponent } from '../paginator/paginator.component';
import { ProjectMembersDataSource } from '../project-members/project-members-datasource';
@ -43,6 +44,7 @@ export class MembersTableComponent implements OnInit, OnDestroy {
private destroyed: Subject<void> = 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((_) => {

View File

@ -2,14 +2,7 @@
<div class="found-user-row" *ngFor="let user of users; index as i">
<div class="circle">
<cnsl-avatar
*ngIf="
user.human &&
user.human.profile &&
user.human.profile.displayName &&
user.human.profile.firstName &&
user.human.profile.lastName;
else cog
"
*ngIf="user.human && user.human.profile; else cog"
class="avatar"
[name]="user.human.profile.displayName"
[avatarUrl]="user.human.profile.avatarUrl || ''"
@ -76,14 +69,7 @@
<div class="user-option" data-e2e="user-option">
<div class="circle">
<cnsl-avatar
*ngIf="
user.human &&
user.human.profile &&
user.human.profile.displayName &&
user.human.profile.firstName &&
user.human.profile.lastName;
else cog
"
*ngIf="user.human && user.human.profile; else cog"
class="avatar"
[name]="user.human.profile.displayName"
[avatarUrl]="user.human.profile.avatarUrl || ''"

View File

@ -77,7 +77,7 @@
[checked]="selection.isSelected(row)"
>
<cnsl-avatar
*ngIf="row && row?.displayName && row.firstName && row.lastName; else cog"
*ngIf="row && row.userType === Type.TYPE_HUMAN; else cog"
class="avatar"
[name]="row.displayName"
[avatarUrl]="row.avatarUrl || ''"

View File

@ -68,7 +68,6 @@ export class UserGrantsComponent implements OnInit, AfterViewInit {
@Input() public type: Type | undefined = undefined;
public filterOpen: boolean = false;
constructor(
private authService: GrpcAuthService,
private userService: ManagementService,

View File

@ -11,10 +11,10 @@
<i class="las la-camera"></i>
</div>
<cnsl-avatar
*ngIf="user && user.profile?.displayName && user.profile?.firstName && user.profile?.lastName"
*ngIf="user && user.profile"
class="avatar"
[name]="user.profile?.displayName ?? ''"
[avatarUrl]="user.profile?.avatarUrl || ''"
[name]="user.profile.displayName"
[avatarUrl]="user.profile.avatarUrl || ''"
[forColor]="preferredLoginName"
[size]="80"
>

View File

@ -92,17 +92,11 @@
[checked]="selection.isSelected(user)"
>
<cnsl-avatar
*ngIf="
user.human &&
user.human.profile.displayName &&
user.human?.profile.firstName &&
user.human?.profile.lastName;
else cog
"
*ngIf="user.human && user.human.profile; else cog"
class="avatar"
[name]="user.human.profile.displayName"
[avatarUrl]="user.human?.profile?.avatarUrl || ''"
[forColor]="user?.preferredLoginName"
[avatarUrl]="user.human.profile.avatarUrl || ''"
[forColor]="user.preferredLoginName"
[size]="32"
>
</cnsl-avatar>

View File

@ -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),
}
}

View File

@ -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,

View File

@ -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
}
}

View File

@ -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,

View File

@ -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

View File

@ -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 {

View File

@ -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 &lt;br&gt;&lt;strong&gt;{{.PreferredLoginName}}&lt;/strong&gt;&lt;br&gt; kannst du dich anmelden. Nutze den untenstehenden Button, um die Initialisierung abzuschliessen &lt;br&gt;(Code &lt;strong&gt;{{.Code}}&lt;/strong&gt;).&lt;br&gt; 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 &lt;br&gt;(Code &lt;strong&gt;{{.Code}}&lt;/strong&gt;).&lt;br&gt; 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 &lt;br&gt;(Code &lt;strong&gt;{{.Code}}&lt;/strong&gt;).&lt;br&gt; 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&lt;br&gt;(Code &lt;strong&gt;{{.Code}}&lt;/strong&gt;).&lt;br&gt;
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
ButtonText: Login

View File

@ -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
ButtonText: Login

View File

@ -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

View File

@ -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
ButtonText: Login

View File

@ -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: ログイン

View File

@ -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ę

View File

@ -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: 登录

View File

@ -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)
}

View File

@ -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,
},
},
},

View File

@ -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 (

View File

@ -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)
}

View File

@ -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,
},
},
},

View File

@ -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)
}

View File

@ -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,
},
},
},

View File

@ -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)
}

View File

@ -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,
},
},
},

View File

@ -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 {

View File

@ -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 {

View File

@ -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 {