mirror of
				https://github.com/go-gitea/gitea
				synced 2025-11-04 05:18:25 +00:00 
			
		
		
		
	Fix showing issues in your repositories (#18916)
- Make a restriction on which issues can be shown based on if you the user or team has write permission to the repository.
- Fixes a issue whereby you wouldn't see any associated issues with a specific team on a organization if you wasn't a member(fixed by zeroing the User{ID} in the options).
- Resolves #18913
			
			
This commit is contained in:
		@@ -1603,6 +1603,7 @@ const (
 | 
				
			|||||||
	FilterModeCreate
 | 
						FilterModeCreate
 | 
				
			||||||
	FilterModeMention
 | 
						FilterModeMention
 | 
				
			||||||
	FilterModeReviewRequested
 | 
						FilterModeReviewRequested
 | 
				
			||||||
 | 
						FilterModeYourRepositories
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func parseCountResult(results []map[string][]byte) int64 {
 | 
					func parseCountResult(results []map[string][]byte) int64 {
 | 
				
			||||||
@@ -1747,6 +1748,7 @@ type UserIssueStatsOptions struct {
 | 
				
			|||||||
	IssueIDs   []int64
 | 
						IssueIDs   []int64
 | 
				
			||||||
	IsArchived util.OptionalBool
 | 
						IsArchived util.OptionalBool
 | 
				
			||||||
	LabelIDs   []int64
 | 
						LabelIDs   []int64
 | 
				
			||||||
 | 
						RepoCond   builder.Cond
 | 
				
			||||||
	Org        *Organization
 | 
						Org        *Organization
 | 
				
			||||||
	Team       *Team
 | 
						Team       *Team
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -1764,6 +1766,9 @@ func GetUserIssueStats(opts UserIssueStatsOptions) (*IssueStats, error) {
 | 
				
			|||||||
	if len(opts.IssueIDs) > 0 {
 | 
						if len(opts.IssueIDs) > 0 {
 | 
				
			||||||
		cond = cond.And(builder.In("issue.id", opts.IssueIDs))
 | 
							cond = cond.And(builder.In("issue.id", opts.IssueIDs))
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						if opts.RepoCond != nil {
 | 
				
			||||||
 | 
							cond = cond.And(opts.RepoCond)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if opts.UserID > 0 {
 | 
						if opts.UserID > 0 {
 | 
				
			||||||
		cond = cond.And(issuePullAccessibleRepoCond("issue.repo_id", opts.UserID, opts.Org, opts.Team, opts.IsPull))
 | 
							cond = cond.And(issuePullAccessibleRepoCond("issue.repo_id", opts.UserID, opts.Org, opts.Team, opts.IsPull))
 | 
				
			||||||
@@ -1785,7 +1790,7 @@ func GetUserIssueStats(opts UserIssueStatsOptions) (*IssueStats, error) {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	switch opts.FilterMode {
 | 
						switch opts.FilterMode {
 | 
				
			||||||
	case FilterModeAll:
 | 
						case FilterModeAll, FilterModeYourRepositories:
 | 
				
			||||||
		stats.OpenCount, err = sess(cond).
 | 
							stats.OpenCount, err = sess(cond).
 | 
				
			||||||
			And("issue.is_closed = ?", false).
 | 
								And("issue.is_closed = ?", false).
 | 
				
			||||||
			Count(new(Issue))
 | 
								Count(new(Issue))
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -362,7 +362,7 @@ func buildIssueOverview(ctx *context.Context, unitType unit.Type) {
 | 
				
			|||||||
	var (
 | 
						var (
 | 
				
			||||||
		viewType   string
 | 
							viewType   string
 | 
				
			||||||
		sortType   = ctx.FormString("sort")
 | 
							sortType   = ctx.FormString("sort")
 | 
				
			||||||
		filterMode = models.FilterModeAll
 | 
							filterMode int
 | 
				
			||||||
	)
 | 
						)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// --------------------------------------------------------------------------------
 | 
						// --------------------------------------------------------------------------------
 | 
				
			||||||
@@ -388,8 +388,10 @@ func buildIssueOverview(ctx *context.Context, unitType unit.Type) {
 | 
				
			|||||||
		filterMode = models.FilterModeMention
 | 
							filterMode = models.FilterModeMention
 | 
				
			||||||
	case "review_requested":
 | 
						case "review_requested":
 | 
				
			||||||
		filterMode = models.FilterModeReviewRequested
 | 
							filterMode = models.FilterModeReviewRequested
 | 
				
			||||||
	case "your_repositories": // filterMode already set to All
 | 
						case "your_repositories":
 | 
				
			||||||
 | 
							fallthrough
 | 
				
			||||||
	default:
 | 
						default:
 | 
				
			||||||
 | 
							filterMode = models.FilterModeYourRepositories
 | 
				
			||||||
		viewType = "your_repositories"
 | 
							viewType = "your_repositories"
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -419,6 +421,30 @@ func buildIssueOverview(ctx *context.Context, unitType unit.Type) {
 | 
				
			|||||||
		User:       ctx.Doer,
 | 
							User:       ctx.Doer,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Search all repositories which
 | 
				
			||||||
 | 
						//
 | 
				
			||||||
 | 
						// As user:
 | 
				
			||||||
 | 
						// - Owns the repository.
 | 
				
			||||||
 | 
						// - Have collaborator permissions in repository.
 | 
				
			||||||
 | 
						//
 | 
				
			||||||
 | 
						// As org:
 | 
				
			||||||
 | 
						// - Owns the repository.
 | 
				
			||||||
 | 
						//
 | 
				
			||||||
 | 
						// As team:
 | 
				
			||||||
 | 
						// - Team org's owns the repository.
 | 
				
			||||||
 | 
						// - Team has read permission to repository.
 | 
				
			||||||
 | 
						repoOpts := &models.SearchRepoOptions{
 | 
				
			||||||
 | 
							Actor:      ctx.Doer,
 | 
				
			||||||
 | 
							OwnerID:    ctx.Doer.ID,
 | 
				
			||||||
 | 
							Private:    true,
 | 
				
			||||||
 | 
							AllPublic:  false,
 | 
				
			||||||
 | 
							AllLimited: false,
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if ctxUser.IsOrganization() && ctx.Org.Team != nil {
 | 
				
			||||||
 | 
							repoOpts.TeamID = ctx.Org.Team.ID
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	switch filterMode {
 | 
						switch filterMode {
 | 
				
			||||||
	case models.FilterModeAll:
 | 
						case models.FilterModeAll:
 | 
				
			||||||
	case models.FilterModeAssign:
 | 
						case models.FilterModeAssign:
 | 
				
			||||||
@@ -429,6 +455,19 @@ func buildIssueOverview(ctx *context.Context, unitType unit.Type) {
 | 
				
			|||||||
		opts.MentionedID = ctx.Doer.ID
 | 
							opts.MentionedID = ctx.Doer.ID
 | 
				
			||||||
	case models.FilterModeReviewRequested:
 | 
						case models.FilterModeReviewRequested:
 | 
				
			||||||
		opts.ReviewRequestedID = ctx.Doer.ID
 | 
							opts.ReviewRequestedID = ctx.Doer.ID
 | 
				
			||||||
 | 
						case models.FilterModeYourRepositories:
 | 
				
			||||||
 | 
							if ctxUser.IsOrganization() && ctx.Org.Team != nil {
 | 
				
			||||||
 | 
								// Fixes a issue whereby the user's ID would be used
 | 
				
			||||||
 | 
								// to check if it's in the team(which possible isn't the case).
 | 
				
			||||||
 | 
								opts.User = nil
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							userRepoIDs, _, err := models.SearchRepositoryIDs(repoOpts)
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								ctx.ServerError("models.SearchRepositoryIDs: %v", err)
 | 
				
			||||||
 | 
								return
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							opts.RepoIDs = userRepoIDs
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// keyword holds the search term entered into the search field.
 | 
						// keyword holds the search term entered into the search field.
 | 
				
			||||||
@@ -560,8 +599,12 @@ func buildIssueOverview(ctx *context.Context, unitType unit.Type) {
 | 
				
			|||||||
			Org:        org,
 | 
								Org:        org,
 | 
				
			||||||
			Team:       team,
 | 
								Team:       team,
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		if len(repoIDs) > 0 {
 | 
							if filterMode == models.FilterModeYourRepositories {
 | 
				
			||||||
			statsOpts.RepoIDs = repoIDs
 | 
								statsOpts.RepoCond = models.SearchRepositoryCondition(repoOpts)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							// Detect when we only should search by team.
 | 
				
			||||||
 | 
							if opts.User == nil {
 | 
				
			||||||
 | 
								statsOpts.UserID = 0
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		issueStats, err = models.GetUserIssueStats(statsOpts)
 | 
							issueStats, err = models.GetUserIssueStats(statsOpts)
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user