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.

api_keys_test.go 8.7KB

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