2022-02-13 23:39:27 +08:00
// Copyright 2021 The Casdoor Authors. All Rights Reserved.
2021-05-30 13:37:34 +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 object
import (
2023-04-25 23:05:53 +08:00
"encoding/json"
2021-05-30 13:37:34 +08:00
"fmt"
"reflect"
2024-02-17 15:24:36 +08:00
"regexp"
2021-05-30 13:37:34 +08:00
"strings"
2024-05-17 11:43:19 +08:00
"github.com/casdoor/casdoor/conf"
2024-02-17 15:24:36 +08:00
"github.com/casdoor/casdoor/i18n"
2022-01-20 14:11:46 +08:00
"github.com/casdoor/casdoor/idp"
2023-11-08 20:22:28 +08:00
"github.com/casdoor/casdoor/util"
2024-05-17 11:43:19 +08:00
jsoniter "github.com/json-iterator/go"
2023-02-12 09:33:24 +08:00
"github.com/xorm-io/core"
2021-05-30 13:37:34 +08:00
)
2023-05-30 15:49:39 +08:00
func GetUserByField ( organizationName string , field string , value string ) ( * User , error ) {
2021-06-18 23:25:24 +08:00
if field == "" || value == "" {
2023-05-30 15:49:39 +08:00
return nil , nil
2021-06-18 23:25:24 +08:00
}
2021-05-30 13:37:34 +08:00
user := User { Owner : organizationName }
2023-07-29 15:07:04 +08:00
existed , err := ormer . Engine . Where ( fmt . Sprintf ( "%s=?" , strings . ToLower ( field ) ) , value ) . Get ( & user )
2021-05-30 13:37:34 +08:00
if err != nil {
2023-05-30 15:49:39 +08:00
return nil , err
2021-05-30 13:37:34 +08:00
}
if existed {
2023-05-30 15:49:39 +08:00
return & user , nil
2021-05-30 13:37:34 +08:00
} else {
2023-05-30 15:49:39 +08:00
return nil , nil
2021-05-30 13:37:34 +08:00
}
}
func HasUserByField ( organizationName string , field string , value string ) bool {
2023-05-30 15:49:39 +08:00
user , err := GetUserByField ( organizationName , field , value )
if err != nil {
panic ( err )
}
return user != nil
2021-05-30 13:37:34 +08:00
}
2023-05-30 15:49:39 +08:00
func GetUserByFields ( organization string , field string ) ( * User , error ) {
2024-05-17 11:43:19 +08:00
isUsernameLowered := conf . GetConfigBool ( "isUsernameLowered" )
if isUsernameLowered {
field = strings . ToLower ( field )
}
field = strings . TrimSpace ( field )
2021-05-30 13:37:34 +08:00
// check username
2023-05-30 15:49:39 +08:00
user , err := GetUserByField ( organization , "name" , field )
if err != nil || user != nil {
return user , err
2021-05-30 13:37:34 +08:00
}
// check email
2023-03-01 15:57:42 +08:00
if strings . Contains ( field , "@" ) {
2023-05-30 15:49:39 +08:00
user , err = GetUserByField ( organization , "email" , field )
if user != nil || err != nil {
return user , err
2023-03-01 15:57:42 +08:00
}
2021-05-30 13:37:34 +08:00
}
// check phone
2023-05-30 15:49:39 +08:00
user , err = GetUserByField ( organization , "phone" , field )
if user != nil || err != nil {
return user , err
2021-05-30 13:37:34 +08:00
}
2024-02-28 01:28:24 +08:00
// check user ID
user , err = GetUserByField ( organization , "id" , field )
if user != nil || err != nil {
return user , err
}
2022-01-04 19:52:29 +08:00
// check ID card
2023-05-30 15:49:39 +08:00
user , err = GetUserByField ( organization , "id_card" , field )
if user != nil || err != nil {
return user , err
2022-01-04 19:52:29 +08:00
}
2023-05-30 15:49:39 +08:00
return nil , nil
2021-05-30 13:37:34 +08:00
}
2023-05-30 15:49:39 +08:00
func SetUserField ( user * User , field string , value string ) ( bool , error ) {
2023-05-16 15:11:19 +03:00
bean := make ( map [ string ] interface { } )
2021-05-30 13:37:34 +08:00
if field == "password" {
2023-05-30 15:49:39 +08:00
organization , err := GetOrganizationByUser ( user )
if err != nil {
return false , err
}
2021-05-30 13:37:34 +08:00
user . UpdateUserPassword ( organization )
2023-05-16 15:11:19 +03:00
bean [ strings . ToLower ( field ) ] = user . Password
bean [ "password_type" ] = user . PasswordType
} else {
bean [ strings . ToLower ( field ) ] = value
2021-05-30 13:37:34 +08:00
}
2023-07-29 15:07:04 +08:00
affected , err := ormer . Engine . Table ( user ) . ID ( core . PK { user . Owner , user . Name } ) . Update ( bean )
2021-05-30 13:37:34 +08:00
if err != nil {
2023-05-30 15:49:39 +08:00
return false , err
}
user , err = getUser ( user . Owner , user . Name )
if err != nil {
return false , err
}
err = user . UpdateUserHash ( )
if err != nil {
return false , err
2021-05-30 13:37:34 +08:00
}
2023-11-08 20:22:28 +08:00
if user != nil {
user . UpdatedTime = util . GetCurrentTime ( )
}
2023-07-29 15:07:04 +08:00
_ , err = ormer . Engine . ID ( core . PK { user . Owner , user . Name } ) . Cols ( "hash" ) . Update ( user )
2021-05-30 13:37:34 +08:00
if err != nil {
2023-05-30 15:49:39 +08:00
return false , err
2021-05-30 13:37:34 +08:00
}
2023-05-30 15:49:39 +08:00
return affected != 0 , nil
2021-05-30 13:37:34 +08:00
}
func GetUserField ( user * User , field string ) string {
// https://socketloop.com/tutorials/golang-how-to-get-struct-field-and-value-by-name
u := reflect . ValueOf ( user )
f := reflect . Indirect ( u ) . FieldByName ( field )
return f . String ( )
}
2021-06-09 21:27:20 +08:00
func setUserProperty ( user * User , field string , value string ) {
2021-05-30 15:13:43 +08:00
if value == "" {
delete ( user . Properties , field )
} else {
2022-07-28 21:52:10 +08:00
if user . Properties == nil {
user . Properties = make ( map [ string ] string )
}
2021-05-30 15:13:43 +08:00
user . Properties [ field ] = value
}
2021-06-09 21:27:20 +08:00
}
2023-11-11 17:16:57 +08:00
func getUserProperty ( user * User , field string ) string {
if user . Properties == nil {
return ""
}
return user . Properties [ field ]
}
func getUserExtraProperty ( user * User , providerType , key string ) ( string , error ) {
extraJson := getUserProperty ( user , fmt . Sprintf ( "oauth_%s_extra" , providerType ) )
if extraJson == "" {
return "" , nil
}
extra := make ( map [ string ] string )
if err := jsoniter . Unmarshal ( [ ] byte ( extraJson ) , & extra ) ; err != nil {
return "" , err
}
return extra [ key ] , nil
}
2023-05-30 15:49:39 +08:00
func SetUserOAuthProperties ( organization * Organization , user * User , providerType string , userInfo * idp . UserInfo ) ( bool , error ) {
2021-06-09 21:27:20 +08:00
if userInfo . Id != "" {
propertyName := fmt . Sprintf ( "oauth_%s_id" , providerType )
setUserProperty ( user , propertyName , userInfo . Id )
}
if userInfo . Username != "" {
propertyName := fmt . Sprintf ( "oauth_%s_username" , providerType )
setUserProperty ( user , propertyName , userInfo . Username )
}
if userInfo . DisplayName != "" {
propertyName := fmt . Sprintf ( "oauth_%s_displayName" , providerType )
setUserProperty ( user , propertyName , userInfo . DisplayName )
if user . DisplayName == "" {
2021-06-09 21:41:27 +08:00
user . DisplayName = userInfo . DisplayName
2021-06-09 21:27:20 +08:00
}
2023-04-17 15:39:33 +08:00
} else if user . DisplayName == "" {
if userInfo . Username != "" {
user . DisplayName = userInfo . Username
} else {
user . DisplayName = userInfo . Id
}
2021-06-09 21:27:20 +08:00
}
if userInfo . Email != "" {
propertyName := fmt . Sprintf ( "oauth_%s_email" , providerType )
setUserProperty ( user , propertyName , userInfo . Email )
if user . Email == "" {
2021-06-09 21:41:27 +08:00
user . Email = userInfo . Email
2021-06-09 21:27:20 +08:00
}
}
2022-09-08 14:44:06 +08:00
if userInfo . UnionId != "" {
propertyName := fmt . Sprintf ( "oauth_%s_unionId" , providerType )
setUserProperty ( user , propertyName , userInfo . UnionId )
}
2021-06-09 21:27:20 +08:00
if userInfo . AvatarUrl != "" {
propertyName := fmt . Sprintf ( "oauth_%s_avatarUrl" , providerType )
setUserProperty ( user , propertyName , userInfo . AvatarUrl )
2021-06-21 00:54:07 +08:00
if user . Avatar == "" || user . Avatar == organization . DefaultAvatar {
2021-06-09 21:41:27 +08:00
user . Avatar = userInfo . AvatarUrl
2021-06-09 21:27:20 +08:00
}
}
2021-05-30 15:13:43 +08:00
2023-11-11 17:16:57 +08:00
if userInfo . Extra != nil {
// Save extra info as json string
propertyName := fmt . Sprintf ( "oauth_%s_extra" , providerType )
oldExtraJson := getUserProperty ( user , propertyName )
extra := make ( map [ string ] string )
if oldExtraJson != "" {
if err := jsoniter . Unmarshal ( [ ] byte ( oldExtraJson ) , & extra ) ; err != nil {
return false , err
}
}
for k , v := range userInfo . Extra {
extra [ k ] = v
}
newExtraJson , err := jsoniter . Marshal ( extra )
if err != nil {
return false , err
}
setUserProperty ( user , propertyName , string ( newExtraJson ) )
}
2023-05-30 15:49:39 +08:00
return UpdateUserForAllFields ( user . GetId ( ) , user )
2021-05-30 15:13:43 +08:00
}
2023-05-30 15:49:39 +08:00
func ClearUserOAuthProperties ( user * User , providerType string ) ( bool , error ) {
2021-05-30 18:35:05 +08:00
for k := range user . Properties {
prefix := fmt . Sprintf ( "oauth_%s_" , providerType )
if strings . HasPrefix ( k , prefix ) {
delete ( user . Properties , k )
}
}
2023-07-29 15:07:04 +08:00
affected , err := ormer . Engine . ID ( core . PK { user . Owner , user . Name } ) . Cols ( "properties" ) . Update ( user )
2021-05-30 18:35:05 +08:00
if err != nil {
2023-05-30 15:49:39 +08:00
return false , err
2021-05-30 18:35:05 +08:00
}
2023-05-30 15:49:39 +08:00
return affected != 0 , nil
2021-05-30 18:35:05 +08:00
}
2023-02-16 22:53:28 +08:00
2023-04-25 23:05:53 +08:00
func CheckPermissionForUpdateUser ( oldUser , newUser * User , isAdmin bool , lang string ) ( bool , string ) {
2023-05-30 15:49:39 +08:00
organization , err := GetOrganizationByUser ( oldUser )
if err != nil {
return false , err . Error ( )
}
2023-04-25 23:05:53 +08:00
var itemsChanged [ ] * AccountItem
if oldUser . Owner != newUser . Owner {
item := GetAccountItemByName ( "Organization" , organization )
2024-09-14 15:00:10 +08:00
if item == nil {
newUser . Owner = oldUser . Owner
} else {
itemsChanged = append ( itemsChanged , item )
}
2023-04-25 23:05:53 +08:00
}
if oldUser . Name != newUser . Name {
item := GetAccountItemByName ( "Name" , organization )
2024-09-14 15:00:10 +08:00
if item == nil {
newUser . Name = oldUser . Name
} else {
itemsChanged = append ( itemsChanged , item )
}
2023-04-25 23:05:53 +08:00
}
if oldUser . Id != newUser . Id {
item := GetAccountItemByName ( "ID" , organization )
2024-09-14 15:00:10 +08:00
if item == nil {
newUser . Id = oldUser . Id
} else {
itemsChanged = append ( itemsChanged , item )
}
2023-04-25 23:05:53 +08:00
}
if oldUser . DisplayName != newUser . DisplayName {
item := GetAccountItemByName ( "Display name" , organization )
2024-09-14 15:00:10 +08:00
if item == nil {
newUser . DisplayName = oldUser . DisplayName
} else {
itemsChanged = append ( itemsChanged , item )
}
2023-04-25 23:05:53 +08:00
}
if oldUser . Avatar != newUser . Avatar {
item := GetAccountItemByName ( "Avatar" , organization )
2024-09-14 15:00:10 +08:00
if item == nil {
newUser . Avatar = oldUser . Avatar
} else {
itemsChanged = append ( itemsChanged , item )
}
2023-04-25 23:05:53 +08:00
}
if oldUser . Type != newUser . Type {
item := GetAccountItemByName ( "User type" , organization )
2024-09-14 15:00:10 +08:00
if item == nil {
newUser . Type = oldUser . Type
} else {
itemsChanged = append ( itemsChanged , item )
}
2023-04-25 23:05:53 +08:00
}
// The password is *** when not modified
if oldUser . Password != newUser . Password && newUser . Password != "***" {
item := GetAccountItemByName ( "Password" , organization )
2024-09-14 15:00:10 +08:00
if item == nil {
newUser . Password = oldUser . Password
} else {
itemsChanged = append ( itemsChanged , item )
}
2023-04-25 23:05:53 +08:00
}
if oldUser . Email != newUser . Email {
item := GetAccountItemByName ( "Email" , organization )
2024-09-14 15:00:10 +08:00
if item == nil {
newUser . Email = oldUser . Email
} else {
itemsChanged = append ( itemsChanged , item )
}
2023-04-25 23:05:53 +08:00
}
if oldUser . Phone != newUser . Phone {
item := GetAccountItemByName ( "Phone" , organization )
2024-09-14 15:00:10 +08:00
if item == nil {
newUser . Phone = oldUser . Phone
} else {
itemsChanged = append ( itemsChanged , item )
}
2023-04-25 23:05:53 +08:00
}
if oldUser . CountryCode != newUser . CountryCode {
item := GetAccountItemByName ( "Country code" , organization )
2024-09-14 15:00:10 +08:00
if item == nil {
newUser . CountryCode = oldUser . CountryCode
} else {
itemsChanged = append ( itemsChanged , item )
}
2023-04-25 23:05:53 +08:00
}
if oldUser . Region != newUser . Region {
item := GetAccountItemByName ( "Country/Region" , organization )
2024-09-14 15:00:10 +08:00
if item == nil {
newUser . Region = oldUser . Region
} else {
itemsChanged = append ( itemsChanged , item )
}
2023-04-25 23:05:53 +08:00
}
if oldUser . Location != newUser . Location {
item := GetAccountItemByName ( "Location" , organization )
2024-09-14 15:00:10 +08:00
if item == nil {
newUser . Location = oldUser . Location
} else {
itemsChanged = append ( itemsChanged , item )
}
2023-04-25 23:05:53 +08:00
}
if oldUser . Affiliation != newUser . Affiliation {
item := GetAccountItemByName ( "Affiliation" , organization )
2024-09-14 15:00:10 +08:00
if item == nil {
newUser . Affiliation = oldUser . Affiliation
} else {
itemsChanged = append ( itemsChanged , item )
}
2023-04-25 23:05:53 +08:00
}
if oldUser . Title != newUser . Title {
item := GetAccountItemByName ( "Title" , organization )
2024-09-14 15:00:10 +08:00
if item == nil {
newUser . Title = oldUser . Title
} else {
itemsChanged = append ( itemsChanged , item )
}
2023-04-25 23:05:53 +08:00
}
if oldUser . Homepage != newUser . Homepage {
item := GetAccountItemByName ( "Homepage" , organization )
2024-09-14 15:00:10 +08:00
if item == nil {
newUser . Homepage = oldUser . Homepage
} else {
itemsChanged = append ( itemsChanged , item )
}
2023-04-25 23:05:53 +08:00
}
if oldUser . Bio != newUser . Bio {
item := GetAccountItemByName ( "Bio" , organization )
2024-09-14 15:00:10 +08:00
if item == nil {
newUser . Bio = oldUser . Bio
} else {
itemsChanged = append ( itemsChanged , item )
}
2023-04-25 23:05:53 +08:00
}
if oldUser . Tag != newUser . Tag {
item := GetAccountItemByName ( "Tag" , organization )
2024-09-14 15:00:10 +08:00
if item == nil {
newUser . Tag = oldUser . Tag
} else {
itemsChanged = append ( itemsChanged , item )
}
2023-04-25 23:05:53 +08:00
}
if oldUser . SignupApplication != newUser . SignupApplication {
item := GetAccountItemByName ( "Signup application" , organization )
2024-09-14 15:00:10 +08:00
if item == nil {
newUser . SignupApplication = oldUser . SignupApplication
} else {
itemsChanged = append ( itemsChanged , item )
}
2023-04-25 23:05:53 +08:00
}
2024-02-17 15:24:36 +08:00
if oldUser . Gender != newUser . Gender {
item := GetAccountItemByName ( "Gender" , organization )
2024-09-14 15:00:10 +08:00
if item == nil {
newUser . Gender = oldUser . Gender
} else {
itemsChanged = append ( itemsChanged , item )
}
2024-02-17 15:24:36 +08:00
}
if oldUser . Birthday != newUser . Birthday {
item := GetAccountItemByName ( "Birthday" , organization )
2024-09-14 15:00:10 +08:00
if item == nil {
newUser . Birthday = oldUser . Birthday
} else {
itemsChanged = append ( itemsChanged , item )
}
2024-02-17 15:24:36 +08:00
}
if oldUser . Education != newUser . Education {
item := GetAccountItemByName ( "Education" , organization )
2024-09-14 15:00:10 +08:00
if item == nil {
newUser . Education = oldUser . Education
} else {
itemsChanged = append ( itemsChanged , item )
}
2024-02-17 15:24:36 +08:00
}
if oldUser . IdCard != newUser . IdCard {
item := GetAccountItemByName ( "ID card" , organization )
2024-09-14 15:00:10 +08:00
if item == nil {
newUser . IdCard = oldUser . IdCard
} else {
itemsChanged = append ( itemsChanged , item )
}
2024-02-17 15:24:36 +08:00
}
if oldUser . IdCardType != newUser . IdCardType {
item := GetAccountItemByName ( "ID card type" , organization )
2024-09-14 15:00:10 +08:00
if item == nil {
newUser . IdCardType = oldUser . IdCardType
} else {
itemsChanged = append ( itemsChanged , item )
}
2024-02-17 15:24:36 +08:00
}
2023-04-25 23:05:53 +08:00
oldUserPropertiesJson , _ := json . Marshal ( oldUser . Properties )
newUserPropertiesJson , _ := json . Marshal ( newUser . Properties )
if string ( oldUserPropertiesJson ) != string ( newUserPropertiesJson ) {
item := GetAccountItemByName ( "Properties" , organization )
2024-09-14 15:00:10 +08:00
if item == nil {
newUser . Properties = oldUser . Properties
} else {
itemsChanged = append ( itemsChanged , item )
}
2023-04-25 23:05:53 +08:00
}
2023-06-21 18:56:37 +08:00
if oldUser . PreferredMfaType != newUser . PreferredMfaType {
2023-05-05 21:23:59 +08:00
item := GetAccountItemByName ( "Multi-factor authentication" , organization )
2024-09-14 15:00:10 +08:00
if item == nil {
newUser . PreferredMfaType = oldUser . PreferredMfaType
} else {
itemsChanged = append ( itemsChanged , item )
}
2023-05-05 21:23:59 +08:00
}
2023-07-13 00:03:18 +08:00
if oldUser . Groups == nil {
oldUser . Groups = [ ] string { }
}
2023-06-12 09:27:16 +08:00
oldUserGroupsJson , _ := json . Marshal ( oldUser . Groups )
2023-07-13 00:03:18 +08:00
if newUser . Groups == nil {
newUser . Groups = [ ] string { }
}
2023-06-12 09:27:16 +08:00
newUserGroupsJson , _ := json . Marshal ( newUser . Groups )
if string ( oldUserGroupsJson ) != string ( newUserGroupsJson ) {
item := GetAccountItemByName ( "Groups" , organization )
2024-09-14 15:00:10 +08:00
if item == nil {
newUser . Groups = oldUser . Groups
} else {
itemsChanged = append ( itemsChanged , item )
}
2023-06-12 09:27:16 +08:00
}
2024-08-01 23:34:12 +08:00
if oldUser . Address == nil {
oldUser . Address = [ ] string { }
}
oldUserAddressJson , _ := json . Marshal ( oldUser . Address )
if newUser . Address == nil {
newUser . Address = [ ] string { }
}
newUserAddressJson , _ := json . Marshal ( newUser . Address )
if string ( oldUserAddressJson ) != string ( newUserAddressJson ) {
item := GetAccountItemByName ( "Address" , organization )
2024-09-14 15:00:10 +08:00
if item == nil {
newUser . Address = oldUser . Address
} else {
itemsChanged = append ( itemsChanged , item )
}
2024-08-01 23:34:12 +08:00
}
2024-03-16 09:04:00 +08:00
if newUser . FaceIds != nil {
item := GetAccountItemByName ( "Face ID" , organization )
2024-09-14 15:00:10 +08:00
if item == nil {
newUser . FaceIds = oldUser . FaceIds
} else {
itemsChanged = append ( itemsChanged , item )
}
2024-03-16 09:04:00 +08:00
}
2023-04-25 23:05:53 +08:00
if oldUser . IsAdmin != newUser . IsAdmin {
item := GetAccountItemByName ( "Is admin" , organization )
2024-09-14 15:00:10 +08:00
if item == nil {
newUser . IsAdmin = oldUser . IsAdmin
} else {
itemsChanged = append ( itemsChanged , item )
}
2023-04-25 23:05:53 +08:00
}
2023-08-19 12:23:15 +08:00
2023-04-25 23:05:53 +08:00
if oldUser . IsForbidden != newUser . IsForbidden {
item := GetAccountItemByName ( "Is forbidden" , organization )
2024-09-14 15:00:10 +08:00
if item == nil {
newUser . IsForbidden = oldUser . IsForbidden
} else {
itemsChanged = append ( itemsChanged , item )
}
2023-04-25 23:05:53 +08:00
}
if oldUser . IsDeleted != newUser . IsDeleted {
item := GetAccountItemByName ( "Is deleted" , organization )
2024-09-14 15:00:10 +08:00
if item == nil {
newUser . IsDeleted = oldUser . IsDeleted
} else {
itemsChanged = append ( itemsChanged , item )
}
2023-04-25 23:05:53 +08:00
}
2024-06-02 01:00:55 +08:00
if oldUser . NeedUpdatePassword != newUser . NeedUpdatePassword {
item := GetAccountItemByName ( "Need update password" , organization )
2024-09-14 15:00:10 +08:00
if item == nil {
newUser . NeedUpdatePassword = oldUser . NeedUpdatePassword
} else {
itemsChanged = append ( itemsChanged , item )
}
2024-06-02 01:00:55 +08:00
}
2024-10-15 20:40:14 +08:00
if oldUser . IpWhitelist != newUser . IpWhitelist {
item := GetAccountItemByName ( "IP whitelist" , organization )
if item == nil {
newUser . IpWhitelist = oldUser . IpWhitelist
} else {
itemsChanged = append ( itemsChanged , item )
}
}
2023-04-25 23:05:53 +08:00
2024-06-22 14:05:53 +08:00
if oldUser . Balance != newUser . Balance {
item := GetAccountItemByName ( "Balance" , organization )
2024-09-14 15:00:10 +08:00
if item == nil {
newUser . Balance = oldUser . Balance
} else {
itemsChanged = append ( itemsChanged , item )
}
2024-06-22 14:05:53 +08:00
}
2023-09-16 21:06:20 +08:00
if oldUser . Score != newUser . Score {
item := GetAccountItemByName ( "Score" , organization )
2024-09-14 15:00:10 +08:00
if item == nil {
newUser . Score = oldUser . Score
} else {
itemsChanged = append ( itemsChanged , item )
}
2023-09-16 21:06:20 +08:00
}
2024-08-01 23:34:12 +08:00
if oldUser . Karma != newUser . Karma {
item := GetAccountItemByName ( "Karma" , organization )
2024-09-14 15:00:10 +08:00
if item == nil {
newUser . Karma = oldUser . Karma
} else {
itemsChanged = append ( itemsChanged , item )
}
2024-08-01 23:34:12 +08:00
}
if oldUser . Language != newUser . Language {
item := GetAccountItemByName ( "Language" , organization )
2024-09-14 15:00:10 +08:00
if item == nil {
newUser . Language = oldUser . Language
} else {
itemsChanged = append ( itemsChanged , item )
}
2024-08-01 23:34:12 +08:00
}
if oldUser . Ranking != newUser . Ranking {
item := GetAccountItemByName ( "Ranking" , organization )
2024-09-14 15:00:10 +08:00
if item == nil {
newUser . Ranking = oldUser . Ranking
} else {
itemsChanged = append ( itemsChanged , item )
}
2024-08-01 23:34:12 +08:00
}
if oldUser . Currency != newUser . Currency {
item := GetAccountItemByName ( "Currency" , organization )
2024-09-14 15:00:10 +08:00
if item == nil {
newUser . Currency = oldUser . Currency
} else {
itemsChanged = append ( itemsChanged , item )
}
2024-08-01 23:34:12 +08:00
}
if oldUser . Hash != newUser . Hash {
item := GetAccountItemByName ( "Hash" , organization )
2024-09-14 15:00:10 +08:00
if item == nil {
newUser . Hash = oldUser . Hash
} else {
itemsChanged = append ( itemsChanged , item )
}
2024-08-01 23:34:12 +08:00
}
2024-02-17 15:24:36 +08:00
for _ , accountItem := range itemsChanged {
if pass , err := CheckAccountItemModifyRule ( accountItem , isAdmin , lang ) ; ! pass {
2023-04-25 23:05:53 +08:00
return pass , err
}
2024-02-17 15:24:36 +08:00
exist , userValue , err := GetUserFieldStringValue ( newUser , util . SpaceToCamel ( accountItem . Name ) )
if err != nil {
return false , err . Error ( )
}
if ! exist {
continue
}
if accountItem . Regex == "" {
continue
}
regexSignupItem , err := regexp . Compile ( accountItem . Regex )
if err != nil {
return false , err . Error ( )
}
matched := regexSignupItem . MatchString ( userValue )
if ! matched {
return false , fmt . Sprintf ( i18n . Translate ( lang , "check:The value \"%s\" for account field \"%s\" doesn't match the account item regex" ) , userValue , accountItem . Name )
}
2023-04-25 23:05:53 +08:00
}
return true , ""
}
2023-02-16 22:53:28 +08:00
func ( user * User ) GetCountryCode ( countryCode string ) string {
if countryCode != "" {
return countryCode
}
if user != nil && user . CountryCode != "" {
return user . CountryCode
}
2023-05-30 15:49:39 +08:00
if org , _ := GetOrganizationByUser ( user ) ; org != nil && len ( org . CountryCodes ) > 0 {
2023-02-16 22:53:28 +08:00
return org . CountryCodes [ 0 ]
}
return ""
}
2023-04-25 23:05:53 +08:00
func ( user * User ) IsAdminUser ( ) bool {
if user == nil {
return false
}
2023-08-19 12:23:15 +08:00
return user . IsAdmin || user . IsGlobalAdmin ( )
2023-04-25 23:05:53 +08:00
}
2024-04-24 01:10:38 +08:00
func IsAppUser ( userId string ) bool {
if strings . HasPrefix ( userId , "app/" ) {
return true
}
return false
}