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 Title: Zitadel - User initialisieren
PreHeader: User initialisieren PreHeader: User initialisieren
Subject: 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. 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 ButtonText: Initialisierung abschliessen
- MessageTextType: PasswordReset - MessageTextType: PasswordReset
@ -562,7 +562,7 @@ DefaultInstance:
Title: Zitadel - Passwort zurücksetzen Title: Zitadel - Passwort zurücksetzen
PreHeader: Passwort zurücksetzen PreHeader: Passwort zurücksetzen
Subject: 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. 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 ButtonText: Passwort zurücksetzen
- MessageTextType: VerifyEmail - MessageTextType: VerifyEmail
@ -570,7 +570,7 @@ DefaultInstance:
Title: Zitadel - Email verifizieren Title: Zitadel - Email verifizieren
PreHeader: Email verifizieren PreHeader: Email verifizieren
Subject: 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. 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 ButtonText: Email verifizieren
- MessageTextType: VerifyPhone - MessageTextType: VerifyPhone
@ -578,7 +578,7 @@ DefaultInstance:
Title: Zitadel - Telefonnummer verifizieren Title: Zitadel - Telefonnummer verifizieren
PreHeader: Telefonnummer verifizieren PreHeader: Telefonnummer verifizieren
Subject: 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}}) Text: Eine Telefonnummer wurde hinzugefügt. Bitte verifiziere diese in dem du folgenden Code eingibst (Code {{.Code}})
ButtonText: Telefon verifizieren ButtonText: Telefon verifizieren
- MessageTextType: DomainClaimed - MessageTextType: DomainClaimed
@ -586,7 +586,7 @@ DefaultInstance:
Title: Zitadel - Domain wurde beansprucht Title: Zitadel - Domain wurde beansprucht
PreHeader: Email / Username ändern PreHeader: Email / Username ändern
Subject: Domain wurde beansprucht 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. 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 ButtonText: Login
- MessageTextType: PasswordChange - MessageTextType: PasswordChange
@ -594,7 +594,7 @@ DefaultInstance:
Title: ZITADEL - Passwort von Benutzer wurde geändert Title: ZITADEL - Passwort von Benutzer wurde geändert
PreHeader: Passwort Änderung PreHeader: Passwort Änderung
Subject: Passwort von Benutzer wurde geändert 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. 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
- MessageTextType: InitCode - MessageTextType: InitCode
@ -602,7 +602,7 @@ DefaultInstance:
Title: Zitadel - Initialize User Title: Zitadel - Initialize User
PreHeader: Initialize User PreHeader: Initialize User
Subject: 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. 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 ButtonText: Finish initialization
- MessageTextType: PasswordReset - MessageTextType: PasswordReset
@ -610,7 +610,7 @@ DefaultInstance:
Title: Zitadel - Reset password Title: Zitadel - Reset password
PreHeader: Reset password PreHeader: Reset password
Subject: 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. 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 ButtonText: Reset password
- MessageTextType: VerifyEmail - MessageTextType: VerifyEmail
@ -618,7 +618,7 @@ DefaultInstance:
Title: Zitadel - Verify email Title: Zitadel - Verify email
PreHeader: Verify email PreHeader: Verify email
Subject: 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. 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 ButtonText: Verify email
- MessageTextType: VerifyPhone - MessageTextType: VerifyPhone
@ -626,7 +626,7 @@ DefaultInstance:
Title: Zitadel - Verify phone Title: Zitadel - Verify phone
PreHeader: Verify phone PreHeader: Verify phone
Subject: 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}}. Text: A new phonenumber has been added. Please use the following code to verify it {{.Code}}.
ButtonText: Verify phone ButtonText: Verify phone
- MessageTextType: DomainClaimed - MessageTextType: DomainClaimed
@ -634,7 +634,7 @@ DefaultInstance:
Title: Zitadel - Domain has been claimed Title: Zitadel - Domain has been claimed
PreHeader: Change email / username PreHeader: Change email / username
Subject: Domain has been claimed 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. 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 ButtonText: Login
- MessageTextType: PasswordChange - MessageTextType: PasswordChange
@ -642,7 +642,7 @@ DefaultInstance:
Title: ZITADEL - Password of user has changed Title: ZITADEL - Password of user has changed
PreHeader: Change password PreHeader: Change password
Subject: Password of user has changed 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. 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

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

View File

@ -13,10 +13,10 @@
data-e2e="member-avatar" data-e2e="member-avatar"
> >
<cnsl-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" class="contributor-avatar dontcloseonclick"
[avatarUrl]="member.avatarUrl || ''" [avatarUrl]="member.avatarUrl || ''"
[name]="member.displayName ? member.displayName : member.firstName + ' ' + member.lastName" [name]="member.displayName"
[forColor]="member.preferredLoginName" [forColor]="member.preferredLoginName"
[size]="32" [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 { Component, EventEmitter, Input, Output } from '@angular/core';
import { BehaviorSubject } from 'rxjs'; import { BehaviorSubject } from 'rxjs';
import { Member } from 'src/app/proto/generated/zitadel/member_pb'; import { Member } from 'src/app/proto/generated/zitadel/member_pb';
import { Type } from 'src/app/proto/generated/zitadel/user_pb';
@Component({ @Component({
selector: 'cnsl-contributors', selector: 'cnsl-contributors',
@ -36,6 +37,8 @@ export class ContributorsComponent {
@Output() showDetailClicked: EventEmitter<void> = new EventEmitter(); @Output() showDetailClicked: EventEmitter<void> = new EventEmitter();
@Output() refreshClicked: EventEmitter<void> = new EventEmitter(); @Output() refreshClicked: EventEmitter<void> = new EventEmitter();
public UserType: any = Type;
public emitAddMember(): void { public emitAddMember(): void {
this.addClicked.emit(); this.addClicked.emit();
} }

View File

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

View File

@ -36,7 +36,7 @@
[checked]="selection.isSelected(row)" [checked]="selection.isSelected(row)"
> >
<cnsl-avatar <cnsl-avatar
*ngIf="row?.displayName && row.firstName && row.lastName; else cog" *ngIf="row?.userType === UserType.TYPE_HUMAN; else cog"
class="avatar" class="avatar"
[name]="row.displayName" [name]="row.displayName"
[avatarUrl]="row.avatarUrl || ''" [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 { Member } from 'src/app/proto/generated/zitadel/member_pb';
import { getMembershipColor } from 'src/app/utils/color'; 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 { AddMemberRolesDialogComponent } from '../add-member-roles-dialog/add-member-roles-dialog.component';
import { PageEvent, PaginatorComponent } from '../paginator/paginator.component'; import { PageEvent, PaginatorComponent } from '../paginator/paginator.component';
import { ProjectMembersDataSource } from '../project-members/project-members-datasource'; import { ProjectMembersDataSource } from '../project-members/project-members-datasource';
@ -43,6 +44,7 @@ export class MembersTableComponent implements OnInit, OnDestroy {
private destroyed: Subject<void> = new Subject(); private destroyed: Subject<void> = new Subject();
public displayedColumns: string[] = ['select', 'userId', 'displayName', 'loginname', 'email', 'roles']; public displayedColumns: string[] = ['select', 'userId', 'displayName', 'loginname', 'email', 'roles'];
public UserType: any = Type;
constructor(private dialog: MatDialog) { constructor(private dialog: MatDialog) {
this.selection.changed.pipe(takeUntil(this.destroyed)).subscribe((_) => { 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="found-user-row" *ngFor="let user of users; index as i">
<div class="circle"> <div class="circle">
<cnsl-avatar <cnsl-avatar
*ngIf=" *ngIf="user.human && user.human.profile; else cog"
user.human &&
user.human.profile &&
user.human.profile.displayName &&
user.human.profile.firstName &&
user.human.profile.lastName;
else cog
"
class="avatar" class="avatar"
[name]="user.human.profile.displayName" [name]="user.human.profile.displayName"
[avatarUrl]="user.human.profile.avatarUrl || ''" [avatarUrl]="user.human.profile.avatarUrl || ''"
@ -76,14 +69,7 @@
<div class="user-option" data-e2e="user-option"> <div class="user-option" data-e2e="user-option">
<div class="circle"> <div class="circle">
<cnsl-avatar <cnsl-avatar
*ngIf=" *ngIf="user.human && user.human.profile; else cog"
user.human &&
user.human.profile &&
user.human.profile.displayName &&
user.human.profile.firstName &&
user.human.profile.lastName;
else cog
"
class="avatar" class="avatar"
[name]="user.human.profile.displayName" [name]="user.human.profile.displayName"
[avatarUrl]="user.human.profile.avatarUrl || ''" [avatarUrl]="user.human.profile.avatarUrl || ''"

View File

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

View File

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

View File

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

View File

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

View File

@ -5,6 +5,7 @@ import (
"github.com/zitadel/zitadel/internal/api/authz" "github.com/zitadel/zitadel/internal/api/authz"
"github.com/zitadel/zitadel/internal/api/grpc/object" "github.com/zitadel/zitadel/internal/api/grpc/object"
"github.com/zitadel/zitadel/internal/api/grpc/user"
"github.com/zitadel/zitadel/internal/query" "github.com/zitadel/zitadel/internal/query"
auth_pb "github.com/zitadel/zitadel/pkg/grpc/auth" auth_pb "github.com/zitadel/zitadel/pkg/grpc/auth"
) )
@ -53,5 +54,6 @@ func UserGrantToPb(grant *query.UserGrant) *auth_pb.UserGrant {
ProjectName: grant.ProjectName, ProjectName: grant.ProjectName,
ProjectGrantId: grant.GrantID, ProjectGrantId: grant.GrantID,
RoleKeys: grant.Roles, RoleKeys: grant.Roles,
UserType: user.TypeToPb(grant.UserType),
} }
} }

View File

@ -2,6 +2,7 @@ package member
import ( import (
"github.com/zitadel/zitadel/internal/api/grpc/object" "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/domain"
"github.com/zitadel/zitadel/internal/errors" "github.com/zitadel/zitadel/internal/errors"
"github.com/zitadel/zitadel/internal/query" "github.com/zitadel/zitadel/internal/query"
@ -33,6 +34,7 @@ func MemberToPb(assetAPIPrefix string, m *query.Member) *member_pb.Member {
LastName: m.LastName, LastName: m.LastName,
DisplayName: m.DisplayName, DisplayName: m.DisplayName,
AvatarUrl: domain.AvatarURL(assetAPIPrefix, m.ResourceOwner, m.AvatarURL), AvatarUrl: domain.AvatarURL(assetAPIPrefix, m.ResourceOwner, m.AvatarURL),
UserType: user.TypeToPb(m.UserType),
Details: object.ToViewDetailsPb( Details: object.ToViewDetailsPb(
m.Sequence, m.Sequence,
m.CreationDate, m.CreationDate,

View File

@ -254,3 +254,16 @@ func ExternalIDPViewsToExternalIDPs(externalIDPs []*query.IDPUserLink) []*domain
} }
return idps 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, ProjectName: grant.ProjectName,
AvatarUrl: domain.AvatarURL(assetPrefix, grant.UserResourceOwner, grant.AvatarURL), AvatarUrl: domain.AvatarURL(assetPrefix, grant.UserResourceOwner, grant.AvatarURL),
PreferredLoginName: grant.PreferredLoginName, PreferredLoginName: grant.PreferredLoginName,
UserType: TypeToPb(grant.UserType),
Details: object.ToViewDetailsPb( Details: object.ToViewDetailsPb(
grant.Sequence, grant.Sequence,
grant.CreationDate, grant.CreationDate,

View File

@ -272,7 +272,15 @@ func (h *AddHuman) ensureDisplayName() {
if strings.TrimSpace(h.DisplayName) != "" { if strings.TrimSpace(h.DisplayName) != "" {
return 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: // 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.AggregateID = userID
} }
human.SetNamesAsDisplayname() human.EnsureDisplayName()
if human.Password != nil { if human.Password != nil {
if err := human.HashPasswordIfExisting(pwPolicy, c.userPasswordAlg, human.Password.ChangeRequired); err != nil { if err := human.HashPasswordIfExisting(pwPolicy, c.userPasswordAlg, human.Password.ChangeRequired); err != nil {
return nil, nil, err return nil, nil, err

View File

@ -1,6 +1,7 @@
package domain package domain
import ( import (
"strings"
"time" "time"
"github.com/zitadel/zitadel/internal/crypto" "github.com/zitadel/zitadel/internal/crypto"
@ -89,10 +90,16 @@ func (u *Human) CheckDomainPolicy(policy *DomainPolicy) error {
return nil return nil
} }
func (u *Human) SetNamesAsDisplayname() { func (u *Human) EnsureDisplayName() {
if u.Profile != nil && u.DisplayName == "" && u.FirstName != "" && u.LastName != "" { if u.Profile != nil && u.DisplayName == "" && u.FirstName != "" && u.LastName != "" {
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 { func (u *Human) HashPasswordIfExisting(policy *PasswordComplexityPolicy, passwordAlg crypto.HashAlgorithm, onetime bool) error {

View File

@ -2,48 +2,48 @@ InitCode:
Title: ZITADEL - User initialisieren Title: ZITADEL - User initialisieren
PreHeader: User initialisieren PreHeader: User initialisieren
Subject: 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. 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 ButtonText: Initialisierung abschliessen
PasswordReset: PasswordReset:
Title: ZITADEL - Passwort zurücksetzen Title: ZITADEL - Passwort zurücksetzen
PreHeader: Passwort zurücksetzen PreHeader: Passwort zurücksetzen
Subject: 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. 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 ButtonText: Passwort zurücksetzen
VerifyEmail: VerifyEmail:
Title: ZITADEL - Email verifizieren Title: ZITADEL - Email verifizieren
PreHeader: Email verifizieren PreHeader: Email verifizieren
Subject: 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. 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 ButtonText: Email verifizieren
VerifyPhone: VerifyPhone:
Title: ZITADEL - Telefonnummer verifizieren Title: ZITADEL - Telefonnummer verifizieren
PreHeader: Telefonnummer verifizieren PreHeader: Telefonnummer verifizieren
Subject: 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; 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 ButtonText: Telefon verifizieren
DomainClaimed: DomainClaimed:
Title: ZITADEL - Domain wurde beansprucht Title: ZITADEL - Domain wurde beansprucht
PreHeader: Email / Username ändern PreHeader: Email / Username ändern
Subject: Domain wurde beansprucht 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. 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 ButtonText: Login
PasswordlessRegistration: PasswordlessRegistration:
Title: ZITADEL - Passwortlosen Login hinzufügen Title: ZITADEL - Passwortlosen Login hinzufügen
PreHeader: Passwortlosen Login hinzufügen PreHeader: Passwortlosen Login hinzufügen
Subject: 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. 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 ButtonText: Passwortlosen Login hinzufügen
PasswordChange: PasswordChange:
Title: ZITADEL - Passwort von Benutzer wurde geändert Title: ZITADEL - Passwort von Benutzer wurde geändert
PreHeader: Passwort Änderung PreHeader: Passwort Änderung
Subject: Passwort von Benutzer wurde geändert 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. 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 Title: ZITADEL - Initialize User
PreHeader: Initialize User PreHeader: Initialize User
Subject: 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. 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 ButtonText: Finish initialization
PasswordReset: PasswordReset:
Title: ZITADEL - Reset password Title: ZITADEL - Reset password
PreHeader: Reset password PreHeader: Reset password
Subject: 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. 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 ButtonText: Reset password
VerifyEmail: VerifyEmail:
Title: ZITADEL - Verify email Title: ZITADEL - Verify email
PreHeader: Verify email PreHeader: Verify email
Subject: 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. 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 ButtonText: Verify email
VerifyPhone: VerifyPhone:
Title: ZITADEL - Verify phone Title: ZITADEL - Verify phone
PreHeader: Verify phone PreHeader: Verify phone
Subject: 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}} Text: A new phone number has been added. Please use the following code to verify it {{.Code}}
ButtonText: Verify phone ButtonText: Verify phone
DomainClaimed: DomainClaimed:
Title: ZITADEL - Domain has been claimed Title: ZITADEL - Domain has been claimed
PreHeader: Change email / username PreHeader: Change email / username
Subject: Domain has been claimed 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. 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 ButtonText: Login
PasswordlessRegistration: PasswordlessRegistration:
Title: ZITADEL - Add Passwordless Login Title: ZITADEL - Add Passwordless Login
PreHeader: Add Passwordless Login PreHeader: Add Passwordless Login
Subject: 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. 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 ButtonText: Add Passwordless Login
PasswordChange: PasswordChange:
Title: ZITADEL - Password of user has changed Title: ZITADEL - Password of user has changed
PreHeader: Change password PreHeader: Change password
Subject: Password of user has changed 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. 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 Title: ZITADEL - Initialiser l'utilisateur
PreHeader: Initialiser l'utilisateur PreHeader: Initialiser l'utilisateur
Subject: 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. 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 ButtonText: Terminer l'initialisation
PasswordReset: PasswordReset:
Title: ZITADEL - Réinitialiser le mot de passe Title: ZITADEL - Réinitialiser le mot de passe
PreHeader: Réinitialiser le mot de passe PreHeader: Réinitialiser le mot de passe
Subject: 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. 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 ButtonText: Réinitialiser le mot de passe
VerifyEmail: VerifyEmail:
Title: ZITADEL - Vérifier l'email Title: ZITADEL - Vérifier l'email
PreHeader: Vérifier l'email PreHeader: Vérifier l'email
Subject: 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. 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 ButtonText: Vérifier l'email
VerifyPhone: VerifyPhone:
Title: ZITADEL - Vérifier le téléphone Title: ZITADEL - Vérifier le téléphone
PreHeader: Vérifier le téléphone PreHeader: Vérifier le téléphone
Subject: 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}} 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 ButtonText: Vérifier le téléphone
DomainClaimed: DomainClaimed:
Title: ZITADEL - Le domaine a été réclamé Title: ZITADEL - Le domaine a été réclamé
PreHeader: Modifier l'email / le nom d'utilisateur PreHeader: Modifier l'email / le nom d'utilisateur
Subject: Le domaine a été réclamé 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. 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 ButtonText: Connexion
PasswordlessRegistration: PasswordlessRegistration:
Title: ZITADEL - Ajouter une connexion sans mot de passe Title: ZITADEL - Ajouter une connexion sans mot de passe
PreHeader: Ajouter une connexion sans mot de passe PreHeader: Ajouter une connexion sans mot de passe
Subject: 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. 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 ButtonText: Ajouter une connexion sans mot de passe
PasswordChange: PasswordChange:
Title: ZITADEL - Le mot de passe de l'utilisateur a changé Title: ZITADEL - Le mot de passe de l'utilisateur a changé
PreHeader: Modifier le mot de passe PreHeader: Modifier le mot de passe
Subject: Le mot de passe de l'utilisateur a changé 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. 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 ButtonText: Login

View File

@ -2,48 +2,48 @@ InitCode:
Title: ZITADEL - Inizializzare l'utente Title: ZITADEL - Inizializzare l'utente
PreHeader: Inizializzare l'utente PreHeader: Inizializzare l'utente
Subject: 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. 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 ButtonText: Termina
PasswordReset: PasswordReset:
Title: ZITADEL - Ripristina la password Title: ZITADEL - Ripristina la password
PreHeader: Ripristina la password PreHeader: Ripristina la password
Subject: 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. 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 ButtonText: Ripristina
VerifyEmail: VerifyEmail:
Title: ZITADEL - Verifica l'e-mail Title: ZITADEL - Verifica l'e-mail
PreHeader: Verifica l'e-mail PreHeader: Verifica l'e-mail
Subject: 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. 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 ButtonText: Verifica
VerifyPhone: VerifyPhone:
Title: ZITADEL - Verifica il telefono Title: ZITADEL - Verifica il telefono
PreHeader: Verifica il telefono PreHeader: Verifica il telefono
Subject: 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}} Text: È stato aggiunto un nuovo numero di telefono. Usa il seguente codice per verificarlo {{.Code}}
ButtonText: Verifica ButtonText: Verifica
DomainClaimed: DomainClaimed:
Title: ZITADEL - Il dominio è stato rivendicato Title: ZITADEL - Il dominio è stato rivendicato
PreHeader: Cambiare email / nome utente PreHeader: Cambiare email / nome utente
Subject: Il dominio è stato rivendicato 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. 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 ButtonText: Accedi
PasswordlessRegistration: PasswordlessRegistration:
Title: ZITADEL - Aggiungere autenticazione passwordless Title: ZITADEL - Aggiungere autenticazione passwordless
PreHeader: Aggiungi l'autenticazione passwordless PreHeader: Aggiungi l'autenticazione passwordless
Subject: 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. 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 ButtonText: Attiva passwordless
PasswordChange: PasswordChange:
Title: ZITADEL - La password dell'utente è stata modificata Title: ZITADEL - La password dell'utente è stata modificata
PreHeader: Modifica della password PreHeader: Modifica della password
Subject: La password dell'utente è stata modificata 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. 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 - ユーザーの初期セットアップ Title: ZITADEL - ユーザーの初期セットアップ
PreHeader: ユーザーの初期セットアップ PreHeader: ユーザーの初期セットアップ
Subject: ユーザーの初期セットアップ Subject: ユーザーの初期セットアップ
Greeting: こんにちは {{.LastName}} {{.FirstName}} さん、 Greeting: こんにちは {{.DisplayName}} さん、
Text: このユーザーはZITADELで作成されました。ユーザー名 {{.PreferredLoginName}} を使用してログインします。以下のボタンから、初期セットアップを完了してください。(コード {{.Code}})このメールの受信を希望していない場合は、無視してください。 Text: このユーザーはZITADELで作成されました。ユーザー名 {{.PreferredLoginName}} を使用してログインします。以下のボタンから、初期セットアップを完了してください。(コード {{.Code}})このメールの受信を希望していない場合は、無視してください。
ButtonText: 初期セットアップを完了する ButtonText: 初期セットアップを完了する
PasswordReset: PasswordReset:
Title: ZITADEL - パスワードをリセットします Title: ZITADEL - パスワードをリセットします
PreHeader: パスワードの再設定 PreHeader: パスワードの再設定
Subject: パスワードの再設定 Subject: パスワードの再設定
Greeting: こんにちは {{.LastName}} {{.FirstName}} さん、 Greeting: こんにちは {{.DisplayName}} さん、
Text: パスワードリセットのリクエストを受け取りました。以下のボタンから、パスワードをリセットしてください。(コード {{.Code}})このメールの受信を希望していない場合は、無視してください。 Text: パスワードリセットのリクエストを受け取りました。以下のボタンから、パスワードをリセットしてください。(コード {{.Code}})このメールの受信を希望していない場合は、無視してください。
ButtonText: パスワードを再設定 ButtonText: パスワードを再設定
VerifyEmail: VerifyEmail:
Title: ZITADEL - メールアドレスの認証 Title: ZITADEL - メールアドレスの認証
PreHeader: メールアドレスの認証 PreHeader: メールアドレスの認証
Subject: メールアドレスの認証 Subject: メールアドレスの認証
Greeting: こんにちは {{.LastName}} {{.FirstName}} さん、 Greeting: こんにちは {{.DisplayName}} さん、
Text: 新しいメールアドレスが追加されました。以下のボタンから、メールアドレスを認証してください。(コード {{.Code}})新しいメールアドレスを追加していない場合は、このメールを無視してください。 Text: 新しいメールアドレスが追加されました。以下のボタンから、メールアドレスを認証してください。(コード {{.Code}})新しいメールアドレスを追加していない場合は、このメールを無視してください。
ButtonText: メールアドレスを認証 ButtonText: メールアドレスを認証
VerifyPhone: VerifyPhone:
Title: ZITADEL - 電話番号の認証 Title: ZITADEL - 電話番号の認証
PreHeader: 電話番号の認証 PreHeader: 電話番号の認証
Subject: 電話番号の認証 Subject: 電話番号の認証
Greeting: こんにちは {{.LastName}} {{.FirstName}} さん、 Greeting: こんにちは {{.DisplayName}} さん、
Text: 新しい電話番号が追加されました。次のコードを使用してを認証してください {{.Code}} Text: 新しい電話番号が追加されました。次のコードを使用してを認証してください {{.Code}}
ButtonText: 電話番号を認証 ButtonText: 電話番号を認証
DomainClaimed: DomainClaimed:
Title: ZITADEL - ドメインの登録 Title: ZITADEL - ドメインの登録
PreHeader: メールアドレス・ユーザー名の変更 PreHeader: メールアドレス・ユーザー名の変更
Subject: ドメインの登録 Subject: ドメインの登録
Greeting: こんにちは {{.LastName}} {{.FirstName}} さん、 Greeting: こんにちは {{.DisplayName}} さん、
Text: ドメイン {{.Domain}} が組織によって登録されました。現在のユーザー {{.Username}} はこの組織のメンバーでないため、ログイン時にメールアドレスを変更する必要があります。一時的なユーザー名({{.TempUsername}})を使用してログインし、設定を進めてください。 Text: ドメイン {{.Domain}} が組織によって登録されました。現在のユーザー {{.Username}} はこの組織のメンバーでないため、ログイン時にメールアドレスを変更する必要があります。一時的なユーザー名({{.TempUsername}})を使用してログインし、設定を進めてください。
ButtonText: ログイン ButtonText: ログイン
PasswordlessRegistration: PasswordlessRegistration:
Title: ZITADEL - パスワードレスログインの追加 Title: ZITADEL - パスワードレスログインの追加
PreHeader: パスワードレスログインの追加 PreHeader: パスワードレスログインの追加
Subject: パスワードレスログインの追加 Subject: パスワードレスログインの追加
Greeting: こんにちは {{.LastName}} {{.FirstName}} さん、 Greeting: こんにちは {{.DisplayName}} さん、
Text: パスワードレスログイン用のトークンを追加するリクエストを受け取りました。以下のボタンから、パスワードレスログイン用のトークンやデバイスを追加してください。 Text: パスワードレスログイン用のトークンを追加するリクエストを受け取りました。以下のボタンから、パスワードレスログイン用のトークンやデバイスを追加してください。
ButtonText: パスワードレスログインを追加 ButtonText: パスワードレスログインを追加
PasswordChange: PasswordChange:
Title: ZITADEL - ユーザーのパスワードが変更されました Title: ZITADEL - ユーザーのパスワードが変更されました
PreHeader: パスワードの変更 PreHeader: パスワードの変更
Subject: ユーザーのパスワードが変更されました Subject: ユーザーのパスワードが変更されました
Greeting: こんにちは {{.LastName}} {{.FirstName}} さん、 Greeting: こんにちは {{.DisplayName}} さん、
Text: ユーザーのパスワードが変更されました。この変更があなたによって行われなかった場合は、すぐにパスワードをリセットすることをお勧めします。 Text: ユーザーのパスワードが変更されました。この変更があなたによって行われなかった場合は、すぐにパスワードをリセットすることをお勧めします。
ButtonText: ログイン ButtonText: ログイン

View File

@ -2,48 +2,48 @@ InitCode:
Title: ZITADEL - Inicjalizacja użytkownika Title: ZITADEL - Inicjalizacja użytkownika
PreHeader: Inicjalizacja użytkownika PreHeader: Inicjalizacja użytkownika
Subject: 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ć. 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ę ButtonText: Zakończ inicjalizację
PasswordReset: PasswordReset:
Title: ZITADEL - Resetowanie hasła Title: ZITADEL - Resetowanie hasła
PreHeader: Resetowanie hasła PreHeader: Resetowanie hasła
Subject: 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ć. 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 ButtonText: Zresetuj hasło
VerifyEmail: VerifyEmail:
Title: ZITADEL - Weryfikacja adresu e-mail Title: ZITADEL - Weryfikacja adresu e-mail
PreHeader: Weryfikacja adresu e-mail PreHeader: Weryfikacja adresu e-mail
Subject: 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. 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 ButtonText: Zweryfikuj adres e-mail
VerifyPhone: VerifyPhone:
Title: ZITADEL - Weryfikacja numeru telefonu Title: ZITADEL - Weryfikacja numeru telefonu
PreHeader: Weryfikacja numeru telefonu PreHeader: Weryfikacja numeru telefonu
Subject: 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}} Text: Został dodany nowy numer telefonu. Użyj następującego kodu, aby go zweryfikować {{.Code}}
ButtonText: Zweryfikuj numer telefonu ButtonText: Zweryfikuj numer telefonu
DomainClaimed: DomainClaimed:
Title: ZITADEL - Domena została zarejestrowana Title: ZITADEL - Domena została zarejestrowana
PreHeader: Zmiana adresu e-mail / nazwy użytkownika PreHeader: Zmiana adresu e-mail / nazwy użytkownika
Subject: Domena została zarejestrowana 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. 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ę ButtonText: Zaloguj się
PasswordlessRegistration: PasswordlessRegistration:
Title: ZITADEL - Dodaj logowanie bez hasła Title: ZITADEL - Dodaj logowanie bez hasła
PreHeader: Dodaj logowanie bez hasła PreHeader: Dodaj logowanie bez hasła
Subject: 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. 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 ButtonText: Dodaj logowanie bez hasła
PasswordChange: PasswordChange:
Title: ZITADEL - Hasło użytkownika zostało zmienione Title: ZITADEL - Hasło użytkownika zostało zmienione
PreHeader: Zmiana hasła PreHeader: Zmiana hasła
Subject: Hasło użytkownika zostało zmienione 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. 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ę ButtonText: Zaloguj się

View File

@ -2,48 +2,48 @@ InitCode:
Title: ZITADEL - 初始化用户 Title: ZITADEL - 初始化用户
PreHeader: 初始化用户 PreHeader: 初始化用户
Subject: 初始化用户 Subject: 初始化用户
Greeting: 你好 {{.FirstName}} {{.LastName}}, Greeting: 你好 {{.DisplayName}},
Text: 此用户是在 ZITADEL 中创建的。使用用户名 {{.PreferredLoginName}} 登录。请单击下面的按钮完成初始化过程。(代码 {{.Code}})如果不是您本人操作,请忽略它。 Text: 此用户是在 ZITADEL 中创建的。使用用户名 {{.PreferredLoginName}} 登录。请单击下面的按钮完成初始化过程。(代码 {{.Code}})如果不是您本人操作,请忽略它。
ButtonText: 完成初始化 ButtonText: 完成初始化
PasswordReset: PasswordReset:
Title: ZITADEL - 重置密码 Title: ZITADEL - 重置密码
PreHeader: 重置密码 PreHeader: 重置密码
Subject: 重置密码 Subject: 重置密码
Greeting: 你好 {{.FirstName}} {{.LastName}}, Greeting: 你好 {{.DisplayName}},
Text: 我们收到了密码重置请求。请使用下面的按钮重置您的密码。(验证码 {{.Code}})如果不是您本人操作,请忽略它。 Text: 我们收到了密码重置请求。请使用下面的按钮重置您的密码。(验证码 {{.Code}})如果不是您本人操作,请忽略它。
ButtonText: 重置密码 ButtonText: 重置密码
VerifyEmail: VerifyEmail:
Title: ZITADEL - 验证电子邮箱 Title: ZITADEL - 验证电子邮箱
PreHeader: 验证电子邮箱 PreHeader: 验证电子邮箱
Subject: 验证电子邮箱 Subject: 验证电子邮箱
Greeting: 你好 {{.FirstName}} {{.LastName}}, Greeting: 你好 {{.DisplayName}},
Text: 已添加新电子邮件。请使用下面的按钮来验证您的邮件。(验证码 {{.Code}})如果不是您本人操作,请忽略此电子邮件。 Text: 已添加新电子邮件。请使用下面的按钮来验证您的邮件。(验证码 {{.Code}})如果不是您本人操作,请忽略此电子邮件。
ButtonText: 验证电子邮箱 ButtonText: 验证电子邮箱
VerifyPhone: VerifyPhone:
Title: ZITADEL - 验证手机号码 Title: ZITADEL - 验证手机号码
PreHeader: 验证手机号码 PreHeader: 验证手机号码
Subject: 验证手机号码 Subject: 验证手机号码
Greeting: 你好 {{.FirstName}} {{.LastName}}, Greeting: 你好 {{.DisplayName}},
Text: 您的用户中添加了一个新的手机号码,请使用以下验证码进行验证 {{.Code}} Text: 您的用户中添加了一个新的手机号码,请使用以下验证码进行验证 {{.Code}}
ButtonText: 验证手机号码 ButtonText: 验证手机号码
DomainClaimed: DomainClaimed:
Title: ZITADEL - 域名所有权验证 Title: ZITADEL - 域名所有权验证
PreHeader: 更改电子邮件/用户名 PreHeader: 更改电子邮件/用户名
Subject: 域名所有权验证 Subject: 域名所有权验证
Greeting: 你好 {{.FirstName}} {{.LastName}}, Greeting: 你好 {{.DisplayName}},
Text: 域 {{.Domain}} 已被组织使用。您当前的用户 {{.Username}} 不属于此组织。因此,您必须在登录时更改您的电子邮件。我们为此登录创建了一个临时用户名 ({{.TempUsername}})。 Text: 域 {{.Domain}} 已被组织使用。您当前的用户 {{.Username}} 不属于此组织。因此,您必须在登录时更改您的电子邮件。我们为此登录创建了一个临时用户名 ({{.TempUsername}})。
ButtonText: 登录 ButtonText: 登录
PasswordlessRegistration: PasswordlessRegistration:
Title: ZITADEL - 添加无密码登录 Title: ZITADEL - 添加无密码登录
PreHeader: 添加无密码登录 PreHeader: 添加无密码登录
Subject: 添加无密码登录 Subject: 添加无密码登录
Greeting: 你好 {{.FirstName}} {{.LastName}}, Greeting: 你好 {{.DisplayName}},
Text: 我们收到了为无密码登录添加令牌的请求。请使用下面的按钮添加您的令牌或设备以进行无密码登录。 Text: 我们收到了为无密码登录添加令牌的请求。请使用下面的按钮添加您的令牌或设备以进行无密码登录。
ButtonText: 添加无密码登录 ButtonText: 添加无密码登录
PasswordChange: PasswordChange:
Title: ZITADEL - 用户的密码已经改变 Title: ZITADEL - 用户的密码已经改变
PreHeader: 更改密码 PreHeader: 更改密码
Subject: 用户的密码已经改变 Subject: 用户的密码已经改变
Greeting: 你好 {{.FirstName}} {{.LastName}}, Greeting: 你好 {{.DisplayName}},
Text: 您的用户的密码已经改变,如果这个改变不是由您做的,请注意立即重新设置您的密码。 Text: 您的用户的密码已经改变,如果这个改变不是由您做的,请注意立即重新设置您的密码。
ButtonText: 登录 ButtonText: 登录

View File

@ -8,6 +8,7 @@ import (
"github.com/zitadel/zitadel/internal/api/authz" "github.com/zitadel/zitadel/internal/api/authz"
"github.com/zitadel/zitadel/internal/api/call" "github.com/zitadel/zitadel/internal/api/call"
"github.com/zitadel/zitadel/internal/domain"
"github.com/zitadel/zitadel/internal/errors" "github.com/zitadel/zitadel/internal/errors"
"github.com/zitadel/zitadel/internal/query/projection" "github.com/zitadel/zitadel/internal/query/projection"
"github.com/zitadel/zitadel/internal/telemetry/tracing" "github.com/zitadel/zitadel/internal/telemetry/tracing"
@ -122,10 +123,12 @@ func prepareInstanceMembersQuery(ctx context.Context, db prepareDatabase) (sq.Se
HumanDisplayNameCol.identifier(), HumanDisplayNameCol.identifier(),
MachineNameCol.identifier(), MachineNameCol.identifier(),
HumanAvatarURLCol.identifier(), HumanAvatarURLCol.identifier(),
UserTypeCol.identifier(),
countColumn.identifier(), countColumn.identifier(),
).From(instanceMemberTable.identifier()). ).From(instanceMemberTable.identifier()).
LeftJoin(join(HumanUserIDCol, InstanceMemberUserID)). LeftJoin(join(HumanUserIDCol, InstanceMemberUserID)).
LeftJoin(join(MachineUserIDCol, InstanceMemberUserID)). LeftJoin(join(MachineUserIDCol, InstanceMemberUserID)).
LeftJoin(join(UserIDCol, InstanceMemberUserID)).
LeftJoin(join(LoginNameUserIDCol, InstanceMemberUserID) + db.Timetravel(call.Took(ctx))). LeftJoin(join(LoginNameUserIDCol, InstanceMemberUserID) + db.Timetravel(call.Took(ctx))).
Where( Where(
sq.Eq{LoginNameIsPrimaryCol.identifier(): true}, sq.Eq{LoginNameIsPrimaryCol.identifier(): true},
@ -145,6 +148,7 @@ func prepareInstanceMembersQuery(ctx context.Context, db prepareDatabase) (sq.Se
displayName = sql.NullString{} displayName = sql.NullString{}
machineName = sql.NullString{} machineName = sql.NullString{}
avatarURL = sql.NullString{} avatarURL = sql.NullString{}
userType = sql.NullInt32{}
) )
err := rows.Scan( err := rows.Scan(
@ -161,6 +165,7 @@ func prepareInstanceMembersQuery(ctx context.Context, db prepareDatabase) (sq.Se
&displayName, &displayName,
&machineName, &machineName,
&avatarURL, &avatarURL,
&userType,
&count, &count,
) )
@ -179,6 +184,7 @@ func prepareInstanceMembersQuery(ctx context.Context, db prepareDatabase) (sq.Se
} else { } else {
member.DisplayName = machineName.String member.DisplayName = machineName.String
} }
member.UserType = domain.UserType(userType.Int32)
members = append(members, member) members = append(members, member)
} }

View File

@ -9,6 +9,7 @@ import (
"testing" "testing"
"github.com/zitadel/zitadel/internal/database" "github.com/zitadel/zitadel/internal/database"
"github.com/zitadel/zitadel/internal/domain"
) )
var ( var (
@ -26,12 +27,15 @@ var (
", projections.users8_humans.display_name" + ", projections.users8_humans.display_name" +
", projections.users8_machines.name" + ", projections.users8_machines.name" +
", projections.users8_humans.avatar_key" + ", projections.users8_humans.avatar_key" +
", projections.users8.type" +
", COUNT(*) OVER () " + ", COUNT(*) OVER () " +
"FROM projections.instance_members3 AS members " + "FROM projections.instance_members3 AS members " +
"LEFT JOIN projections.users8_humans " + "LEFT JOIN projections.users8_humans " +
"ON members.user_id = projections.users8_humans.user_id AND members.instance_id = projections.users8_humans.instance_id " + "ON members.user_id = projections.users8_humans.user_id AND members.instance_id = projections.users8_humans.instance_id " +
"LEFT JOIN projections.users8_machines " + "LEFT JOIN projections.users8_machines " +
"ON members.user_id = projections.users8_machines.user_id AND members.instance_id = projections.users8_machines.instance_id " + "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 " + "LEFT JOIN projections.login_names2 " +
"ON members.user_id = projections.login_names2.user_id AND members.instance_id = projections.login_names2.instance_id " + "ON members.user_id = projections.login_names2.user_id AND members.instance_id = projections.login_names2.instance_id " +
"AS OF SYSTEM TIME '-1 ms' " + "AS OF SYSTEM TIME '-1 ms' " +
@ -50,6 +54,7 @@ var (
"display_name", "display_name",
"name", "name",
"avatar_key", "avatar_key",
"type",
"count", "count",
} }
) )
@ -101,6 +106,7 @@ func Test_IAMMemberPrepares(t *testing.T) {
"display name", "display name",
nil, nil,
nil, nil,
domain.UserTypeHuman,
}, },
}, },
), ),
@ -123,6 +129,7 @@ func Test_IAMMemberPrepares(t *testing.T) {
LastName: "last-name", LastName: "last-name",
DisplayName: "display name", DisplayName: "display name",
AvatarURL: "", AvatarURL: "",
UserType: domain.UserTypeHuman,
}, },
}, },
}, },
@ -149,6 +156,7 @@ func Test_IAMMemberPrepares(t *testing.T) {
nil, nil,
"machine-name", "machine-name",
nil, nil,
domain.UserTypeMachine,
}, },
}, },
), ),
@ -171,6 +179,7 @@ func Test_IAMMemberPrepares(t *testing.T) {
LastName: "", LastName: "",
DisplayName: "machine-name", DisplayName: "machine-name",
AvatarURL: "", AvatarURL: "",
UserType: domain.UserTypeMachine,
}, },
}, },
}, },
@ -197,6 +206,7 @@ func Test_IAMMemberPrepares(t *testing.T) {
"display name", "display name",
nil, nil,
nil, nil,
domain.UserTypeHuman,
}, },
{ {
testNow, testNow,
@ -212,6 +222,7 @@ func Test_IAMMemberPrepares(t *testing.T) {
nil, nil,
"machine-name", "machine-name",
nil, nil,
domain.UserTypeMachine,
}, },
}, },
), ),
@ -234,6 +245,7 @@ func Test_IAMMemberPrepares(t *testing.T) {
LastName: "last-name", LastName: "last-name",
DisplayName: "display name", DisplayName: "display name",
AvatarURL: "", AvatarURL: "",
UserType: domain.UserTypeHuman,
}, },
{ {
CreationDate: testNow, CreationDate: testNow,
@ -248,6 +260,7 @@ func Test_IAMMemberPrepares(t *testing.T) {
LastName: "", LastName: "",
DisplayName: "machine-name", DisplayName: "machine-name",
AvatarURL: "", AvatarURL: "",
UserType: domain.UserTypeMachine,
}, },
}, },
}, },

View File

@ -4,6 +4,7 @@ import (
"time" "time"
"github.com/zitadel/zitadel/internal/database" "github.com/zitadel/zitadel/internal/database"
"github.com/zitadel/zitadel/internal/domain"
"github.com/zitadel/zitadel/internal/query/projection" "github.com/zitadel/zitadel/internal/query/projection"
sq "github.com/Masterminds/squirrel" sq "github.com/Masterminds/squirrel"
@ -60,6 +61,7 @@ type Member struct {
LastName string LastName string
DisplayName string DisplayName string
AvatarURL string AvatarURL string
UserType domain.UserType
} }
var ( var (

View File

@ -8,6 +8,7 @@ import (
"github.com/zitadel/zitadel/internal/api/authz" "github.com/zitadel/zitadel/internal/api/authz"
"github.com/zitadel/zitadel/internal/api/call" "github.com/zitadel/zitadel/internal/api/call"
"github.com/zitadel/zitadel/internal/domain"
"github.com/zitadel/zitadel/internal/errors" "github.com/zitadel/zitadel/internal/errors"
"github.com/zitadel/zitadel/internal/query/projection" "github.com/zitadel/zitadel/internal/query/projection"
"github.com/zitadel/zitadel/internal/telemetry/tracing" "github.com/zitadel/zitadel/internal/telemetry/tracing"
@ -124,10 +125,12 @@ func prepareOrgMembersQuery(ctx context.Context, db prepareDatabase) (sq.SelectB
HumanDisplayNameCol.identifier(), HumanDisplayNameCol.identifier(),
MachineNameCol.identifier(), MachineNameCol.identifier(),
HumanAvatarURLCol.identifier(), HumanAvatarURLCol.identifier(),
UserTypeCol.identifier(),
countColumn.identifier(), countColumn.identifier(),
).From(orgMemberTable.identifier()). ).From(orgMemberTable.identifier()).
LeftJoin(join(HumanUserIDCol, OrgMemberUserID)). LeftJoin(join(HumanUserIDCol, OrgMemberUserID)).
LeftJoin(join(MachineUserIDCol, OrgMemberUserID)). LeftJoin(join(MachineUserIDCol, OrgMemberUserID)).
LeftJoin(join(UserIDCol, OrgMemberUserID)).
LeftJoin(join(LoginNameUserIDCol, OrgMemberUserID) + db.Timetravel(call.Took(ctx))). LeftJoin(join(LoginNameUserIDCol, OrgMemberUserID) + db.Timetravel(call.Took(ctx))).
Where( Where(
sq.Eq{LoginNameIsPrimaryCol.identifier(): true}, sq.Eq{LoginNameIsPrimaryCol.identifier(): true},
@ -147,6 +150,7 @@ func prepareOrgMembersQuery(ctx context.Context, db prepareDatabase) (sq.SelectB
displayName = sql.NullString{} displayName = sql.NullString{}
machineName = sql.NullString{} machineName = sql.NullString{}
avatarURL = sql.NullString{} avatarURL = sql.NullString{}
userType = sql.NullInt32{}
) )
err := rows.Scan( err := rows.Scan(
@ -163,6 +167,7 @@ func prepareOrgMembersQuery(ctx context.Context, db prepareDatabase) (sq.SelectB
&displayName, &displayName,
&machineName, &machineName,
&avatarURL, &avatarURL,
&userType,
&count, &count,
) )
@ -181,6 +186,7 @@ func prepareOrgMembersQuery(ctx context.Context, db prepareDatabase) (sq.SelectB
} else { } else {
member.DisplayName = machineName.String member.DisplayName = machineName.String
} }
member.UserType = domain.UserType(userType.Int32)
members = append(members, member) members = append(members, member)
} }

View File

@ -9,6 +9,7 @@ import (
"testing" "testing"
"github.com/zitadel/zitadel/internal/database" "github.com/zitadel/zitadel/internal/database"
"github.com/zitadel/zitadel/internal/domain"
) )
var ( var (
@ -26,6 +27,7 @@ var (
", projections.users8_humans.display_name" + ", projections.users8_humans.display_name" +
", projections.users8_machines.name" + ", projections.users8_machines.name" +
", projections.users8_humans.avatar_key" + ", projections.users8_humans.avatar_key" +
", projections.users8.type" +
", COUNT(*) OVER () " + ", COUNT(*) OVER () " +
"FROM projections.org_members3 AS members " + "FROM projections.org_members3 AS members " +
"LEFT JOIN projections.users8_humans " + "LEFT JOIN projections.users8_humans " +
@ -34,6 +36,9 @@ var (
"LEFT JOIN projections.users8_machines " + "LEFT JOIN projections.users8_machines " +
"ON members.user_id = projections.users8_machines.user_id " + "ON members.user_id = projections.users8_machines.user_id " +
"AND members.instance_id = projections.users8_machines.instance_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 " + "LEFT JOIN projections.login_names2 " +
"ON members.user_id = projections.login_names2.user_id " + "ON members.user_id = projections.login_names2.user_id " +
"AND members.instance_id = projections.login_names2.instance_id " + "AND members.instance_id = projections.login_names2.instance_id " +
@ -53,6 +58,7 @@ var (
"display_name", "display_name",
"name", "name",
"avatar_key", "avatar_key",
"type",
"count", "count",
} }
) )
@ -104,6 +110,7 @@ func Test_OrgMemberPrepares(t *testing.T) {
"display name", "display name",
nil, nil,
nil, nil,
domain.UserTypeHuman,
}, },
}, },
), ),
@ -126,6 +133,7 @@ func Test_OrgMemberPrepares(t *testing.T) {
LastName: "last-name", LastName: "last-name",
DisplayName: "display name", DisplayName: "display name",
AvatarURL: "", AvatarURL: "",
UserType: domain.UserTypeHuman,
}, },
}, },
}, },
@ -152,6 +160,7 @@ func Test_OrgMemberPrepares(t *testing.T) {
nil, nil,
"machine-name", "machine-name",
nil, nil,
domain.UserTypeMachine,
}, },
}, },
), ),
@ -174,6 +183,7 @@ func Test_OrgMemberPrepares(t *testing.T) {
LastName: "", LastName: "",
DisplayName: "machine-name", DisplayName: "machine-name",
AvatarURL: "", AvatarURL: "",
UserType: domain.UserTypeMachine,
}, },
}, },
}, },
@ -200,6 +210,7 @@ func Test_OrgMemberPrepares(t *testing.T) {
"display name", "display name",
nil, nil,
nil, nil,
domain.UserTypeHuman,
}, },
{ {
testNow, testNow,
@ -215,6 +226,7 @@ func Test_OrgMemberPrepares(t *testing.T) {
nil, nil,
"machine-name", "machine-name",
nil, nil,
domain.UserTypeMachine,
}, },
}, },
), ),
@ -237,6 +249,7 @@ func Test_OrgMemberPrepares(t *testing.T) {
LastName: "last-name", LastName: "last-name",
DisplayName: "display name", DisplayName: "display name",
AvatarURL: "", AvatarURL: "",
UserType: domain.UserTypeHuman,
}, },
{ {
CreationDate: testNow, CreationDate: testNow,
@ -251,6 +264,7 @@ func Test_OrgMemberPrepares(t *testing.T) {
LastName: "", LastName: "",
DisplayName: "machine-name", DisplayName: "machine-name",
AvatarURL: "", AvatarURL: "",
UserType: domain.UserTypeMachine,
}, },
}, },
}, },

View File

@ -8,6 +8,7 @@ import (
"github.com/zitadel/zitadel/internal/api/authz" "github.com/zitadel/zitadel/internal/api/authz"
"github.com/zitadel/zitadel/internal/api/call" "github.com/zitadel/zitadel/internal/api/call"
"github.com/zitadel/zitadel/internal/domain"
"github.com/zitadel/zitadel/internal/errors" "github.com/zitadel/zitadel/internal/errors"
"github.com/zitadel/zitadel/internal/query/projection" "github.com/zitadel/zitadel/internal/query/projection"
) )
@ -138,10 +139,12 @@ func prepareProjectGrantMembersQuery(ctx context.Context, db prepareDatabase) (s
HumanDisplayNameCol.identifier(), HumanDisplayNameCol.identifier(),
MachineNameCol.identifier(), MachineNameCol.identifier(),
HumanAvatarURLCol.identifier(), HumanAvatarURLCol.identifier(),
UserTypeCol.identifier(),
countColumn.identifier(), countColumn.identifier(),
).From(projectGrantMemberTable.identifier()). ).From(projectGrantMemberTable.identifier()).
LeftJoin(join(HumanUserIDCol, ProjectGrantMemberUserID)). LeftJoin(join(HumanUserIDCol, ProjectGrantMemberUserID)).
LeftJoin(join(MachineUserIDCol, ProjectGrantMemberUserID)). LeftJoin(join(MachineUserIDCol, ProjectGrantMemberUserID)).
LeftJoin(join(UserIDCol, ProjectGrantMemberUserID)).
LeftJoin(join(LoginNameUserIDCol, ProjectGrantMemberUserID)). LeftJoin(join(LoginNameUserIDCol, ProjectGrantMemberUserID)).
LeftJoin(join(ProjectGrantColumnGrantID, ProjectGrantMemberGrantID) + db.Timetravel(call.Took(ctx))). LeftJoin(join(ProjectGrantColumnGrantID, ProjectGrantMemberGrantID) + db.Timetravel(call.Took(ctx))).
Where( Where(
@ -162,6 +165,7 @@ func prepareProjectGrantMembersQuery(ctx context.Context, db prepareDatabase) (s
displayName = sql.NullString{} displayName = sql.NullString{}
machineName = sql.NullString{} machineName = sql.NullString{}
avatarURL = sql.NullString{} avatarURL = sql.NullString{}
userType = sql.NullInt32{}
) )
err := rows.Scan( err := rows.Scan(
@ -178,6 +182,7 @@ func prepareProjectGrantMembersQuery(ctx context.Context, db prepareDatabase) (s
&displayName, &displayName,
&machineName, &machineName,
&avatarURL, &avatarURL,
&userType,
&count, &count,
) )
@ -196,6 +201,7 @@ func prepareProjectGrantMembersQuery(ctx context.Context, db prepareDatabase) (s
} else { } else {
member.DisplayName = machineName.String member.DisplayName = machineName.String
} }
member.UserType = domain.UserType(userType.Int32)
members = append(members, member) members = append(members, member)
} }

View File

@ -9,6 +9,7 @@ import (
"testing" "testing"
"github.com/zitadel/zitadel/internal/database" "github.com/zitadel/zitadel/internal/database"
"github.com/zitadel/zitadel/internal/domain"
) )
var ( var (
@ -26,6 +27,7 @@ var (
", projections.users8_humans.display_name" + ", projections.users8_humans.display_name" +
", projections.users8_machines.name" + ", projections.users8_machines.name" +
", projections.users8_humans.avatar_key" + ", projections.users8_humans.avatar_key" +
", projections.users8.type" +
", COUNT(*) OVER () " + ", COUNT(*) OVER () " +
"FROM projections.project_grant_members3 AS members " + "FROM projections.project_grant_members3 AS members " +
"LEFT JOIN projections.users8_humans " + "LEFT JOIN projections.users8_humans " +
@ -34,6 +36,9 @@ var (
"LEFT JOIN projections.users8_machines " + "LEFT JOIN projections.users8_machines " +
"ON members.user_id = projections.users8_machines.user_id " + "ON members.user_id = projections.users8_machines.user_id " +
"AND members.instance_id = projections.users8_machines.instance_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 " + "LEFT JOIN projections.login_names2 " +
"ON members.user_id = projections.login_names2.user_id " + "ON members.user_id = projections.login_names2.user_id " +
"AND members.instance_id = projections.login_names2.instance_id " + "AND members.instance_id = projections.login_names2.instance_id " +
@ -56,6 +61,7 @@ var (
"display_name", "display_name",
"name", "name",
"avatar_key", "avatar_key",
"type",
"count", "count",
} }
) )
@ -107,6 +113,7 @@ func Test_ProjectGrantMemberPrepares(t *testing.T) {
"display name", "display name",
nil, nil,
nil, nil,
domain.UserTypeHuman,
}, },
}, },
), ),
@ -129,6 +136,7 @@ func Test_ProjectGrantMemberPrepares(t *testing.T) {
LastName: "last-name", LastName: "last-name",
DisplayName: "display name", DisplayName: "display name",
AvatarURL: "", AvatarURL: "",
UserType: domain.UserTypeHuman,
}, },
}, },
}, },
@ -155,6 +163,7 @@ func Test_ProjectGrantMemberPrepares(t *testing.T) {
nil, nil,
"machine-name", "machine-name",
nil, nil,
domain.UserTypeMachine,
}, },
}, },
), ),
@ -177,6 +186,7 @@ func Test_ProjectGrantMemberPrepares(t *testing.T) {
LastName: "", LastName: "",
DisplayName: "machine-name", DisplayName: "machine-name",
AvatarURL: "", AvatarURL: "",
UserType: domain.UserTypeMachine,
}, },
}, },
}, },
@ -203,6 +213,7 @@ func Test_ProjectGrantMemberPrepares(t *testing.T) {
"display name", "display name",
nil, nil,
nil, nil,
domain.UserTypeHuman,
}, },
{ {
testNow, testNow,
@ -218,6 +229,7 @@ func Test_ProjectGrantMemberPrepares(t *testing.T) {
nil, nil,
"machine-name", "machine-name",
nil, nil,
domain.UserTypeMachine,
}, },
}, },
), ),
@ -240,6 +252,7 @@ func Test_ProjectGrantMemberPrepares(t *testing.T) {
LastName: "last-name", LastName: "last-name",
DisplayName: "display name", DisplayName: "display name",
AvatarURL: "", AvatarURL: "",
UserType: domain.UserTypeHuman,
}, },
{ {
CreationDate: testNow, CreationDate: testNow,
@ -254,6 +267,7 @@ func Test_ProjectGrantMemberPrepares(t *testing.T) {
LastName: "", LastName: "",
DisplayName: "machine-name", DisplayName: "machine-name",
AvatarURL: "", AvatarURL: "",
UserType: domain.UserTypeMachine,
}, },
}, },
}, },

View File

@ -8,6 +8,7 @@ import (
"github.com/zitadel/zitadel/internal/api/authz" "github.com/zitadel/zitadel/internal/api/authz"
"github.com/zitadel/zitadel/internal/api/call" "github.com/zitadel/zitadel/internal/api/call"
"github.com/zitadel/zitadel/internal/domain"
"github.com/zitadel/zitadel/internal/errors" "github.com/zitadel/zitadel/internal/errors"
"github.com/zitadel/zitadel/internal/query/projection" "github.com/zitadel/zitadel/internal/query/projection"
"github.com/zitadel/zitadel/internal/telemetry/tracing" "github.com/zitadel/zitadel/internal/telemetry/tracing"
@ -124,10 +125,12 @@ func prepareProjectMembersQuery(ctx context.Context, db prepareDatabase) (sq.Sel
HumanDisplayNameCol.identifier(), HumanDisplayNameCol.identifier(),
MachineNameCol.identifier(), MachineNameCol.identifier(),
HumanAvatarURLCol.identifier(), HumanAvatarURLCol.identifier(),
UserTypeCol.identifier(),
countColumn.identifier(), countColumn.identifier(),
).From(projectMemberTable.identifier()). ).From(projectMemberTable.identifier()).
LeftJoin(join(HumanUserIDCol, ProjectMemberUserID)). LeftJoin(join(HumanUserIDCol, ProjectMemberUserID)).
LeftJoin(join(MachineUserIDCol, ProjectMemberUserID)). LeftJoin(join(MachineUserIDCol, ProjectMemberUserID)).
LeftJoin(join(UserIDCol, ProjectMemberUserID)).
LeftJoin(join(LoginNameUserIDCol, ProjectMemberUserID) + db.Timetravel(call.Took(ctx))). LeftJoin(join(LoginNameUserIDCol, ProjectMemberUserID) + db.Timetravel(call.Took(ctx))).
Where( Where(
sq.Eq{LoginNameIsPrimaryCol.identifier(): true}, sq.Eq{LoginNameIsPrimaryCol.identifier(): true},
@ -147,6 +150,7 @@ func prepareProjectMembersQuery(ctx context.Context, db prepareDatabase) (sq.Sel
displayName = sql.NullString{} displayName = sql.NullString{}
machineName = sql.NullString{} machineName = sql.NullString{}
avatarURL = sql.NullString{} avatarURL = sql.NullString{}
userType = sql.NullInt32{}
) )
err := rows.Scan( err := rows.Scan(
@ -163,6 +167,7 @@ func prepareProjectMembersQuery(ctx context.Context, db prepareDatabase) (sq.Sel
&displayName, &displayName,
&machineName, &machineName,
&avatarURL, &avatarURL,
&userType,
&count, &count,
) )
@ -181,6 +186,7 @@ func prepareProjectMembersQuery(ctx context.Context, db prepareDatabase) (sq.Sel
} else { } else {
member.DisplayName = machineName.String member.DisplayName = machineName.String
} }
member.UserType = domain.UserType(userType.Int32)
members = append(members, member) members = append(members, member)
} }

View File

@ -9,6 +9,7 @@ import (
"testing" "testing"
"github.com/zitadel/zitadel/internal/database" "github.com/zitadel/zitadel/internal/database"
"github.com/zitadel/zitadel/internal/domain"
) )
var ( var (
@ -26,6 +27,7 @@ var (
", projections.users8_humans.display_name" + ", projections.users8_humans.display_name" +
", projections.users8_machines.name" + ", projections.users8_machines.name" +
", projections.users8_humans.avatar_key" + ", projections.users8_humans.avatar_key" +
", projections.users8.type" +
", COUNT(*) OVER () " + ", COUNT(*) OVER () " +
"FROM projections.project_members3 AS members " + "FROM projections.project_members3 AS members " +
"LEFT JOIN projections.users8_humans " + "LEFT JOIN projections.users8_humans " +
@ -34,6 +36,9 @@ var (
"LEFT JOIN projections.users8_machines " + "LEFT JOIN projections.users8_machines " +
"ON members.user_id = projections.users8_machines.user_id " + "ON members.user_id = projections.users8_machines.user_id " +
"AND members.instance_id = projections.users8_machines.instance_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 " + "LEFT JOIN projections.login_names2 " +
"ON members.user_id = projections.login_names2.user_id " + "ON members.user_id = projections.login_names2.user_id " +
"AND members.instance_id = projections.login_names2.instance_id " + "AND members.instance_id = projections.login_names2.instance_id " +
@ -53,6 +58,7 @@ var (
"display_name", "display_name",
"name", "name",
"avatar_key", "avatar_key",
"type",
"count", "count",
} }
) )
@ -104,6 +110,7 @@ func Test_ProjectMemberPrepares(t *testing.T) {
"display name", "display name",
nil, nil,
nil, nil,
domain.UserTypeHuman,
}, },
}, },
), ),
@ -126,6 +133,7 @@ func Test_ProjectMemberPrepares(t *testing.T) {
LastName: "last-name", LastName: "last-name",
DisplayName: "display name", DisplayName: "display name",
AvatarURL: "", AvatarURL: "",
UserType: domain.UserTypeHuman,
}, },
}, },
}, },
@ -152,6 +160,7 @@ func Test_ProjectMemberPrepares(t *testing.T) {
nil, nil,
"machine-name", "machine-name",
nil, nil,
domain.UserTypeMachine,
}, },
}, },
), ),
@ -174,6 +183,7 @@ func Test_ProjectMemberPrepares(t *testing.T) {
LastName: "", LastName: "",
DisplayName: "machine-name", DisplayName: "machine-name",
AvatarURL: "", AvatarURL: "",
UserType: domain.UserTypeMachine,
}, },
}, },
}, },
@ -200,6 +210,7 @@ func Test_ProjectMemberPrepares(t *testing.T) {
"display name", "display name",
nil, nil,
nil, nil,
domain.UserTypeHuman,
}, },
{ {
testNow, testNow,
@ -215,6 +226,7 @@ func Test_ProjectMemberPrepares(t *testing.T) {
nil, nil,
"machine-name", "machine-name",
nil, nil,
domain.UserTypeMachine,
}, },
}, },
), ),
@ -237,6 +249,7 @@ func Test_ProjectMemberPrepares(t *testing.T) {
LastName: "last-name", LastName: "last-name",
DisplayName: "display name", DisplayName: "display name",
AvatarURL: "", AvatarURL: "",
UserType: domain.UserTypeHuman,
}, },
{ {
CreationDate: testNow, CreationDate: testNow,
@ -251,6 +264,7 @@ func Test_ProjectMemberPrepares(t *testing.T) {
LastName: "", LastName: "",
DisplayName: "machine-name", DisplayName: "machine-name",
AvatarURL: "", AvatarURL: "",
UserType: domain.UserTypeMachine,
}, },
}, },
}, },

View File

@ -1466,6 +1466,11 @@ message UserGrant {
example: "[\"RoleKey1\", \"RoleKey2\"]", 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 { message ListMyProjectOrgsRequest {

View File

@ -1,6 +1,7 @@
syntax = "proto3"; syntax = "proto3";
import "zitadel/object.proto"; import "zitadel/object.proto";
import "zitadel/user.proto";
import "validate/validate.proto"; import "validate/validate.proto";
import "protoc-gen-openapiv2/options/annotations.proto"; import "protoc-gen-openapiv2/options/annotations.proto";
@ -57,6 +58,11 @@ message Member {
example: "\"https://api.zitadel.ch/assets/v1/avatar-32432jkh4kj32\""; 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 { message SearchQuery {

View File

@ -723,6 +723,11 @@ message UserGrant {
example: "\"gigi@zitadel.com\""; 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 { enum UserGrantState {