diff options
author | Lunny Xiao <xiaolunwen@gmail.com> | 2018-12-19 00:26:26 +0800 |
---|---|---|
committer | techknowlogick <hello@techknowlogick.com> | 2018-12-18 11:26:26 -0500 |
commit | fe55ab2a6806b6a7c114378c0436bc59a31646d0 (patch) | |
tree | 43e0566e550b38596c6fb2ec6c0bf5adeeaad7f4 /models | |
parent | e726e4b828e9592085e6cf717a2e6c29b1c2d472 (diff) | |
download | gitea-fe55ab2a6806b6a7c114378c0436bc59a31646d0.tar.gz gitea-fe55ab2a6806b6a7c114378c0436bc59a31646d0.zip |
fix forgot removed records when deleting user (#5429)
* fix forgot removed records when deleting user
* fix migration
* fix rewritekey lock on sqlite
* remove unused codes
Diffstat (limited to 'models')
-rw-r--r-- | models/migrations/migrations.go | 2 | ||||
-rw-r--r-- | models/migrations/v75.go | 33 | ||||
-rw-r--r-- | models/ssh_key.go | 7 | ||||
-rw-r--r-- | models/user.go | 27 |
4 files changed, 53 insertions, 16 deletions
diff --git a/models/migrations/migrations.go b/models/migrations/migrations.go index 6c28989c2e..5a9c80a829 100644 --- a/models/migrations/migrations.go +++ b/models/migrations/migrations.go @@ -202,6 +202,8 @@ var migrations = []Migration{ NewMigration("add must_change_password column for users table", addMustChangePassword), // v74 -> v75 NewMigration("add approval whitelists to protected branches", addApprovalWhitelistsToProtectedBranches), + // v75 -> v76 + NewMigration("clear nonused data which not deleted when user was deleted", clearNonusedData), } // Migrate database to current version diff --git a/models/migrations/v75.go b/models/migrations/v75.go new file mode 100644 index 0000000000..d1ea5fcc94 --- /dev/null +++ b/models/migrations/v75.go @@ -0,0 +1,33 @@ +// Copyright 2018 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package migrations + +import ( + "github.com/go-xorm/builder" + "github.com/go-xorm/xorm" +) + +func clearNonusedData(x *xorm.Engine) error { + condDelete := func(colName string) builder.Cond { + return builder.NotIn(colName, builder.Select("id").From("user")) + } + + if _, err := x.Exec(builder.Delete(condDelete("uid")).From("team_user")); err != nil { + return err + } + + if _, err := x.Exec(builder.Delete(condDelete("user_id")).From("collaboration")); err != nil { + return err + } + + if _, err := x.Exec(builder.Delete(condDelete("user_id")).From("stop_watch")); err != nil { + return err + } + + if _, err := x.Exec(builder.Delete(condDelete("owner_id")).From("gpg_key")); err != nil { + return err + } + return nil +} diff --git a/models/ssh_key.go b/models/ssh_key.go index b7dd81b49b..0f8e5225bb 100644 --- a/models/ssh_key.go +++ b/models/ssh_key.go @@ -549,6 +549,7 @@ func DeletePublicKey(doer *User, id int64) (err error) { if err = sess.Commit(); err != nil { return err } + sess.Close() return RewriteAllPublicKeys() } @@ -557,6 +558,10 @@ func DeletePublicKey(doer *User, id int64) (err error) { // Note: x.Iterate does not get latest data after insert/delete, so we have to call this function // outside any session scope independently. func RewriteAllPublicKeys() error { + return rewriteAllPublicKeys(x) +} + +func rewriteAllPublicKeys(e Engine) error { //Don't rewrite key if internal server if setting.SSH.StartBuiltinServer || !setting.SSH.CreateAuthorizedKeysFile { return nil @@ -583,7 +588,7 @@ func RewriteAllPublicKeys() error { } } - err = x.Iterate(new(PublicKey), func(idx int, bean interface{}) (err error) { + err = e.Iterate(new(PublicKey), func(idx int, bean interface{}) (err error) { _, err = t.WriteString((bean.(*PublicKey)).AuthorizedString()) return err }) diff --git a/models/user.go b/models/user.go index 8f1b170b0d..a30e0d8e52 100644 --- a/models/user.go +++ b/models/user.go @@ -1015,25 +1015,26 @@ func deleteUser(e *xorm.Session, u *User) error { &EmailAddress{UID: u.ID}, &UserOpenID{UID: u.ID}, &Reaction{UserID: u.ID}, + &TeamUser{UID: u.ID}, + &Collaboration{UserID: u.ID}, + &Stopwatch{UserID: u.ID}, ); err != nil { return fmt.Errorf("deleteBeans: %v", err) } // ***** START: PublicKey ***** - keys := make([]*PublicKey, 0, 10) - if err = e.Find(&keys, &PublicKey{OwnerID: u.ID}); err != nil { - return fmt.Errorf("get all public keys: %v", err) - } - - keyIDs := make([]int64, len(keys)) - for i := range keys { - keyIDs[i] = keys[i].ID - } - if err = deletePublicKeys(e, keyIDs...); err != nil { + if _, err = e.Delete(&PublicKey{OwnerID: u.ID}); err != nil { return fmt.Errorf("deletePublicKeys: %v", err) } + rewriteAllPublicKeys(e) // ***** END: PublicKey ***** + // ***** START: GPGPublicKey ***** + if _, err = e.Delete(&GPGKey{OwnerID: u.ID}); err != nil { + return fmt.Errorf("deleteGPGKeys: %v", err) + } + // ***** END: GPGPublicKey ***** + // Clear assignee. if err = clearAssigneeByUserID(e, u.ID); err != nil { return fmt.Errorf("clear assignee: %v", err) @@ -1084,11 +1085,7 @@ func DeleteUser(u *User) (err error) { return err } - if err = sess.Commit(); err != nil { - return err - } - - return RewriteAllPublicKeys() + return sess.Commit() } // DeleteInactivateUsers deletes all inactivate users and email addresses. |