|
|
|
@ -188,9 +188,13 @@ func Milestones(ctx *context.Context) { |
|
|
|
|
ctx.ServerError("env.RepoIDs", err) |
|
|
|
|
return |
|
|
|
|
} |
|
|
|
|
userRepoIDs, err = models.FilterOutRepoIdsWithoutUnitAccess(ctx.User, userRepoIDs, models.UnitTypeIssues, models.UnitTypePullRequests) |
|
|
|
|
if err != nil { |
|
|
|
|
ctx.ServerError("FilterOutRepoIdsWithoutUnitAccess", err) |
|
|
|
|
return |
|
|
|
|
} |
|
|
|
|
} else { |
|
|
|
|
unitType := models.UnitTypeIssues |
|
|
|
|
userRepoIDs, err = ctxUser.GetAccessRepoIDs(unitType) |
|
|
|
|
userRepoIDs, err = ctxUser.GetAccessRepoIDs(models.UnitTypeIssues, models.UnitTypePullRequests) |
|
|
|
|
if err != nil { |
|
|
|
|
ctx.ServerError("ctxUser.GetAccessRepoIDs", err) |
|
|
|
|
return |
|
|
|
@ -201,27 +205,30 @@ func Milestones(ctx *context.Context) { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
var repoIDs []int64 |
|
|
|
|
if issueReposQueryPattern.MatchString(reposQuery) { |
|
|
|
|
// remove "[" and "]" from string
|
|
|
|
|
reposQuery = reposQuery[1 : len(reposQuery)-1] |
|
|
|
|
//for each ID (delimiter ",") add to int to repoIDs
|
|
|
|
|
reposSet := false |
|
|
|
|
for _, rID := range strings.Split(reposQuery, ",") { |
|
|
|
|
// Ensure nonempty string entries
|
|
|
|
|
if rID != "" && rID != "0" { |
|
|
|
|
reposSet = true |
|
|
|
|
rIDint64, err := strconv.ParseInt(rID, 10, 64) |
|
|
|
|
if err == nil && com.IsSliceContainsInt64(userRepoIDs, rIDint64) { |
|
|
|
|
repoIDs = append(repoIDs, rIDint64) |
|
|
|
|
if len(reposQuery) != 0 { |
|
|
|
|
if issueReposQueryPattern.MatchString(reposQuery) { |
|
|
|
|
// remove "[" and "]" from string
|
|
|
|
|
reposQuery = reposQuery[1 : len(reposQuery)-1] |
|
|
|
|
//for each ID (delimiter ",") add to int to repoIDs
|
|
|
|
|
reposSet := false |
|
|
|
|
for _, rID := range strings.Split(reposQuery, ",") { |
|
|
|
|
// Ensure nonempty string entries
|
|
|
|
|
if rID != "" && rID != "0" { |
|
|
|
|
reposSet = true |
|
|
|
|
rIDint64, err := strconv.ParseInt(rID, 10, 64) |
|
|
|
|
// If the repo id specified by query is not parseable or not accessible by user, just ignore it.
|
|
|
|
|
if err == nil && com.IsSliceContainsInt64(userRepoIDs, rIDint64) { |
|
|
|
|
repoIDs = append(repoIDs, rIDint64) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
if reposSet && len(repoIDs) == 0 { |
|
|
|
|
// force an empty result
|
|
|
|
|
repoIDs = []int64{-1} |
|
|
|
|
} |
|
|
|
|
} else { |
|
|
|
|
log.Warn("issueReposQueryPattern not match with query") |
|
|
|
|
} |
|
|
|
|
if reposSet && len(repoIDs) == 0 { |
|
|
|
|
// force an empty result
|
|
|
|
|
repoIDs = []int64{-1} |
|
|
|
|
} |
|
|
|
|
} else { |
|
|
|
|
log.Error("issueReposQueryPattern not match with query") |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if len(repoIDs) == 0 { |
|
|
|
@ -256,26 +263,6 @@ func Milestones(ctx *context.Context) { |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
showReposMap[rID] = repo |
|
|
|
|
|
|
|
|
|
// Check if user has access to given repository.
|
|
|
|
|
perm, err := models.GetUserRepoPermission(repo, ctxUser) |
|
|
|
|
if err != nil { |
|
|
|
|
ctx.ServerError("GetUserRepoPermission", fmt.Errorf("[%d]%v", rID, err)) |
|
|
|
|
return |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if !perm.CanRead(models.UnitTypeIssues) { |
|
|
|
|
if log.IsTrace() { |
|
|
|
|
log.Trace("Permission Denied: User %-v cannot read %-v of repo %-v\n"+ |
|
|
|
|
"User in repo has Permissions: %-+v", |
|
|
|
|
ctxUser, |
|
|
|
|
models.UnitTypeIssues, |
|
|
|
|
repo, |
|
|
|
|
perm) |
|
|
|
|
} |
|
|
|
|
ctx.Status(404) |
|
|
|
|
return |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
showRepos := models.RepositoryListOfMap(showReposMap) |
|
|
|
@ -345,9 +332,11 @@ var issueReposQueryPattern = regexp.MustCompile(`^\[\d+(,\d+)*,?\]$`) |
|
|
|
|
// Issues render the user issues page
|
|
|
|
|
func Issues(ctx *context.Context) { |
|
|
|
|
isPullList := ctx.Params(":type") == "pulls" |
|
|
|
|
unitType := models.UnitTypeIssues |
|
|
|
|
if isPullList { |
|
|
|
|
ctx.Data["Title"] = ctx.Tr("pull_requests") |
|
|
|
|
ctx.Data["PageIsPulls"] = true |
|
|
|
|
unitType = models.UnitTypePullRequests |
|
|
|
|
} else { |
|
|
|
|
ctx.Data["Title"] = ctx.Tr("issues") |
|
|
|
|
ctx.Data["PageIsIssues"] = true |
|
|
|
@ -404,7 +393,7 @@ func Issues(ctx *context.Context) { |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} else { |
|
|
|
|
log.Error("issueReposQueryPattern not match with query") |
|
|
|
|
log.Warn("issueReposQueryPattern not match with query") |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -424,11 +413,12 @@ func Issues(ctx *context.Context) { |
|
|
|
|
ctx.ServerError("env.RepoIDs", err) |
|
|
|
|
return |
|
|
|
|
} |
|
|
|
|
} else { |
|
|
|
|
unitType := models.UnitTypeIssues |
|
|
|
|
if isPullList { |
|
|
|
|
unitType = models.UnitTypePullRequests |
|
|
|
|
userRepoIDs, err = models.FilterOutRepoIdsWithoutUnitAccess(ctx.User, userRepoIDs, unitType) |
|
|
|
|
if err != nil { |
|
|
|
|
ctx.ServerError("FilterOutRepoIdsWithoutUnitAccess", err) |
|
|
|
|
return |
|
|
|
|
} |
|
|
|
|
} else { |
|
|
|
|
userRepoIDs, err = ctxUser.GetAccessRepoIDs(unitType) |
|
|
|
|
if err != nil { |
|
|
|
|
ctx.ServerError("ctxUser.GetAccessRepoIDs", err) |
|
|
|
|