2022-02-13 23:39:27 +08:00
// Copyright 2021 The Casdoor Authors. All Rights Reserved.
2021-05-01 17:45:01 +08:00
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package util
2021-05-15 10:13:12 +08:00
import (
2023-04-29 01:11:58 +08:00
"fmt"
2021-05-15 10:13:12 +08:00
"net/mail"
2024-10-20 20:09:21 +08:00
"net/url"
2021-05-15 10:13:12 +08:00
"regexp"
2024-01-22 02:25:13 +08:00
"strings"
2021-05-01 17:45:01 +08:00
2023-02-16 22:53:28 +08:00
"github.com/nyaruka/phonenumbers"
2022-08-07 12:26:14 +08:00
)
2021-05-01 17:45:01 +08:00
2023-06-29 21:44:14 +08:00
var (
2024-11-05 20:38:47 +08:00
rePhone * regexp . Regexp
ReWhiteSpace * regexp . Regexp
ReFieldWhiteList * regexp . Regexp
ReUserName * regexp . Regexp
ReUserNameWithEmail * regexp . Regexp
2023-06-29 21:44:14 +08:00
)
2023-02-16 22:53:28 +08:00
2021-05-01 17:45:01 +08:00
func init ( ) {
2023-05-23 17:54:51 +08:00
rePhone , _ = regexp . Compile ( ` (\d { 3})\d*(\d { 4}) ` )
2023-06-29 21:44:14 +08:00
ReWhiteSpace , _ = regexp . Compile ( ` \s ` )
ReFieldWhiteList , _ = regexp . Compile ( ` ^[A-Za-z0-9]+$ ` )
2024-02-12 16:52:17 +04:00
ReUserName , _ = regexp . Compile ( "^[a-zA-Z0-9]+([-._][a-zA-Z0-9]+)*$" )
2024-11-05 20:38:47 +08:00
ReUserNameWithEmail , _ = regexp . Compile ( ` ^([a-zA-Z0-9]+([-._][a-zA-Z0-9]+)*)|([a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z] { 2,})$ ` ) // Add support for email formats
2021-05-01 17:45:01 +08:00
}
func IsEmailValid ( email string ) bool {
2021-05-15 10:13:12 +08:00
_ , err := mail . ParseAddress ( email )
return err == nil
2021-05-01 17:45:01 +08:00
}
2023-02-16 22:53:28 +08:00
func IsPhoneValid ( phone string , countryCode string ) bool {
phoneNumber , err := phonenumbers . Parse ( phone , countryCode )
if err != nil {
return false
}
return phonenumbers . IsValidNumber ( phoneNumber )
}
func IsPhoneAllowInRegin ( countryCode string , allowRegions [ ] string ) bool {
2024-10-03 22:58:09 +08:00
if ContainsString ( allowRegions , "All" ) {
return true
}
2023-02-27 20:10:59 +08:00
return ContainsString ( allowRegions , countryCode )
2021-05-01 17:45:01 +08:00
}
2022-03-15 12:54:57 +08:00
2024-01-22 02:25:13 +08:00
func IsRegexp ( s string ) ( bool , error ) {
if _ , err := regexp . Compile ( s ) ; err != nil {
return false , err
}
return regexp . QuoteMeta ( s ) != s , nil
}
func IsInvitationCodeMatch ( pattern string , invitationCode string ) ( bool , error ) {
if ! strings . HasPrefix ( pattern , "^" ) {
pattern = "^" + pattern
}
if ! strings . HasSuffix ( pattern , "$" ) {
pattern = pattern + "$"
}
return regexp . MatchString ( pattern , invitationCode )
}
2023-02-16 22:53:28 +08:00
func GetE164Number ( phone string , countryCode string ) ( string , bool ) {
phoneNumber , _ := phonenumbers . Parse ( phone , countryCode )
return phonenumbers . Format ( phoneNumber , phonenumbers . E164 ) , phonenumbers . IsValidNumber ( phoneNumber )
2022-03-20 23:21:09 +08:00
}
2023-04-29 01:11:58 +08:00
func GetCountryCode ( prefix string , phone string ) ( string , error ) {
if prefix == "" || phone == "" {
return "" , nil
}
phoneNumber , err := phonenumbers . Parse ( fmt . Sprintf ( "+%s%s" , prefix , phone ) , "" )
if err != nil {
return "" , err
}
countryCode := phonenumbers . GetRegionCodeForNumber ( phoneNumber )
if countryCode == "" {
return "" , fmt . Errorf ( "country code not found for phone prefix: %s" , prefix )
}
return countryCode , nil
}
2023-06-29 21:44:14 +08:00
func FilterField ( field string ) bool {
return ReFieldWhiteList . MatchString ( field )
}
2024-10-20 20:09:21 +08:00
func IsValidOrigin ( origin string ) ( bool , error ) {
urlObj , err := url . Parse ( origin )
if err != nil {
return false , err
}
if urlObj == nil {
return false , nil
}
originHostOnly := ""
if urlObj . Host != "" {
originHostOnly = fmt . Sprintf ( "%s://%s" , urlObj . Scheme , urlObj . Hostname ( ) )
}
res := originHostOnly == "http://localhost" || originHostOnly == "https://localhost" || originHostOnly == "http://127.0.0.1" || originHostOnly == "http://casdoor-app" || strings . HasSuffix ( originHostOnly , ".chromiumapp.org" )
return res , nil
}