mirror of https://github.com/ory/kratos
78 lines
1.9 KiB
Go
78 lines
1.9 KiB
Go
// Copyright © 2024 Ory Corp
|
|
// SPDX-License-Identifier: Apache-2.0
|
|
|
|
package x
|
|
|
|
import (
|
|
"strings"
|
|
|
|
"github.com/nyaruka/phonenumbers"
|
|
"github.com/pkg/errors"
|
|
)
|
|
|
|
// NormalizeEmailIdentifier normalizes an email address.
|
|
func NormalizeEmailIdentifier(value string) string {
|
|
if strings.Contains(value, "@") {
|
|
value = strings.TrimSpace(strings.ToLower(value))
|
|
}
|
|
return value
|
|
}
|
|
|
|
// NormalizePhoneIdentifier normalizes a phone number.
|
|
func NormalizePhoneIdentifier(value string) string {
|
|
if number, err := phonenumbers.Parse(value, ""); err == nil && phonenumbers.IsValidNumber(number) {
|
|
value = phonenumbers.Format(number, phonenumbers.E164)
|
|
}
|
|
return value
|
|
}
|
|
|
|
// NormalizeOtherIdentifier normalizes an identifier that is not an email or phone number.
|
|
func NormalizeOtherIdentifier(value string) string {
|
|
return strings.TrimSpace(value)
|
|
}
|
|
|
|
// GracefulNormalization normalizes an identifier based on the format.
|
|
//
|
|
// Supported formats are:
|
|
//
|
|
// - email
|
|
// - phone
|
|
// - username
|
|
func GracefulNormalization(value string) string {
|
|
if number, err := phonenumbers.Parse(value, ""); err == nil && phonenumbers.IsValidNumber(number) {
|
|
return phonenumbers.Format(number, phonenumbers.E164)
|
|
} else if strings.Contains(value, "@") {
|
|
return NormalizeEmailIdentifier(value)
|
|
}
|
|
return NormalizeOtherIdentifier(value)
|
|
}
|
|
|
|
// NormalizeIdentifier normalizes an identifier based on the format.
|
|
//
|
|
// Supported formats are:
|
|
//
|
|
// - email
|
|
// - phone
|
|
// - username
|
|
func NormalizeIdentifier(value, format string) (string, error) {
|
|
switch format {
|
|
case "email":
|
|
return NormalizeEmailIdentifier(value), nil
|
|
case "sms":
|
|
number, err := phonenumbers.Parse(value, "")
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
if !phonenumbers.IsValidNumber(number) {
|
|
return "", errors.New("the provided number is not a valid phone number")
|
|
}
|
|
|
|
return phonenumbers.Format(number, phonenumbers.E164), nil
|
|
case "username":
|
|
fallthrough
|
|
default:
|
|
return NormalizeOtherIdentifier(value), nil
|
|
}
|
|
}
|