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.

oauth2_test.go 8.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234
  1. // Copyright 2019 The Gitea 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 auth
  5. import (
  6. "testing"
  7. "code.gitea.io/gitea/models/db"
  8. "code.gitea.io/gitea/models/unittest"
  9. "github.com/stretchr/testify/assert"
  10. )
  11. //////////////////// Application
  12. func TestOAuth2Application_GenerateClientSecret(t *testing.T) {
  13. assert.NoError(t, unittest.PrepareTestDatabase())
  14. app := unittest.AssertExistsAndLoadBean(t, &OAuth2Application{ID: 1}).(*OAuth2Application)
  15. secret, err := app.GenerateClientSecret()
  16. assert.NoError(t, err)
  17. assert.True(t, len(secret) > 0)
  18. unittest.AssertExistsAndLoadBean(t, &OAuth2Application{ID: 1, ClientSecret: app.ClientSecret})
  19. }
  20. func BenchmarkOAuth2Application_GenerateClientSecret(b *testing.B) {
  21. assert.NoError(b, unittest.PrepareTestDatabase())
  22. app := unittest.AssertExistsAndLoadBean(b, &OAuth2Application{ID: 1}).(*OAuth2Application)
  23. for i := 0; i < b.N; i++ {
  24. _, _ = app.GenerateClientSecret()
  25. }
  26. }
  27. func TestOAuth2Application_ContainsRedirectURI(t *testing.T) {
  28. app := &OAuth2Application{
  29. RedirectURIs: []string{"a", "b", "c"},
  30. }
  31. assert.True(t, app.ContainsRedirectURI("a"))
  32. assert.True(t, app.ContainsRedirectURI("b"))
  33. assert.True(t, app.ContainsRedirectURI("c"))
  34. assert.False(t, app.ContainsRedirectURI("d"))
  35. }
  36. func TestOAuth2Application_ValidateClientSecret(t *testing.T) {
  37. assert.NoError(t, unittest.PrepareTestDatabase())
  38. app := unittest.AssertExistsAndLoadBean(t, &OAuth2Application{ID: 1}).(*OAuth2Application)
  39. secret, err := app.GenerateClientSecret()
  40. assert.NoError(t, err)
  41. assert.True(t, app.ValidateClientSecret([]byte(secret)))
  42. assert.False(t, app.ValidateClientSecret([]byte("fewijfowejgfiowjeoifew")))
  43. }
  44. func TestGetOAuth2ApplicationByClientID(t *testing.T) {
  45. assert.NoError(t, unittest.PrepareTestDatabase())
  46. app, err := GetOAuth2ApplicationByClientID(db.DefaultContext, "da7da3ba-9a13-4167-856f-3899de0b0138")
  47. assert.NoError(t, err)
  48. assert.Equal(t, "da7da3ba-9a13-4167-856f-3899de0b0138", app.ClientID)
  49. app, err = GetOAuth2ApplicationByClientID(db.DefaultContext, "invalid client id")
  50. assert.Error(t, err)
  51. assert.Nil(t, app)
  52. }
  53. func TestCreateOAuth2Application(t *testing.T) {
  54. assert.NoError(t, unittest.PrepareTestDatabase())
  55. app, err := CreateOAuth2Application(db.DefaultContext, CreateOAuth2ApplicationOptions{Name: "newapp", UserID: 1})
  56. assert.NoError(t, err)
  57. assert.Equal(t, "newapp", app.Name)
  58. assert.Len(t, app.ClientID, 36)
  59. unittest.AssertExistsAndLoadBean(t, &OAuth2Application{Name: "newapp"})
  60. }
  61. func TestOAuth2Application_TableName(t *testing.T) {
  62. assert.Equal(t, "oauth2_application", new(OAuth2Application).TableName())
  63. }
  64. func TestOAuth2Application_GetGrantByUserID(t *testing.T) {
  65. assert.NoError(t, unittest.PrepareTestDatabase())
  66. app := unittest.AssertExistsAndLoadBean(t, &OAuth2Application{ID: 1}).(*OAuth2Application)
  67. grant, err := app.GetGrantByUserID(db.DefaultContext, 1)
  68. assert.NoError(t, err)
  69. assert.Equal(t, int64(1), grant.UserID)
  70. grant, err = app.GetGrantByUserID(db.DefaultContext, 34923458)
  71. assert.NoError(t, err)
  72. assert.Nil(t, grant)
  73. }
  74. func TestOAuth2Application_CreateGrant(t *testing.T) {
  75. assert.NoError(t, unittest.PrepareTestDatabase())
  76. app := unittest.AssertExistsAndLoadBean(t, &OAuth2Application{ID: 1}).(*OAuth2Application)
  77. grant, err := app.CreateGrant(db.DefaultContext, 2, "")
  78. assert.NoError(t, err)
  79. assert.NotNil(t, grant)
  80. assert.Equal(t, int64(2), grant.UserID)
  81. assert.Equal(t, int64(1), grant.ApplicationID)
  82. assert.Equal(t, "", grant.Scope)
  83. }
  84. //////////////////// Grant
  85. func TestGetOAuth2GrantByID(t *testing.T) {
  86. assert.NoError(t, unittest.PrepareTestDatabase())
  87. grant, err := GetOAuth2GrantByID(db.DefaultContext, 1)
  88. assert.NoError(t, err)
  89. assert.Equal(t, int64(1), grant.ID)
  90. grant, err = GetOAuth2GrantByID(db.DefaultContext, 34923458)
  91. assert.NoError(t, err)
  92. assert.Nil(t, grant)
  93. }
  94. func TestOAuth2Grant_IncreaseCounter(t *testing.T) {
  95. assert.NoError(t, unittest.PrepareTestDatabase())
  96. grant := unittest.AssertExistsAndLoadBean(t, &OAuth2Grant{ID: 1, Counter: 1}).(*OAuth2Grant)
  97. assert.NoError(t, grant.IncreaseCounter(db.DefaultContext))
  98. assert.Equal(t, int64(2), grant.Counter)
  99. unittest.AssertExistsAndLoadBean(t, &OAuth2Grant{ID: 1, Counter: 2})
  100. }
  101. func TestOAuth2Grant_ScopeContains(t *testing.T) {
  102. assert.NoError(t, unittest.PrepareTestDatabase())
  103. grant := unittest.AssertExistsAndLoadBean(t, &OAuth2Grant{ID: 1, Scope: "openid profile"}).(*OAuth2Grant)
  104. assert.True(t, grant.ScopeContains("openid"))
  105. assert.True(t, grant.ScopeContains("profile"))
  106. assert.False(t, grant.ScopeContains("profil"))
  107. assert.False(t, grant.ScopeContains("profile2"))
  108. }
  109. func TestOAuth2Grant_GenerateNewAuthorizationCode(t *testing.T) {
  110. assert.NoError(t, unittest.PrepareTestDatabase())
  111. grant := unittest.AssertExistsAndLoadBean(t, &OAuth2Grant{ID: 1}).(*OAuth2Grant)
  112. code, err := grant.GenerateNewAuthorizationCode(db.DefaultContext, "https://example2.com/callback", "CjvyTLSdR47G5zYenDA-eDWW4lRrO8yvjcWwbD_deOg", "S256")
  113. assert.NoError(t, err)
  114. assert.NotNil(t, code)
  115. assert.True(t, len(code.Code) > 32) // secret length > 32
  116. }
  117. func TestOAuth2Grant_TableName(t *testing.T) {
  118. assert.Equal(t, "oauth2_grant", new(OAuth2Grant).TableName())
  119. }
  120. func TestGetOAuth2GrantsByUserID(t *testing.T) {
  121. assert.NoError(t, unittest.PrepareTestDatabase())
  122. result, err := GetOAuth2GrantsByUserID(db.DefaultContext, 1)
  123. assert.NoError(t, err)
  124. assert.Len(t, result, 1)
  125. assert.Equal(t, int64(1), result[0].ID)
  126. assert.Equal(t, result[0].ApplicationID, result[0].Application.ID)
  127. result, err = GetOAuth2GrantsByUserID(db.DefaultContext, 34134)
  128. assert.NoError(t, err)
  129. assert.Empty(t, result)
  130. }
  131. func TestRevokeOAuth2Grant(t *testing.T) {
  132. assert.NoError(t, unittest.PrepareTestDatabase())
  133. assert.NoError(t, RevokeOAuth2Grant(db.DefaultContext, 1, 1))
  134. unittest.AssertNotExistsBean(t, &OAuth2Grant{ID: 1, UserID: 1})
  135. }
  136. //////////////////// Authorization Code
  137. func TestGetOAuth2AuthorizationByCode(t *testing.T) {
  138. assert.NoError(t, unittest.PrepareTestDatabase())
  139. code, err := GetOAuth2AuthorizationByCode(db.DefaultContext, "authcode")
  140. assert.NoError(t, err)
  141. assert.NotNil(t, code)
  142. assert.Equal(t, "authcode", code.Code)
  143. assert.Equal(t, int64(1), code.ID)
  144. code, err = GetOAuth2AuthorizationByCode(db.DefaultContext, "does not exist")
  145. assert.NoError(t, err)
  146. assert.Nil(t, code)
  147. }
  148. func TestOAuth2AuthorizationCode_ValidateCodeChallenge(t *testing.T) {
  149. // test plain
  150. code := &OAuth2AuthorizationCode{
  151. CodeChallengeMethod: "plain",
  152. CodeChallenge: "test123",
  153. }
  154. assert.True(t, code.ValidateCodeChallenge("test123"))
  155. assert.False(t, code.ValidateCodeChallenge("ierwgjoergjio"))
  156. // test S256
  157. code = &OAuth2AuthorizationCode{
  158. CodeChallengeMethod: "S256",
  159. CodeChallenge: "CjvyTLSdR47G5zYenDA-eDWW4lRrO8yvjcWwbD_deOg",
  160. }
  161. assert.True(t, code.ValidateCodeChallenge("N1Zo9-8Rfwhkt68r1r29ty8YwIraXR8eh_1Qwxg7yQXsonBt"))
  162. assert.False(t, code.ValidateCodeChallenge("wiogjerogorewngoenrgoiuenorg"))
  163. // test unknown
  164. code = &OAuth2AuthorizationCode{
  165. CodeChallengeMethod: "monkey",
  166. CodeChallenge: "foiwgjioriogeiogjerger",
  167. }
  168. assert.False(t, code.ValidateCodeChallenge("foiwgjioriogeiogjerger"))
  169. // test no code challenge
  170. code = &OAuth2AuthorizationCode{
  171. CodeChallengeMethod: "",
  172. CodeChallenge: "foierjiogerogerg",
  173. }
  174. assert.True(t, code.ValidateCodeChallenge(""))
  175. }
  176. func TestOAuth2AuthorizationCode_GenerateRedirectURI(t *testing.T) {
  177. code := &OAuth2AuthorizationCode{
  178. RedirectURI: "https://example.com/callback",
  179. Code: "thecode",
  180. }
  181. redirect, err := code.GenerateRedirectURI("thestate")
  182. assert.NoError(t, err)
  183. assert.Equal(t, "https://example.com/callback?code=thecode&state=thestate", redirect.String())
  184. redirect, err = code.GenerateRedirectURI("")
  185. assert.NoError(t, err)
  186. assert.Equal(t, "https://example.com/callback?code=thecode", redirect.String())
  187. }
  188. func TestOAuth2AuthorizationCode_Invalidate(t *testing.T) {
  189. assert.NoError(t, unittest.PrepareTestDatabase())
  190. code := unittest.AssertExistsAndLoadBean(t, &OAuth2AuthorizationCode{Code: "authcode"}).(*OAuth2AuthorizationCode)
  191. assert.NoError(t, code.Invalidate(db.DefaultContext))
  192. unittest.AssertNotExistsBean(t, &OAuth2AuthorizationCode{Code: "authcode"})
  193. }
  194. func TestOAuth2AuthorizationCode_TableName(t *testing.T) {
  195. assert.Equal(t, "oauth2_authorization_code", new(OAuth2AuthorizationCode).TableName())
  196. }