aboutsummaryrefslogtreecommitdiffstats
path: root/models
diff options
context:
space:
mode:
authorLunny Xiao <xiaolunwen@gmail.com>2018-12-19 00:26:26 +0800
committertechknowlogick <hello@techknowlogick.com>2018-12-18 11:26:26 -0500
commitfe55ab2a6806b6a7c114378c0436bc59a31646d0 (patch)
tree43e0566e550b38596c6fb2ec6c0bf5adeeaad7f4 /models
parente726e4b828e9592085e6cf717a2e6c29b1c2d472 (diff)
downloadgitea-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.go2
-rw-r--r--models/migrations/v75.go33
-rw-r--r--models/ssh_key.go7
-rw-r--r--models/user.go27
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.