diff --git a/Deploy/db/registry.sql b/Deploy/db/registry.sql index b661321d7..4380d3192 100644 --- a/Deploy/db/registry.sql +++ b/Deploy/db/registry.sql @@ -38,8 +38,14 @@ insert into role (role_code, name) values create table user ( user_id int NOT NULL AUTO_INCREMENT, - username varchar(15), - email varchar(128), +# The max length of username controlled by API is 20, +# and 11 is reserved for marking the deleted users. +# The mark of deleted user is "#user_id". +# The 11 consist of 10 for the max value of user_id(4294967295) +# in MySQL and 1 of '#'. + username varchar(32), +# 11 bytes is reserved for marking the deleted users. + email varchar(255), password varchar(40) NOT NULL, realname varchar (20) NOT NULL, comment varchar (30), diff --git a/dao/dao_test.go b/dao/dao_test.go index f823e9a6c..405eff79b 100644 --- a/dao/dao_test.go +++ b/dao/dao_test.go @@ -889,20 +889,6 @@ func TestGetTopRepos(t *testing.T) { } } -func TestDeleteUser(t *testing.T) { - err := DeleteUser(currentUser.UserID) - if err != nil { - t.Errorf("Error occurred in DeleteUser: %v", err) - } - user, err := GetUser(*currentUser) - if err != nil { - t.Errorf("Error occurred in GetUser: %v", err) - } - if user != nil { - t.Errorf("user is not nil after deletion, user: %+v", user) - } -} - var targetID, policyID, policyID2, policyID3, jobID, jobID2, jobID3 int64 func TestAddRepTarget(t *testing.T) { diff --git a/dao/user.go b/dao/user.go index 3022b55a8..6f928bdac 100644 --- a/dao/user.go +++ b/dao/user.go @@ -214,7 +214,10 @@ func CheckUserPassword(query models.User) (*models.User, error) { // DeleteUser ... func DeleteUser(userID int) error { o := GetOrmer() - _, err := o.Raw(`update user set deleted = 1 where user_id = ?`, userID).Exec() + _, err := o.Raw(`update user + set deleted = 1, username = concat(username, "#", user_id), + email = concat(email, "#", user_id) + where user_id = ?`, userID).Exec() return err } diff --git a/dao/user_test.go b/dao/user_test.go new file mode 100644 index 000000000..6a8bd4874 --- /dev/null +++ b/dao/user_test.go @@ -0,0 +1,69 @@ +/* + Copyright (c) 2016 VMware, Inc. 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 dao + +import ( + "fmt" + "testing" + + "github.com/vmware/harbor/models" +) + +func TestDeleteUser(t *testing.T) { + username := "user_for_test" + email := "user_for_test@vmware.com" + password := "P@ssword" + realname := "user_for_test" + + u := models.User{ + Username: username, + Email: email, + Password: password, + Realname: realname, + } + id, err := Register(u) + if err != nil { + t.Fatalf("failed to register user: %v", err) + } + + err = DeleteUser(int(id)) + if err != nil { + t.Fatalf("Error occurred in DeleteUser: %v", err) + } + + user := &models.User{} + sql := "select * from user where user_id = ?" + if err = GetOrmer().Raw(sql, id). + QueryRow(user); err != nil { + t.Fatalf("failed to query user: %v", err) + } + + if user.Deleted != 1 { + t.Error("user is not deleted") + } + + expected := fmt.Sprintf("%s#%d", u.Username, id) + if user.Username != expected { + t.Errorf("unexpected username: %s != %s", user.Username, + expected) + } + + expected = fmt.Sprintf("%s#%d", u.Email, id) + if user.Email != expected { + t.Errorf("unexpected email: %s != %s", user.Email, + expected) + } +}