Skip to content

Commit fe55ab2

Browse files
lunnytechknowlogick
authored andcommitted
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
1 parent e726e4b commit fe55ab2

19 files changed

+758
-130
lines changed

Gopkg.lock

Lines changed: 3 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Gopkg.toml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,10 @@ ignored = ["google.golang.org/appengine*"]
4040
name = "github.com/go-xorm/xorm"
4141
revision = "401f4ee8ff8cbc40a4754cb12192fbe4f02f3979"
4242

43+
[[override]]
44+
name = "github.com/go-xorm/builder"
45+
version = "0.3.3"
46+
4347
[[override]]
4448
name = "github.com/go-sql-driver/mysql"
4549
revision = "d523deb1b23d913de5bdada721a6071e71283618"

models/migrations/migrations.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,8 @@ var migrations = []Migration{
202202
NewMigration("add must_change_password column for users table", addMustChangePassword),
203203
// v74 -> v75
204204
NewMigration("add approval whitelists to protected branches", addApprovalWhitelistsToProtectedBranches),
205+
// v75 -> v76
206+
NewMigration("clear nonused data which not deleted when user was deleted", clearNonusedData),
205207
}
206208

207209
// Migrate database to current version

models/migrations/v75.go

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
// Copyright 2018 The Gitea Authors. All rights reserved.
2+
// Use of this source code is governed by a MIT-style
3+
// license that can be found in the LICENSE file.
4+
5+
package migrations
6+
7+
import (
8+
"github.com/go-xorm/builder"
9+
"github.com/go-xorm/xorm"
10+
)
11+
12+
func clearNonusedData(x *xorm.Engine) error {
13+
condDelete := func(colName string) builder.Cond {
14+
return builder.NotIn(colName, builder.Select("id").From("user"))
15+
}
16+
17+
if _, err := x.Exec(builder.Delete(condDelete("uid")).From("team_user")); err != nil {
18+
return err
19+
}
20+
21+
if _, err := x.Exec(builder.Delete(condDelete("user_id")).From("collaboration")); err != nil {
22+
return err
23+
}
24+
25+
if _, err := x.Exec(builder.Delete(condDelete("user_id")).From("stop_watch")); err != nil {
26+
return err
27+
}
28+
29+
if _, err := x.Exec(builder.Delete(condDelete("owner_id")).From("gpg_key")); err != nil {
30+
return err
31+
}
32+
return nil
33+
}

models/ssh_key.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -549,6 +549,7 @@ func DeletePublicKey(doer *User, id int64) (err error) {
549549
if err = sess.Commit(); err != nil {
550550
return err
551551
}
552+
sess.Close()
552553

553554
return RewriteAllPublicKeys()
554555
}
@@ -557,6 +558,10 @@ func DeletePublicKey(doer *User, id int64) (err error) {
557558
// Note: x.Iterate does not get latest data after insert/delete, so we have to call this function
558559
// outside any session scope independently.
559560
func RewriteAllPublicKeys() error {
561+
return rewriteAllPublicKeys(x)
562+
}
563+
564+
func rewriteAllPublicKeys(e Engine) error {
560565
//Don't rewrite key if internal server
561566
if setting.SSH.StartBuiltinServer || !setting.SSH.CreateAuthorizedKeysFile {
562567
return nil
@@ -583,7 +588,7 @@ func RewriteAllPublicKeys() error {
583588
}
584589
}
585590

586-
err = x.Iterate(new(PublicKey), func(idx int, bean interface{}) (err error) {
591+
err = e.Iterate(new(PublicKey), func(idx int, bean interface{}) (err error) {
587592
_, err = t.WriteString((bean.(*PublicKey)).AuthorizedString())
588593
return err
589594
})

models/user.go

Lines changed: 12 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1015,25 +1015,26 @@ func deleteUser(e *xorm.Session, u *User) error {
10151015
&EmailAddress{UID: u.ID},
10161016
&UserOpenID{UID: u.ID},
10171017
&Reaction{UserID: u.ID},
1018+
&TeamUser{UID: u.ID},
1019+
&Collaboration{UserID: u.ID},
1020+
&Stopwatch{UserID: u.ID},
10181021
); err != nil {
10191022
return fmt.Errorf("deleteBeans: %v", err)
10201023
}
10211024

10221025
// ***** START: PublicKey *****
1023-
keys := make([]*PublicKey, 0, 10)
1024-
if err = e.Find(&keys, &PublicKey{OwnerID: u.ID}); err != nil {
1025-
return fmt.Errorf("get all public keys: %v", err)
1026-
}
1027-
1028-
keyIDs := make([]int64, len(keys))
1029-
for i := range keys {
1030-
keyIDs[i] = keys[i].ID
1031-
}
1032-
if err = deletePublicKeys(e, keyIDs...); err != nil {
1026+
if _, err = e.Delete(&PublicKey{OwnerID: u.ID}); err != nil {
10331027
return fmt.Errorf("deletePublicKeys: %v", err)
10341028
}
1029+
rewriteAllPublicKeys(e)
10351030
// ***** END: PublicKey *****
10361031

1032+
// ***** START: GPGPublicKey *****
1033+
if _, err = e.Delete(&GPGKey{OwnerID: u.ID}); err != nil {
1034+
return fmt.Errorf("deleteGPGKeys: %v", err)
1035+
}
1036+
// ***** END: GPGPublicKey *****
1037+
10371038
// Clear assignee.
10381039
if err = clearAssigneeByUserID(e, u.ID); err != nil {
10391040
return fmt.Errorf("clear assignee: %v", err)
@@ -1084,11 +1085,7 @@ func DeleteUser(u *User) (err error) {
10841085
return err
10851086
}
10861087

1087-
if err = sess.Commit(); err != nil {
1088-
return err
1089-
}
1090-
1091-
return RewriteAllPublicKeys()
1088+
return sess.Commit()
10921089
}
10931090

10941091
// DeleteInactivateUsers deletes all inactivate users and email addresses.

0 commit comments

Comments
 (0)