gitea源码

user_test.go 7.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  1. // Copyright 2021 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package user
  4. import (
  5. "fmt"
  6. "strings"
  7. "testing"
  8. "time"
  9. "code.gitea.io/gitea/models/auth"
  10. "code.gitea.io/gitea/models/db"
  11. "code.gitea.io/gitea/models/organization"
  12. repo_model "code.gitea.io/gitea/models/repo"
  13. "code.gitea.io/gitea/models/unittest"
  14. user_model "code.gitea.io/gitea/models/user"
  15. "code.gitea.io/gitea/modules/setting"
  16. "code.gitea.io/gitea/modules/timeutil"
  17. org_service "code.gitea.io/gitea/services/org"
  18. "github.com/stretchr/testify/assert"
  19. )
  20. func TestMain(m *testing.M) {
  21. unittest.MainTest(m)
  22. }
  23. func TestDeleteUser(t *testing.T) {
  24. test := func(userID int64) {
  25. assert.NoError(t, unittest.PrepareTestDatabase())
  26. user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: userID})
  27. ownedRepos := make([]*repo_model.Repository, 0, 10)
  28. assert.NoError(t, db.GetEngine(t.Context()).Find(&ownedRepos, &repo_model.Repository{OwnerID: userID}))
  29. if len(ownedRepos) > 0 {
  30. err := DeleteUser(t.Context(), user, false)
  31. assert.Error(t, err)
  32. assert.True(t, repo_model.IsErrUserOwnRepos(err))
  33. return
  34. }
  35. orgUsers := make([]*organization.OrgUser, 0, 10)
  36. assert.NoError(t, db.GetEngine(t.Context()).Find(&orgUsers, &organization.OrgUser{UID: userID}))
  37. for _, orgUser := range orgUsers {
  38. org := unittest.AssertExistsAndLoadBean(t, &organization.Organization{ID: orgUser.OrgID})
  39. if err := org_service.RemoveOrgUser(t.Context(), org, user); err != nil {
  40. assert.True(t, organization.IsErrLastOrgOwner(err))
  41. return
  42. }
  43. }
  44. assert.NoError(t, DeleteUser(t.Context(), user, false))
  45. unittest.AssertNotExistsBean(t, &user_model.User{ID: userID})
  46. unittest.CheckConsistencyFor(t, &user_model.User{}, &repo_model.Repository{})
  47. }
  48. test(2)
  49. test(4)
  50. test(8)
  51. test(11)
  52. org := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 3})
  53. assert.Error(t, DeleteUser(t.Context(), org, false))
  54. }
  55. func TestPurgeUser(t *testing.T) {
  56. test := func(userID int64) {
  57. assert.NoError(t, unittest.PrepareTestDatabase())
  58. user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: userID})
  59. err := DeleteUser(t.Context(), user, true)
  60. assert.NoError(t, err)
  61. unittest.AssertNotExistsBean(t, &user_model.User{ID: userID})
  62. unittest.CheckConsistencyFor(t, &user_model.User{}, &repo_model.Repository{})
  63. }
  64. test(2)
  65. test(4)
  66. test(8)
  67. test(11)
  68. org := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 3})
  69. assert.Error(t, DeleteUser(t.Context(), org, false))
  70. }
  71. func TestCreateUser(t *testing.T) {
  72. user := &user_model.User{
  73. Name: "GiteaBot",
  74. Email: "GiteaBot@gitea.io",
  75. Passwd: ";p['////..-++']",
  76. IsAdmin: false,
  77. Theme: setting.UI.DefaultTheme,
  78. MustChangePassword: false,
  79. }
  80. assert.NoError(t, user_model.CreateUser(t.Context(), user, &user_model.Meta{}))
  81. assert.NoError(t, DeleteUser(t.Context(), user, false))
  82. }
  83. func TestRenameUser(t *testing.T) {
  84. assert.NoError(t, unittest.PrepareTestDatabase())
  85. user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 21})
  86. t.Run("Non-Local", func(t *testing.T) {
  87. u := &user_model.User{
  88. Type: user_model.UserTypeIndividual,
  89. LoginType: auth.OAuth2,
  90. }
  91. assert.ErrorIs(t, RenameUser(t.Context(), u, "user_rename"), user_model.ErrUserIsNotLocal{})
  92. })
  93. t.Run("Same username", func(t *testing.T) {
  94. assert.NoError(t, RenameUser(t.Context(), user, user.Name))
  95. })
  96. t.Run("Non usable username", func(t *testing.T) {
  97. usernames := []string{"--diff", ".well-known", "gitea-actions", "aaa.atom", "aa.png"}
  98. for _, username := range usernames {
  99. assert.Error(t, user_model.IsUsableUsername(username), "non-usable username: %s", username)
  100. assert.Error(t, RenameUser(t.Context(), user, username), "non-usable username: %s", username)
  101. }
  102. })
  103. t.Run("Only capitalization", func(t *testing.T) {
  104. caps := strings.ToUpper(user.Name)
  105. unittest.AssertNotExistsBean(t, &user_model.User{ID: user.ID, Name: caps})
  106. unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{OwnerID: user.ID, OwnerName: user.Name})
  107. assert.NoError(t, RenameUser(t.Context(), user, caps))
  108. unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: user.ID, Name: caps})
  109. unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{OwnerID: user.ID, OwnerName: caps})
  110. })
  111. t.Run("Already exists", func(t *testing.T) {
  112. existUser := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1})
  113. assert.ErrorIs(t, RenameUser(t.Context(), user, existUser.Name), user_model.ErrUserAlreadyExist{Name: existUser.Name})
  114. assert.ErrorIs(t, RenameUser(t.Context(), user, existUser.LowerName), user_model.ErrUserAlreadyExist{Name: existUser.LowerName})
  115. newUsername := fmt.Sprintf("uSEr%d", existUser.ID)
  116. assert.ErrorIs(t, RenameUser(t.Context(), user, newUsername), user_model.ErrUserAlreadyExist{Name: newUsername})
  117. })
  118. t.Run("Normal", func(t *testing.T) {
  119. oldUsername := user.Name
  120. newUsername := "User_Rename"
  121. assert.NoError(t, RenameUser(t.Context(), user, newUsername))
  122. unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: user.ID, Name: newUsername, LowerName: strings.ToLower(newUsername)})
  123. redirectUID, err := user_model.LookupUserRedirect(t.Context(), oldUsername)
  124. assert.NoError(t, err)
  125. assert.Equal(t, user.ID, redirectUID)
  126. unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{OwnerID: user.ID, OwnerName: user.Name})
  127. })
  128. }
  129. func TestCreateUser_Issue5882(t *testing.T) {
  130. // Init settings
  131. _ = setting.Admin
  132. passwd := ".//.;1;;//.,-=_"
  133. tt := []struct {
  134. user *user_model.User
  135. disableOrgCreation bool
  136. }{
  137. {&user_model.User{Name: "GiteaBot", Email: "GiteaBot@gitea.io", Passwd: passwd, MustChangePassword: false}, false},
  138. {&user_model.User{Name: "GiteaBot2", Email: "GiteaBot2@gitea.io", Passwd: passwd, MustChangePassword: false}, true},
  139. }
  140. setting.Service.DefaultAllowCreateOrganization = true
  141. for _, v := range tt {
  142. setting.Admin.DisableRegularOrgCreation = v.disableOrgCreation
  143. assert.NoError(t, user_model.CreateUser(t.Context(), v.user, &user_model.Meta{}))
  144. u, err := user_model.GetUserByEmail(t.Context(), v.user.Email)
  145. assert.NoError(t, err)
  146. assert.Equal(t, !u.AllowCreateOrganization, v.disableOrgCreation)
  147. assert.NoError(t, DeleteUser(t.Context(), v.user, false))
  148. }
  149. }
  150. func TestDeleteInactiveUsers(t *testing.T) {
  151. addUser := func(name, email string, createdUnix timeutil.TimeStamp, active bool) {
  152. inactiveUser := &user_model.User{Name: name, LowerName: strings.ToLower(name), Email: email, CreatedUnix: createdUnix, IsActive: active}
  153. _, err := db.GetEngine(t.Context()).NoAutoTime().Insert(inactiveUser)
  154. assert.NoError(t, err)
  155. inactiveUserEmail := &user_model.EmailAddress{UID: inactiveUser.ID, IsPrimary: true, Email: email, LowerEmail: strings.ToLower(email), IsActivated: active}
  156. err = db.Insert(t.Context(), inactiveUserEmail)
  157. assert.NoError(t, err)
  158. }
  159. addUser("user-inactive-10", "user-inactive-10@test.com", timeutil.TimeStampNow().Add(-600), false)
  160. addUser("user-inactive-5", "user-inactive-5@test.com", timeutil.TimeStampNow().Add(-300), false)
  161. addUser("user-active-10", "user-active-10@test.com", timeutil.TimeStampNow().Add(-600), true)
  162. addUser("user-active-5", "user-active-5@test.com", timeutil.TimeStampNow().Add(-300), true)
  163. unittest.AssertExistsAndLoadBean(t, &user_model.User{Name: "user-inactive-10"})
  164. unittest.AssertExistsAndLoadBean(t, &user_model.EmailAddress{Email: "user-inactive-10@test.com"})
  165. assert.NoError(t, DeleteInactiveUsers(t.Context(), 8*time.Minute))
  166. unittest.AssertNotExistsBean(t, &user_model.User{Name: "user-inactive-10"})
  167. unittest.AssertNotExistsBean(t, &user_model.EmailAddress{Email: "user-inactive-10@test.com"})
  168. unittest.AssertExistsAndLoadBean(t, &user_model.User{Name: "user-inactive-5"})
  169. unittest.AssertExistsAndLoadBean(t, &user_model.User{Name: "user-active-10"})
  170. unittest.AssertExistsAndLoadBean(t, &user_model.User{Name: "user-active-5"})
  171. }