Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTiago Botelho <tiagonbotelho@hotmail.com>2018-02-02 18:27:30 +0300
committerTiago Botelho <tiagonbotelho@hotmail.com>2018-02-06 19:52:29 +0300
commit1e56b3f476f9779ec747534e94156a6b8076209c (patch)
treee9374a520232a2d96ef55bf3089dd5350db0a900 /lib/gitlab/git_access.rb
parent839829a7786dd163eccb470bf251211bfb90bd72 (diff)
Moves project creationg to git access check for git push
Diffstat (limited to 'lib/gitlab/git_access.rb')
-rw-r--r--lib/gitlab/git_access.rb92
1 files changed, 56 insertions, 36 deletions
diff --git a/lib/gitlab/git_access.rb b/lib/gitlab/git_access.rb
index 84299dd5790..bc1e83f77b2 100644
--- a/lib/gitlab/git_access.rb
+++ b/lib/gitlab/git_access.rb
@@ -28,32 +28,37 @@ module Gitlab
PUSH_COMMANDS = %w{ git-receive-pack }.freeze
ALL_COMMANDS = DOWNLOAD_COMMANDS + PUSH_COMMANDS
- attr_reader :actor, :project, :protocol, :authentication_abilities, :redirected_path, :target_namespace
+ attr_reader :actor, :project, :protocol, :authentication_abilities, :namespace_path, :project_path, :redirected_path
- def initialize(actor, project, protocol, authentication_abilities:, redirected_path: nil, target_namespace: nil)
+ def initialize(actor, project, protocol, authentication_abilities:, namespace_path: nil, project_path: nil, redirected_path: nil)
@actor = actor
@project = project
@protocol = protocol
- @redirected_path = redirected_path
@authentication_abilities = authentication_abilities
- @target_namespace = target_namespace
+ @namespace_path = namespace_path
+ @project_path = project_path
+ @redirected_path = redirected_path
end
def check(cmd, changes)
check_protocol!
check_valid_actor!
check_active_user!
- check_project_accessibility!(cmd)
- check_project_moved!
check_command_disabled!(cmd)
check_command_existence!(cmd)
- check_repository_existence!(cmd)
+ check_db_accessibility!(cmd)
+
+ ensure_project_on_push!(cmd, changes)
+
+ check_project_accessibility!
+ check_project_moved!
+ check_repository_existence!
case cmd
when *DOWNLOAD_COMMANDS
check_download_access!
when *PUSH_COMMANDS
- check_push_access!(cmd, changes)
+ check_push_access!(changes)
end
true
@@ -99,8 +104,8 @@ module Gitlab
end
end
- def check_project_accessibility!(cmd)
- unless can_create_project_in_namespace?(cmd) || can_read_project?
+ def check_project_accessibility!
+ if project.blank? || !can_read_project?
raise NotFoundError, ERROR_MESSAGES[:project_not_found]
end
end
@@ -143,16 +148,49 @@ module Gitlab
end
end
- def check_repository_existence!(cmd)
- unless can_create_project_in_namespace?(cmd) || project.repository.exists?
+ def check_db_accessibility!(cmd)
+ return unless receive_pack?(cmd)
+
+ if Gitlab::Database.read_only?
+ raise UnauthorizedError, push_to_read_only_message
+ end
+ end
+
+ def ensure_project_on_push!(cmd, changes)
+ return if project || deploy_key?
+ return unless receive_pack?(cmd) && changes == '_any' && authentication_abilities.include?(:push_code)
+
+ namespace = Namespace.find_by_full_path(namespace_path)
+
+ return unless user&.can?(:create_projects, namespace)
+
+ project_params = {
+ path: project_path,
+ namespace_id: namespace.id,
+ visibility_level: Gitlab::VisibilityLevel::PRIVATE
+ }
+
+ project = Projects::CreateService.new(user, project_params).execute
+
+ unless project.saved?
+ raise ProjectCreationError, "Could not create project: #{project.errors.full_messages.join(', ')}"
+ end
+
+ @project = project
+ user_access.project = @project
+
+ Checks::ProjectCreated.new(project, user, protocol).add_message
+ end
+
+ def check_repository_existence!
+ unless project.repository.exists?
raise UnauthorizedError, ERROR_MESSAGES[:no_repo]
end
end
def check_download_access!
- return if deploy_key?
-
- passed = user_can_download_code? ||
+ passed = deploy_key? ||
+ user_can_download_code? ||
build_can_download_code? ||
guest_can_download_code?
@@ -161,13 +199,7 @@ module Gitlab
end
end
- def check_push_access!(cmd, changes)
- if Gitlab::Database.read_only?
- raise UnauthorizedError, push_to_read_only_message
- end
-
- return if can_create_project_in_namespace?(cmd)
-
+ def check_push_access!(changes)
if project.repository_read_only?
raise UnauthorizedError, ERROR_MESSAGES[:read_only]
end
@@ -180,8 +212,6 @@ module Gitlab
raise UnauthorizedError, ERROR_MESSAGES[:upload]
end
- return if changes.blank? # Allow access.
-
check_change_access!(changes)
end
@@ -198,6 +228,8 @@ module Gitlab
end
def check_change_access!(changes)
+ return if changes.blank? # Allow access.
+
changes_list = Gitlab::ChangesList.new(changes)
# Iterate over all changes to find if user allowed all of them to be applied
@@ -240,14 +272,6 @@ module Gitlab
end || Guest.can?(:read_project, project)
end
- def can_create_project_in_namespace?(cmd)
- strong_memoize(:can_create_project_in_namespace) do
- return false unless push?(cmd) && target_namespace && project.blank?
-
- user.can?(:create_projects, target_namespace)
- end
- end
-
def http?
protocol == 'http'
end
@@ -260,10 +284,6 @@ module Gitlab
command == 'git-receive-pack'
end
- def push?(cmd)
- PUSH_COMMANDS.include?(cmd)
- end
-
def upload_pack_disabled_over_http?
!Gitlab.config.gitlab_shell.upload_pack
end