From 921d2afc6989dfa8220032984f657210c07e8792 Mon Sep 17 00:00:00 2001 From: Tiago Botelho Date: Thu, 18 Jan 2018 09:31:00 +0000 Subject: Adds option to push over HTTP to create a new project --- app/controllers/projects/git_http_controller.rb | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) (limited to 'app/controllers/projects/git_http_controller.rb') diff --git a/app/controllers/projects/git_http_controller.rb b/app/controllers/projects/git_http_controller.rb index 71ae60cb8cd..45a1a5cf0de 100644 --- a/app/controllers/projects/git_http_controller.rb +++ b/app/controllers/projects/git_http_controller.rb @@ -11,6 +11,12 @@ class Projects::GitHttpController < Projects::GitHttpClientController def info_refs log_user_activity if upload_pack? + if project.blank? && params[:service] == 'git-receive-pack' + @project = ::Projects::CreateService.new(access_actor, project_params).execute + + return render_ok if @project.saved? + end + render_ok end @@ -26,6 +32,15 @@ class Projects::GitHttpController < Projects::GitHttpClientController private + def project_params + { + description: "", + path: params[:project_id].gsub("\.git", ''), + namespace_id: namespace.id.to_s, + visibility_level: Gitlab::VisibilityLevel::PRIVATE.to_s + } + end + def download_request? upload_pack? end @@ -56,7 +71,11 @@ class Projects::GitHttpController < Projects::GitHttpClientController end def access - @access ||= access_klass.new(access_actor, project, 'http', authentication_abilities: authentication_abilities, redirected_path: redirected_path) + @access ||= access_klass.new(access_actor, project, 'http', authentication_abilities: authentication_abilities, redirected_path: redirected_path, target_namespace: namespace) + end + + def namespace + @namespace = Namespace.find_by_path_or_name(params[:namespace_id]) end def access_actor -- cgit v1.2.1 From 35882e681b681f68a818bda9a8d2624edfecc219 Mon Sep 17 00:00:00 2001 From: Tiago Botelho Date: Thu, 18 Jan 2018 16:07:07 +0000 Subject: Adds option to push over SSH to create a new project --- app/controllers/projects/git_http_controller.rb | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) (limited to 'app/controllers/projects/git_http_controller.rb') diff --git a/app/controllers/projects/git_http_controller.rb b/app/controllers/projects/git_http_controller.rb index 45a1a5cf0de..97c0f5b8c87 100644 --- a/app/controllers/projects/git_http_controller.rb +++ b/app/controllers/projects/git_http_controller.rb @@ -12,7 +12,7 @@ class Projects::GitHttpController < Projects::GitHttpClientController log_user_activity if upload_pack? if project.blank? && params[:service] == 'git-receive-pack' - @project = ::Projects::CreateService.new(access_actor, project_params).execute + @project = ::Projects::CreateService.new(user, project_params).execute return render_ok if @project.saved? end @@ -34,10 +34,10 @@ class Projects::GitHttpController < Projects::GitHttpClientController def project_params { - description: "", - path: params[:project_id].gsub("\.git", ''), - namespace_id: namespace.id.to_s, - visibility_level: Gitlab::VisibilityLevel::PRIVATE.to_s + description: "", + path: params[:project_id].gsub("\.git", ''), + namespace_id: namespace.id.to_s, + visibility_level: Gitlab::VisibilityLevel::PRIVATE.to_s } end -- cgit v1.2.1 From 32b2ff26011a5274bdb8a3dd41ad360a67c3148a Mon Sep 17 00:00:00 2001 From: Tiago Botelho Date: Fri, 19 Jan 2018 13:04:14 +0000 Subject: Adds remote messsage when project is created in a push over SSH or HTTP --- app/controllers/projects/git_http_controller.rb | 38 +++++++++++++++---------- 1 file changed, 23 insertions(+), 15 deletions(-) (limited to 'app/controllers/projects/git_http_controller.rb') diff --git a/app/controllers/projects/git_http_controller.rb b/app/controllers/projects/git_http_controller.rb index 97c0f5b8c87..6010423c243 100644 --- a/app/controllers/projects/git_http_controller.rb +++ b/app/controllers/projects/git_http_controller.rb @@ -11,10 +11,14 @@ class Projects::GitHttpController < Projects::GitHttpClientController def info_refs log_user_activity if upload_pack? - if project.blank? && params[:service] == 'git-receive-pack' + if user && project.blank? && receive_pack? @project = ::Projects::CreateService.new(user, project_params).execute - return render_ok if @project.saved? + if @project.saved? + Gitlab::Checks::NewProject.new(user, @project, 'http').add_new_project_message + else + raise Gitlab::GitAccess::NotFoundError, 'Could not create project' + end end render_ok @@ -32,15 +36,6 @@ class Projects::GitHttpController < Projects::GitHttpClientController private - def project_params - { - description: "", - path: params[:project_id].gsub("\.git", ''), - namespace_id: namespace.id.to_s, - visibility_level: Gitlab::VisibilityLevel::PRIVATE.to_s - } - end - def download_request? upload_pack? end @@ -49,6 +44,10 @@ class Projects::GitHttpController < Projects::GitHttpClientController git_command == 'git-upload-pack' end + def receive_pack? + git_command == 'git-receive-pack' + end + def git_command if action_name == 'info_refs' params[:service] @@ -74,10 +73,6 @@ class Projects::GitHttpController < Projects::GitHttpClientController @access ||= access_klass.new(access_actor, project, 'http', authentication_abilities: authentication_abilities, redirected_path: redirected_path, target_namespace: namespace) end - def namespace - @namespace = Namespace.find_by_path_or_name(params[:namespace_id]) - end - def access_actor return user if user return :ci if ci? @@ -93,6 +88,19 @@ class Projects::GitHttpController < Projects::GitHttpClientController @access_klass ||= wiki? ? Gitlab::GitAccessWiki : Gitlab::GitAccess end + def project_params + { + description: "", + path: Project.parse_project_id(params[:project_id]), + namespace_id: namespace&.id, + visibility_level: Gitlab::VisibilityLevel::PRIVATE.to_s + } + end + + def namespace + @namespace ||= Namespace.find_by_path_or_name(params[:namespace_id]) + end + def log_user_activity Users::ActivityService.new(user, 'pull').execute end -- cgit v1.2.1 From bc78ae6985ee37f9ac2ffc2dbf6f445078d16038 Mon Sep 17 00:00:00 2001 From: Tiago Botelho Date: Mon, 22 Jan 2018 18:10:56 +0000 Subject: Add specs --- app/controllers/projects/git_http_controller.rb | 2 ++ 1 file changed, 2 insertions(+) (limited to 'app/controllers/projects/git_http_controller.rb') diff --git a/app/controllers/projects/git_http_controller.rb b/app/controllers/projects/git_http_controller.rb index 6010423c243..5660a9027d5 100644 --- a/app/controllers/projects/git_http_controller.rb +++ b/app/controllers/projects/git_http_controller.rb @@ -31,6 +31,8 @@ class Projects::GitHttpController < Projects::GitHttpClientController # POST /foo/bar.git/git-receive-pack" (git push) def git_receive_pack + raise Gitlab::GitAccess::NotFoundError, 'Could not create project' unless project + render_ok end -- cgit v1.2.1 From e42a548f1dac02577d0c1731fef508dab68c45a5 Mon Sep 17 00:00:00 2001 From: Tiago Botelho Date: Thu, 25 Jan 2018 12:26:52 +0000 Subject: Move new project on push logic to a service --- app/controllers/projects/git_http_controller.rb | 33 +++++++++---------------- 1 file changed, 11 insertions(+), 22 deletions(-) (limited to 'app/controllers/projects/git_http_controller.rb') diff --git a/app/controllers/projects/git_http_controller.rb b/app/controllers/projects/git_http_controller.rb index 5660a9027d5..90a9079fab3 100644 --- a/app/controllers/projects/git_http_controller.rb +++ b/app/controllers/projects/git_http_controller.rb @@ -5,21 +5,13 @@ class Projects::GitHttpController < Projects::GitHttpClientController rescue_from Gitlab::GitAccess::UnauthorizedError, with: :render_403 rescue_from Gitlab::GitAccess::NotFoundError, with: :render_404 + rescue_from Gitlab::GitAccess::ProjectCreationError, with: :render_422 # GET /foo/bar.git/info/refs?service=git-upload-pack (git pull) # GET /foo/bar.git/info/refs?service=git-receive-pack (git push) def info_refs log_user_activity if upload_pack? - - if user && project.blank? && receive_pack? - @project = ::Projects::CreateService.new(user, project_params).execute - - if @project.saved? - Gitlab::Checks::NewProject.new(user, @project, 'http').add_new_project_message - else - raise Gitlab::GitAccess::NotFoundError, 'Could not create project' - end - end + create_new_project if receive_pack? && project.blank? render_ok end @@ -31,8 +23,6 @@ class Projects::GitHttpController < Projects::GitHttpClientController # POST /foo/bar.git/git-receive-pack" (git push) def git_receive_pack - raise Gitlab::GitAccess::NotFoundError, 'Could not create project' unless project - render_ok end @@ -58,6 +48,10 @@ class Projects::GitHttpController < Projects::GitHttpClientController end end + def create_new_project + @project = ::Projects::CreateFromPushService.new(user, params[:project_id], namespace, 'http').execute + end + def render_ok set_workhorse_internal_api_content_type render json: Gitlab::Workhorse.git_http_ok(repository, wiki?, user, action_name) @@ -71,6 +65,10 @@ class Projects::GitHttpController < Projects::GitHttpClientController render plain: exception.message, status: :not_found end + def render_422(exception) + render plain: exception.message, status: :unprocessable_entity + end + def access @access ||= access_klass.new(access_actor, project, 'http', authentication_abilities: authentication_abilities, redirected_path: redirected_path, target_namespace: namespace) end @@ -90,17 +88,8 @@ class Projects::GitHttpController < Projects::GitHttpClientController @access_klass ||= wiki? ? Gitlab::GitAccessWiki : Gitlab::GitAccess end - def project_params - { - description: "", - path: Project.parse_project_id(params[:project_id]), - namespace_id: namespace&.id, - visibility_level: Gitlab::VisibilityLevel::PRIVATE.to_s - } - end - def namespace - @namespace ||= Namespace.find_by_path_or_name(params[:namespace_id]) + @namespace ||= Namespace.find_by_full_path(params[:namespace_id]) end def log_user_activity -- cgit v1.2.1 From 1e56b3f476f9779ec747534e94156a6b8076209c Mon Sep 17 00:00:00 2001 From: Tiago Botelho Date: Fri, 2 Feb 2018 15:27:30 +0000 Subject: Moves project creationg to git access check for git push --- app/controllers/projects/git_http_controller.rb | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) (limited to 'app/controllers/projects/git_http_controller.rb') diff --git a/app/controllers/projects/git_http_controller.rb b/app/controllers/projects/git_http_controller.rb index 90a9079fab3..45910a9be44 100644 --- a/app/controllers/projects/git_http_controller.rb +++ b/app/controllers/projects/git_http_controller.rb @@ -11,7 +11,6 @@ class Projects::GitHttpController < Projects::GitHttpClientController # GET /foo/bar.git/info/refs?service=git-receive-pack (git push) def info_refs log_user_activity if upload_pack? - create_new_project if receive_pack? && project.blank? render_ok end @@ -36,10 +35,6 @@ class Projects::GitHttpController < Projects::GitHttpClientController git_command == 'git-upload-pack' end - def receive_pack? - git_command == 'git-receive-pack' - end - def git_command if action_name == 'info_refs' params[:service] @@ -48,10 +43,6 @@ class Projects::GitHttpController < Projects::GitHttpClientController end end - def create_new_project - @project = ::Projects::CreateFromPushService.new(user, params[:project_id], namespace, 'http').execute - end - def render_ok set_workhorse_internal_api_content_type render json: Gitlab::Workhorse.git_http_ok(repository, wiki?, user, action_name) @@ -70,7 +61,10 @@ class Projects::GitHttpController < Projects::GitHttpClientController end def access - @access ||= access_klass.new(access_actor, project, 'http', authentication_abilities: authentication_abilities, redirected_path: redirected_path, target_namespace: namespace) + @access ||= access_klass.new(access_actor, project, + 'http', authentication_abilities: authentication_abilities, + namespace_path: params[:namespace_id], project_path: project_path, + redirected_path: redirected_path) end def access_actor @@ -82,14 +76,15 @@ class Projects::GitHttpController < Projects::GitHttpClientController # Use the magic string '_any' to indicate we do not know what the # changes are. This is also what gitlab-shell does. access.check(git_command, '_any') + @project ||= access.project end def access_klass @access_klass ||= wiki? ? Gitlab::GitAccessWiki : Gitlab::GitAccess end - def namespace - @namespace ||= Namespace.find_by_full_path(params[:namespace_id]) + def project_path + @project_path ||= params[:project_id].sub(/\.git$/, '') end def log_user_activity -- cgit v1.2.1