diff options
Diffstat (limited to 'app/services/import/bitbucket_server_service.rb')
-rw-r--r-- | app/services/import/bitbucket_server_service.rb | 104 |
1 files changed, 104 insertions, 0 deletions
diff --git a/app/services/import/bitbucket_server_service.rb b/app/services/import/bitbucket_server_service.rb new file mode 100644 index 00000000000..86e8215821e --- /dev/null +++ b/app/services/import/bitbucket_server_service.rb @@ -0,0 +1,104 @@ +# frozen_string_literal: true + +module Import + class BitbucketServerService < Import::BaseService + attr_reader :client, :params, :current_user + + def execute(credentials) + if blocked_url? + return log_and_return_error("Invalid URL: #{url}", :bad_request) + end + + unless authorized? + return log_and_return_error("You don't have permissions to create this project", :unauthorized) + end + + unless repo + return log_and_return_error("Project %{project_repo} could not be found" % { project_repo: "#{project_key}/#{repo_slug}" }, :unprocessable_entity) + end + + project = create_project(credentials) + + if project.persisted? + success(project) + else + log_and_return_error(project_save_error(project), :unprocessable_entity) + end + rescue BitbucketServer::Connection::ConnectionError => e + log_and_return_error("Import failed due to a BitBucket Server error: #{e}", :bad_request) + end + + private + + def create_project(credentials) + Gitlab::BitbucketServerImport::ProjectCreator.new( + project_key, + repo_slug, + repo, + project_name, + target_namespace, + current_user, + credentials + ).execute + end + + def repo + @repo ||= client.repo(project_key, repo_slug) + end + + def project_name + @project_name ||= params[:new_name].presence || repo.name + end + + def namespace_path + @namespace_path ||= params[:new_namespace].presence || current_user.namespace_path + end + + def target_namespace + @target_namespace ||= find_or_create_namespace(namespace_path, current_user.namespace_path) + end + + def repo_slug + @repo_slug ||= params[:bitbucket_server_repo] + end + + def project_key + @project_key ||= params[:bitbucket_server_project] + end + + def url + @url ||= params[:bitbucket_server_url] + end + + def authorized? + can?(current_user, :create_projects, target_namespace) + 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 + + def log_and_return_error(message, error_type) + log_error(message) + error(_(message), error_type) + end + + def log_error(message) + Gitlab::Import::Logger.error( + message: 'Import failed due to a BitBucket Server error', + error: message + ) + end + end +end |