mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-11-04 04:14:01 +01:00 
			
		
		
		
	Make "/user/login" page redirect if the current user has signed in (#29583)
Fix #29582 and maybe more. Maybe fix #29116
This commit is contained in:
		
							parent
							
								
									82875ae946
								
							
						
					
					
						commit
						df1268ca08
					
				@ -123,9 +123,21 @@ func resetLocale(ctx *context.Context, u *user_model.User) error {
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func RedirectAfterLogin(ctx *context.Context) {
 | 
			
		||||
	redirectTo := ctx.FormString("redirect_to")
 | 
			
		||||
	if redirectTo == "" {
 | 
			
		||||
		redirectTo = ctx.GetSiteCookie("redirect_to")
 | 
			
		||||
	}
 | 
			
		||||
	middleware.DeleteRedirectToCookie(ctx.Resp)
 | 
			
		||||
	nextRedirectTo := setting.AppSubURL + string(setting.LandingPageURL)
 | 
			
		||||
	if setting.LandingPageURL == setting.LandingPageLogin {
 | 
			
		||||
		nextRedirectTo = setting.AppSubURL + "/" // do not cycle-redirect to the login page
 | 
			
		||||
	}
 | 
			
		||||
	ctx.RedirectToFirst(redirectTo, nextRedirectTo)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func CheckAutoLogin(ctx *context.Context) bool {
 | 
			
		||||
	// Check auto-login
 | 
			
		||||
	isSucceed, err := autoSignIn(ctx)
 | 
			
		||||
	isSucceed, err := autoSignIn(ctx) // try to auto-login
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		if errors.Is(err, auth_service.ErrAuthTokenInvalidHash) {
 | 
			
		||||
			ctx.Flash.Error(ctx.Tr("auth.remember_me.compromised"), true)
 | 
			
		||||
@ -138,17 +150,10 @@ func CheckAutoLogin(ctx *context.Context) bool {
 | 
			
		||||
	redirectTo := ctx.FormString("redirect_to")
 | 
			
		||||
	if len(redirectTo) > 0 {
 | 
			
		||||
		middleware.SetRedirectToCookie(ctx.Resp, redirectTo)
 | 
			
		||||
	} else {
 | 
			
		||||
		redirectTo = ctx.GetSiteCookie("redirect_to")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if isSucceed {
 | 
			
		||||
		middleware.DeleteRedirectToCookie(ctx.Resp)
 | 
			
		||||
		nextRedirectTo := setting.AppSubURL + string(setting.LandingPageURL)
 | 
			
		||||
		if setting.LandingPageURL == setting.LandingPageLogin {
 | 
			
		||||
			nextRedirectTo = setting.AppSubURL + "/" // do not cycle-redirect to the login page
 | 
			
		||||
		}
 | 
			
		||||
		ctx.RedirectToFirst(redirectTo, nextRedirectTo)
 | 
			
		||||
		RedirectAfterLogin(ctx)
 | 
			
		||||
		return true
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@ -163,6 +168,11 @@ func SignIn(ctx *context.Context) {
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if ctx.IsSigned {
 | 
			
		||||
		RedirectAfterLogin(ctx)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	oauth2Providers, err := oauth2.GetOAuth2Providers(ctx, optional.Some(true))
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		ctx.ServerError("UserSignIn", err)
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										43
									
								
								routers/web/auth/auth_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										43
									
								
								routers/web/auth/auth_test.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,43 @@
 | 
			
		||||
// Copyright 2024 The Gitea Authors. All rights reserved.
 | 
			
		||||
// SPDX-License-Identifier: MIT
 | 
			
		||||
 | 
			
		||||
package auth
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"net/http"
 | 
			
		||||
	"net/url"
 | 
			
		||||
	"testing"
 | 
			
		||||
 | 
			
		||||
	"code.gitea.io/gitea/modules/test"
 | 
			
		||||
	"code.gitea.io/gitea/services/contexttest"
 | 
			
		||||
 | 
			
		||||
	"github.com/stretchr/testify/assert"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func TestUserLogin(t *testing.T) {
 | 
			
		||||
	ctx, resp := contexttest.MockContext(t, "/user/login")
 | 
			
		||||
	SignIn(ctx)
 | 
			
		||||
	assert.Equal(t, http.StatusOK, resp.Code)
 | 
			
		||||
 | 
			
		||||
	ctx, resp = contexttest.MockContext(t, "/user/login")
 | 
			
		||||
	ctx.IsSigned = true
 | 
			
		||||
	SignIn(ctx)
 | 
			
		||||
	assert.Equal(t, http.StatusSeeOther, resp.Code)
 | 
			
		||||
	assert.Equal(t, "/", test.RedirectURL(resp))
 | 
			
		||||
 | 
			
		||||
	ctx, resp = contexttest.MockContext(t, "/user/login?redirect_to=/other")
 | 
			
		||||
	ctx.IsSigned = true
 | 
			
		||||
	SignIn(ctx)
 | 
			
		||||
	assert.Equal(t, "/other", test.RedirectURL(resp))
 | 
			
		||||
 | 
			
		||||
	ctx, resp = contexttest.MockContext(t, "/user/login")
 | 
			
		||||
	ctx.Req.AddCookie(&http.Cookie{Name: "redirect_to", Value: "/other-cookie"})
 | 
			
		||||
	ctx.IsSigned = true
 | 
			
		||||
	SignIn(ctx)
 | 
			
		||||
	assert.Equal(t, "/other-cookie", test.RedirectURL(resp))
 | 
			
		||||
 | 
			
		||||
	ctx, resp = contexttest.MockContext(t, "/user/login?redirect_to="+url.QueryEscape("https://example.com"))
 | 
			
		||||
	ctx.IsSigned = true
 | 
			
		||||
	SignIn(ctx)
 | 
			
		||||
	assert.Equal(t, "/", test.RedirectURL(resp))
 | 
			
		||||
}
 | 
			
		||||
@ -79,7 +79,7 @@ func assertPagesMetas(t *testing.T, expectedNames []string, metas any) {
 | 
			
		||||
func TestWiki(t *testing.T) {
 | 
			
		||||
	unittest.PrepareTestEnv(t)
 | 
			
		||||
 | 
			
		||||
	ctx, _ := contexttest.MockContext(t, "user2/repo1/wiki/?action=_pages")
 | 
			
		||||
	ctx, _ := contexttest.MockContext(t, "user2/repo1/wiki")
 | 
			
		||||
	ctx.SetParams("*", "Home")
 | 
			
		||||
	contexttest.LoadRepo(t, ctx, 1)
 | 
			
		||||
	Wiki(ctx)
 | 
			
		||||
 | 
			
		||||
@ -7,6 +7,7 @@ package contexttest
 | 
			
		||||
import (
 | 
			
		||||
	gocontext "context"
 | 
			
		||||
	"io"
 | 
			
		||||
	"maps"
 | 
			
		||||
	"net/http"
 | 
			
		||||
	"net/http/httptest"
 | 
			
		||||
	"net/url"
 | 
			
		||||
@ -36,7 +37,7 @@ func mockRequest(t *testing.T, reqPath string) *http.Request {
 | 
			
		||||
	}
 | 
			
		||||
	requestURL, err := url.Parse(path)
 | 
			
		||||
	assert.NoError(t, err)
 | 
			
		||||
	req := &http.Request{Method: method, URL: requestURL, Form: url.Values{}}
 | 
			
		||||
	req := &http.Request{Method: method, URL: requestURL, Form: maps.Clone(requestURL.Query()), Header: http.Header{}}
 | 
			
		||||
	req = req.WithContext(middleware.WithContextData(req.Context()))
 | 
			
		||||
	return req
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user