mirror of
https://github.com/andwati/zitadel.git
synced 2026-10-18 13:52:51 +00:00
When an expired invite code was used for webauthn (passkeys), the change date got updated by the failed event. This change date was used to test for expiry, meaning failed events would reset the expiry timeout. This fix adds a Code Creation Date to the writemodel which gets set by the first event. This can be the added or requested event. Other changes: - Expiry renamed to CodeExpiry so it's consistent with similar write models using secret codes. - humanVerifyPasswordlessInitCode takes an algorithm instead of the complete generator, so the method can be unit tested easier - Added tests that reproduced the original issue
151 lines
4.4 KiB
Go
151 lines
4.4 KiB
Go
package command
|
|
|
|
import (
|
|
"github.com/zitadel/zitadel/internal/domain"
|
|
"github.com/zitadel/zitadel/internal/repository/user"
|
|
)
|
|
|
|
func writeModelToHuman(wm *HumanWriteModel) *domain.Human {
|
|
human := &domain.Human{
|
|
ObjectRoot: writeModelToObjectRoot(wm.WriteModel),
|
|
Username: wm.UserName,
|
|
State: wm.UserState,
|
|
Profile: &domain.Profile{
|
|
FirstName: wm.FirstName,
|
|
LastName: wm.LastName,
|
|
NickName: wm.NickName,
|
|
DisplayName: wm.DisplayName,
|
|
PreferredLanguage: wm.PreferredLanguage,
|
|
Gender: wm.Gender,
|
|
},
|
|
Email: &domain.Email{
|
|
EmailAddress: wm.Email,
|
|
IsEmailVerified: wm.IsEmailVerified,
|
|
},
|
|
}
|
|
if wm.Phone != "" {
|
|
human.Phone = &domain.Phone{
|
|
PhoneNumber: wm.Phone,
|
|
}
|
|
}
|
|
if wm.Country != "" || wm.Locality != "" || wm.PostalCode != "" || wm.Region != "" || wm.StreetAddress != "" {
|
|
human.Address = &domain.Address{
|
|
Country: wm.Country,
|
|
Locality: wm.Locality,
|
|
PostalCode: wm.PostalCode,
|
|
Region: wm.Region,
|
|
StreetAddress: wm.StreetAddress,
|
|
}
|
|
}
|
|
return human
|
|
}
|
|
|
|
func writeModelToProfile(wm *HumanProfileWriteModel) *domain.Profile {
|
|
return &domain.Profile{
|
|
ObjectRoot: writeModelToObjectRoot(wm.WriteModel),
|
|
FirstName: wm.FirstName,
|
|
LastName: wm.LastName,
|
|
NickName: wm.NickName,
|
|
DisplayName: wm.DisplayName,
|
|
PreferredLanguage: wm.PreferredLanguage,
|
|
Gender: wm.Gender,
|
|
}
|
|
}
|
|
|
|
func writeModelToEmail(wm *HumanEmailWriteModel) *domain.Email {
|
|
return &domain.Email{
|
|
ObjectRoot: writeModelToObjectRoot(wm.WriteModel),
|
|
EmailAddress: wm.Email,
|
|
IsEmailVerified: wm.IsEmailVerified,
|
|
}
|
|
}
|
|
|
|
func writeModelToPhone(wm *HumanPhoneWriteModel) *domain.Phone {
|
|
return &domain.Phone{
|
|
ObjectRoot: writeModelToObjectRoot(wm.WriteModel),
|
|
PhoneNumber: wm.Phone,
|
|
IsPhoneVerified: wm.IsPhoneVerified,
|
|
}
|
|
}
|
|
func writeModelToAddress(wm *HumanAddressWriteModel) *domain.Address {
|
|
return &domain.Address{
|
|
ObjectRoot: writeModelToObjectRoot(wm.WriteModel),
|
|
Country: wm.Country,
|
|
Locality: wm.Locality,
|
|
PostalCode: wm.PostalCode,
|
|
Region: wm.Region,
|
|
StreetAddress: wm.StreetAddress,
|
|
}
|
|
}
|
|
|
|
func keyWriteModelToMachineKey(wm *MachineKeyWriteModel) *domain.MachineKey {
|
|
return &domain.MachineKey{
|
|
ObjectRoot: writeModelToObjectRoot(wm.WriteModel),
|
|
KeyID: wm.KeyID,
|
|
Type: wm.KeyType,
|
|
ExpirationDate: wm.ExpirationDate,
|
|
}
|
|
}
|
|
|
|
func readModelToWebAuthNTokens(readModel HumanWebAuthNTokensReadModel) []*domain.WebAuthNToken {
|
|
tokens := make([]*domain.WebAuthNToken, len(readModel.GetWebAuthNTokens()))
|
|
for i, token := range readModel.GetWebAuthNTokens() {
|
|
tokens[i] = writeModelToWebAuthN(token)
|
|
}
|
|
return tokens
|
|
}
|
|
|
|
func writeModelToWebAuthN(wm *HumanWebAuthNWriteModel) *domain.WebAuthNToken {
|
|
return &domain.WebAuthNToken{
|
|
ObjectRoot: writeModelToObjectRoot(wm.WriteModel),
|
|
WebAuthNTokenID: wm.WebauthNTokenID,
|
|
Challenge: wm.Challenge,
|
|
KeyID: wm.KeyID,
|
|
PublicKey: wm.PublicKey,
|
|
AttestationType: wm.AttestationType,
|
|
AAGUID: wm.AAGUID,
|
|
SignCount: wm.SignCount,
|
|
WebAuthNTokenName: wm.WebAuthNTokenName,
|
|
State: wm.State,
|
|
RPID: wm.RPID,
|
|
}
|
|
}
|
|
|
|
func authRequestDomainToAuthRequestInfo(authRequest *domain.AuthRequest) *user.AuthRequestInfo {
|
|
if authRequest == nil {
|
|
return nil
|
|
}
|
|
info := &user.AuthRequestInfo{
|
|
ID: authRequest.ID,
|
|
UserAgentID: authRequest.AgentID,
|
|
SelectedIDPConfigID: authRequest.SelectedIDPConfigID,
|
|
}
|
|
if authRequest.BrowserInfo != nil {
|
|
info.BrowserInfo = &user.BrowserInfo{
|
|
UserAgent: authRequest.BrowserInfo.UserAgent,
|
|
AcceptLanguage: authRequest.BrowserInfo.AcceptLanguage,
|
|
RemoteIP: authRequest.BrowserInfo.RemoteIP,
|
|
}
|
|
}
|
|
return info
|
|
}
|
|
|
|
func writeModelToPasswordlessInitCode(initCodeModel *HumanPasswordlessInitCodeWriteModel, code string) *domain.PasswordlessInitCode {
|
|
return &domain.PasswordlessInitCode{
|
|
ObjectRoot: writeModelToObjectRoot(initCodeModel.WriteModel),
|
|
CodeID: initCodeModel.CodeID,
|
|
Code: code,
|
|
Expiration: initCodeModel.CodeExpiration,
|
|
State: initCodeModel.State,
|
|
}
|
|
}
|
|
|
|
func writeModelToUserMetadata(wm *UserMetadataWriteModel) *domain.Metadata {
|
|
return &domain.Metadata{
|
|
ObjectRoot: writeModelToObjectRoot(wm.WriteModel),
|
|
Key: wm.Key,
|
|
Value: wm.Value,
|
|
State: wm.State,
|
|
}
|
|
}
|