mirror of
				https://github.com/go-gitea/gitea
				synced 2025-11-03 21:08:25 +00:00 
			
		
		
		
	Ensure public repositories in private organizations are visible and fix admin organizations list (#11465) (#11474)
* Ensure that we can see public repositories in private organization Fix #10144 (Again) Signed-off-by: Andrew Thornton <art27@cantab.net> * Fix Admin users and organizations page Signed-off-by: Andrew Thornton <art27@cantab.net> * Update models/repo_list.go Co-authored-by: Lauris BH <lauris@nix.lv> Co-authored-by: zeripath <art27@cantab.net> Co-authored-by: Lauris BH <lauris@nix.lv>
This commit is contained in:
		@@ -249,14 +249,35 @@ func SearchRepositoryCondition(opts *SearchRepoOptions) builder.Cond {
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if opts.Collaborate != util.OptionalBoolFalse {
 | 
							if opts.Collaborate != util.OptionalBoolFalse {
 | 
				
			||||||
 | 
								// A Collaboration is:
 | 
				
			||||||
			collaborateCond := builder.And(
 | 
								collaborateCond := builder.And(
 | 
				
			||||||
 | 
									// 1. Repository we don't own
 | 
				
			||||||
 | 
									builder.Neq{"owner_id": opts.OwnerID},
 | 
				
			||||||
 | 
									// 2. But we can see because of:
 | 
				
			||||||
				builder.Or(
 | 
									builder.Or(
 | 
				
			||||||
					builder.Expr("repository.id IN (SELECT repo_id FROM `access` WHERE access.user_id = ?)", opts.OwnerID),
 | 
										// A. We have access
 | 
				
			||||||
					builder.In("id", builder.Select("`team_repo`.repo_id").
 | 
										builder.In("`repository`.id",
 | 
				
			||||||
 | 
											builder.Select("`access`.repo_id").
 | 
				
			||||||
 | 
												From("access").
 | 
				
			||||||
 | 
												Where(builder.Eq{"`access`.user_id": opts.OwnerID})),
 | 
				
			||||||
 | 
										// B. We are in a team for
 | 
				
			||||||
 | 
										builder.In("`repository`.id", builder.Select("`team_repo`.repo_id").
 | 
				
			||||||
						From("team_repo").
 | 
											From("team_repo").
 | 
				
			||||||
						Where(builder.Eq{"`team_user`.uid": opts.OwnerID}).
 | 
											Where(builder.Eq{"`team_user`.uid": opts.OwnerID}).
 | 
				
			||||||
						Join("INNER", "team_user", "`team_user`.team_id = `team_repo`.team_id"))),
 | 
											Join("INNER", "team_user", "`team_user`.team_id = `team_repo`.team_id")),
 | 
				
			||||||
				builder.Neq{"owner_id": opts.OwnerID})
 | 
										// C. Public repositories in private organizations that we are member of
 | 
				
			||||||
 | 
										builder.And(
 | 
				
			||||||
 | 
											builder.Eq{"`repository`.is_private": false},
 | 
				
			||||||
 | 
											builder.In("`repository`.owner_id",
 | 
				
			||||||
 | 
												builder.Select("`org_user`.org_id").
 | 
				
			||||||
 | 
													From("org_user").
 | 
				
			||||||
 | 
													Join("INNER", "`user`", "`user`.id = `org_user`.org_id").
 | 
				
			||||||
 | 
													Where(builder.Eq{
 | 
				
			||||||
 | 
														"`org_user`.uid":    opts.OwnerID,
 | 
				
			||||||
 | 
														"`user`.type":       UserTypeOrganization,
 | 
				
			||||||
 | 
														"`user`.visibility": structs.VisibleTypePrivate,
 | 
				
			||||||
 | 
													})))),
 | 
				
			||||||
 | 
								)
 | 
				
			||||||
			if !opts.Private {
 | 
								if !opts.Private {
 | 
				
			||||||
				collaborateCond = collaborateCond.And(builder.Expr("owner_id NOT IN (SELECT org_id FROM org_user WHERE org_user.uid = ? AND org_user.is_public = ?)", opts.OwnerID, false))
 | 
									collaborateCond = collaborateCond.And(builder.Expr("owner_id NOT IN (SELECT org_id FROM org_user WHERE org_user.uid = ? AND org_user.is_public = ?)", opts.OwnerID, false))
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -194,7 +194,6 @@ func RenderUserSearch(ctx *context.Context, opts *models.SearchUserOptions, tplN
 | 
				
			|||||||
	if opts.Page <= 1 {
 | 
						if opts.Page <= 1 {
 | 
				
			||||||
		opts.Page = 1
 | 
							opts.Page = 1
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	opts.Actor = ctx.User
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	var (
 | 
						var (
 | 
				
			||||||
		users   []*models.User
 | 
							users   []*models.User
 | 
				
			||||||
@@ -252,6 +251,7 @@ func ExploreUsers(ctx *context.Context) {
 | 
				
			|||||||
	ctx.Data["IsRepoIndexerEnabled"] = setting.Indexer.RepoIndexerEnabled
 | 
						ctx.Data["IsRepoIndexerEnabled"] = setting.Indexer.RepoIndexerEnabled
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	RenderUserSearch(ctx, &models.SearchUserOptions{
 | 
						RenderUserSearch(ctx, &models.SearchUserOptions{
 | 
				
			||||||
 | 
							Actor:       ctx.User,
 | 
				
			||||||
		Type:        models.UserTypeIndividual,
 | 
							Type:        models.UserTypeIndividual,
 | 
				
			||||||
		ListOptions: models.ListOptions{PageSize: setting.UI.ExplorePagingNum},
 | 
							ListOptions: models.ListOptions{PageSize: setting.UI.ExplorePagingNum},
 | 
				
			||||||
		IsActive:    util.OptionalBoolTrue,
 | 
							IsActive:    util.OptionalBoolTrue,
 | 
				
			||||||
@@ -272,6 +272,7 @@ func ExploreOrganizations(ctx *context.Context) {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	RenderUserSearch(ctx, &models.SearchUserOptions{
 | 
						RenderUserSearch(ctx, &models.SearchUserOptions{
 | 
				
			||||||
 | 
							Actor:       ctx.User,
 | 
				
			||||||
		Type:        models.UserTypeOrganization,
 | 
							Type:        models.UserTypeOrganization,
 | 
				
			||||||
		ListOptions: models.ListOptions{PageSize: setting.UI.ExplorePagingNum},
 | 
							ListOptions: models.ListOptions{PageSize: setting.UI.ExplorePagingNum},
 | 
				
			||||||
		Visible:     visibleTypes,
 | 
							Visible:     visibleTypes,
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user