2019-03-02 22:35:43 +05:30
# frozen_string_literal: true
module Import
class GithubService < Import :: BaseService
2021-04-17 20:07:23 +05:30
include ActiveSupport :: NumberHelper
include Gitlab :: Utils :: StrongMemoize
2019-03-02 22:35:43 +05:30
attr_accessor :client
attr_reader :params , :current_user
def execute ( access_params , provider )
2021-01-29 00:20:46 +05:30
if blocked_url?
2022-01-26 12:08:38 +05:30
return log_and_return_error ( " Invalid URL: #{ url } " , _ ( " Invalid URL: %{url} " ) % { url : url } , :bad_request )
2021-01-29 00:20:46 +05:30
end
2019-03-02 22:35:43 +05:30
unless authorized?
2019-07-31 22:56:46 +05:30
return error ( _ ( 'This namespace has already been taken! Please choose another one.' ) , :unprocessable_entity )
2019-03-02 22:35:43 +05:30
end
2021-04-17 20:07:23 +05:30
if oversized?
return error ( oversize_error_message , :unprocessable_entity )
end
2020-06-23 00:09:42 +05:30
project = create_project ( access_params , provider )
2019-03-02 22:35:43 +05:30
if project . persisted?
success ( project )
else
error ( project_save_error ( project ) , :unprocessable_entity )
end
2020-06-23 00:09:42 +05:30
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 ,
2021-02-22 17:27:13 +05:30
type : provider ,
2021-04-17 20:07:23 +05:30
** access_params
) . execute ( extra_project_attrs )
2019-03-02 22:35:43 +05:30
end
def repo
2020-10-24 23:57:45 +05:30
@repo || = client . repository ( params [ :repo_id ] . to_i )
2019-03-02 22:35:43 +05:30
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
2021-04-17 20:07:23 +05:30
def oversized?
repository_size_limit > 0 && repo . size > repository_size_limit
end
def oversize_error_message
_ ( '"%{repository_name}" size (%{repository_size}) is larger than the limit of %{limit}.' ) % {
repository_name : repo . name ,
repository_size : number_to_human_size ( repo . size ) ,
limit : number_to_human_size ( repository_size_limit )
}
end
def repository_size_limit
strong_memoize :repository_size_limit do
namespace_limit = target_namespace . repository_size_limit . to_i
if namespace_limit > 0
namespace_limit
else
Gitlab :: CurrentSettings . repository_size_limit . to_i
end
end
end
2019-03-02 22:35:43 +05:30
def authorized?
can? ( current_user , :create_projects , target_namespace )
end
2020-06-23 00:09:42 +05:30
2021-01-29 00:20:46 +05:30
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 ,
2021-02-22 17:27:13 +05:30
allow_localhost : allow_local_requests? ,
allow_local_network : allow_local_requests? ,
schemes : %w( http https )
2021-01-29 00:20:46 +05:30
)
end
2020-06-23 00:09:42 +05:30
private
def log_error ( exception )
2021-10-27 15:23:28 +05:30
Gitlab :: GithubImport :: Logger . error (
2020-06-23 00:09:42 +05:30
message : 'Import failed due to a GitHub error' ,
status : exception . response_status ,
error : exception . response_body
)
2022-06-21 17:19:12 +05:30
error ( _ ( 'Import failed due to a GitHub error: %{original} (HTTP %{code})' ) % { original : exception . response_body , code : exception . response_status } , :unprocessable_entity )
2020-06-23 00:09:42 +05:30
end
2022-01-26 12:08:38 +05:30
def log_and_return_error ( message , translated_message , http_status )
Gitlab :: GithubImport :: Logger . error (
message : 'Error while attempting to import from GitHub' ,
error : message
)
error ( translated_message , http_status )
end
2019-03-02 22:35:43 +05:30
end
end
2019-12-04 20:38:33 +05:30
2021-06-08 01:23:25 +05:30
Import :: GithubService . prepend_mod_with ( 'Import::GithubService' )