kratos/x/normalize.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
}
}