summaryrefslogtreecommitdiff
path: root/app/controllers/projects/forks_controller.rb
diff options
context:
space:
mode:
Diffstat (limited to 'app/controllers/projects/forks_controller.rb')
-rw-r--r--app/controllers/projects/forks_controller.rb27
1 files changed, 21 insertions, 6 deletions
diff --git a/app/controllers/projects/forks_controller.rb b/app/controllers/projects/forks_controller.rb
index 9806b91c7e8..e0e8fb177ba 100644
--- a/app/controllers/projects/forks_controller.rb
+++ b/app/controllers/projects/forks_controller.rb
@@ -3,6 +3,7 @@
class Projects::ForksController < Projects::ApplicationController
include ContinueParams
include RendersMemberAccess
+ include Gitlab::Utils::StrongMemoize
# Authorize
before_action :whitelist_query_limiting, only: [:create]
@@ -10,6 +11,7 @@ class Projects::ForksController < Projects::ApplicationController
before_action :authorize_download_code!
before_action :authenticate_user!, only: [:new, :create]
before_action :authorize_fork_project!, only: [:new, :create]
+ before_action :authorize_fork_namespace!, only: [:create]
# rubocop: disable CodeReuse/ActiveRecord
def index
@@ -37,18 +39,15 @@ class Projects::ForksController < Projects::ApplicationController
# rubocop: enable CodeReuse/ActiveRecord
def new
- @namespaces = current_user.manageable_namespaces
- @namespaces.delete(@project.namespace)
+ @namespaces = fork_service.valid_fork_targets
end
# rubocop: disable CodeReuse/ActiveRecord
def create
- namespace = Namespace.find(params[:namespace_key])
-
- @forked_project = namespace.projects.find_by(path: project.path)
+ @forked_project = fork_namespace.projects.find_by(path: project.path)
@forked_project = nil unless @forked_project && @forked_project.forked_from_project == project
- @forked_project ||= ::Projects::ForkService.new(project, current_user, namespace: namespace).execute
+ @forked_project ||= fork_service.execute
if !@forked_project.saved? || !@forked_project.forked?
render :error
@@ -64,6 +63,22 @@ class Projects::ForksController < Projects::ApplicationController
private
+ def fork_service
+ strong_memoize(:fork_service) do
+ ::Projects::ForkService.new(project, current_user, namespace: fork_namespace)
+ end
+ end
+
+ def fork_namespace
+ strong_memoize(:fork_namespace) do
+ Namespace.find(params[:namespace_key]) if params[:namespace_key].present?
+ end
+ end
+
+ def authorize_fork_namespace!
+ access_denied! unless fork_namespace && fork_service.valid_fork_target?
+ end
+
def whitelist_query_limiting
Gitlab::QueryLimiting.whitelist('https://gitlab.com/gitlab-org/gitlab-foss/issues/42335')
end