diff --git a/controllers/account.go b/controllers/account.go index 43a3e8f1..2ecaafb0 100644 --- a/controllers/account.go +++ b/controllers/account.go @@ -198,7 +198,7 @@ func (c *ApiController) UploadAvatar() { return } user.Avatar = fmt.Sprintf("%s%s.png?time=%s", object.GetAvatarPath(), user.Name, util.GetCurrentUnixTime()) - object.UpdateUser(user.Owner+"/"+user.Name, user) + object.UpdateUser(user.GetId(), user) resp = Response{Status: "ok", Msg: ""} c.Data["json"] = resp c.ServeJSON() diff --git a/object/user.go b/object/user.go index 811d2f39..b577f160 100644 --- a/object/user.go +++ b/object/user.go @@ -15,8 +15,6 @@ package object import ( - "crypto/md5" - "encoding/hex" "fmt" "reflect" "strings" @@ -237,17 +235,16 @@ func GetMaskedUsers(users []*User) []*User { return users } -func getMd5Hash(text string) string { - hash := md5.Sum([]byte(text)) - return hex.EncodeToString(hash[:]) -} - func calculateHash(user *User) string { s := strings.Join([]string{user.Id, user.Password, user.DisplayName, user.Avatar, user.Phone}, "|") - return getMd5Hash(s) + return util.GetMd5Hash(s) } func (user *User) UpdateUserHash() { hash := calculateHash(user) user.Hash = hash } + +func (user *User) GetId() string { + return fmt.Sprintf("%s/%s", user.Owner, user.Name) +} diff --git a/original/sync.go b/original/sync.go index 9883ffac..2b196d42 100644 --- a/original/sync.go +++ b/original/sync.go @@ -22,6 +22,10 @@ import ( "github.com/casdoor/casdoor/util" ) +func getFullAvatarUrl(avatar string) string { + return fmt.Sprintf("%s%s", avatarBaseUrl, avatar) +} + func createUserFromOriginalUser(originalUser *User) *object.User { user := &object.User{ Owner: orgName, @@ -31,7 +35,7 @@ func createUserFromOriginalUser(originalUser *User) *object.User { Type: "normal-user", Password: originalUser.Password, DisplayName: originalUser.Name, - Avatar: fmt.Sprintf("%s%s", avatarBaseUrl, originalUser.Avatar), + Avatar: getFullAvatarUrl(originalUser.Avatar), Email: "", PhonePrefix: "86", Phone: originalUser.Cellphone, @@ -46,8 +50,9 @@ func createUserFromOriginalUser(originalUser *User) *object.User { func syncUsers() { fmt.Printf("Running syncUsers()..\n") - userMap := getUserMap() - oUsers := getUsersOriginal() + users, userMap := getUserMap() + oUsers, _ := getUserMapOriginal() + fmt.Printf("Users: %d, oUsers: %d\n", len(users), len(oUsers)) newUsers := []*object.User{} for _, oUser := range oUsers { @@ -56,6 +61,14 @@ func syncUsers() { user := createUserFromOriginalUser(oUser) fmt.Printf("New user: %v\n", user) newUsers = append(newUsers, user) + } else { + user := userMap[id] + hash := calculateHash(oUser) + if user.Hash != hash { + user := createUserFromOriginalUser(oUser) + object.UpdateUser(user.GetId(), user) + fmt.Printf("Update user: %v\n", user) + } } } object.AddUsersSafe(newUsers) diff --git a/original/user.go b/original/user.go index d8b1c2fa..8063a2df 100644 --- a/original/user.go +++ b/original/user.go @@ -16,12 +16,17 @@ package original import "github.com/casdoor/casdoor/object" -func getUserMap() map[string]*object.User { +func getUsers() []*object.User { users := object.GetUsers(orgName) + return users +} + +func getUserMap() ([]*object.User, map[string]*object.User) { + users := getUsers() m := map[string]*object.User{} for _, user := range users { m[user.Name] = user } - return m + return users, m } diff --git a/original/user_original.go b/original/user_original.go index 6cd47183..981d2c7e 100644 --- a/original/user_original.go +++ b/original/user_original.go @@ -14,6 +14,13 @@ package original +import ( + "strconv" + "strings" + + "github.com/casdoor/casdoor/util" +) + type User struct { Id int `xorm:"int notnull pk autoincr" json:"id"` Name string `xorm:"varchar(128)" json:"name"` @@ -37,12 +44,17 @@ func getUsersOriginal() []*User { return users } -//func getUserMapOriginal() map[string]*User { -// users := getUsersOriginal() -// -// m := map[string]*User{} -// for _, user := range users { -// m[strconv.Itoa(user.Id)] = user -// } -// return m -//} +func getUserMapOriginal() ([]*User, map[string]*User) { + users := getUsersOriginal() + + m := map[string]*User{} + for _, user := range users { + m[strconv.Itoa(user.Id)] = user + } + return users, m +} + +func calculateHash(user *User) string { + s := strings.Join([]string{strconv.Itoa(user.Id), user.Password, user.Name, getFullAvatarUrl(user.Avatar), user.Cellphone}, "|") + return util.GetMd5Hash(s) +} diff --git a/util/string.go b/util/string.go index bec52fa9..41a153ca 100644 --- a/util/string.go +++ b/util/string.go @@ -15,6 +15,8 @@ package util import ( + "crypto/md5" + "encoding/hex" "errors" "fmt" "strings" @@ -38,3 +40,8 @@ func GenerateId() string { func GetId(name string) string { return fmt.Sprintf("admin/%s", name) } + +func GetMd5Hash(text string) string { + hash := md5.Sum([]byte(text)) + return hex.EncodeToString(hash[:]) +}