11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
|
# File 'match/lib/match/importer.rb', line 11
def import_cert(params, cert_path: nil, p12_path: nil, profile_path: nil)
cert_path = ensure_valid_file_path(cert_path, "Certificate", ".cer")
p12_path = ensure_valid_file_path(p12_path, "Private key", ".p12")
profile_path = ensure_valid_file_path(profile_path, "Provisioning profile", ".mobileprovision or .provisionprofile", optional: true)
storage = Storage.for_mode(params[:storage_mode], {
git_url: params[:git_url],
shallow_clone: params[:shallow_clone],
skip_docs: params[:skip_docs],
git_branch: params[:git_branch],
git_full_name: params[:git_full_name],
git_user_email: params[:git_user_email],
clone_branch_directly: params[:clone_branch_directly],
type: params[:type].to_s,
platform: params[:platform].to_s,
google_cloud_bucket_name: params[:google_cloud_bucket_name].to_s,
google_cloud_keys_file: params[:google_cloud_keys_file].to_s,
google_cloud_project_id: params[:google_cloud_project_id].to_s,
s3_bucket: params[:s3_bucket],
s3_region: params[:s3_region],
s3_access_key: params[:s3_access_key],
s3_secret_access_key: params[:s3_secret_access_key],
s3_object_prefix: params[:s3_object_prefix],
readonly: params[:readonly],
username: params[:username],
team_id: params[:team_id],
team_name: params[:team_name],
api_key_path: params[:api_key_path],
api_key: params[:api_key]
})
storage.download
encryption = Encryption.for_storage_mode(params[:storage_mode], {
git_url: params[:git_url],
working_directory: storage.working_directory
})
encryption.decrypt_files if encryption
UI.success("Repo is at: '#{storage.working_directory}'")
cert_type = Match.cert_type_sym(params[:type])
case cert_type
when :development
certificate_type = [
Spaceship::ConnectAPI::Certificate::CertificateType::IOS_DEVELOPMENT,
Spaceship::ConnectAPI::Certificate::CertificateType::MAC_APP_DEVELOPMENT,
Spaceship::ConnectAPI::Certificate::CertificateType::DEVELOPMENT
].join(',')
when :distribution, :enterprise
certificate_type = [
Spaceship::ConnectAPI::Certificate::CertificateType::IOS_DISTRIBUTION,
Spaceship::ConnectAPI::Certificate::CertificateType::MAC_APP_DISTRIBUTION,
Spaceship::ConnectAPI::Certificate::CertificateType::DISTRIBUTION
].join(',')
when :developer_id_application
certificate_type = [
Spaceship::ConnectAPI::Certificate::CertificateType::DEVELOPER_ID_APPLICATION
].join(',')
when :mac_installer_distribution
certificate_type = [
Spaceship::ConnectAPI::Certificate::CertificateType::MAC_INSTALLER_DISTRIBUTION
].join(',')
else
UI.user_error!("Cert type '#{cert_type}' is not supported")
end
prov_type = Match.profile_type_sym(params[:type])
output_dir_certs = File.join(storage.prefixed_working_directory, "certs", cert_type.to_s)
output_dir_profiles = File.join(storage.prefixed_working_directory, "profiles", prov_type.to_s)
token = api_token(params)
if token
UI.message("Creating authorization token for App Store Connect API")
Spaceship::ConnectAPI.token = token
else
UI.message("Login to App Store Connect (#{params[:username]})")
Spaceship::ConnectAPI.login(params[:username], use_portal: true, use_tunes: false, portal_team_id: params[:team_id], team_name: params[:team_name])
end
certs = Spaceship::ConnectAPI::Certificate.all(filter: { certificateType: certificate_type })
cert_contents_base_64 = Base64.strict_encode64(File.binread(cert_path))
matching_cert = certs.find do |cert|
cert.certificate_content == cert_contents_base_64
end
UI.user_error!("This certificate cannot be imported - the certificate contents did not match with any available on the Developer Portal") if matching_cert.nil?
FileUtils.mkdir_p(output_dir_certs)
dest_cert_path = File.join(output_dir_certs, "#{matching_cert.id}.cer")
dest_p12_path = File.join(output_dir_certs, "#{matching_cert.id}.p12")
files_to_commit = [dest_cert_path, dest_p12_path]
IO.copy_stream(cert_path, dest_cert_path)
IO.copy_stream(p12_path, dest_p12_path)
unless profile_path.nil?
FileUtils.mkdir_p(output_dir_profiles)
bundle_id = FastlaneCore::ProvisioningProfile.bundle_id(profile_path)
profile_extension = FastlaneCore::ProvisioningProfile.profile_extension(profile_path)
profile_type_name = Match::Generator.profile_type_name(prov_type)
dest_profile_path = File.join(output_dir_profiles, "#{profile_type_name}_#{bundle_id}#{profile_extension}")
files_to_commit.push(dest_profile_path)
IO.copy_stream(profile_path, dest_profile_path)
end
encryption.encrypt_files if encryption
storage.save_changes!(files_to_commit: files_to_commit)
end
|