You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

access_test.go 4.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. // Copyright 2017 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package access_test
  4. import (
  5. "testing"
  6. "code.gitea.io/gitea/models/db"
  7. perm_model "code.gitea.io/gitea/models/perm"
  8. access_model "code.gitea.io/gitea/models/perm/access"
  9. repo_model "code.gitea.io/gitea/models/repo"
  10. "code.gitea.io/gitea/models/unittest"
  11. user_model "code.gitea.io/gitea/models/user"
  12. "github.com/stretchr/testify/assert"
  13. )
  14. func TestAccessLevel(t *testing.T) {
  15. assert.NoError(t, unittest.PrepareTestDatabase())
  16. user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
  17. user5 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 5})
  18. user29 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 29})
  19. // A public repository owned by User 2
  20. repo1 := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1})
  21. assert.False(t, repo1.IsPrivate)
  22. // A private repository owned by Org 3
  23. repo3 := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 3})
  24. assert.True(t, repo3.IsPrivate)
  25. // Another public repository
  26. repo4 := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 4})
  27. assert.False(t, repo4.IsPrivate)
  28. // org. owned private repo
  29. repo24 := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 24})
  30. level, err := access_model.AccessLevel(db.DefaultContext, user2, repo1)
  31. assert.NoError(t, err)
  32. assert.Equal(t, perm_model.AccessModeOwner, level)
  33. level, err = access_model.AccessLevel(db.DefaultContext, user2, repo3)
  34. assert.NoError(t, err)
  35. assert.Equal(t, perm_model.AccessModeOwner, level)
  36. level, err = access_model.AccessLevel(db.DefaultContext, user5, repo1)
  37. assert.NoError(t, err)
  38. assert.Equal(t, perm_model.AccessModeRead, level)
  39. level, err = access_model.AccessLevel(db.DefaultContext, user5, repo3)
  40. assert.NoError(t, err)
  41. assert.Equal(t, perm_model.AccessModeNone, level)
  42. // restricted user has no access to a public repo
  43. level, err = access_model.AccessLevel(db.DefaultContext, user29, repo1)
  44. assert.NoError(t, err)
  45. assert.Equal(t, perm_model.AccessModeNone, level)
  46. // ... unless he's a collaborator
  47. level, err = access_model.AccessLevel(db.DefaultContext, user29, repo4)
  48. assert.NoError(t, err)
  49. assert.Equal(t, perm_model.AccessModeWrite, level)
  50. // ... or a team member
  51. level, err = access_model.AccessLevel(db.DefaultContext, user29, repo24)
  52. assert.NoError(t, err)
  53. assert.Equal(t, perm_model.AccessModeRead, level)
  54. }
  55. func TestHasAccess(t *testing.T) {
  56. assert.NoError(t, unittest.PrepareTestDatabase())
  57. user1 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
  58. user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 5})
  59. // A public repository owned by User 2
  60. repo1 := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1})
  61. assert.False(t, repo1.IsPrivate)
  62. // A private repository owned by Org 3
  63. repo2 := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 3})
  64. assert.True(t, repo2.IsPrivate)
  65. has, err := access_model.HasAnyUnitAccess(db.DefaultContext, user1.ID, repo1)
  66. assert.NoError(t, err)
  67. assert.True(t, has)
  68. _, err = access_model.HasAnyUnitAccess(db.DefaultContext, user1.ID, repo2)
  69. assert.NoError(t, err)
  70. _, err = access_model.HasAnyUnitAccess(db.DefaultContext, user2.ID, repo1)
  71. assert.NoError(t, err)
  72. _, err = access_model.HasAnyUnitAccess(db.DefaultContext, user2.ID, repo2)
  73. assert.NoError(t, err)
  74. }
  75. func TestRepository_RecalculateAccesses(t *testing.T) {
  76. // test with organization repo
  77. assert.NoError(t, unittest.PrepareTestDatabase())
  78. repo1 := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 3})
  79. assert.NoError(t, repo1.LoadOwner(db.DefaultContext))
  80. _, err := db.GetEngine(db.DefaultContext).Delete(&repo_model.Collaboration{UserID: 2, RepoID: 3})
  81. assert.NoError(t, err)
  82. assert.NoError(t, access_model.RecalculateAccesses(db.DefaultContext, repo1))
  83. access := &access_model.Access{UserID: 2, RepoID: 3}
  84. has, err := db.GetEngine(db.DefaultContext).Get(access)
  85. assert.NoError(t, err)
  86. assert.True(t, has)
  87. assert.Equal(t, perm_model.AccessModeOwner, access.Mode)
  88. }
  89. func TestRepository_RecalculateAccesses2(t *testing.T) {
  90. // test with non-organization repo
  91. assert.NoError(t, unittest.PrepareTestDatabase())
  92. repo1 := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 4})
  93. assert.NoError(t, repo1.LoadOwner(db.DefaultContext))
  94. _, err := db.GetEngine(db.DefaultContext).Delete(&repo_model.Collaboration{UserID: 4, RepoID: 4})
  95. assert.NoError(t, err)
  96. assert.NoError(t, access_model.RecalculateAccesses(db.DefaultContext, repo1))
  97. has, err := db.GetEngine(db.DefaultContext).Get(&access_model.Access{UserID: 4, RepoID: 4})
  98. assert.NoError(t, err)
  99. assert.False(t, has)
  100. }