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_gpg_keys_test.go 12KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263
  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. "net/http"
  7. "net/http/httptest"
  8. "strconv"
  9. "testing"
  10. api "code.gitea.io/gitea/modules/structs"
  11. "github.com/stretchr/testify/assert"
  12. )
  13. type makeRequestFunc func(testing.TB, *http.Request, int) *httptest.ResponseRecorder
  14. func TestGPGKeys(t *testing.T) {
  15. defer prepareTestEnv(t)()
  16. session := loginUser(t, "user2")
  17. token := getTokenForLoggedInUser(t, session)
  18. tt := []struct {
  19. name string
  20. makeRequest makeRequestFunc
  21. token string
  22. results []int
  23. }{
  24. {
  25. name: "NoLogin", makeRequest: MakeRequest, token: "",
  26. results: []int{http.StatusUnauthorized, http.StatusUnauthorized, http.StatusUnauthorized, http.StatusUnauthorized, http.StatusUnauthorized, http.StatusUnauthorized, http.StatusUnauthorized, http.StatusUnauthorized, http.StatusUnauthorized},
  27. },
  28. {
  29. name: "LoggedAsUser2", makeRequest: session.MakeRequest, token: token,
  30. results: []int{http.StatusOK, http.StatusOK, http.StatusNotFound, http.StatusNoContent, http.StatusUnprocessableEntity, http.StatusNotFound, http.StatusCreated, http.StatusNotFound, http.StatusCreated},
  31. },
  32. }
  33. for _, tc := range tt {
  34. // Basic test on result code
  35. t.Run(tc.name, func(t *testing.T) {
  36. t.Run("ViewOwnGPGKeys", func(t *testing.T) {
  37. testViewOwnGPGKeys(t, tc.makeRequest, tc.token, tc.results[0])
  38. })
  39. t.Run("ViewGPGKeys", func(t *testing.T) {
  40. testViewGPGKeys(t, tc.makeRequest, tc.token, tc.results[1])
  41. })
  42. t.Run("GetGPGKey", func(t *testing.T) {
  43. testGetGPGKey(t, tc.makeRequest, tc.token, tc.results[2])
  44. })
  45. t.Run("DeleteGPGKey", func(t *testing.T) {
  46. testDeleteGPGKey(t, tc.makeRequest, tc.token, tc.results[3])
  47. })
  48. t.Run("CreateInvalidGPGKey", func(t *testing.T) {
  49. testCreateInvalidGPGKey(t, tc.makeRequest, tc.token, tc.results[4])
  50. })
  51. t.Run("CreateNoneRegistredEmailGPGKey", func(t *testing.T) {
  52. testCreateNoneRegistredEmailGPGKey(t, tc.makeRequest, tc.token, tc.results[5])
  53. })
  54. t.Run("CreateValidGPGKey", func(t *testing.T) {
  55. testCreateValidGPGKey(t, tc.makeRequest, tc.token, tc.results[6])
  56. })
  57. t.Run("CreateValidSecondaryEmailGPGKeyNotActivated", func(t *testing.T) {
  58. testCreateValidSecondaryEmailGPGKey(t, tc.makeRequest, tc.token, tc.results[7])
  59. })
  60. })
  61. }
  62. // Check state after basic add
  63. t.Run("CheckState", func(t *testing.T) {
  64. var keys []*api.GPGKey
  65. req := NewRequest(t, "GET", "/api/v1/user/gpg_keys?token="+token) // GET all keys
  66. resp := session.MakeRequest(t, req, http.StatusOK)
  67. DecodeJSON(t, resp, &keys)
  68. assert.Len(t, keys, 1)
  69. primaryKey1 := keys[0] // Primary key 1
  70. assert.EqualValues(t, "38EA3BCED732982C", primaryKey1.KeyID)
  71. assert.Len(t, primaryKey1.Emails, 1)
  72. assert.EqualValues(t, "user2@example.com", primaryKey1.Emails[0].Email)
  73. assert.True(t, primaryKey1.Emails[0].Verified)
  74. subKey := primaryKey1.SubsKey[0] // Subkey of 38EA3BCED732982C
  75. assert.EqualValues(t, "70D7C694D17D03AD", subKey.KeyID)
  76. assert.Empty(t, subKey.Emails)
  77. var key api.GPGKey
  78. req = NewRequest(t, "GET", "/api/v1/user/gpg_keys/"+strconv.FormatInt(primaryKey1.ID, 10)+"?token="+token) // Primary key 1
  79. resp = session.MakeRequest(t, req, http.StatusOK)
  80. DecodeJSON(t, resp, &key)
  81. assert.EqualValues(t, "38EA3BCED732982C", key.KeyID)
  82. assert.Len(t, key.Emails, 1)
  83. assert.EqualValues(t, "user2@example.com", key.Emails[0].Email)
  84. assert.True(t, key.Emails[0].Verified)
  85. req = NewRequest(t, "GET", "/api/v1/user/gpg_keys/"+strconv.FormatInt(subKey.ID, 10)+"?token="+token) // Subkey of 38EA3BCED732982C
  86. resp = session.MakeRequest(t, req, http.StatusOK)
  87. DecodeJSON(t, resp, &key)
  88. assert.EqualValues(t, "70D7C694D17D03AD", key.KeyID)
  89. assert.Empty(t, key.Emails)
  90. })
  91. // Check state after basic add
  92. t.Run("CheckCommits", func(t *testing.T) {
  93. t.Run("NotSigned", func(t *testing.T) {
  94. var branch api.Branch
  95. req := NewRequest(t, "GET", "/api/v1/repos/user2/repo16/branches/not-signed?token="+token)
  96. resp := session.MakeRequest(t, req, http.StatusOK)
  97. DecodeJSON(t, resp, &branch)
  98. assert.False(t, branch.Commit.Verification.Verified)
  99. })
  100. t.Run("SignedWithNotValidatedEmail", func(t *testing.T) {
  101. var branch api.Branch
  102. req := NewRequest(t, "GET", "/api/v1/repos/user2/repo16/branches/good-sign-not-yet-validated?token="+token)
  103. resp := session.MakeRequest(t, req, http.StatusOK)
  104. DecodeJSON(t, resp, &branch)
  105. assert.False(t, branch.Commit.Verification.Verified)
  106. })
  107. t.Run("SignedWithValidEmail", func(t *testing.T) {
  108. var branch api.Branch
  109. req := NewRequest(t, "GET", "/api/v1/repos/user2/repo16/branches/good-sign?token="+token)
  110. resp := session.MakeRequest(t, req, http.StatusOK)
  111. DecodeJSON(t, resp, &branch)
  112. assert.True(t, branch.Commit.Verification.Verified)
  113. })
  114. })
  115. }
  116. func testViewOwnGPGKeys(t *testing.T, makeRequest makeRequestFunc, token string, expected int) {
  117. req := NewRequest(t, "GET", "/api/v1/user/gpg_keys?token="+token)
  118. makeRequest(t, req, expected)
  119. }
  120. func testViewGPGKeys(t *testing.T, makeRequest makeRequestFunc, token string, expected int) {
  121. req := NewRequest(t, "GET", "/api/v1/users/user2/gpg_keys?token="+token)
  122. makeRequest(t, req, expected)
  123. }
  124. func testGetGPGKey(t *testing.T, makeRequest makeRequestFunc, token string, expected int) {
  125. req := NewRequest(t, "GET", "/api/v1/user/gpg_keys/1?token="+token)
  126. makeRequest(t, req, expected)
  127. }
  128. func testDeleteGPGKey(t *testing.T, makeRequest makeRequestFunc, token string, expected int) {
  129. req := NewRequest(t, "DELETE", "/api/v1/user/gpg_keys/1?token="+token)
  130. makeRequest(t, req, expected)
  131. }
  132. func testCreateGPGKey(t *testing.T, makeRequest makeRequestFunc, token string, expected int, publicKey string) {
  133. req := NewRequestWithJSON(t, "POST", "/api/v1/user/gpg_keys?token="+token, api.CreateGPGKeyOption{
  134. ArmoredKey: publicKey,
  135. })
  136. makeRequest(t, req, expected)
  137. }
  138. func testCreateInvalidGPGKey(t *testing.T, makeRequest makeRequestFunc, token string, expected int) {
  139. testCreateGPGKey(t, makeRequest, token, expected, "invalid_key")
  140. }
  141. func testCreateNoneRegistredEmailGPGKey(t *testing.T, makeRequest makeRequestFunc, token string, expected int) {
  142. testCreateGPGKey(t, makeRequest, token, expected, `-----BEGIN PGP PUBLIC KEY BLOCK-----
  143. mQENBFmGUygBCACjCNbKvMGgp0fd5vyFW9olE1CLCSyyF9gQN2hSuzmZLuAZF2Kh
  144. dCMCG2T1UwzUB/yWUFWJ2BtCwSjuaRv+cGohqEy6bhEBV90peGA33lHfjx7wP25O
  145. 7moAphDOTZtDj1AZfCh/PTcJut8Lc0eRDMhNyp/bYtO7SHNT1Hr6rrCV/xEtSAvR
  146. 3b148/tmIBiSadaLwc558KU3ucjnW5RVGins3AjBZ+TuT4XXVH/oeLSeXPSJ5rt1
  147. rHwaseslMqZ4AbvwFLx5qn1OC9rEQv/F548QsA8m0IntLjoPon+6wcubA9Gra21c
  148. Fp6aRYl9x7fiqXDLg8i3s2nKdV7+e6as6Tp9ABEBAAG0FG5vdGtub3duQGV4YW1w
  149. bGUuY29tiQEcBBABAgAGBQJZhlMoAAoJEC8+pvYULDtte/wH/2JNrhmHwDY+hMj0
  150. batIK4HICnkKxjIgbha80P2Ao08NkzSge58fsxiKDFYAQjHui+ZAw4dq79Ax9AOO
  151. Iv2GS9+DUfWhrb6RF+vNuJldFzcI0rTW/z2q+XGKrUCwN3khJY5XngHfQQrdBtMK
  152. qsoUXz/5B8g422RTbo/SdPsyYAV6HeLLeV3rdgjI1fpaW0seZKHeTXQb/HvNeuPg
  153. qz+XV1g6Gdqa1RjDOaX7A8elVKxrYq3LBtc93FW+grBde8n7JL0zPM3DY+vJ0IJZ
  154. INx/MmBfmtCq05FqNclvU+sj2R3N1JJOtBOjZrJHQbJhzoILou8AkxeX1A+q9OAz
  155. 1geiY5E=
  156. =TkP3
  157. -----END PGP PUBLIC KEY BLOCK-----`)
  158. }
  159. func testCreateValidGPGKey(t *testing.T, makeRequest makeRequestFunc, token string, expected int) {
  160. // User2 <user2@example.com> //primary & activated
  161. testCreateGPGKey(t, makeRequest, token, expected, `-----BEGIN PGP PUBLIC KEY BLOCK-----
  162. mQENBFmGVsMBCACuxgZ7W7rI9xN08Y4M7B8yx/6/I4Slm94+wXf8YNRvAyqj30dW
  163. VJhyBcnfNRDLKSQp5o/hhfDkCgdqBjLa1PnHlGS3PXJc0hP/FyYPD2BFvNMPpCYS
  164. eu3T1qKSNXm6X0XOWD2LIrdiDC8HaI9FqZVMI/srMK2CF8XCL2m67W1FuoPlWzod
  165. 5ORy0IZB7spoF0xihmcgnEGElRmdo5w/vkGH8U7Zyn9Eb57UVFeafgeskf4wqB23
  166. BjbMdW2YaB+yzMRwYgOnD5lnBD4uqSmvjaV9C0kxn7x+oJkkiRV8/z1cNcO+BaeQ
  167. Akh/yTTeTzYGSc/ZOqCX1O+NOPgSeixVlqenABEBAAG0GVVzZXIyIDx1c2VyMkBl
  168. eGFtcGxlLmNvbT6JAVQEEwEIAD4WIQRXgbSh0TtGbgRd7XI46jvO1zKYLAUCWYZW
  169. wwIbAwUJA8JnAAULCQgHAgYVCAkKCwIEFgIDAQIeAQIXgAAKCRA46jvO1zKYLF/e
  170. B/91wm2KLMIQBZBA9WA2/+9rQWTo9EqgYrXN60rEzX3cYJWXZiE4DrKR1oWDGNLi
  171. KXOCW62snvJldolBqq0ZqaKvPKzl0Y5TRqbYEc9AjUSqgRin1b+G2DevLGT4ibq+
  172. 7ocQvz0XkASEUAgHahp0Ubiiib1521WwT/duL+AG8Gg0+DK09RfV3eX5/EOkQCKv
  173. 8cutqgsd2Smz40A8wXuJkRcipZBtrB/GkUaZ/eJdwEeSYZjEA9GWF61LJT2stvRN
  174. HCk7C3z3pVEek1PluiFs/4VN8BG8yDzW4c0tLty4Fj3VwPqwIbB5AJbquVfhQCb4
  175. Eep2lm3Lc9b1OwO5N3coPJkouQENBFmGVsMBCADAGba2L6NCOE1i3WIP6CPzbdOo
  176. N3gdTfTgccAx9fNeon9jor+3tgEjlo9/6cXiRoksOV6W4wFab/ZwWgwN6JO4CGvZ
  177. Wi7EQwMMMp1E36YTojKQJrcA9UvMnTHulqQQ88F5E845DhzFQM3erv42QZZMBAX3
  178. kXCgy1GNFocl6tLUvJdEqs+VcJGGANMpmzE4WLa8KhSYnxipwuQ62JBy9R+cHyKT
  179. OARk8znRqSu5bT3LtlrZ/HXu+6Oy4+2uCdNzZIh5J5tPS7CPA6ptl88iGVBte/CJ
  180. 7cjgJWSQqeYp2Y5QvsWAivkQ4Ww9plHbbwV0A2eaHsjjWzlUl3HoJ/snMOhBABEB
  181. AAGJATwEGAEIACYWIQRXgbSh0TtGbgRd7XI46jvO1zKYLAUCWYZWwwIbDAUJA8Jn
  182. AAAKCRA46jvO1zKYLBwLCACQOpeRVrwIKVaWcPMYjVHHJsGscaLKpgpARAUgbiG6
  183. Cbc2WI8Sm3fRwrY0VAfN+u9QwrtvxANcyB3vTgTzw7FimfhOimxiTSO8HQCfjDZF
  184. Xly8rq+Fua7+ClWUpy21IekW41VvZYjH2sL6EVP+UcEOaGAyN53XfhaRVZPhNtZN
  185. NKAE9N5EG3rbsZ33LzJj40rEKlzFSseAAPft8qA3IXjzFBx+PQXHMpNCagL79he6
  186. lqockTJ+oPmta4CF/J0U5LUr1tOZXheL3TP6m8d08gDrtn0YuGOPk87i9sJz+jR9
  187. uy6MA3VSB99SK9ducGmE1Jv8mcziREroz2TEGr0zPs6h
  188. =J59D
  189. -----END PGP PUBLIC KEY BLOCK-----`)
  190. }
  191. func testCreateValidSecondaryEmailGPGKey(t *testing.T, makeRequest makeRequestFunc, token string, expected int) {
  192. // User2 <user2-2@example.com> //secondary and not activated
  193. testCreateGPGKey(t, makeRequest, token, expected, `-----BEGIN PGP PUBLIC KEY BLOCK-----
  194. mQGNBGC2K2cBDAC1+Xgk+8UfhASVgRngQi4rnQ8k0t+bWsBz4Czd26+cxVDRwlTT
  195. 8PALdrbrY/e9iXjcVcZ8Npo4UYe7/LfnL57dc7tgbenRGYYrWyVoNNv58BVw4xCY
  196. RmgvdHWIIPGuz3aME0smHxbJ2KewYTqjTPuVKF/wrHTwCpVWdjYKC5KDo3yx0mro
  197. xf9vOJOnkWNMiEw7TiZfkrbUqxyA53BVsSNKRX5C3b4FJcVT7eiAq7sDAaFxjEHy
  198. ahZslmvg7XZxWzSVzxDNesR7f4xuop8HBjzaluJoVuwiyWculTvz1b6hyHVQr+ad
  199. h8JGjj1tySI65OTFsTuptsfHXjtjl/NR4P6BXkf+FVwweaTQaEzpHkv0m9b9pY43
  200. CY/8XtS4uNPermiLG/Z0BB1eOCdoOQVHpjOa55IXQWhxXB6NZVyowiUbrR7jLDQy
  201. 5JP7D1HmErTR8JRm3VDqGbSaCgugRgFX+lb/fpgFp9k02OeK+JQudolZOt1mVk+T
  202. C4xmEWxfiH15/JMAEQEAAbQbdXNlcjIgPHVzZXIyLTJAZXhhbXBsZS5jb20+iQHU
  203. BBMBCAA+FiEEB/Y4DM3Ba2H9iXmlPO9G70C+/D4FAmC2K2cCGwMFCQPCZwAFCwkI
  204. BwIGFQoJCAsCBBYCAwECHgECF4AACgkQPO9G70C+/D59/Av/XZIhCH4X2FpxCO3d
  205. oCa+sbYkBL5xeUoPfAx5ThXzqL/tllO88TKTMEGZF3k5pocXWH0xmhqlvDTcdb0i
  206. W3O0CN8FLmuotU51c0JC1mt9zwJP9PeJNyqxrMm01Yzj55z/Dz3QHSTlDjrWTWjn
  207. YBqDf2HfdM177oydfSYmevZni1aDmBalWpFPRvqISCO7uFnvg1hJQ5mD/0qie663
  208. QJ8LAAANg32H9DyPnYi9wU62WX0DMUVTjKctT3cnYCbirjjJ7ZlCCm+cf61CRX1B
  209. E1Ng/Ef3ZcUfXWitZSjfET/pKEMSNjsQawFpZ/LPCBl+UPHzaTPAASeGJvcbZ3py
  210. wZQLQc1MCu2hmMBQ8zHQTdS2Pp0RISxCQLYvVQL6DrcJDNiSqn9p9RQt5c5r5Pjx
  211. 80BIPcjj3glOVP7PYE2azQAkt6reEjhimwCfjeDpiPnkBTY7Av2jCcUFhhemDY/j
  212. TRXK1paLphhJ36zC22SeHGxNNakjjuUakqB85DEUeoWuVm6ouQGNBGC2K2cBDADx
  213. G2rIAgMjdPtofhkEZXwv6zdNwmYOlIIM+59bam9Ep/vFq8F5f+xldevm5dvM8SeR
  214. pNwDGSOUf5OKBWBdsJFhlYBl7+EcKd/Tent/XS6JoA9ffF33b+r04L543+ykiKON
  215. WYeYi0F4WwYTIQgqZHJze1sPVkYGR5F0bL8PAcLuwd5dzZVi/q2HakrGdg29N8oY
  216. b/XnoR7FflPrNYdzO6hawi5Inx7KS7aWa0ZkARb0F4HSct+/m6nAZVsoJINLudyQ
  217. ut2NWeU8rWIm1hqyIxQFvuQJy46umq++10J/sWA98bkg41Rx+72+eP7DM5v8IgUp
  218. clJsfljRXIBWbmRAVZvtNI7PX9fwMMhf4M7wHO7G2WV39o1exKps5xFFcn8PUQiX
  219. jCSR81M145CgCdmLUR1y0pdkN/WIqjXBhkPIvO2dxEcodMNHb1aUUuUOnww6+xIP
  220. 8rGVw+a2DUiALc8Qr5RP21AYKRctfiwhSQh2KODveMtyLI3U9C/eLRPp+QM3XB8A
  221. EQEAAYkBvAQYAQgAJhYhBAf2OAzNwWth/Yl5pTzvRu9Avvw+BQJgtitnAhsMBQkD
  222. wmcAAAoJEDzvRu9Avvw+3FcMAJBwupyJ4zwQFxTJ5BkDlusG3U2FXEf3bDrXhvNd
  223. qi8eS8Vo/vRiH/w/my5JFpz1o2tJToryF71D+uF5DTItalKquhsQ9reAEmXggqOh
  224. 9Jd9mWJIEEWcRORiLNDKENKvE8bouw4U4hRaSF0IaGzAe5mO+oOvwal8L97wFxrZ
  225. 4leM1GzkopiuNfbkkBBw2KJcMjYBHzzXSCALnVwhjbgkBEWPIg38APT3cr9KfnMM
  226. q8+tvsGLj4piAl3Lww7+GhSsDOUXH8btR41BSAQDrbO5q6oi/h4nuxoNmQIDW/Ug
  227. s+dd5hnY2FtHRjb4FCR9kAjdTE6stc8wzohWfbg1N+12TTA2ylByAumICVXixavH
  228. RJ7l0OiWJk388qw9mqh3k8HcBxL7OfDlFC9oPmCS0iYiIwW/Yc80kBhoxcvl/Xa7
  229. mIMMn8taHIaQO7v9ln2EVQYTzbNCmwTw9ovTM0j/Pbkg2EftfP1TCoxQHvBnsCED
  230. 6qgtsUdi5eviONRkBgeZtN3oxA==
  231. =MgDv
  232. -----END PGP PUBLIC KEY BLOCK-----`)
  233. }