1
0
mirror of https://github.com/juanfont/headscale.git synced 2025-09-25 17:51:11 +02:00

Fix: Populate user name from email prefix if OIDC username is invalid

This commit is contained in:
Sirius 2025-05-28 18:51:32 +09:00
parent b8044c29dd
commit 243112bc6e
No known key found for this signature in database

View File

@ -314,15 +314,32 @@ type OIDCUserInfo struct {
// FromClaim overrides a User from OIDC claims. // FromClaim overrides a User from OIDC claims.
// All fields will be updated, except for the ID. // All fields will be updated, except for the ID.
func (u *User) FromClaim(claims *OIDCClaims) { func (u *User) FromClaim(claims *OIDCClaims) {
err := util.ValidateUsername(claims.Username) var assignedName bool
if err == nil { if claims.Username != "" {
u.Name = claims.Username err := util.ValidateUsername(claims.Username)
} else { if err == nil {
log.Debug().Err(err).Msgf("Username %s is not valid", claims.Username) u.Name = claims.Username
assignedName = true
} else {
log.Debug().Err(err).Msgf("OIDC claims.Username %s is not valid", claims.Username)
}
}
if !assignedName && claims.Email != "" {
emailPrefix := strings.Split(claims.Email, "@")[0]
if emailPrefix != "" {
err := util.ValidateUsername(emailPrefix)
if err == nil {
// Ensure uniqueness of the extracted email prefix if it's to be used as a primary username.
u.Name = emailPrefix
} else {
log.Debug().Err(err).Msgf("Extracted email prefix %s is not a valid username", emailPrefix)
}
}
} }
if claims.EmailVerified { if claims.EmailVerified {
_, err = mail.ParseAddress(claims.Email) _, err := mail.ParseAddress(claims.Email)
if err == nil { if err == nil {
u.Email = claims.Email u.Email = claims.Email
} }