Skip to content
Snippets Groups Projects
Commit ab7a79bf authored by Valery Sizov's avatar Valery Sizov
Browse files

developer can push to protected branches

parent 148740cc
No related branches found
No related tags found
1 merge request!8686add "Uplaod" and "Replace" functionality
Loading
Loading
@@ -233,13 +233,7 @@ class Projects::MergeRequestsController < Projects::ApplicationController
end
 
def allowed_to_push_code?(project, branch)
action = if project.protected_branch?(branch)
:push_code_to_protected_branches
else
:push_code
end
can?(current_user, action, project)
::Gitlab::GitAccess.can_push_to_branch?(current_user, project, branch)
end
 
def merge_request_params
Loading
Loading
Loading
Loading
@@ -11,12 +11,7 @@ module BranchesHelper
 
def can_push_branch?(project, branch_name)
return false unless project.repository.branch_names.include?(branch_name)
action = if project.protected_branch?(branch_name)
:push_code_to_protected_branches
else
:push_code
end
current_user.can?(action, project)
::Gitlab::GitAccess.can_push_to_branch?(current_user, project, branch_name)
end
end
Loading
Loading
@@ -58,11 +58,7 @@ module TreeHelper
ref ||= @ref
return false unless project.repository.branch_names.include?(ref)
 
if project.protected_branch? ref
can?(current_user, :push_code_to_protected_branches, project)
else
can?(current_user, :push_code, project)
end
::Gitlab::GitAccess.can_push_to_branch?(current_user, project, ref)
end
 
def edit_blob_link(project, ref, path, options = {})
Loading
Loading
Loading
Loading
@@ -3,11 +3,7 @@ require_relative "base_service"
module Files
class CreateService < BaseService
def execute
allowed = if project.protected_branch?(ref)
can?(current_user, :push_code_to_protected_branches, project)
else
can?(current_user, :push_code, project)
end
allowed = Gitlab::GitAccess.can_push_to_branch?(current_user, project, ref)
 
unless allowed
return error("You are not allowed to create file in this branch")
Loading
Loading
Loading
Loading
@@ -3,11 +3,7 @@ require_relative "base_service"
module Files
class DeleteService < BaseService
def execute
allowed = if project.protected_branch?(ref)
can?(current_user, :push_code_to_protected_branches, project)
else
can?(current_user, :push_code, project)
end
allowed = ::Gitlab::GitAccess.can_push_to_branch?(current_user, project, ref)
 
unless allowed
return error("You are not allowed to push into this branch")
Loading
Loading
Loading
Loading
@@ -3,11 +3,7 @@ require_relative "base_service"
module Files
class UpdateService < BaseService
def execute
allowed = if project.protected_branch?(ref)
can?(current_user, :push_code_to_protected_branches, project)
else
can?(current_user, :push_code, project)
end
allowed = ::Gitlab::GitAccess.can_push_to_branch?(current_user, project, ref)
 
unless allowed
return error("You are not allowed to push into this branch")
Loading
Loading
Loading
Loading
@@ -167,13 +167,9 @@ module API
put ":id/merge_request/:merge_request_id/merge" do
merge_request = user_project.merge_requests.find(params[:merge_request_id])
 
action = if user_project.protected_branch?(merge_request.target_branch)
:push_code_to_protected_branches
else
:push_code
end
allowed = ::Gitlab::GitAccess.can_push_to_branch?(current_user, user_project, merge_request.target_branch)
 
if can?(current_user, action, user_project)
if allowed
if merge_request.unchecked?
merge_request.check_if_can_be_merged
end
Loading
Loading
Loading
Loading
@@ -5,6 +5,15 @@ module Gitlab
 
attr_reader :params, :project, :git_cmd, :user
 
def self.can_push_to_branch?(user, project, ref)
if project.protected_branch?(ref) &&
!(project.developers_can_push_to_protected_branch?(ref) && project.team.developer?(user))
user.can?(:push_code_to_protected_branches, project)
else
user.can?(:push_code, project)
end
end
def check(actor, cmd, project, changes = nil)
case cmd
when *DOWNLOAD_COMMANDS
Loading
Loading
Loading
Loading
@@ -5,6 +5,68 @@ describe Gitlab::GitAccess do
let(:project) { create(:project) }
let(:user) { create(:user) }
 
describe 'can_push_to_branch?' do
describe 'push to none protected branch' do
it "returns true if user is a master" do
project.team << [user, :master]
Gitlab::GitAccess.can_push_to_branch?(user, project, "random_branch").should be_true
end
it "returns true if user is a developer" do
project.team << [user, :developer]
Gitlab::GitAccess.can_push_to_branch?(user, project, "random_branch").should be_true
end
it "returns false if user is a reporter" do
project.team << [user, :reporter]
Gitlab::GitAccess.can_push_to_branch?(user, project, "random_branch").should be_false
end
end
describe 'push to protected branch' do
before do
@branch = create :protected_branch, project: project
end
it "returns true if user is a master" do
project.team << [user, :master]
Gitlab::GitAccess.can_push_to_branch?(user, project, @branch.name).should be_true
end
it "returns false if user is a developer" do
project.team << [user, :developer]
Gitlab::GitAccess.can_push_to_branch?(user, project, @branch.name).should be_false
end
it "returns false if user is a reporter" do
project.team << [user, :reporter]
Gitlab::GitAccess.can_push_to_branch?(user, project, @branch.name).should be_false
end
end
describe 'push to protected branch if allowed for developers' do
before do
@branch = create :protected_branch, project: project, developers_can_push: true
end
it "returns true if user is a master" do
project.team << [user, :master]
Gitlab::GitAccess.can_push_to_branch?(user, project, @branch.name).should be_true
end
it "returns true if user is a developer" do
project.team << [user, :developer]
Gitlab::GitAccess.can_push_to_branch?(user, project, @branch.name).should be_true
end
it "returns false if user is a reporter" do
project.team << [user, :reporter]
Gitlab::GitAccess.can_push_to_branch?(user, project, @branch.name).should be_false
end
end
end
describe 'download_access_check' do
describe 'master permissions' do
before { project.team << [user, :master] }
Loading
Loading
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment