gitea源码

api_keys_test.go 9.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  1. // Copyright 2017 The Gogs Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package integration
  4. import (
  5. "fmt"
  6. "net/http"
  7. "net/url"
  8. "testing"
  9. asymkey_model "code.gitea.io/gitea/models/asymkey"
  10. auth_model "code.gitea.io/gitea/models/auth"
  11. "code.gitea.io/gitea/models/perm"
  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. api "code.gitea.io/gitea/modules/structs"
  16. "code.gitea.io/gitea/tests"
  17. "github.com/stretchr/testify/assert"
  18. )
  19. func TestViewDeployKeysNoLogin(t *testing.T) {
  20. defer tests.PrepareTestEnv(t)()
  21. req := NewRequest(t, "GET", "/api/v1/repos/user2/repo1/keys")
  22. MakeRequest(t, req, http.StatusUnauthorized)
  23. }
  24. func TestCreateDeployKeyNoLogin(t *testing.T) {
  25. defer tests.PrepareTestEnv(t)()
  26. req := NewRequestWithJSON(t, "POST", "/api/v1/repos/user2/repo1/keys", api.CreateKeyOption{
  27. Title: "title",
  28. Key: "key",
  29. })
  30. MakeRequest(t, req, http.StatusUnauthorized)
  31. }
  32. func TestGetDeployKeyNoLogin(t *testing.T) {
  33. defer tests.PrepareTestEnv(t)()
  34. req := NewRequest(t, "GET", "/api/v1/repos/user2/repo1/keys/1")
  35. MakeRequest(t, req, http.StatusUnauthorized)
  36. }
  37. func TestDeleteDeployKeyNoLogin(t *testing.T) {
  38. defer tests.PrepareTestEnv(t)()
  39. req := NewRequest(t, "DELETE", "/api/v1/repos/user2/repo1/keys/1")
  40. MakeRequest(t, req, http.StatusUnauthorized)
  41. }
  42. func TestCreateReadOnlyDeployKey(t *testing.T) {
  43. defer tests.PrepareTestEnv(t)()
  44. repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{Name: "repo1"})
  45. repoOwner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: repo.OwnerID})
  46. session := loginUser(t, repoOwner.Name)
  47. token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteRepository)
  48. keysURL := fmt.Sprintf("/api/v1/repos/%s/%s/keys", repoOwner.Name, repo.Name)
  49. rawKeyBody := api.CreateKeyOption{
  50. Title: "read-only",
  51. Key: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQC4cn+iXnA4KvcQYSV88vGn0Yi91vG47t1P7okprVmhNTkipNRIHWr6WdCO4VDr/cvsRkuVJAsLO2enwjGWWueOO6BodiBgyAOZ/5t5nJNMCNuLGT5UIo/RI1b0WRQwxEZTRjt6mFNw6lH14wRd8ulsr9toSWBPMOGWoYs1PDeDL0JuTjL+tr1SZi/EyxCngpYszKdXllJEHyI79KQgeD0Vt3pTrkbNVTOEcCNqZePSVmUH8X8Vhugz3bnE0/iE9Pb5fkWO9c4AnM1FgI/8Bvp27Fw2ShryIXuR6kKvUqhVMTuOSDHwu6A8jLE5Owt3GAYugDpDYuwTVNGrHLXKpPzrGGPE/jPmaLCMZcsdkec95dYeU3zKODEm8UQZFhmJmDeWVJ36nGrGZHL4J5aTTaeFUJmmXDaJYiJ+K2/ioKgXqnXvltu0A9R8/LGy4nrTJRr4JMLuJFoUXvGm1gXQ70w2LSpk6yl71RNC0hCtsBe8BP8IhYCM0EP5jh7eCMQZNvM= nocomment\n",
  52. ReadOnly: true,
  53. }
  54. req := NewRequestWithJSON(t, "POST", keysURL, rawKeyBody).
  55. AddTokenAuth(token)
  56. resp := MakeRequest(t, req, http.StatusCreated)
  57. var newDeployKey api.DeployKey
  58. DecodeJSON(t, resp, &newDeployKey)
  59. unittest.AssertExistsAndLoadBean(t, &asymkey_model.DeployKey{
  60. ID: newDeployKey.ID,
  61. Name: rawKeyBody.Title,
  62. Content: rawKeyBody.Key,
  63. Mode: perm.AccessModeRead,
  64. })
  65. // Using the ID of a key that does not belong to the repository must fail
  66. {
  67. req := NewRequest(t, "GET", fmt.Sprintf("/api/v1/repos/%s/%s/keys/%d", repoOwner.Name, repo.Name, newDeployKey.ID)).
  68. AddTokenAuth(token)
  69. MakeRequest(t, req, http.StatusOK)
  70. session5 := loginUser(t, "user5")
  71. token5 := getTokenForLoggedInUser(t, session5, auth_model.AccessTokenScopeWriteRepository)
  72. req = NewRequest(t, "GET", fmt.Sprintf("/api/v1/repos/user5/repo4/keys/%d", newDeployKey.ID)).
  73. AddTokenAuth(token5)
  74. MakeRequest(t, req, http.StatusNotFound)
  75. }
  76. }
  77. func TestCreateReadWriteDeployKey(t *testing.T) {
  78. defer tests.PrepareTestEnv(t)()
  79. repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{Name: "repo1"})
  80. repoOwner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: repo.OwnerID})
  81. session := loginUser(t, repoOwner.Name)
  82. token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteRepository)
  83. keysURL := fmt.Sprintf("/api/v1/repos/%s/%s/keys", repoOwner.Name, repo.Name)
  84. rawKeyBody := api.CreateKeyOption{
  85. Title: "read-write",
  86. Key: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQC4cn+iXnA4KvcQYSV88vGn0Yi91vG47t1P7okprVmhNTkipNRIHWr6WdCO4VDr/cvsRkuVJAsLO2enwjGWWueOO6BodiBgyAOZ/5t5nJNMCNuLGT5UIo/RI1b0WRQwxEZTRjt6mFNw6lH14wRd8ulsr9toSWBPMOGWoYs1PDeDL0JuTjL+tr1SZi/EyxCngpYszKdXllJEHyI79KQgeD0Vt3pTrkbNVTOEcCNqZePSVmUH8X8Vhugz3bnE0/iE9Pb5fkWO9c4AnM1FgI/8Bvp27Fw2ShryIXuR6kKvUqhVMTuOSDHwu6A8jLE5Owt3GAYugDpDYuwTVNGrHLXKpPzrGGPE/jPmaLCMZcsdkec95dYeU3zKODEm8UQZFhmJmDeWVJ36nGrGZHL4J5aTTaeFUJmmXDaJYiJ+K2/ioKgXqnXvltu0A9R8/LGy4nrTJRr4JMLuJFoUXvGm1gXQ70w2LSpk6yl71RNC0hCtsBe8BP8IhYCM0EP5jh7eCMQZNvM= nocomment\n",
  87. }
  88. req := NewRequestWithJSON(t, "POST", keysURL, rawKeyBody).
  89. AddTokenAuth(token)
  90. resp := MakeRequest(t, req, http.StatusCreated)
  91. var newDeployKey api.DeployKey
  92. DecodeJSON(t, resp, &newDeployKey)
  93. unittest.AssertExistsAndLoadBean(t, &asymkey_model.DeployKey{
  94. ID: newDeployKey.ID,
  95. Name: rawKeyBody.Title,
  96. Content: rawKeyBody.Key,
  97. Mode: perm.AccessModeWrite,
  98. })
  99. }
  100. func TestCreateUserKey(t *testing.T) {
  101. defer tests.PrepareTestEnv(t)()
  102. user := unittest.AssertExistsAndLoadBean(t, &user_model.User{Name: "user1"})
  103. session := loginUser(t, "user1")
  104. token := url.QueryEscape(getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteUser))
  105. keyType := "ssh-rsa"
  106. keyContent := "AAAAB3NzaC1yc2EAAAADAQABAAABgQC4cn+iXnA4KvcQYSV88vGn0Yi91vG47t1P7okprVmhNTkipNRIHWr6WdCO4VDr/cvsRkuVJAsLO2enwjGWWueOO6BodiBgyAOZ/5t5nJNMCNuLGT5UIo/RI1b0WRQwxEZTRjt6mFNw6lH14wRd8ulsr9toSWBPMOGWoYs1PDeDL0JuTjL+tr1SZi/EyxCngpYszKdXllJEHyI79KQgeD0Vt3pTrkbNVTOEcCNqZePSVmUH8X8Vhugz3bnE0/iE9Pb5fkWO9c4AnM1FgI/8Bvp27Fw2ShryIXuR6kKvUqhVMTuOSDHwu6A8jLE5Owt3GAYugDpDYuwTVNGrHLXKpPzrGGPE/jPmaLCMZcsdkec95dYeU3zKODEm8UQZFhmJmDeWVJ36nGrGZHL4J5aTTaeFUJmmXDaJYiJ+K2/ioKgXqnXvltu0A9R8/LGy4nrTJRr4JMLuJFoUXvGm1gXQ70w2LSpk6yl71RNC0hCtsBe8BP8IhYCM0EP5jh7eCMQZNvM="
  107. rawKeyBody := api.CreateKeyOption{
  108. Title: "test-key",
  109. Key: keyType + " " + keyContent,
  110. }
  111. req := NewRequestWithJSON(t, "POST", "/api/v1/user/keys", rawKeyBody).
  112. AddTokenAuth(token)
  113. resp := MakeRequest(t, req, http.StatusCreated)
  114. var newPublicKey api.PublicKey
  115. DecodeJSON(t, resp, &newPublicKey)
  116. fingerprint, err := asymkey_model.CalcFingerprint(rawKeyBody.Key)
  117. assert.NoError(t, err)
  118. unittest.AssertExistsAndLoadBean(t, &asymkey_model.PublicKey{
  119. ID: newPublicKey.ID,
  120. OwnerID: user.ID,
  121. Name: rawKeyBody.Title,
  122. Fingerprint: fingerprint,
  123. Mode: perm.AccessModeWrite,
  124. })
  125. // Search by fingerprint
  126. req = NewRequest(t, "GET", "/api/v1/user/keys?fingerprint="+newPublicKey.Fingerprint).
  127. AddTokenAuth(token)
  128. resp = MakeRequest(t, req, http.StatusOK)
  129. var fingerprintPublicKeys []api.PublicKey
  130. DecodeJSON(t, resp, &fingerprintPublicKeys)
  131. assert.Equal(t, newPublicKey.Fingerprint, fingerprintPublicKeys[0].Fingerprint)
  132. assert.Equal(t, newPublicKey.ID, fingerprintPublicKeys[0].ID)
  133. assert.Equal(t, user.ID, fingerprintPublicKeys[0].Owner.ID)
  134. req = NewRequest(t, "GET", fmt.Sprintf("/api/v1/users/%s/keys?fingerprint=%s", user.Name, newPublicKey.Fingerprint)).
  135. AddTokenAuth(token)
  136. resp = MakeRequest(t, req, http.StatusOK)
  137. DecodeJSON(t, resp, &fingerprintPublicKeys)
  138. assert.Equal(t, newPublicKey.Fingerprint, fingerprintPublicKeys[0].Fingerprint)
  139. assert.Equal(t, newPublicKey.ID, fingerprintPublicKeys[0].ID)
  140. assert.Equal(t, user.ID, fingerprintPublicKeys[0].Owner.ID)
  141. // Fail search by fingerprint
  142. req = NewRequest(t, "GET", fmt.Sprintf("/api/v1/user/keys?fingerprint=%sA", newPublicKey.Fingerprint)).
  143. AddTokenAuth(token)
  144. resp = MakeRequest(t, req, http.StatusOK)
  145. DecodeJSON(t, resp, &fingerprintPublicKeys)
  146. assert.Empty(t, fingerprintPublicKeys)
  147. // Fail searching for wrong users key
  148. req = NewRequest(t, "GET", fmt.Sprintf("/api/v1/users/%s/keys?fingerprint=%s", "user2", newPublicKey.Fingerprint)).
  149. AddTokenAuth(token)
  150. resp = MakeRequest(t, req, http.StatusOK)
  151. DecodeJSON(t, resp, &fingerprintPublicKeys)
  152. assert.Empty(t, fingerprintPublicKeys)
  153. // Now login as user 2
  154. session2 := loginUser(t, "user2")
  155. token2 := getTokenForLoggedInUser(t, session2, auth_model.AccessTokenScopeWriteUser)
  156. // Should find key even though not ours, but we shouldn't know whose it is
  157. req = NewRequest(t, "GET", "/api/v1/user/keys?fingerprint="+newPublicKey.Fingerprint).
  158. AddTokenAuth(token2)
  159. resp = MakeRequest(t, req, http.StatusOK)
  160. DecodeJSON(t, resp, &fingerprintPublicKeys)
  161. assert.Equal(t, newPublicKey.Fingerprint, fingerprintPublicKeys[0].Fingerprint)
  162. assert.Equal(t, newPublicKey.ID, fingerprintPublicKeys[0].ID)
  163. assert.Nil(t, fingerprintPublicKeys[0].Owner)
  164. // Should find key even though not ours, but we shouldn't know whose it is
  165. req = NewRequest(t, "GET", fmt.Sprintf("/api/v1/users/%s/keys?fingerprint=%s", user.Name, newPublicKey.Fingerprint)).
  166. AddTokenAuth(token2)
  167. resp = MakeRequest(t, req, http.StatusOK)
  168. DecodeJSON(t, resp, &fingerprintPublicKeys)
  169. assert.Equal(t, newPublicKey.Fingerprint, fingerprintPublicKeys[0].Fingerprint)
  170. assert.Equal(t, newPublicKey.ID, fingerprintPublicKeys[0].ID)
  171. assert.Nil(t, fingerprintPublicKeys[0].Owner)
  172. // Fail when searching for key if it is not ours
  173. req = NewRequest(t, "GET", fmt.Sprintf("/api/v1/users/%s/keys?fingerprint=%s", "user2", newPublicKey.Fingerprint)).
  174. AddTokenAuth(token2)
  175. resp = MakeRequest(t, req, http.StatusOK)
  176. DecodeJSON(t, resp, &fingerprintPublicKeys)
  177. assert.Empty(t, fingerprintPublicKeys)
  178. }