96 lines
2.4 KiB
Ruby
96 lines
2.4 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
module Import
|
|
class GithubService < Import::BaseService
|
|
attr_accessor :client
|
|
attr_reader :params, :current_user
|
|
|
|
def execute(access_params, provider)
|
|
if blocked_url?
|
|
return log_and_return_error("Invalid URL: #{url}", :bad_request)
|
|
end
|
|
|
|
unless authorized?
|
|
return error(_('This namespace has already been taken! Please choose another one.'), :unprocessable_entity)
|
|
end
|
|
|
|
project = create_project(access_params, provider)
|
|
|
|
if project.persisted?
|
|
success(project)
|
|
else
|
|
error(project_save_error(project), :unprocessable_entity)
|
|
end
|
|
rescue Octokit::Error => e
|
|
log_error(e)
|
|
end
|
|
|
|
def create_project(access_params, provider)
|
|
Gitlab::LegacyGithubImport::ProjectCreator.new(
|
|
repo,
|
|
project_name,
|
|
target_namespace,
|
|
current_user,
|
|
access_params,
|
|
type: provider
|
|
).execute(extra_project_attrs)
|
|
end
|
|
|
|
def repo
|
|
@repo ||= client.repository(params[:repo_id].to_i)
|
|
end
|
|
|
|
def project_name
|
|
@project_name ||= params[:new_name].presence || repo.name
|
|
end
|
|
|
|
def namespace_path
|
|
@namespace_path ||= params[:target_namespace].presence || current_user.namespace_path
|
|
end
|
|
|
|
def target_namespace
|
|
@target_namespace ||= find_or_create_namespace(namespace_path, current_user.namespace_path)
|
|
end
|
|
|
|
def extra_project_attrs
|
|
{}
|
|
end
|
|
|
|
def authorized?
|
|
can?(current_user, :create_projects, target_namespace)
|
|
end
|
|
|
|
def url
|
|
@url ||= params[:github_hostname]
|
|
end
|
|
|
|
def allow_local_requests?
|
|
Gitlab::CurrentSettings.allow_local_requests_from_web_hooks_and_services?
|
|
end
|
|
|
|
def blocked_url?
|
|
Gitlab::UrlBlocker.blocked_url?(
|
|
url,
|
|
{
|
|
allow_localhost: allow_local_requests?,
|
|
allow_local_network: allow_local_requests?,
|
|
schemes: %w(http https)
|
|
}
|
|
)
|
|
end
|
|
|
|
private
|
|
|
|
def log_error(exception)
|
|
Gitlab::Import::Logger.error(
|
|
message: 'Import failed due to a GitHub error',
|
|
status: exception.response_status,
|
|
error: exception.response_body
|
|
)
|
|
|
|
error(_('Import failed due to a GitHub error: %{original}') % { original: exception.response_body }, :unprocessable_entity)
|
|
end
|
|
end
|
|
end
|
|
|
|
Import::GithubService.prepend_if_ee('EE::Import::GithubService')
|