fastlane 2.121.0.beta.20190418200030 → 2.121.0.beta.20190419200010
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/cert/lib/cert/runner.rb +1 -1
- data/deliver/lib/deliver/app_screenshot.rb +33 -38
- data/fastlane/lib/fastlane/actions/app_store_build_number.rb +1 -1
- data/fastlane/lib/fastlane/actions/latest_testflight_build_number.rb +2 -8
- data/fastlane/lib/fastlane/version.rb +1 -1
- data/spaceship/lib/spaceship/spaceauth_runner.rb +5 -3
- data/spaceship/lib/spaceship/two_step_or_factor_client.rb +80 -15
- data/spaceship/lib/spaceship.rb +1 -0
- metadata +14 -14
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: edd3f9b8c80196c22a0a1762980b3cfbc0e4045b
|
4
|
+
data.tar.gz: 628831a51625a69a33984133a42ee34f906ebdd8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cf720bdcb105744e8fe67b42fcba0fe8606b26e160b8e97ca64b7e9dba31ddcb37c210b9fac25d2162ab9a6a24d3e4a15cd6e8514bdd942136102180bd5ffee8
|
7
|
+
data.tar.gz: b86ece9302ceedc4c38f2e3663f4676394f8eb8d072ea0b4b575212e2108dc7cf82798c91867645bfd009b888f058e27cd7bf1eaebb5d70f95ed3be6cb44d1e8
|
data/cert/lib/cert/runner.rb
CHANGED
@@ -153,7 +153,7 @@ module Cert
|
|
153
153
|
# Create a new certificate signing request
|
154
154
|
csr, pkey = Spaceship.certificate.create_certificate_signing_request
|
155
155
|
|
156
|
-
# Use the signing request to create a new distribution certificate
|
156
|
+
# Use the signing request to create a new (development|distribution) certificate
|
157
157
|
begin
|
158
158
|
certificate = certificate_type.create!(csr: csr)
|
159
159
|
rescue => ex
|
@@ -178,25 +178,30 @@ module Deliver
|
|
178
178
|
def self.device_messages
|
179
179
|
return {
|
180
180
|
ScreenSize::IOS_65_MESSAGES => [
|
181
|
-
[1242, 2688]
|
181
|
+
[1242, 2688],
|
182
|
+
[2688, 1242]
|
182
183
|
],
|
183
184
|
ScreenSize::IOS_61_MESSAGES => [
|
184
|
-
[828, 1792]
|
185
|
+
[828, 1792],
|
186
|
+
[1792, 828]
|
185
187
|
],
|
186
188
|
ScreenSize::IOS_58_MESSAGES => [
|
187
|
-
[1125, 2436]
|
189
|
+
[1125, 2436],
|
190
|
+
[2436, 1125]
|
188
191
|
],
|
189
192
|
ScreenSize::IOS_55_MESSAGES => [
|
190
|
-
[
|
191
|
-
[
|
193
|
+
[1242, 2208],
|
194
|
+
[2208, 1242]
|
192
195
|
],
|
193
196
|
ScreenSize::IOS_47_MESSAGES => [
|
194
|
-
[750, 1334]
|
197
|
+
[750, 1334],
|
198
|
+
[1334, 750]
|
195
199
|
],
|
196
200
|
ScreenSize::IOS_40_MESSAGES => [
|
197
|
-
[640, 1136],
|
198
201
|
[640, 1096],
|
199
|
-
[
|
202
|
+
[640, 1136],
|
203
|
+
[1136, 600],
|
204
|
+
[1136, 640]
|
200
205
|
],
|
201
206
|
ScreenSize::IOS_IPAD_MESSAGES => [
|
202
207
|
[1024, 748],
|
@@ -212,7 +217,7 @@ module Deliver
|
|
212
217
|
[1668, 2224],
|
213
218
|
[2224, 1668]
|
214
219
|
],
|
215
|
-
ScreenSize::
|
220
|
+
ScreenSize::IOS_IPAD_11_MESSAGES => [
|
216
221
|
[1668, 2388],
|
217
222
|
[2388, 1668]
|
218
223
|
],
|
@@ -227,30 +232,36 @@ module Deliver
|
|
227
232
|
def self.devices
|
228
233
|
return {
|
229
234
|
ScreenSize::IOS_65 => [
|
230
|
-
[1242, 2688]
|
235
|
+
[1242, 2688],
|
236
|
+
[2688, 1242]
|
231
237
|
],
|
232
238
|
ScreenSize::IOS_61 => [
|
233
|
-
[828, 1792]
|
239
|
+
[828, 1792],
|
240
|
+
[1792, 828]
|
234
241
|
],
|
235
242
|
ScreenSize::IOS_58 => [
|
236
|
-
[1125, 2436]
|
243
|
+
[1125, 2436],
|
244
|
+
[2436, 1125]
|
237
245
|
],
|
238
246
|
ScreenSize::IOS_55 => [
|
239
|
-
[
|
240
|
-
[
|
247
|
+
[1242, 2208],
|
248
|
+
[2208, 1242]
|
241
249
|
],
|
242
250
|
ScreenSize::IOS_47 => [
|
243
|
-
[750, 1334]
|
251
|
+
[750, 1334],
|
252
|
+
[1334, 750]
|
244
253
|
],
|
245
254
|
ScreenSize::IOS_40 => [
|
246
|
-
[640, 1136],
|
247
255
|
[640, 1096],
|
248
|
-
[
|
256
|
+
[640, 1136],
|
257
|
+
[1136, 600],
|
258
|
+
[1136, 640]
|
249
259
|
],
|
250
260
|
ScreenSize::IOS_35 => [
|
251
|
-
[640, 960],
|
252
261
|
[640, 920],
|
253
|
-
[
|
262
|
+
[640, 960],
|
263
|
+
[960, 600],
|
264
|
+
[960, 640]
|
254
265
|
],
|
255
266
|
ScreenSize::IOS_IPAD => [ # 9.7 inch
|
256
267
|
[1024, 748],
|
@@ -298,28 +309,12 @@ module Deliver
|
|
298
309
|
|
299
310
|
UI.user_error!("Could not find or parse file at path '#{path}'") if size.nil? || size.count == 0
|
300
311
|
|
301
|
-
# Walk up two directories and test if we need to handle a platform that doesn't support landscape
|
302
|
-
path_component = Pathname.new(path).each_filename.to_a[-3]
|
303
|
-
if path_component.eql?("appleTV")
|
304
|
-
skip_landscape = true
|
305
|
-
end
|
306
|
-
|
307
312
|
# iMessage screenshots have same resolution as app screenshots so we need to distinguish them
|
313
|
+
path_component = Pathname.new(path).each_filename.to_a[-3]
|
308
314
|
devices = path_component.eql?("iMessage") ? self.device_messages : self.devices
|
309
315
|
|
310
|
-
devices.each do |
|
311
|
-
|
312
|
-
if skip_landscape
|
313
|
-
if size[0] == (resolution[0]) && size[1] == (resolution[1]) # portrait
|
314
|
-
return device_type
|
315
|
-
end
|
316
|
-
else
|
317
|
-
if (size[0] == (resolution[0]) && size[1] == (resolution[1])) || # portrait
|
318
|
-
(size[1] == (resolution[0]) && size[0] == (resolution[1])) # landscape
|
319
|
-
return device_type
|
320
|
-
end
|
321
|
-
end
|
322
|
-
end
|
316
|
+
devices.each do |screen_size, resolutions|
|
317
|
+
return screen_size if resolutions.include?(size)
|
323
318
|
end
|
324
319
|
|
325
320
|
UI.user_error!("Unsupported screen size #{size} for path '#{path}'")
|
@@ -21,7 +21,7 @@ module Fastlane
|
|
21
21
|
def self.get_build_number(params)
|
22
22
|
UI.message("Login to App Store Connect (#{params[:username]})")
|
23
23
|
Spaceship::Tunes.login(params[:username])
|
24
|
-
Spaceship::Tunes.select_team
|
24
|
+
Spaceship::Tunes.select_team(team_id: params[:team_id], team_name: params[:team_name])
|
25
25
|
UI.message("Login successful")
|
26
26
|
|
27
27
|
app = Spaceship::Tunes::Application.find(params[:app_identifier])
|
@@ -79,10 +79,7 @@ module Fastlane
|
|
79
79
|
is_string: false, # as we also allow integers, which we convert to strings anyway
|
80
80
|
code_gen_sensitive: true,
|
81
81
|
default_value: CredentialsManager::AppfileConfig.try_fetch_value(:itc_team_id),
|
82
|
-
default_value_dynamic: true,
|
83
|
-
verify_block: proc do |value|
|
84
|
-
ENV["FASTLANE_ITC_TEAM_ID"] = value.to_s
|
85
|
-
end),
|
82
|
+
default_value_dynamic: true),
|
86
83
|
FastlaneCore::ConfigItem.new(key: :team_name,
|
87
84
|
short_option: "-e",
|
88
85
|
env_name: "LATEST_TESTFLIGHT_BUILD_NUMBER_TEAM_NAME",
|
@@ -90,10 +87,7 @@ module Fastlane
|
|
90
87
|
optional: true,
|
91
88
|
code_gen_sensitive: true,
|
92
89
|
default_value: CredentialsManager::AppfileConfig.try_fetch_value(:itc_team_name),
|
93
|
-
default_value_dynamic: true
|
94
|
-
verify_block: proc do |value|
|
95
|
-
ENV["FASTLANE_ITC_TEAM_NAME"] = value.to_s
|
96
|
-
end)
|
90
|
+
default_value_dynamic: true)
|
97
91
|
]
|
98
92
|
end
|
99
93
|
|
@@ -1,5 +1,5 @@
|
|
1
1
|
module Fastlane
|
2
|
-
VERSION = '2.121.0.beta.
|
2
|
+
VERSION = '2.121.0.beta.20190419200010'.freeze
|
3
3
|
DESCRIPTION = "The easiest way to automate beta deployments and releases for your iOS and Android apps".freeze
|
4
4
|
MINIMUM_XCODE_RELEASE = "7.0".freeze
|
5
5
|
RUBOCOP_REQUIREMENT = '0.49.1'.freeze
|
@@ -18,13 +18,15 @@ module Spaceship
|
|
18
18
|
Spaceship::Tunes.login(@username)
|
19
19
|
puts("Successfully logged in to App Store Connect".green)
|
20
20
|
puts("")
|
21
|
-
rescue
|
21
|
+
rescue => ex
|
22
22
|
puts("Could not login to App Store Connect".red)
|
23
23
|
puts("Please check your credentials and try again.".yellow)
|
24
24
|
puts("This could be an issue with App Store Connect,".yellow)
|
25
25
|
puts("Please try unsetting the FASTLANE_SESSION environment variable".yellow)
|
26
26
|
puts("(if it is set) and re-run `fastlane spaceauth`".yellow)
|
27
|
-
|
27
|
+
puts("")
|
28
|
+
puts("Execption type: #{ex.class}")
|
29
|
+
raise ex
|
28
30
|
end
|
29
31
|
|
30
32
|
itc_cookie_content = Spaceship::Tunes.client.store_cookie
|
@@ -44,7 +46,7 @@ module Spaceship
|
|
44
46
|
|
45
47
|
# We remove all the un-needed cookies
|
46
48
|
cookies.select! do |cookie|
|
47
|
-
cookie.name.start_with?("myacinfo") || cookie.name ==
|
49
|
+
cookie.name.start_with?("myacinfo") || cookie.name == "dqsid" || cookie.name.start_with?("DES")
|
48
50
|
end
|
49
51
|
|
50
52
|
yaml = cookies.to_yaml.gsub("\n", "\\n")
|
@@ -123,14 +123,33 @@ module Spaceship
|
|
123
123
|
code_length = security_code["length"]
|
124
124
|
|
125
125
|
puts("")
|
126
|
-
|
127
|
-
code_type = 'trusteddevice'
|
128
|
-
code = ask("Please enter the #{code_length} digit code:")
|
129
|
-
body = { "securityCode" => { "code" => code.to_s } }.to_json
|
126
|
+
env_2fa_sms_default_phone_number = ENV["SPACESHIP_2FA_SMS_DEFAULT_PHONE_NUMBER"]
|
130
127
|
|
131
|
-
if
|
128
|
+
if env_2fa_sms_default_phone_number
|
129
|
+
raise Tunes::Error.new, "Environment variable SPACESHIP_2FA_SMS_DEFAULT_PHONE_NUMBER is set, but empty." if env_2fa_sms_default_phone_number.empty?
|
130
|
+
|
131
|
+
puts("Environment variable `SPACESHIP_2FA_SMS_DEFAULT_PHONE_NUMBER` is set, automatically requesting 2FA token via SMS to that number")
|
132
|
+
puts("SPACESHIP_2FA_SMS_DEFAULT_PHONE_NUMBER = #{env_2fa_sms_default_phone_number}")
|
133
|
+
puts("")
|
134
|
+
phone_number = env_2fa_sms_default_phone_number
|
135
|
+
phone_id = phone_id_from_number(response.body["trustedPhoneNumbers"], phone_number)
|
132
136
|
code_type = 'phone'
|
133
|
-
body = request_two_factor_code_from_phone(
|
137
|
+
body = request_two_factor_code_from_phone(phone_id, phone_number, code_length)
|
138
|
+
else
|
139
|
+
puts("(Input `sms` to escape this prompt and select a trusted phone number to send the code as a text message)")
|
140
|
+
puts("")
|
141
|
+
puts("(You can also set the environment variable `SPACESHIP_2FA_SMS_DEFAULT_PHONE_NUMBER` to automate this)")
|
142
|
+
puts("(Read more at: https://github.com/fastlane/fastlane/blob/master/spaceship/docs/Authentication.md#auto-select-sms-via-spaceship-2fa-sms-default-phone-number)")
|
143
|
+
puts("")
|
144
|
+
code_type = 'trusteddevice'
|
145
|
+
code = ask_for_2fa_code("Please enter the #{code_length} digit code:")
|
146
|
+
body = { "securityCode" => { "code" => code.to_s } }.to_json
|
147
|
+
|
148
|
+
# User exited by entering `sms` and wants to choose phone number for SMS
|
149
|
+
if code == 'sms'
|
150
|
+
code_type = 'phone'
|
151
|
+
body = request_two_factor_code_from_phone_choose(response.body["trustedPhoneNumbers"], code_length)
|
152
|
+
end
|
134
153
|
end
|
135
154
|
|
136
155
|
puts("Requesting session...")
|
@@ -172,23 +191,68 @@ module Spaceship
|
|
172
191
|
return true
|
173
192
|
end
|
174
193
|
|
175
|
-
|
194
|
+
# extracted into its own method for testing
|
195
|
+
def ask_for_2fa_code(text)
|
196
|
+
ask(text)
|
197
|
+
end
|
198
|
+
|
199
|
+
def phone_id_from_number(phone_numbers, phone_number)
|
200
|
+
characters_to_remove_from_phone_numbers = ' \-()"'
|
201
|
+
|
202
|
+
# start with e.g. +49 162 1234585 or +1-123-456-7866
|
203
|
+
phone_number = phone_number.tr(characters_to_remove_from_phone_numbers, '')
|
204
|
+
# cleaned: +491621234585 or +11234567866
|
205
|
+
|
206
|
+
phone_numbers.each do |phone|
|
207
|
+
# rubocop:disable Style/AsciiComments
|
208
|
+
# start with: +49 •••• •••••85 or +1 (•••) •••-••66
|
209
|
+
number_with_dialcode_masked = phone['numberWithDialCode'].tr(characters_to_remove_from_phone_numbers, '')
|
210
|
+
# cleaned: +49•••••••••85 or +1••••••••66
|
211
|
+
# rubocop:enable Style/AsciiComments
|
212
|
+
|
213
|
+
maskings_count = number_with_dialcode_masked.count('•') # => 9 or 8
|
214
|
+
pattern = /^([0-9+]{2,4})([•]{#{maskings_count}})([0-9]{2})$/
|
215
|
+
replacement = "\\1([0-9]{#{maskings_count - 1},#{maskings_count}})\\3"
|
216
|
+
number_with_dialcode_regex_part = number_with_dialcode_masked.gsub(pattern, replacement)
|
217
|
+
# => +49([0-9]{8,9})85 or +1([0-9]{7,8})66
|
218
|
+
|
219
|
+
backslash = '\\'
|
220
|
+
number_with_dialcode_regex_part = backslash + number_with_dialcode_regex_part
|
221
|
+
number_with_dialcode_regex = /^#{number_with_dialcode_regex_part}$/
|
222
|
+
# => /^\+49([0-9]{8})85$/ or /^\+1([0-9]{7,8})66$/
|
223
|
+
|
224
|
+
return phone['id'] if phone_number =~ number_with_dialcode_regex
|
225
|
+
# +491621234585 matches /^\+49([0-9]{8})85$/
|
226
|
+
end
|
227
|
+
|
228
|
+
# Handle case of phone_number not existing in phone_numbers because ENV var is wrong or matcher is broken
|
229
|
+
raise Tunes::Error.new, %(
|
230
|
+
Could not find a matching phone number to #{phone_number} in #{phone_numbers}.
|
231
|
+
Make sure your environment variable is set to the correct phone number.
|
232
|
+
If it is, please open an issue at https://github.com/fastlane/fastlane/issues/new and include this output so we can fix our matcher. Thanks.
|
233
|
+
)
|
234
|
+
end
|
235
|
+
|
236
|
+
def phone_id_from_masked_number(phone_numbers, masked_number)
|
176
237
|
phone_numbers.each do |phone|
|
177
|
-
|
178
|
-
return phone_id if phone['numberWithDialCode'] == result
|
238
|
+
return phone['id'] if phone['numberWithDialCode'] == masked_number
|
179
239
|
end
|
180
240
|
end
|
181
241
|
|
182
|
-
def
|
242
|
+
def request_two_factor_code_from_phone_choose(phone_numbers, code_length)
|
183
243
|
puts("Please select a trusted phone number to send code to:")
|
184
244
|
|
185
245
|
available = phone_numbers.collect do |current|
|
186
246
|
current['numberWithDialCode']
|
187
247
|
end
|
188
|
-
|
248
|
+
chosen = choose(*available)
|
249
|
+
phone_id = phone_id_from_masked_number(phone_numbers, chosen)
|
189
250
|
|
190
|
-
phone_id
|
251
|
+
request_two_factor_code_from_phone(phone_id, chosen, code_length)
|
252
|
+
end
|
191
253
|
|
254
|
+
# this is used in two places: after choosing a phone number and when a phone number is set via ENV var
|
255
|
+
def request_two_factor_code_from_phone(phone_id, phone_number, code_length)
|
192
256
|
# Request code
|
193
257
|
r = request(:put) do |req|
|
194
258
|
req.url("https://idmsa.apple.com/appleauth/auth/verify/phone")
|
@@ -201,10 +265,11 @@ module Spaceship
|
|
201
265
|
# since this might be from the Dev Portal, but for 2 step
|
202
266
|
Spaceship::TunesClient.new.handle_itc_response(r.body)
|
203
267
|
|
204
|
-
puts("Successfully requested text message")
|
268
|
+
puts("Successfully requested text message to #{phone_number}")
|
269
|
+
|
270
|
+
code = ask_for_2fa_code("Please enter the #{code_length} digit code you received at #{phone_number}:")
|
205
271
|
|
206
|
-
|
207
|
-
{ "securityCode" => { "code" => code.to_s }, "phoneNumber" => { "id" => phone_id }, "mode" => "sms" }.to_json
|
272
|
+
return { "securityCode" => { "code" => code.to_s }, "phoneNumber" => { "id" => phone_id }, "mode" => "sms" }.to_json
|
208
273
|
end
|
209
274
|
|
210
275
|
def store_session
|
data/spaceship/lib/spaceship.rb
CHANGED
@@ -13,6 +13,7 @@ require_relative 'spaceship/tunes/tunes'
|
|
13
13
|
require_relative 'spaceship/tunes/spaceship'
|
14
14
|
require_relative 'spaceship/test_flight'
|
15
15
|
require_relative 'spaceship/connect_api'
|
16
|
+
require_relative 'spaceship/spaceauth_runner'
|
16
17
|
|
17
18
|
require_relative 'spaceship/module'
|
18
19
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fastlane
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.121.0.beta.
|
4
|
+
version: 2.121.0.beta.20190419200010
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kohki Miki
|
@@ -27,7 +27,7 @@ authors:
|
|
27
27
|
autorequire:
|
28
28
|
bindir: bin
|
29
29
|
cert_chain: []
|
30
|
-
date: 2019-04-
|
30
|
+
date: 2019-04-19 00:00:00.000000000 Z
|
31
31
|
dependencies:
|
32
32
|
- !ruby/object:Gem::Dependency
|
33
33
|
name: slack-notifier
|
@@ -1688,24 +1688,24 @@ metadata:
|
|
1688
1688
|
post_install_message:
|
1689
1689
|
rdoc_options: []
|
1690
1690
|
require_paths:
|
1691
|
-
-
|
1691
|
+
- match/lib
|
1692
|
+
- precheck/lib
|
1693
|
+
- pem/lib
|
1694
|
+
- deliver/lib
|
1695
|
+
- fastlane_core/lib
|
1692
1696
|
- snapshot/lib
|
1697
|
+
- cert/lib
|
1693
1698
|
- fastlane/lib
|
1694
|
-
- credentials_manager/lib
|
1695
|
-
- frameit/lib
|
1696
|
-
- supply/lib
|
1697
1699
|
- produce/lib
|
1698
|
-
-
|
1699
|
-
- cert/lib
|
1700
|
-
- deliver/lib
|
1700
|
+
- supply/lib
|
1701
1701
|
- screengrab/lib
|
1702
|
-
- pilot/lib
|
1703
1702
|
- sigh/lib
|
1704
|
-
- precheck/lib
|
1705
|
-
- gym/lib
|
1706
|
-
- match/lib
|
1707
|
-
- fastlane_core/lib
|
1708
1703
|
- scan/lib
|
1704
|
+
- spaceship/lib
|
1705
|
+
- credentials_manager/lib
|
1706
|
+
- pilot/lib
|
1707
|
+
- gym/lib
|
1708
|
+
- frameit/lib
|
1709
1709
|
required_ruby_version: !ruby/object:Gem::Requirement
|
1710
1710
|
requirements:
|
1711
1711
|
- - ">="
|