[GITEA] Add repo empty check for branch feed
- If you attempted to get a branch feed on a empty repository, it would result in a panic as the code expects that the branch exists. - `context.RepoRefByType` would normally already 404 if the branch doesn't exist, however if a repository is empty, it would not do this check. - Fix bug where `/atom/branch/*` would return a RSS feed. (cherry picked from commitd27bcd98a4) (cherry picked from commitc58566403d) (cherry picked from commitb8b3f6ab8b) (cherry picked from commit195520100b) (cherry picked from commit6e417087dd)
This commit is contained in:
		
							parent
							
								
									7a3b605c11
								
							
						
					
					
						commit
						ff91e5957a
					
				
					 4 changed files with 73 additions and 14 deletions
				
			
		| 
						 | 
				
			
			@ -8,11 +8,12 @@ import (
 | 
			
		|||
)
 | 
			
		||||
 | 
			
		||||
// RenderBranchFeed render format for branch or file
 | 
			
		||||
func RenderBranchFeed(ctx *context.Context) {
 | 
			
		||||
	_, _, showFeedType := GetFeedType(ctx.Params(":reponame"), ctx.Req)
 | 
			
		||||
	if ctx.Repo.TreePath == "" {
 | 
			
		||||
		ShowBranchFeed(ctx, ctx.Repo.Repository, showFeedType)
 | 
			
		||||
	} else {
 | 
			
		||||
		ShowFileFeed(ctx, ctx.Repo.Repository, showFeedType)
 | 
			
		||||
func RenderBranchFeed(feedType string) func(ctx *context.Context) {
 | 
			
		||||
	return func(ctx *context.Context) {
 | 
			
		||||
		if ctx.Repo.TreePath == "" {
 | 
			
		||||
			ShowBranchFeed(ctx, ctx.Repo.Repository, feedType)
 | 
			
		||||
		} else {
 | 
			
		||||
			ShowFileFeed(ctx, ctx.Repo.Repository, feedType)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -735,12 +735,19 @@ func Home(ctx *context.Context) {
 | 
			
		|||
	if setting.Other.EnableFeed {
 | 
			
		||||
		isFeed, _, showFeedType := feed.GetFeedType(ctx.Params(":reponame"), ctx.Req)
 | 
			
		||||
		if isFeed {
 | 
			
		||||
			switch {
 | 
			
		||||
			case ctx.Link == fmt.Sprintf("%s.%s", ctx.Repo.RepoLink, showFeedType):
 | 
			
		||||
			if ctx.Link == fmt.Sprintf("%s.%s", ctx.Repo.RepoLink, showFeedType) {
 | 
			
		||||
				feed.ShowRepoFeed(ctx, ctx.Repo.Repository, showFeedType)
 | 
			
		||||
			case ctx.Repo.TreePath == "":
 | 
			
		||||
				return
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			if ctx.Repo.Repository.IsEmpty {
 | 
			
		||||
				ctx.NotFound("MustBeNotEmpty", nil)
 | 
			
		||||
				return
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			if ctx.Repo.TreePath == "" {
 | 
			
		||||
				feed.ShowBranchFeed(ctx, ctx.Repo.Repository, showFeedType)
 | 
			
		||||
			case ctx.Repo.TreePath != "":
 | 
			
		||||
			} else {
 | 
			
		||||
				feed.ShowFileFeed(ctx, ctx.Repo.Repository, showFeedType)
 | 
			
		||||
			}
 | 
			
		||||
			return
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1464,8 +1464,8 @@ func registerRoutes(m *web.Route) {
 | 
			
		|||
			m.Get("/cherry-pick/{sha:([a-f0-9]{7,40})$}", repo.SetEditorconfigIfExists, repo.CherryPick)
 | 
			
		||||
		}, repo.MustBeNotEmpty, context.RepoRef(), reqRepoCodeReader)
 | 
			
		||||
 | 
			
		||||
		m.Get("/rss/branch/*", context.RepoRefByType(context.RepoRefBranch), feedEnabled, feed.RenderBranchFeed)
 | 
			
		||||
		m.Get("/atom/branch/*", context.RepoRefByType(context.RepoRefBranch), feedEnabled, feed.RenderBranchFeed)
 | 
			
		||||
		m.Get("/rss/branch/*", repo.MustBeNotEmpty, context.RepoRefByType(context.RepoRefBranch), feedEnabled, feed.RenderBranchFeed("rss"))
 | 
			
		||||
		m.Get("/atom/branch/*", repo.MustBeNotEmpty, context.RepoRefByType(context.RepoRefBranch), feedEnabled, feed.RenderBranchFeed("atom"))
 | 
			
		||||
 | 
			
		||||
		m.Group("/src", func() {
 | 
			
		||||
			m.Get("/branch/*", context.RepoRefByType(context.RepoRefBranch), repo.Home)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -7,15 +7,19 @@ import (
 | 
			
		|||
	"net/http"
 | 
			
		||||
	"testing"
 | 
			
		||||
 | 
			
		||||
	"code.gitea.io/gitea/models/db"
 | 
			
		||||
	user_model "code.gitea.io/gitea/models/user"
 | 
			
		||||
	"code.gitea.io/gitea/tests"
 | 
			
		||||
 | 
			
		||||
	"github.com/stretchr/testify/assert"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func TestFeed(t *testing.T) {
 | 
			
		||||
	defer tests.PrepareTestEnv(t)()
 | 
			
		||||
 | 
			
		||||
	t.Run("User", func(t *testing.T) {
 | 
			
		||||
		t.Run("Atom", func(t *testing.T) {
 | 
			
		||||
			defer tests.PrepareTestEnv(t)()
 | 
			
		||||
			defer tests.PrintCurrentTest(t)()
 | 
			
		||||
 | 
			
		||||
			req := NewRequest(t, "GET", "/user2.atom")
 | 
			
		||||
			resp := MakeRequest(t, req, http.StatusOK)
 | 
			
		||||
| 
						 | 
				
			
			@ -25,7 +29,7 @@ func TestFeed(t *testing.T) {
 | 
			
		|||
		})
 | 
			
		||||
 | 
			
		||||
		t.Run("RSS", func(t *testing.T) {
 | 
			
		||||
			defer tests.PrepareTestEnv(t)()
 | 
			
		||||
			defer tests.PrintCurrentTest(t)()
 | 
			
		||||
 | 
			
		||||
			req := NewRequest(t, "GET", "/user2.rss")
 | 
			
		||||
			resp := MakeRequest(t, req, http.StatusOK)
 | 
			
		||||
| 
						 | 
				
			
			@ -34,4 +38,51 @@ func TestFeed(t *testing.T) {
 | 
			
		|||
			assert.Contains(t, data, `<rss version="2.0"`)
 | 
			
		||||
		})
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
	t.Run("Repo", func(t *testing.T) {
 | 
			
		||||
		t.Run("Normal", func(t *testing.T) {
 | 
			
		||||
			t.Run("Atom", func(t *testing.T) {
 | 
			
		||||
				defer tests.PrintCurrentTest(t)()
 | 
			
		||||
 | 
			
		||||
				req := NewRequest(t, "GET", "/user2/repo1/atom/branch/master")
 | 
			
		||||
				resp := MakeRequest(t, req, http.StatusOK)
 | 
			
		||||
 | 
			
		||||
				data := resp.Body.String()
 | 
			
		||||
				assert.Contains(t, data, `<feed xmlns="http://www.w3.org/2005/Atom"`)
 | 
			
		||||
			})
 | 
			
		||||
			t.Run("RSS", func(t *testing.T) {
 | 
			
		||||
				defer tests.PrintCurrentTest(t)()
 | 
			
		||||
 | 
			
		||||
				req := NewRequest(t, "GET", "/user2/repo1/rss/branch/master")
 | 
			
		||||
				resp := MakeRequest(t, req, http.StatusOK)
 | 
			
		||||
 | 
			
		||||
				data := resp.Body.String()
 | 
			
		||||
				assert.Contains(t, data, `<rss version="2.0"`)
 | 
			
		||||
			})
 | 
			
		||||
		})
 | 
			
		||||
		t.Run("Empty", func(t *testing.T) {
 | 
			
		||||
			err := user_model.UpdateUserCols(db.DefaultContext, &user_model.User{ID: 30, ProhibitLogin: false}, "prohibit_login")
 | 
			
		||||
			assert.NoError(t, err)
 | 
			
		||||
 | 
			
		||||
			session := loginUser(t, "user30")
 | 
			
		||||
			t.Run("Atom", func(t *testing.T) {
 | 
			
		||||
				defer tests.PrintCurrentTest(t)()
 | 
			
		||||
 | 
			
		||||
				req := NewRequest(t, "GET", "/user30/empty/atom/branch/master")
 | 
			
		||||
				session.MakeRequest(t, req, http.StatusNotFound)
 | 
			
		||||
 | 
			
		||||
				req = NewRequest(t, "GET", "/user30/empty.atom/src/branch/master")
 | 
			
		||||
				session.MakeRequest(t, req, http.StatusNotFound)
 | 
			
		||||
			})
 | 
			
		||||
			t.Run("RSS", func(t *testing.T) {
 | 
			
		||||
				defer tests.PrintCurrentTest(t)()
 | 
			
		||||
 | 
			
		||||
				req := NewRequest(t, "GET", "/user30/empty/rss/branch/master")
 | 
			
		||||
				session.MakeRequest(t, req, http.StatusNotFound)
 | 
			
		||||
 | 
			
		||||
				req = NewRequest(t, "GET", "/user30/empty.rss/src/branch/master")
 | 
			
		||||
				session.MakeRequest(t, req, http.StatusNotFound)
 | 
			
		||||
			})
 | 
			
		||||
		})
 | 
			
		||||
	})
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue