gitea源码

auth_test.go 3.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. // Copyright 2024 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package auth
  4. import (
  5. "net/http"
  6. "net/url"
  7. "testing"
  8. auth_model "code.gitea.io/gitea/models/auth"
  9. "code.gitea.io/gitea/modules/session"
  10. "code.gitea.io/gitea/modules/setting"
  11. "code.gitea.io/gitea/modules/test"
  12. "code.gitea.io/gitea/modules/util"
  13. "code.gitea.io/gitea/services/auth/source/oauth2"
  14. "code.gitea.io/gitea/services/contexttest"
  15. "github.com/markbates/goth"
  16. "github.com/markbates/goth/gothic"
  17. "github.com/stretchr/testify/assert"
  18. )
  19. func addOAuth2Source(t *testing.T, authName string, cfg oauth2.Source) {
  20. cfg.Provider = util.IfZero(cfg.Provider, "gitea")
  21. err := auth_model.CreateSource(t.Context(), &auth_model.Source{
  22. Type: auth_model.OAuth2,
  23. Name: authName,
  24. IsActive: true,
  25. Cfg: &cfg,
  26. })
  27. assert.NoError(t, err)
  28. }
  29. func TestUserLogin(t *testing.T) {
  30. ctx, resp := contexttest.MockContext(t, "/user/login")
  31. SignIn(ctx)
  32. assert.Equal(t, http.StatusOK, resp.Code)
  33. ctx, resp = contexttest.MockContext(t, "/user/login")
  34. ctx.IsSigned = true
  35. SignIn(ctx)
  36. assert.Equal(t, http.StatusSeeOther, resp.Code)
  37. assert.Equal(t, "/", test.RedirectURL(resp))
  38. ctx, resp = contexttest.MockContext(t, "/user/login?redirect_to=/other")
  39. ctx.IsSigned = true
  40. SignIn(ctx)
  41. assert.Equal(t, "/other", test.RedirectURL(resp))
  42. ctx, resp = contexttest.MockContext(t, "/user/login")
  43. ctx.Req.AddCookie(&http.Cookie{Name: "redirect_to", Value: "/other-cookie"})
  44. ctx.IsSigned = true
  45. SignIn(ctx)
  46. assert.Equal(t, "/other-cookie", test.RedirectURL(resp))
  47. ctx, resp = contexttest.MockContext(t, "/user/login?redirect_to="+url.QueryEscape("https://example.com"))
  48. ctx.IsSigned = true
  49. SignIn(ctx)
  50. assert.Equal(t, "/", test.RedirectURL(resp))
  51. }
  52. func TestSignUpOAuth2Login(t *testing.T) {
  53. defer test.MockVariableValue(&setting.OAuth2Client.EnableAutoRegistration, true)()
  54. _ = oauth2.Init(t.Context())
  55. addOAuth2Source(t, "dummy-auth-source", oauth2.Source{})
  56. t.Run("OAuth2MissingField", func(t *testing.T) {
  57. defer test.MockVariableValue(&gothic.CompleteUserAuth, func(res http.ResponseWriter, req *http.Request) (goth.User, error) {
  58. return goth.User{Provider: "dummy-auth-source", UserID: "dummy-user"}, nil
  59. })()
  60. mockOpt := contexttest.MockContextOption{SessionStore: session.NewMockMemStore("dummy-sid")}
  61. ctx, resp := contexttest.MockContext(t, "/user/oauth2/dummy-auth-source/callback?code=dummy-code", mockOpt)
  62. ctx.SetPathParam("provider", "dummy-auth-source")
  63. SignInOAuthCallback(ctx)
  64. assert.Equal(t, http.StatusSeeOther, resp.Code)
  65. assert.Equal(t, "/user/link_account", test.RedirectURL(resp))
  66. // then the user will be redirected to the link account page, and see a message about the missing fields
  67. ctx, _ = contexttest.MockContext(t, "/user/link_account", mockOpt)
  68. LinkAccount(ctx)
  69. assert.EqualValues(t, "auth.oauth_callback_unable_auto_reg:dummy-auth-source,email", ctx.Data["AutoRegistrationFailedPrompt"])
  70. })
  71. t.Run("OAuth2CallbackError", func(t *testing.T) {
  72. mockOpt := contexttest.MockContextOption{SessionStore: session.NewMockMemStore("dummy-sid")}
  73. ctx, resp := contexttest.MockContext(t, "/user/oauth2/dummy-auth-source/callback", mockOpt)
  74. ctx.SetPathParam("provider", "dummy-auth-source")
  75. SignInOAuthCallback(ctx)
  76. assert.Equal(t, http.StatusSeeOther, resp.Code)
  77. assert.Equal(t, "/user/login", test.RedirectURL(resp))
  78. assert.Contains(t, ctx.Flash.ErrorMsg, "auth.oauth.signin.error.general")
  79. })
  80. }