diff --git a/object/check.go b/object/check.go index 79d57e3f..14e3e968 100644 --- a/object/check.go +++ b/object/check.go @@ -175,7 +175,7 @@ func CheckPassword(user *User, password string, lang string, options ...bool) st return i18n.Translate(lang, "check:Organization does not exist") } - credManager := cred.GetCredManager(organization.PasswordType) + credManager := cred.GetCredManager(user.PasswordType) if credManager != nil { if organization.MasterPassword != "" { if credManager.IsPasswordCorrect(password, organization.MasterPassword, "", organization.PasswordSalt) { diff --git a/object/migrator.go b/object/migrator.go index cfe80506..5e0e8dcf 100644 --- a/object/migrator.go +++ b/object/migrator.go @@ -26,6 +26,7 @@ func DoMigration() { &Migrator_1_101_0_PR_1083{}, &Migrator_1_235_0_PR_1530{}, &Migrator_1_240_0_PR_1539{}, + &Migrator_1_314_0_PR_1841{}, // more migrators add here in chronological order... } diff --git a/object/migrator_1_314_0_PR_1841.go b/object/migrator_1_314_0_PR_1841.go new file mode 100644 index 00000000..9aa2d3b9 --- /dev/null +++ b/object/migrator_1_314_0_PR_1841.go @@ -0,0 +1,93 @@ +// Copyright 2023 The Casdoor Authors. All Rights Reserved. +// +// 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 ( + "github.com/xorm-io/core" + "github.com/xorm-io/xorm" + "github.com/xorm-io/xorm/migrate" +) + +type Migrator_1_314_0_PR_1841 struct{} + +func (*Migrator_1_314_0_PR_1841) IsMigrationNeeded() bool { + users := []*User{} + + err := adapter.Engine.Table("user").Find(&users) + if err != nil { + return false + } + + for _, u := range users { + if u.PasswordType != "" { + return false + } + } + + return true +} + +func (*Migrator_1_314_0_PR_1841) DoMigration() *migrate.Migration { + migration := migrate.Migration{ + ID: "20230515MigrateUser--Create a new field 'passwordType' for table `user`", + Migrate: func(engine *xorm.Engine) error { + tx := engine.NewSession() + + defer tx.Close() + + err := tx.Begin() + if err != nil { + return err + } + + users := []*User{} + organizations := []*Organization{} + + err = tx.Table("user").Find(&users) + if err != nil { + return err + } + + err = tx.Table("organization").Find(&organizations) + if err != nil { + return err + } + + passwordTypes := make(map[string]string) + for _, org := range organizations { + passwordTypes[org.Name] = org.PasswordType + } + + columns := []string{ + "password_type", + } + + for _, u := range users { + u.PasswordType = passwordTypes[u.Owner] + + _, err := tx.ID(core.PK{u.Owner, u.Name}).Cols(columns...).Update(u) + if err != nil { + return err + } + } + + tx.Commit() + + return nil + }, + } + + return &migration +} diff --git a/object/user.go b/object/user.go index 34839a7c..d6efac0a 100644 --- a/object/user.go +++ b/object/user.go @@ -41,6 +41,7 @@ type User struct { Type string `xorm:"varchar(100)" json:"type"` Password string `xorm:"varchar(100)" json:"password"` PasswordSalt string `xorm:"varchar(100)" json:"passwordSalt"` + PasswordType string `xorm:"varchar(100)" json:"passwordType"` DisplayName string `xorm:"varchar(100)" json:"displayName"` FirstName string `xorm:"varchar(100)" json:"firstName"` LastName string `xorm:"varchar(100)" json:"lastName"` diff --git a/object/user_cred.go b/object/user_cred.go index ae5bc299..c1db566b 100644 --- a/object/user_cred.go +++ b/object/user_cred.go @@ -35,5 +35,6 @@ func (user *User) UpdateUserPassword(organization *Organization) { if credManager != nil { hashedPassword := credManager.GetHashedPassword(user.Password, user.PasswordSalt, organization.PasswordSalt) user.Password = hashedPassword + user.PasswordType = organization.PasswordType } } diff --git a/object/user_util.go b/object/user_util.go index bcc0e06d..e38b6c59 100644 --- a/object/user_util.go +++ b/object/user_util.go @@ -77,13 +77,17 @@ func GetUserByFields(organization string, field string) *User { } func SetUserField(user *User, field string, value string) bool { + bean := make(map[string]interface{}) if field == "password" { organization := GetOrganizationByUser(user) user.UpdateUserPassword(organization) - value = user.Password + bean[strings.ToLower(field)] = user.Password + bean["password_type"] = user.PasswordType + } else { + bean[strings.ToLower(field)] = value } - affected, err := adapter.Engine.Table(user).ID(core.PK{user.Owner, user.Name}).Update(map[string]interface{}{strings.ToLower(field): value}) + affected, err := adapter.Engine.Table(user).ID(core.PK{user.Owner, user.Name}).Update(bean) if err != nil { panic(err) }