mirror of
				https://github.com/go-gitea/gitea
				synced 2025-11-04 05:18:25 +00:00 
			
		
		
		
	Do some missing checks (#28423)
This commit is contained in:
		@@ -790,6 +790,24 @@ func verifyAuthWithOptions(options *common.VerifyOptions) func(ctx *context.APIC
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func individualPermsChecker(ctx *context.APIContext) {
 | 
				
			||||||
 | 
						// org permissions have been checked in context.OrgAssignment(), but individual permissions haven't been checked.
 | 
				
			||||||
 | 
						if ctx.ContextUser.IsIndividual() {
 | 
				
			||||||
 | 
							switch {
 | 
				
			||||||
 | 
							case ctx.ContextUser.Visibility == api.VisibleTypePrivate:
 | 
				
			||||||
 | 
								if ctx.Doer == nil || (ctx.ContextUser.ID != ctx.Doer.ID && !ctx.Doer.IsAdmin) {
 | 
				
			||||||
 | 
									ctx.NotFound("Visit Project", nil)
 | 
				
			||||||
 | 
									return
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							case ctx.ContextUser.Visibility == api.VisibleTypeLimited:
 | 
				
			||||||
 | 
								if ctx.Doer == nil {
 | 
				
			||||||
 | 
									ctx.NotFound("Visit Project", nil)
 | 
				
			||||||
 | 
									return
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// check for and warn against deprecated authentication options
 | 
					// check for and warn against deprecated authentication options
 | 
				
			||||||
func checkDeprecatedAuthMethods(ctx *context.APIContext) {
 | 
					func checkDeprecatedAuthMethods(ctx *context.APIContext) {
 | 
				
			||||||
	if ctx.FormString("token") != "" || ctx.FormString("access_token") != "" {
 | 
						if ctx.FormString("token") != "" || ctx.FormString("access_token") != "" {
 | 
				
			||||||
@@ -899,7 +917,7 @@ func Routes() *web.Route {
 | 
				
			|||||||
				}, reqSelfOrAdmin(), reqBasicOrRevProxyAuth())
 | 
									}, reqSelfOrAdmin(), reqBasicOrRevProxyAuth())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				m.Get("/activities/feeds", user.ListUserActivityFeeds)
 | 
									m.Get("/activities/feeds", user.ListUserActivityFeeds)
 | 
				
			||||||
			}, context_service.UserAssignmentAPI())
 | 
								}, context_service.UserAssignmentAPI(), individualPermsChecker)
 | 
				
			||||||
		}, tokenRequiresScopes(auth_model.AccessTokenScopeCategoryUser))
 | 
							}, tokenRequiresScopes(auth_model.AccessTokenScopeCategoryUser))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// Users (requires user scope)
 | 
							// Users (requires user scope)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -796,6 +796,24 @@ func registerRoutes(m *web.Route) {
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						individualPermsChecker := func(ctx *context.Context) {
 | 
				
			||||||
 | 
							// org permissions have been checked in context.OrgAssignment(), but individual permissions haven't been checked.
 | 
				
			||||||
 | 
							if ctx.ContextUser.IsIndividual() {
 | 
				
			||||||
 | 
								switch {
 | 
				
			||||||
 | 
								case ctx.ContextUser.Visibility == structs.VisibleTypePrivate:
 | 
				
			||||||
 | 
									if ctx.Doer == nil || (ctx.ContextUser.ID != ctx.Doer.ID && !ctx.Doer.IsAdmin) {
 | 
				
			||||||
 | 
										ctx.NotFound("Visit Project", nil)
 | 
				
			||||||
 | 
										return
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								case ctx.ContextUser.Visibility == structs.VisibleTypeLimited:
 | 
				
			||||||
 | 
									if ctx.Doer == nil {
 | 
				
			||||||
 | 
										ctx.NotFound("Visit Project", nil)
 | 
				
			||||||
 | 
										return
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// ***** START: Organization *****
 | 
						// ***** START: Organization *****
 | 
				
			||||||
	m.Group("/org", func() {
 | 
						m.Group("/org", func() {
 | 
				
			||||||
		m.Group("/{org}", func() {
 | 
							m.Group("/{org}", func() {
 | 
				
			||||||
@@ -976,11 +994,11 @@ func registerRoutes(m *web.Route) {
 | 
				
			|||||||
					return
 | 
										return
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			})
 | 
								})
 | 
				
			||||||
		})
 | 
							}, reqUnitAccess(unit.TypeProjects, perm.AccessModeRead, true), individualPermsChecker)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		m.Group("", func() {
 | 
							m.Group("", func() {
 | 
				
			||||||
			m.Get("/code", user.CodeSearch)
 | 
								m.Get("/code", user.CodeSearch)
 | 
				
			||||||
		}, reqUnitAccess(unit.TypeCode, perm.AccessModeRead, false))
 | 
							}, reqUnitAccess(unit.TypeCode, perm.AccessModeRead, false), individualPermsChecker)
 | 
				
			||||||
	}, ignSignIn, context_service.UserAssignmentWeb(), context.OrgAssignment()) // for "/{username}/-" (packages, projects, code)
 | 
						}, ignSignIn, context_service.UserAssignmentWeb(), context.OrgAssignment()) // for "/{username}/-" (packages, projects, code)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	m.Group("/{username}/{reponame}", func() {
 | 
						m.Group("/{username}/{reponame}", func() {
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										23
									
								
								tests/integration/project_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								tests/integration/project_test.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,23 @@
 | 
				
			|||||||
 | 
					// Copyright 2023 The Gitea Authors. All rights reserved.
 | 
				
			||||||
 | 
					// SPDX-License-Identifier: MIT
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package integration
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"net/http"
 | 
				
			||||||
 | 
						"testing"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"code.gitea.io/gitea/tests"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TestPrivateRepoProject(t *testing.T) {
 | 
				
			||||||
 | 
						defer tests.PrepareTestEnv(t)()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// not logged in user
 | 
				
			||||||
 | 
						req := NewRequest(t, "GET", "/user31/-/projects")
 | 
				
			||||||
 | 
						MakeRequest(t, req, http.StatusNotFound)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						sess := loginUser(t, "user1")
 | 
				
			||||||
 | 
						req = NewRequest(t, "GET", "/user31/-/projects")
 | 
				
			||||||
 | 
						sess.MakeRequest(t, req, http.StatusOK)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Reference in New Issue
	
	Block a user