···2026202620272027 // auth filter: only owner or collaborators can close
20282028 roles := f.RolesInRepo(user)
20292029+ isOwner := roles.IsOwner()
20292030 isCollaborator := roles.IsCollaborator()
20302031 isPullAuthor := user.Did == pull.OwnerDid
20312031- isCloseAllowed := isCollaborator || isPullAuthor
20322032+ isCloseAllowed := isOwner || isCollaborator || isPullAuthor
20322033 if !isCloseAllowed {
20332034 log.Println("failed to close pull")
20342035 s.pages.Notice(w, "pull-close", "You are unauthorized to close this pull.")
···2094209520952096 // auth filter: only owner or collaborators can close
20962097 roles := f.RolesInRepo(user)
20982098+ isOwner := roles.IsOwner()
20972099 isCollaborator := roles.IsCollaborator()
20982100 isPullAuthor := user.Did == pull.OwnerDid
20992099- isCloseAllowed := isCollaborator || isPullAuthor
21012101+ isCloseAllowed := isOwner || isCollaborator || isPullAuthor
21002102 if !isCloseAllowed {
21012103 log.Println("failed to close pull")
21022104 s.pages.Notice(w, "pull-close", "You are unauthorized to close this pull.")
+2
appview/pulls/router.go
···4444 r.Get("/", s.ResubmitPull)
4545 r.Post("/", s.ResubmitPull)
4646 })
4747+ // permissions here require us to know pull author
4848+ // it is handled within the route
4749 r.Post("/close", s.ClosePull)
4850 r.Post("/reopen", s.ReopenPull)
4951 // collaborators only