Skip to content

Commit a2a49c9

Browse files
Chri-slunny
authored andcommitted
Added checks for protected branches in pull requests (#3544)
* Added checks for protected branches in pull requests Signed-off-by: Christian Wulff <NChris@posteo.net> * Moved check for protected branch into new function CheckUserAllowedToMerge Signed-off-by: Christian Wulff <NChris@posteo.net> * Removed merge conflict lines from last commit Signed-off-by: Christian Wulff <NChris@posteo.net> * Explicit check for error type in ViewIssue Signed-off-by: Christian Wulff <NChris@posteo.net>
1 parent c0d41b1 commit a2a49c9

File tree

4 files changed

+54
-1
lines changed

4 files changed

+54
-1
lines changed

models/error.go

+15
Original file line numberDiff line numberDiff line change
@@ -785,6 +785,21 @@ func (err ErrBranchNameConflict) Error() string {
785785
return fmt.Sprintf("branch conflicts with existing branch [name: %s]", err.BranchName)
786786
}
787787

788+
// ErrNotAllowedToMerge represents an error that a branch is protected and the current user is not allowed to modify it
789+
type ErrNotAllowedToMerge struct {
790+
Reason string
791+
}
792+
793+
// IsErrNotAllowedToMerge checks if an error is an ErrNotAllowedToMerge.
794+
func IsErrNotAllowedToMerge(err error) bool {
795+
_, ok := err.(ErrNotAllowedToMerge)
796+
return ok
797+
}
798+
799+
func (err ErrNotAllowedToMerge) Error() string {
800+
return fmt.Sprintf("not allowed to merge [reason: %s]", err.Reason)
801+
}
802+
788803
// ErrTagAlreadyExists represents an error that tag with such name already exists
789804
type ErrTagAlreadyExists struct {
790805
TagName string

models/pull.go

+29
Original file line numberDiff line numberDiff line change
@@ -272,6 +272,31 @@ const (
272272
MergeStyleSquash MergeStyle = "squash"
273273
)
274274

275+
// CheckUserAllowedToMerge checks whether the user is allowed to merge
276+
func (pr *PullRequest) CheckUserAllowedToMerge(doer *User) (err error) {
277+
if doer == nil {
278+
return ErrNotAllowedToMerge{
279+
"Not signed in",
280+
}
281+
}
282+
283+
if pr.BaseRepo == nil {
284+
if err = pr.GetBaseRepo(); err != nil {
285+
return fmt.Errorf("GetBaseRepo: %v", err)
286+
}
287+
}
288+
289+
if protected, err := pr.BaseRepo.IsProtectedBranch(pr.BaseBranch, doer); err != nil {
290+
return fmt.Errorf("IsProtectedBranch: %v", err)
291+
} else if protected {
292+
return ErrNotAllowedToMerge{
293+
"The branch is protected",
294+
}
295+
}
296+
297+
return nil
298+
}
299+
275300
// Merge merges pull request to base repository.
276301
// FIXME: add repoWorkingPull make sure two merges does not happen at same time.
277302
func (pr *PullRequest) Merge(doer *User, baseGitRepo *git.Repository, mergeStyle MergeStyle, message string) (err error) {
@@ -287,6 +312,10 @@ func (pr *PullRequest) Merge(doer *User, baseGitRepo *git.Repository, mergeStyle
287312
}
288313
prConfig := prUnit.PullRequestsConfig()
289314

315+
if err := pr.CheckUserAllowedToMerge(doer); err != nil {
316+
return fmt.Errorf("CheckUserAllowedToMerge: %v", err)
317+
}
318+
290319
// Check if merge style is correct and allowed
291320
if !prConfig.IsMergeStyleAllowed(mergeStyle) {
292321
return ErrInvalidMergeStyle{pr.BaseRepo.ID, mergeStyle}

routers/repo/issue.go

+9
Original file line numberDiff line numberDiff line change
@@ -734,6 +734,15 @@ func ViewIssue(ctx *context.Context) {
734734
}
735735
prConfig := prUnit.PullRequestsConfig()
736736

737+
ctx.Data["AllowMerge"] = ctx.Data["IsRepositoryWriter"]
738+
if err := pull.CheckUserAllowedToMerge(ctx.User); err != nil {
739+
if !models.IsErrNotAllowedToMerge(err) {
740+
ctx.ServerError("CheckUserAllowedToMerge", err)
741+
return
742+
}
743+
ctx.Data["AllowMerge"] = false
744+
}
745+
737746
// Check correct values and select default
738747
if ms, ok := ctx.Data["MergeStyle"].(models.MergeStyle); !ok ||
739748
!prConfig.IsMergeStyleAllowed(ms) {

templates/repo/issue/view_content/pull.tmpl

+1-1
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@
3737
<span class="octicon octicon-check"></span>
3838
{{$.i18n.Tr "repo.pulls.can_auto_merge_desc"}}
3939
</div>
40-
{{if .IsRepositoryWriter}}
40+
{{if .AllowMerge}}
4141
{{$prUnit := .Repository.MustGetUnit $.UnitTypePullRequests}}
4242
{{if or $prUnit.PullRequestsConfig.AllowMerge $prUnit.PullRequestsConfig.AllowRebase $prUnit.PullRequestsConfig.AllowSquash}}
4343
<div class="ui divider"></div>

0 commit comments

Comments
 (0)