fastlane_hotfix 2.165.0 → 2.187.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (415) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE +1 -1
  3. data/README.md +106 -86
  4. data/cert/lib/cert/commands_generator.rb +2 -1
  5. data/cert/lib/cert/options.rb +6 -5
  6. data/cert/lib/cert/runner.rb +8 -8
  7. data/deliver/lib/assets/summary.html.erb +10 -10
  8. data/deliver/lib/deliver/app_screenshot.rb +17 -11
  9. data/deliver/lib/deliver/app_screenshot_validator.rb +108 -0
  10. data/deliver/lib/deliver/commands_generator.rb +4 -3
  11. data/deliver/lib/deliver/detect_values.rb +5 -3
  12. data/deliver/lib/deliver/download_screenshots.rb +2 -3
  13. data/deliver/lib/deliver/html_generator.rb +2 -2
  14. data/deliver/lib/deliver/languages.rb +1 -1
  15. data/deliver/lib/deliver/loader.rb +123 -21
  16. data/deliver/lib/deliver/module.rb +6 -0
  17. data/deliver/lib/deliver/options.rb +41 -55
  18. data/deliver/lib/deliver/runner.rb +19 -14
  19. data/deliver/lib/deliver/setup.rb +9 -5
  20. data/deliver/lib/deliver/submit_for_review.rb +4 -4
  21. data/deliver/lib/deliver/upload_metadata.rb +32 -21
  22. data/deliver/lib/deliver/upload_price_tier.rb +1 -1
  23. data/deliver/lib/deliver/upload_screenshots.rb +14 -76
  24. data/fastlane/lib/fastlane/actions/actions_helper.rb +3 -3
  25. data/fastlane/lib/fastlane/actions/adb.rb +2 -5
  26. data/fastlane/lib/fastlane/actions/adb_devices.rb +0 -1
  27. data/fastlane/lib/fastlane/actions/add_git_tag.rb +22 -6
  28. data/fastlane/lib/fastlane/actions/app_store_build_number.rb +17 -17
  29. data/fastlane/lib/fastlane/actions/app_store_connect_api_key.rb +21 -7
  30. data/fastlane/lib/fastlane/actions/appaloosa.rb +7 -2
  31. data/fastlane/lib/fastlane/actions/appetize.rb +13 -8
  32. data/fastlane/lib/fastlane/actions/appetize_viewing_url_generator.rb +0 -11
  33. data/fastlane/lib/fastlane/actions/appium.rb +40 -65
  34. data/fastlane/lib/fastlane/actions/appledoc.rb +46 -46
  35. data/fastlane/lib/fastlane/actions/apteligent.rb +3 -2
  36. data/fastlane/lib/fastlane/actions/artifactory.rb +41 -9
  37. data/fastlane/lib/fastlane/actions/automatic_code_signing.rb +7 -13
  38. data/fastlane/lib/fastlane/actions/backup_file.rb +1 -1
  39. data/fastlane/lib/fastlane/actions/backup_xcarchive.rb +3 -3
  40. data/fastlane/lib/fastlane/actions/badge.rb +9 -13
  41. data/fastlane/lib/fastlane/actions/build_and_upload_to_appetize.rb +11 -5
  42. data/fastlane/lib/fastlane/actions/build_app.rb +7 -1
  43. data/fastlane/lib/fastlane/actions/bundle_install.rb +8 -10
  44. data/fastlane/lib/fastlane/actions/carthage.rb +22 -14
  45. data/fastlane/lib/fastlane/actions/changelog_from_git_commits.rb +8 -17
  46. data/fastlane/lib/fastlane/actions/chatwork.rb +3 -2
  47. data/fastlane/lib/fastlane/actions/check_app_store_metadata.rb +9 -1
  48. data/fastlane/lib/fastlane/actions/clean_build_artifacts.rb +0 -1
  49. data/fastlane/lib/fastlane/actions/clean_cocoapods_cache.rb +0 -1
  50. data/fastlane/lib/fastlane/actions/clipboard.rb +3 -6
  51. data/fastlane/lib/fastlane/actions/cloc.rb +9 -13
  52. data/fastlane/lib/fastlane/actions/cocoapods.rb +23 -15
  53. data/fastlane/lib/fastlane/actions/commit_github_file.rb +12 -4
  54. data/fastlane/lib/fastlane/actions/commit_version_bump.rb +6 -7
  55. data/fastlane/lib/fastlane/actions/copy_artifacts.rb +3 -4
  56. data/fastlane/lib/fastlane/actions/crashlytics.rb +7 -11
  57. data/fastlane/lib/fastlane/actions/create_app_on_managed_play_store.rb +70 -76
  58. data/fastlane/lib/fastlane/actions/create_keychain.rb +13 -11
  59. data/fastlane/lib/fastlane/actions/create_pull_request.rb +15 -9
  60. data/fastlane/lib/fastlane/actions/create_xcframework.rb +123 -0
  61. data/fastlane/lib/fastlane/actions/danger.rb +13 -12
  62. data/fastlane/lib/fastlane/actions/deploygate.rb +1 -2
  63. data/fastlane/lib/fastlane/actions/docs/build_app.md +1 -1
  64. data/fastlane/lib/fastlane/actions/docs/capture_android_screenshots.md +27 -28
  65. data/fastlane/lib/fastlane/actions/docs/capture_ios_screenshots.md +7 -3
  66. data/fastlane/lib/fastlane/actions/docs/create_app_online.md +171 -67
  67. data/fastlane/lib/fastlane/actions/docs/frame_screenshots.md +20 -3
  68. data/fastlane/lib/fastlane/actions/docs/sync_code_signing.md +9 -3
  69. data/fastlane/lib/fastlane/actions/docs/upload_to_app_store.md.erb +39 -16
  70. data/fastlane/lib/fastlane/actions/docs/upload_to_play_store.md +2 -1
  71. data/fastlane/lib/fastlane/actions/docs/upload_to_testflight.md +15 -5
  72. data/fastlane/lib/fastlane/actions/download_app_privacy_details_from_app_store.rb +142 -0
  73. data/fastlane/lib/fastlane/actions/download_dsyms.rb +8 -20
  74. data/fastlane/lib/fastlane/actions/dsym_zip.rb +1 -1
  75. data/fastlane/lib/fastlane/actions/ensure_env_vars.rb +2 -6
  76. data/fastlane/lib/fastlane/actions/ensure_git_branch.rb +0 -1
  77. data/fastlane/lib/fastlane/actions/ensure_git_status_clean.rb +3 -4
  78. data/fastlane/lib/fastlane/actions/ensure_no_debug_code.rb +3 -5
  79. data/fastlane/lib/fastlane/actions/ensure_xcode_version.rb +1 -2
  80. data/fastlane/lib/fastlane/actions/environment_variable.rb +13 -21
  81. data/fastlane/lib/fastlane/actions/erb.rb +2 -5
  82. data/fastlane/lib/fastlane/actions/get_build_number_repository.rb +1 -1
  83. data/fastlane/lib/fastlane/actions/get_certificates.rb +5 -1
  84. data/fastlane/lib/fastlane/actions/get_github_release.rb +11 -1
  85. data/fastlane/lib/fastlane/actions/get_ipa_info_plist_value.rb +0 -1
  86. data/fastlane/lib/fastlane/actions/get_managed_play_store_publishing_rights.rb +32 -35
  87. data/fastlane/lib/fastlane/actions/get_provisioning_profile.rb +9 -1
  88. data/fastlane/lib/fastlane/actions/get_push_certificate.rb +1 -1
  89. data/fastlane/lib/fastlane/actions/get_version_number.rb +17 -10
  90. data/fastlane/lib/fastlane/actions/git_add.rb +5 -10
  91. data/fastlane/lib/fastlane/actions/git_branch.rb +4 -10
  92. data/fastlane/lib/fastlane/actions/git_commit.rb +12 -10
  93. data/fastlane/lib/fastlane/actions/git_pull.rb +4 -10
  94. data/fastlane/lib/fastlane/actions/git_remote_branch.rb +57 -0
  95. data/fastlane/lib/fastlane/actions/git_submodule_update.rb +16 -8
  96. data/fastlane/lib/fastlane/actions/git_tag_exists.rb +4 -0
  97. data/fastlane/lib/fastlane/actions/github_api.rb +17 -8
  98. data/fastlane/lib/fastlane/actions/gradle.rb +12 -20
  99. data/fastlane/lib/fastlane/actions/hg_commit_version_bump.rb +1 -1
  100. data/fastlane/lib/fastlane/actions/hg_push.rb +1 -1
  101. data/fastlane/lib/fastlane/actions/hipchat.rb +6 -6
  102. data/fastlane/lib/fastlane/actions/hockey.rb +5 -12
  103. data/fastlane/lib/fastlane/actions/ifttt.rb +3 -6
  104. data/fastlane/lib/fastlane/actions/import_from_git.rb +7 -9
  105. data/fastlane/lib/fastlane/actions/increment_build_number.rb +8 -2
  106. data/fastlane/lib/fastlane/actions/install_on_device.rb +3 -6
  107. data/fastlane/lib/fastlane/actions/install_provisioning_profile.rb +4 -0
  108. data/fastlane/lib/fastlane/actions/installr.rb +22 -25
  109. data/fastlane/lib/fastlane/actions/ipa.rb +2 -2
  110. data/fastlane/lib/fastlane/actions/jazzy.rb +11 -8
  111. data/fastlane/lib/fastlane/actions/jira.rb +61 -14
  112. data/fastlane/lib/fastlane/actions/latest_testflight_build_number.rb +6 -6
  113. data/fastlane/lib/fastlane/actions/lcov.rb +0 -4
  114. data/fastlane/lib/fastlane/actions/mailgun.rb +21 -27
  115. data/fastlane/lib/fastlane/actions/make_changelog_from_jenkins.rb +1 -1
  116. data/fastlane/lib/fastlane/actions/match_nuke.rb +59 -0
  117. data/fastlane/lib/fastlane/actions/modify_services.rb +59 -24
  118. data/fastlane/lib/fastlane/actions/nexus_upload.rb +3 -2
  119. data/fastlane/lib/fastlane/actions/notarize.rb +98 -54
  120. data/fastlane/lib/fastlane/actions/notification.rb +1 -1
  121. data/fastlane/lib/fastlane/actions/number_of_commits.rb +1 -1
  122. data/fastlane/lib/fastlane/actions/oclint.rb +15 -14
  123. data/fastlane/lib/fastlane/actions/onesignal.rb +13 -3
  124. data/fastlane/lib/fastlane/actions/pod_push.rb +9 -2
  125. data/fastlane/lib/fastlane/actions/podio_item.rb +0 -7
  126. data/fastlane/lib/fastlane/actions/prompt.rb +3 -4
  127. data/fastlane/lib/fastlane/actions/push_git_tags.rb +1 -1
  128. data/fastlane/lib/fastlane/actions/push_to_git_remote.rb +14 -3
  129. data/fastlane/lib/fastlane/actions/puts.rb +1 -2
  130. data/fastlane/lib/fastlane/actions/register_device.rb +10 -13
  131. data/fastlane/lib/fastlane/actions/register_devices.rb +11 -14
  132. data/fastlane/lib/fastlane/actions/reset_git_repo.rb +5 -8
  133. data/fastlane/lib/fastlane/actions/reset_simulator_contents.rb +0 -2
  134. data/fastlane/lib/fastlane/actions/resign.rb +2 -9
  135. data/fastlane/lib/fastlane/actions/restore_file.rb +1 -1
  136. data/fastlane/lib/fastlane/actions/rsync.rb +3 -6
  137. data/fastlane/lib/fastlane/actions/run_tests.rb +1 -1
  138. data/fastlane/lib/fastlane/actions/s3.rb +1 -1
  139. data/fastlane/lib/fastlane/actions/say.rb +2 -3
  140. data/fastlane/lib/fastlane/actions/scp.rb +4 -10
  141. data/fastlane/lib/fastlane/actions/set_build_number_repository.rb +1 -1
  142. data/fastlane/lib/fastlane/actions/set_changelog.rb +10 -13
  143. data/fastlane/lib/fastlane/actions/set_github_release.rb +23 -16
  144. data/fastlane/lib/fastlane/actions/set_info_plist_value.rb +1 -1
  145. data/fastlane/lib/fastlane/actions/set_pod_key.rb +3 -4
  146. data/fastlane/lib/fastlane/actions/setup_ci.rb +1 -2
  147. data/fastlane/lib/fastlane/actions/setup_circle_ci.rb +1 -1
  148. data/fastlane/lib/fastlane/actions/setup_jenkins.rb +7 -12
  149. data/fastlane/lib/fastlane/actions/setup_travis.rb +1 -1
  150. data/fastlane/lib/fastlane/actions/sh.rb +2 -4
  151. data/fastlane/lib/fastlane/actions/slack.rb +164 -145
  152. data/fastlane/lib/fastlane/actions/slather.rb +5 -21
  153. data/fastlane/lib/fastlane/actions/sonar.rb +12 -19
  154. data/fastlane/lib/fastlane/actions/sourcedocs.rb +128 -0
  155. data/fastlane/lib/fastlane/actions/spaceship_logs.rb +1 -1
  156. data/fastlane/lib/fastlane/actions/splunkmint.rb +2 -2
  157. data/fastlane/lib/fastlane/actions/spm.rb +8 -2
  158. data/fastlane/lib/fastlane/actions/ssh.rb +5 -10
  159. data/fastlane/lib/fastlane/actions/swiftlint.rb +21 -19
  160. data/fastlane/lib/fastlane/actions/sync_code_signing.rb +6 -1
  161. data/fastlane/lib/fastlane/actions/testfairy.rb +0 -1
  162. data/fastlane/lib/fastlane/actions/tryouts.rb +2 -3
  163. data/fastlane/lib/fastlane/actions/twitter.rb +0 -5
  164. data/fastlane/lib/fastlane/actions/unlock_keychain.rb +3 -3
  165. data/fastlane/lib/fastlane/actions/update_app_group_identifiers.rb +1 -4
  166. data/fastlane/lib/fastlane/actions/update_code_signing_settings.rb +8 -15
  167. data/fastlane/lib/fastlane/actions/update_fastlane.rb +31 -10
  168. data/fastlane/lib/fastlane/actions/update_icloud_container_identifiers.rb +1 -4
  169. data/fastlane/lib/fastlane/actions/update_info_plist.rb +1 -1
  170. data/fastlane/lib/fastlane/actions/update_keychain_access_groups.rb +1 -4
  171. data/fastlane/lib/fastlane/actions/update_plist.rb +1 -1
  172. data/fastlane/lib/fastlane/actions/update_project_provisioning.rb +3 -4
  173. data/fastlane/lib/fastlane/actions/update_urban_airship_configuration.rb +0 -1
  174. data/fastlane/lib/fastlane/actions/update_url_schemes.rb +15 -26
  175. data/fastlane/lib/fastlane/actions/upload_app_privacy_details_to_app_store.rb +290 -0
  176. data/fastlane/lib/fastlane/actions/upload_symbols_to_crashlytics.rb +8 -7
  177. data/fastlane/lib/fastlane/actions/upload_symbols_to_sentry.rb +3 -10
  178. data/fastlane/lib/fastlane/actions/upload_to_app_store.rb +8 -4
  179. data/fastlane/lib/fastlane/actions/upload_to_testflight.rb +7 -2
  180. data/fastlane/lib/fastlane/actions/validate_play_store_json_key.rb +40 -44
  181. data/fastlane/lib/fastlane/actions/version_get_podspec.rb +1 -2
  182. data/fastlane/lib/fastlane/actions/xcode_install.rb +8 -5
  183. data/fastlane/lib/fastlane/actions/xcode_server_get_assets.rb +3 -3
  184. data/fastlane/lib/fastlane/actions/xcodebuild.rb +5 -5
  185. data/fastlane/lib/fastlane/cli_tools_distributor.rb +6 -3
  186. data/fastlane/lib/fastlane/commands_generator.rb +2 -1
  187. data/fastlane/lib/fastlane/documentation/actions_list.rb +2 -2
  188. data/fastlane/lib/fastlane/documentation/docs_generator.rb +1 -1
  189. data/fastlane/lib/fastlane/documentation/markdown_docs_generator.rb +1 -1
  190. data/fastlane/lib/fastlane/environment_printer.rb +1 -0
  191. data/fastlane/lib/fastlane/erb_template_helper.rb +7 -1
  192. data/fastlane/lib/fastlane/fast_file.rb +19 -7
  193. data/fastlane/lib/fastlane/fastlane_require.rb +7 -1
  194. data/fastlane/lib/fastlane/features.rb +1 -1
  195. data/fastlane/lib/fastlane/helper/adb_helper.rb +1 -1
  196. data/fastlane/lib/fastlane/helper/crashlytics_helper.rb +4 -4
  197. data/fastlane/lib/fastlane/helper/gem_helper.rb +2 -2
  198. data/fastlane/lib/fastlane/helper/git_helper.rb +34 -5
  199. data/fastlane/lib/fastlane/lane_manager.rb +3 -2
  200. data/fastlane/lib/fastlane/notification/slack.rb +56 -0
  201. data/fastlane/lib/fastlane/plugins/plugin_fetcher.rb +1 -2
  202. data/fastlane/lib/fastlane/plugins/plugin_info.rb +2 -2
  203. data/fastlane/lib/fastlane/plugins/plugin_info_collector.rb +1 -2
  204. data/fastlane/lib/fastlane/plugins/plugin_manager.rb +2 -3
  205. data/fastlane/lib/fastlane/plugins/template/%gem_name%.gemspec.erb +7 -6
  206. data/fastlane/lib/fastlane/plugins/template/.circleci/config.yml +1 -1
  207. data/fastlane/lib/fastlane/plugins/template/.github/workflows/test.yml +1 -1
  208. data/fastlane/lib/fastlane/plugins/template/.rubocop.yml +31 -35
  209. data/fastlane/lib/fastlane/plugins/template/spec/spec_helper.rb.erb +1 -1
  210. data/fastlane/lib/fastlane/setup/setup.rb +23 -10
  211. data/fastlane/lib/fastlane/setup/setup_ios.rb +3 -3
  212. data/fastlane/lib/fastlane/swift_fastlane_api_generator.rb +3 -0
  213. data/fastlane/lib/fastlane/swift_fastlane_function.rb +44 -16
  214. data/fastlane/lib/fastlane/swift_runner_upgrader.rb +2 -0
  215. data/fastlane/lib/fastlane/version.rb +2 -2
  216. data/fastlane/swift/Actions.swift +1 -1
  217. data/fastlane/swift/Appfile.swift +1 -1
  218. data/fastlane/swift/ArgumentProcessor.swift +1 -1
  219. data/fastlane/swift/ControlCommand.swift +1 -1
  220. data/fastlane/swift/Deliverfile.swift +2 -2
  221. data/fastlane/swift/DeliverfileProtocol.swift +23 -23
  222. data/fastlane/swift/Fastfile.swift +1 -1
  223. data/fastlane/swift/Fastlane.swift +7965 -4213
  224. data/fastlane/swift/FastlaneSwiftRunner/FastlaneSwiftRunner.xcodeproj/project.pbxproj +4 -0
  225. data/fastlane/swift/Gymfile.swift +2 -2
  226. data/fastlane/swift/GymfileProtocol.swift +15 -3
  227. data/fastlane/swift/LaneFileProtocol.swift +12 -6
  228. data/fastlane/swift/MainProcess.swift +3 -1
  229. data/fastlane/swift/Matchfile.swift +2 -2
  230. data/fastlane/swift/MatchfileProtocol.swift +4 -4
  231. data/fastlane/swift/OptionalConfigValue.swift +101 -0
  232. data/fastlane/swift/Plugins.swift +1 -1
  233. data/fastlane/swift/Precheckfile.swift +2 -2
  234. data/fastlane/swift/PrecheckfileProtocol.swift +8 -4
  235. data/fastlane/swift/RubyCommand.swift +2 -2
  236. data/fastlane/swift/RubyCommandable.swift +1 -1
  237. data/fastlane/swift/Runner.swift +3 -3
  238. data/fastlane/swift/RunnerArgument.swift +1 -1
  239. data/fastlane/swift/Scanfile.swift +2 -2
  240. data/fastlane/swift/ScanfileProtocol.swift +34 -2
  241. data/fastlane/swift/Screengrabfile.swift +2 -2
  242. data/fastlane/swift/ScreengrabfileProtocol.swift +5 -5
  243. data/fastlane/swift/Snapshotfile.swift +2 -2
  244. data/fastlane/swift/SnapshotfileProtocol.swift +19 -3
  245. data/fastlane/swift/SocketClient.swift +4 -3
  246. data/fastlane/swift/SocketClientDelegateProtocol.swift +1 -1
  247. data/fastlane/swift/SocketResponse.swift +5 -3
  248. data/fastlane/swift/formatting/Brewfile.lock.json +24 -16
  249. data/fastlane/swift/main.swift +1 -1
  250. data/fastlane/swift/upgrade_manifest.json +1 -1
  251. data/fastlane_core/lib/fastlane_core.rb +22 -20
  252. data/fastlane_core/lib/fastlane_core/build_watcher.rb +89 -12
  253. data/fastlane_core/lib/fastlane_core/cert_checker.rb +12 -7
  254. data/fastlane_core/lib/fastlane_core/clipboard.rb +20 -0
  255. data/fastlane_core/lib/fastlane_core/command_executor.rb +3 -9
  256. data/fastlane_core/lib/fastlane_core/configuration/commander_generator.rb +6 -1
  257. data/fastlane_core/lib/fastlane_core/configuration/config_item.rb +41 -3
  258. data/fastlane_core/lib/fastlane_core/configuration/configuration.rb +14 -8
  259. data/fastlane_core/lib/fastlane_core/device_manager.rb +1 -1
  260. data/fastlane_core/lib/fastlane_core/helper.rb +78 -14
  261. data/fastlane_core/lib/fastlane_core/ipa_file_analyser.rb +41 -16
  262. data/fastlane_core/lib/fastlane_core/ipa_upload_package_builder.rb +3 -2
  263. data/fastlane_core/lib/fastlane_core/itunes_transporter.rb +20 -15
  264. data/fastlane_core/lib/fastlane_core/keychain_importer.rb +1 -1
  265. data/fastlane_core/lib/fastlane_core/languages.rb +2 -2
  266. data/fastlane_core/lib/fastlane_core/pkg_upload_package_builder.rb +3 -2
  267. data/fastlane_core/lib/fastlane_core/print_table.rb +5 -3
  268. data/fastlane_core/lib/fastlane_core/project.rb +48 -28
  269. data/fastlane_core/lib/fastlane_core/provisioning_profile.rb +3 -1
  270. data/{deliver/lib/deliver → fastlane_core/lib/fastlane_core}/queue_worker.rb +4 -4
  271. data/fastlane_core/lib/fastlane_core/swag.rb +1 -1
  272. data/fastlane_core/lib/fastlane_core/ui/disable_colors.rb +8 -0
  273. data/fastlane_core/lib/fastlane_core/ui/help.erb +35 -0
  274. data/fastlane_core/lib/fastlane_core/ui/help_formatter.rb +16 -0
  275. data/fastlane_core/lib/fastlane_core/ui/implementations/shell.rb +16 -2
  276. data/fastlane_core/lib/fastlane_core/ui/interface.rb +1 -1
  277. data/fastlane_core/lib/fastlane_core/update_checker/update_checker.rb +2 -2
  278. data/frameit/lib/frameit/commands_generator.rb +2 -1
  279. data/frameit/lib/frameit/config_parser.rb +2 -2
  280. data/frameit/lib/frameit/device_types.rb +7 -1
  281. data/frameit/lib/frameit/frame_downloader.rb +2 -1
  282. data/gym/lib/gym/code_signing_mapping.rb +3 -3
  283. data/gym/lib/gym/commands_generator.rb +2 -1
  284. data/gym/lib/gym/error_handler.rb +8 -0
  285. data/gym/lib/gym/generators/build_command_generator.rb +3 -0
  286. data/gym/lib/gym/generators/package_command_generator.rb +4 -0
  287. data/gym/lib/gym/generators/package_command_generator_xcode7.rb +21 -15
  288. data/gym/lib/gym/options.rb +19 -3
  289. data/gym/lib/gym/runner.rb +15 -4
  290. data/match/lib/match/change_password.rb +3 -3
  291. data/match/lib/match/commands_generator.rb +2 -1
  292. data/match/lib/match/encryption/interface.rb +1 -1
  293. data/match/lib/match/encryption/openssl.rb +5 -3
  294. data/match/lib/match/importer.rb +9 -10
  295. data/match/lib/match/migrate.rb +2 -3
  296. data/match/lib/match/module.rb +2 -1
  297. data/match/lib/match/nuke.rb +19 -15
  298. data/match/lib/match/options.rb +4 -3
  299. data/match/lib/match/runner.rb +3 -4
  300. data/match/lib/match/spaceship_ensure.rb +3 -0
  301. data/match/lib/match/storage/git_storage.rb +14 -10
  302. data/match/lib/match/storage/google_cloud_storage.rb +2 -2
  303. data/match/lib/match/storage/s3_storage.rb +2 -2
  304. data/pem/lib/pem/commands_generator.rb +2 -1
  305. data/pilot/lib/pilot.rb +0 -1
  306. data/pilot/lib/pilot/build_manager.rb +41 -15
  307. data/pilot/lib/pilot/commands_generator.rb +2 -1
  308. data/pilot/lib/pilot/manager.rb +11 -8
  309. data/pilot/lib/pilot/options.rb +18 -9
  310. data/pilot/lib/pilot/tester_exporter.rb +0 -1
  311. data/pilot/lib/pilot/tester_manager.rb +0 -1
  312. data/precheck/lib/precheck/commands_generator.rb +2 -1
  313. data/precheck/lib/precheck/options.rb +9 -3
  314. data/precheck/lib/precheck/rule_processor.rb +1 -1
  315. data/precheck/lib/precheck/runner.rb +14 -9
  316. data/produce/lib/produce/commands_generator.rb +101 -28
  317. data/produce/lib/produce/developer_center.rb +42 -4
  318. data/produce/lib/produce/options.rb +1 -1
  319. data/produce/lib/produce/service.rb +270 -179
  320. data/scan/lib/scan/commands_generator.rb +2 -1
  321. data/scan/lib/scan/detect_values.rb +7 -2
  322. data/scan/lib/scan/module.rb +4 -0
  323. data/scan/lib/scan/options.rb +46 -1
  324. data/scan/lib/scan/runner.rb +88 -3
  325. data/scan/lib/scan/slack_poster.rb +4 -1
  326. data/scan/lib/scan/test_command_generator.rb +13 -8
  327. data/screengrab/lib/screengrab/android_environment.rb +5 -53
  328. data/screengrab/lib/screengrab/commands_generator.rb +2 -1
  329. data/screengrab/lib/screengrab/dependency_checker.rb +0 -20
  330. data/screengrab/lib/screengrab/options.rb +5 -2
  331. data/screengrab/lib/screengrab/runner.rb +111 -108
  332. data/sigh/lib/assets/resign.sh +81 -61
  333. data/sigh/lib/sigh/commands_generator.rb +2 -1
  334. data/sigh/lib/sigh/download_all.rb +4 -8
  335. data/sigh/lib/sigh/options.rb +3 -2
  336. data/sigh/lib/sigh/runner.rb +9 -9
  337. data/snapshot/lib/assets/SnapfileTemplate +3 -2
  338. data/snapshot/lib/assets/SnapfileTemplate.swift +2 -1
  339. data/snapshot/lib/assets/SnapshotHelper.swift +20 -12
  340. data/snapshot/lib/snapshot/commands_generator.rb +3 -1
  341. data/snapshot/lib/snapshot/options.rb +22 -2
  342. data/snapshot/lib/snapshot/reports_generator.rb +7 -1
  343. data/snapshot/lib/snapshot/simulator_launchers/launcher_configuration.rb +2 -0
  344. data/snapshot/lib/snapshot/simulator_launchers/simulator_launcher.rb +1 -1
  345. data/snapshot/lib/snapshot/simulator_launchers/simulator_launcher_base.rb +10 -5
  346. data/snapshot/lib/snapshot/test_command_generator.rb +18 -4
  347. data/snapshot/lib/snapshot/test_command_generator_base.rb +3 -1
  348. data/snapshot/lib/snapshot/test_command_generator_xcode_8.rb +1 -1
  349. data/snapshot/lib/snapshot/update.rb +1 -1
  350. data/spaceship/README.md +4 -14
  351. data/spaceship/lib/spaceship/base.rb +2 -2
  352. data/spaceship/lib/spaceship/client.rb +44 -16
  353. data/spaceship/lib/spaceship/commands_generator.rb +4 -2
  354. data/spaceship/lib/spaceship/connect_api.rb +6 -0
  355. data/spaceship/lib/spaceship/connect_api/api_client.rb +67 -9
  356. data/spaceship/lib/spaceship/connect_api/model.rb +1 -1
  357. data/spaceship/lib/spaceship/connect_api/models/age_rating_declaration.rb +39 -6
  358. data/spaceship/lib/spaceship/connect_api/models/app.rb +95 -55
  359. data/spaceship/lib/spaceship/connect_api/models/app_data_usage.rb +59 -0
  360. data/spaceship/lib/spaceship/connect_api/models/app_data_usage_category.rb +65 -0
  361. data/spaceship/lib/spaceship/connect_api/models/app_data_usage_data_protection.rb +27 -0
  362. data/spaceship/lib/spaceship/connect_api/models/app_data_usage_grouping.rb +18 -0
  363. data/spaceship/lib/spaceship/connect_api/models/app_data_usage_purposes.rb +37 -0
  364. data/spaceship/lib/spaceship/connect_api/models/app_data_usages_publish_state.rb +36 -0
  365. data/spaceship/lib/spaceship/connect_api/models/app_info.rb +26 -10
  366. data/spaceship/lib/spaceship/connect_api/models/app_info_localization.rb +8 -4
  367. data/spaceship/lib/spaceship/connect_api/models/app_preview.rb +15 -11
  368. data/spaceship/lib/spaceship/connect_api/models/app_preview_set.rb +18 -9
  369. data/spaceship/lib/spaceship/connect_api/models/app_screenshot.rb +10 -8
  370. data/spaceship/lib/spaceship/connect_api/models/app_screenshot_set.rb +20 -11
  371. data/spaceship/lib/spaceship/connect_api/models/app_store_review_attachment.rb +7 -5
  372. data/spaceship/lib/spaceship/connect_api/models/app_store_review_detail.rb +6 -4
  373. data/spaceship/lib/spaceship/connect_api/models/app_store_version.rb +62 -38
  374. data/spaceship/lib/spaceship/connect_api/models/app_store_version_localization.rb +27 -14
  375. data/spaceship/lib/spaceship/connect_api/models/app_store_version_submission.rb +3 -2
  376. data/spaceship/lib/spaceship/connect_api/models/beta_app_review_submission.rb +3 -2
  377. data/spaceship/lib/spaceship/connect_api/models/beta_feedback.rb +6 -4
  378. data/spaceship/lib/spaceship/connect_api/models/beta_group.rb +29 -3
  379. data/spaceship/lib/spaceship/connect_api/models/beta_tester.rb +15 -9
  380. data/spaceship/lib/spaceship/connect_api/models/build.rb +34 -17
  381. data/spaceship/lib/spaceship/connect_api/models/build_beta_detail.rb +4 -0
  382. data/spaceship/lib/spaceship/connect_api/models/build_delivery.rb +3 -2
  383. data/spaceship/lib/spaceship/connect_api/models/bundle_id.rb +41 -6
  384. data/spaceship/lib/spaceship/connect_api/models/bundle_id_capability.rb +86 -21
  385. data/spaceship/lib/spaceship/connect_api/models/certificate.rb +12 -8
  386. data/spaceship/lib/spaceship/connect_api/models/device.rb +36 -4
  387. data/spaceship/lib/spaceship/connect_api/models/idfa_declaration.rb +6 -4
  388. data/spaceship/lib/spaceship/connect_api/models/profile.rb +18 -8
  389. data/spaceship/lib/spaceship/connect_api/models/reset_ratings_request.rb +3 -2
  390. data/spaceship/lib/spaceship/connect_api/models/sandbox_tester.rb +9 -6
  391. data/spaceship/lib/spaceship/connect_api/models/territory.rb +3 -2
  392. data/spaceship/lib/spaceship/connect_api/models/user.rb +6 -4
  393. data/spaceship/lib/spaceship/connect_api/models/user_invitation.rb +22 -6
  394. data/spaceship/lib/spaceship/connect_api/provisioning/provisioning.rb +99 -2
  395. data/spaceship/lib/spaceship/connect_api/response.rb +3 -1
  396. data/spaceship/lib/spaceship/connect_api/testflight/testflight.rb +50 -0
  397. data/spaceship/lib/spaceship/connect_api/token.rb +15 -3
  398. data/spaceship/lib/spaceship/connect_api/tunes/tunes.rb +122 -2
  399. data/spaceship/lib/spaceship/errors.rb +19 -0
  400. data/spaceship/lib/spaceship/playground.rb +2 -2
  401. data/spaceship/lib/spaceship/spaceauth_runner.rb +38 -15
  402. data/spaceship/lib/spaceship/tunes/iap_detail.rb +1 -1
  403. data/spaceship/lib/spaceship/tunes/members.rb +1 -1
  404. data/spaceship/lib/spaceship/tunes/tunes_client.rb +4 -4
  405. data/spaceship/lib/spaceship/two_step_or_factor_client.rb +59 -33
  406. data/spaceship/lib/spaceship/ui.rb +2 -2
  407. data/spaceship/lib/spaceship/upgrade_2fa_later_client.rb +91 -0
  408. data/supply/lib/supply.rb +1 -1
  409. data/supply/lib/supply/client.rb +5 -3
  410. data/supply/lib/supply/commands_generator.rb +2 -1
  411. data/supply/lib/supply/options.rb +3 -3
  412. data/supply/lib/supply/uploader.rb +6 -4
  413. metadata +124 -92
  414. data/pilot/lib/pilot/features.rb +0 -0
  415. data/pilot/lib/pilot/tester_util.rb +0 -0
@@ -25,6 +25,12 @@ module Spaceship
25
25
  # key is for App Store or Enterprise so this is the temporary workaround
26
26
  attr_accessor :in_house
27
27
 
28
+ def self.from(hash: nil, filepath: nil)
29
+ api_token ||= self.create(**hash) if hash
30
+ api_token ||= self.from_json_file(filepath) if filepath
31
+ return api_token
32
+ end
33
+
28
34
  def self.from_json_file(filepath)
29
35
  json = JSON.parse(File.read(filepath), { symbolize_names: true })
30
36
 
@@ -37,10 +43,10 @@ module Spaceship
37
43
  raise "App Store Connect API key JSON is missing field(s): #{missing_keys.join(', ')}"
38
44
  end
39
45
 
40
- self.create(json)
46
+ self.create(**json)
41
47
  end
42
48
 
43
- def self.create(key_id: nil, issuer_id: nil, filepath: nil, key: nil, is_key_content_base64: false, duration: nil, in_house: nil)
49
+ def self.create(key_id: nil, issuer_id: nil, filepath: nil, key: nil, is_key_content_base64: false, duration: nil, in_house: nil, **)
44
50
  key_id ||= ENV['SPACESHIP_CONNECT_API_KEY_ID']
45
51
  issuer_id ||= ENV['SPACESHIP_CONNECT_API_ISSUER_ID']
46
52
  filepath ||= ENV['SPACESHIP_CONNECT_API_KEY_FILEPATH']
@@ -60,14 +66,16 @@ module Spaceship
60
66
  key_id: key_id,
61
67
  issuer_id: issuer_id,
62
68
  key: OpenSSL::PKey::EC.new(key),
69
+ key_raw: key,
63
70
  duration: duration,
64
71
  in_house: in_house
65
72
  )
66
73
  end
67
74
 
68
- def initialize(key_id: nil, issuer_id: nil, key: nil, duration: nil, in_house: nil)
75
+ def initialize(key_id: nil, issuer_id: nil, key: nil, key_raw: nil, duration: nil, in_house: nil)
69
76
  @key_id = key_id
70
77
  @key = key
78
+ @key_raw = key_raw
71
79
  @issuer_id = issuer_id
72
80
  @duration = duration
73
81
  @in_house = in_house
@@ -97,6 +105,10 @@ module Spaceship
97
105
  def expired?
98
106
  @expiration < Time.now
99
107
  end
108
+
109
+ def write_key_to_file(path)
110
+ File.open(path, 'w') { |f| f.write(@key_raw) }
111
+ end
100
112
  end
101
113
  end
102
114
  end
@@ -17,9 +17,11 @@ module Spaceship
17
17
  # ageRatingDeclarations
18
18
  #
19
19
 
20
- def get_age_rating_declaration(app_store_version_id: nil)
20
+ def get_age_rating_declaration(app_info_id: nil, app_store_version_id: nil)
21
+ raise "Keyword 'app_store_version_id' is deprecated and 'app_info_id' is required" if app_store_version_id || app_info_id.nil?
22
+
21
23
  params = tunes_request_client.build_params(filter: nil, includes: nil, limit: nil, sort: nil)
22
- tunes_request_client.get("appStoreVersions/#{app_store_version_id}/ageRatingDeclaration", params)
24
+ tunes_request_client.get("appInfos/#{app_info_id}/ageRatingDeclaration", params)
23
25
  end
24
26
 
25
27
  def patch_age_rating_declaration(age_rating_declaration_id: nil, attributes: nil)
@@ -200,6 +202,109 @@ module Spaceship
200
202
  tunes_request_client.patch("apps/#{app_id}", body)
201
203
  end
202
204
 
205
+ #
206
+ # appDataUsage
207
+ #
208
+
209
+ def get_app_data_usages(app_id: nil, filter: {}, includes: nil, limit: nil, sort: nil)
210
+ params = tunes_request_client.build_params(filter: filter, includes: includes, limit: limit, sort: sort)
211
+ tunes_request_client.get("apps/#{app_id}/dataUsages", params)
212
+ end
213
+
214
+ def post_app_data_usage(app_id:, app_data_usage_category_id: nil, app_data_usage_protection_id: nil, app_data_usage_purpose_id: nil)
215
+ raise "app_id is required " if app_id.nil?
216
+
217
+ relationships = {
218
+ app: {
219
+ data: {
220
+ type: "apps",
221
+ id: app_id
222
+ }
223
+ }
224
+ }
225
+
226
+ if app_data_usage_category_id
227
+ relationships[:category] = {
228
+ data: {
229
+ type: "appDataUsageCategories",
230
+ id: app_data_usage_category_id
231
+ }
232
+ }
233
+ end
234
+
235
+ if app_data_usage_protection_id
236
+ relationships[:dataProtection] = {
237
+ data: {
238
+ type: "appDataUsageDataProtections",
239
+ id: app_data_usage_protection_id
240
+ }
241
+ }
242
+ end
243
+
244
+ if app_data_usage_purpose_id
245
+ relationships[:purpose] = {
246
+ data: {
247
+ type: "appDataUsagePurposes",
248
+ id: app_data_usage_purpose_id
249
+ }
250
+ }
251
+ end
252
+
253
+ body = {
254
+ data: {
255
+ type: "appDataUsages",
256
+ relationships: relationships
257
+ }
258
+ }
259
+
260
+ tunes_request_client.post("appDataUsages", body)
261
+ end
262
+
263
+ def delete_app_data_usage(app_data_usage_id: nil)
264
+ tunes_request_client.delete("appDataUsages/#{app_data_usage_id}")
265
+ end
266
+
267
+ #
268
+ # appDataUsageCategory
269
+ #
270
+
271
+ def get_app_data_usage_categories(filter: {}, includes: nil, limit: nil, sort: nil)
272
+ params = tunes_request_client.build_params(filter: filter, includes: includes, limit: limit, sort: sort)
273
+ tunes_request_client.get("appDataUsageCategories", params)
274
+ end
275
+
276
+ #
277
+ # appDataUsagePurpose
278
+ #
279
+
280
+ def get_app_data_usage_purposes(filter: {}, includes: nil, limit: nil, sort: nil)
281
+ params = tunes_request_client.build_params(filter: filter, includes: includes, limit: limit, sort: sort)
282
+ tunes_request_client.get("appDataUsagePurposes", params)
283
+ end
284
+
285
+ #
286
+ # appDataUsagesPublishState
287
+ #
288
+
289
+ def get_app_data_usages_publish_state(app_id: nil)
290
+ params = tunes_request_client.build_params(filter: nil, includes: nil, limit: nil, sort: nil)
291
+ tunes_request_client.get("apps/#{app_id}/dataUsagePublishState", params)
292
+ end
293
+
294
+ def patch_app_data_usages_publish_state(app_data_usages_publish_state_id: nil, published: nil)
295
+ body = {
296
+ data: {
297
+ type: "appDataUsagesPublishState",
298
+ id: app_data_usages_publish_state_id,
299
+ attributes: {
300
+ published: published
301
+ }
302
+ }
303
+ }
304
+
305
+ tunes_request_client.patch("appDataUsagesPublishState/#{app_data_usages_publish_state_id}", body)
306
+ end
307
+
203
308
  #
204
309
  # appPreview
205
310
  #
@@ -278,6 +383,11 @@ module Spaceship
278
383
  tunes_request_client.post("appPreviewSets", body)
279
384
  end
280
385
 
386
+ def delete_app_preview_set(app_preview_set_id: nil)
387
+ params = tunes_request_client.build_params(filter: nil, includes: nil, limit: nil, sort: nil)
388
+ tunes_request_client.delete("appPreviewSets/#{app_preview_set_id}", params)
389
+ end
390
+
281
391
  def patch_app_preview_set_previews(app_preview_set_id: nil, app_preview_ids: nil)
282
392
  app_preview_ids ||= []
283
393
 
@@ -412,6 +522,11 @@ module Spaceship
412
522
  tunes_request_client.patch("appScreenshotSets/#{app_screenshot_set_id}/relationships/appScreenshots", body)
413
523
  end
414
524
 
525
+ def delete_app_screenshot_set(app_screenshot_set_id: nil)
526
+ params = tunes_request_client.build_params(filter: nil, includes: nil, limit: nil, sort: nil)
527
+ tunes_request_client.delete("appScreenshotSets/#{app_screenshot_set_id}", params)
528
+ end
529
+
415
530
  #
416
531
  # appScreenshots
417
532
  #
@@ -654,6 +769,11 @@ module Spaceship
654
769
  tunes_request_client.get("appStoreVersions/#{app_store_version_id}/appStoreVersionLocalizations", params)
655
770
  end
656
771
 
772
+ def get_app_store_version_localization(app_store_version_localization_id: nil, filter: {}, includes: nil, limit: nil, sort: nil)
773
+ params = tunes_request_client.build_params(filter: nil, includes: nil, limit: nil, sort: nil)
774
+ tunes_request_client.get("appStoreVersionLocalizations/#{app_store_version_localization_id}", params)
775
+ end
776
+
657
777
  def post_app_store_version_localization(app_store_version_id: nil, attributes: {})
658
778
  body = {
659
779
  data: {
@@ -43,6 +43,25 @@ module Spaceship
43
43
  end
44
44
  end
45
45
 
46
+ # Raised when 429 is received from App Store Connect
47
+ class TooManyRequestsError < BasicPreferredInfoError
48
+ attr_reader :retry_after
49
+ attr_reader :rate_limit_user
50
+
51
+ def initialize(resp_hash)
52
+ headers = resp_hash[:response_headers] || {}
53
+ @retry_after = (headers['retry-after'] || 60).to_i
54
+ @rate_limit_user = headers['x-daiquiri-rate-limit-user']
55
+ message = 'Apple 429 detected'
56
+ message += " - #{rate_limit_user}" if rate_limit_user
57
+ super(message)
58
+ end
59
+
60
+ def show_github_issues
61
+ false
62
+ end
63
+ end
64
+
46
65
  class UnexpectedResponse < StandardError
47
66
  attr_reader :error_info
48
67
 
@@ -13,8 +13,8 @@ module Spaceship
13
13
  rescue Gem::LoadError
14
14
  puts("Could not find gem 'pry'".red)
15
15
  puts("")
16
- puts("If you installed spaceship using `sudo gem install spaceship` run")
17
- puts(" sudo gem install pry".yellow)
16
+ puts("If you installed spaceship using `gem install spaceship` run")
17
+ puts(" gem install pry".yellow)
18
18
  puts("to install the missing gem")
19
19
  puts("")
20
20
  puts("If you use a Gemfile add this to your Gemfile:")
@@ -1,15 +1,17 @@
1
1
  require 'colored'
2
2
  require 'credentials_manager/appfile_config'
3
3
  require 'yaml'
4
+ require 'fastlane_core'
4
5
 
5
6
  require_relative 'tunes/tunes_client'
6
7
 
7
8
  module Spaceship
8
9
  class SpaceauthRunner
9
- def initialize(username: nil)
10
+ def initialize(username: nil, copy_to_clipboard: nil)
10
11
  @username = username
11
12
  @username ||= CredentialsManager::AppfileConfig.try_fetch_value(:apple_id)
12
13
  @username ||= ask("Username: ")
14
+ @copy_to_clipboard = copy_to_clipboard
13
15
  end
14
16
 
15
17
  def run
@@ -22,7 +24,7 @@ module Spaceship
22
24
  puts("Could not login to App Store Connect".red)
23
25
  puts("Please check your credentials and try again.".yellow)
24
26
  puts("This could be an issue with App Store Connect,".yellow)
25
- puts("Please try unsetting the FASTLANE_SESSION environment variable".yellow)
27
+ puts("Please try unsetting the FASTLANE_SESSION environment variable by calling 'unset FASTLANE_SESSION'".yellow)
26
28
  puts("(if it is set) and re-run `fastlane spaceauth`".yellow)
27
29
  puts("")
28
30
  puts("Exception type: #{ex.class}")
@@ -37,34 +39,55 @@ module Spaceship
37
39
  # Example:
38
40
  # name: DES5c148586daa451e55afb017aa62418f91
39
41
  # value: HSARMTKNSRVTWFlaF/ek8asaa9lymMA0dN8JQ6pY7B3F5kdqTxJvMT19EVEFX8EQudB/uNwBHOHzaa30KYTU/eCP/UF7vGTgxs6PAnlVWKscWssOVHfP2IKWUPaa4Dn+I6ilA7eAFQsiaaVT
40
- cookies = YAML.safe_load(
41
- itc_cookie_content,
42
- [HTTP::Cookie, Time], # classes allowlist
43
- [], # symbols allowlist
44
- true # allow YAML aliases
45
- )
42
+ cookies = load_cookies(itc_cookie_content)
46
43
 
47
44
  # We remove all the un-needed cookies
48
45
  cookies.select! do |cookie|
49
46
  cookie.name.start_with?("myacinfo") || cookie.name == "dqsid" || cookie.name.start_with?("DES")
50
47
  end
51
48
 
52
- yaml = cookies.to_yaml.gsub("\n", "\\n")
49
+ @yaml = cookies.to_yaml.gsub("\n", "\\n")
53
50
 
54
51
  puts("---")
55
52
  puts("")
56
53
  puts("Pass the following via the FASTLANE_SESSION environment variable:")
57
- puts(yaml.cyan.underline)
54
+ puts(@yaml.cyan.underline)
58
55
  puts("")
59
56
  puts("")
60
57
  puts("Example:")
61
- puts("export FASTLANE_SESSION='#{yaml}'".cyan.underline)
58
+ puts("export FASTLANE_SESSION='#{@yaml}'".cyan.underline)
62
59
 
63
- if mac? && Spaceship::Client::UserInterface.interactive? && agree("🙄 Should fastlane copy the cookie into your clipboard, so you can easily paste it? (y/n)", true)
64
- require 'open3'
65
- Open3.popen3('pbcopy') { |input, _, _| input << yaml }
66
- puts("Successfully copied text into your clipboard 🎨".green)
60
+ if @copy_to_clipboard == false
61
+ puts("Skipped asking to copy the session string into your clipboard ⏭️".green)
62
+ elsif @copy_to_clipboard || (mac? && Spaceship::Client::UserInterface.interactive? && agree("🙄 Should fastlane copy the cookie into your clipboard, so you can easily paste it? (y/n)", true))
63
+ FastlaneCore::Clipboard.copy(content: @yaml)
64
+ puts("Successfully copied the session string into your clipboard 🎨".green)
67
65
  end
66
+
67
+ return self
68
+ end
69
+
70
+ def load_cookies(content)
71
+ # When Ruby 2.5 support is dropped, we can safely get rid of the latter branch.
72
+ if YAML.name == 'Psych' && Gem::Version.new(Psych::VERSION) >= Gem::Version.new('3.1')
73
+ YAML.safe_load(
74
+ content,
75
+ permitted_classes: [HTTP::Cookie, Time],
76
+ aliases: true
77
+ )
78
+ else
79
+ YAML.safe_load(
80
+ content,
81
+ [HTTP::Cookie, Time], # classes allowlist
82
+ [], # symbols allowlist
83
+ true # allow YAML aliases
84
+ )
85
+ end
86
+ end
87
+
88
+ def session_string
89
+ FastlaneCore::UI.user_error!("`#{__method__}` method called before calling `run` in `SpaceauthRunner`") unless @yaml
90
+ @yaml
68
91
  end
69
92
 
70
93
  def mac?
@@ -242,7 +242,7 @@ module Spaceship
242
242
  # @return ([Spaceship::Tunes::PricingInfo]) An array of pricing infos from the same tier
243
243
  def world_wide_pricing_info
244
244
  client
245
- .pricing_tiers
245
+ .pricing_tiers(application.apple_id)
246
246
  .find { |p| p.tier_stem == pricing_intervals.first[:tier].to_s }
247
247
  .pricing_info
248
248
  end
@@ -15,7 +15,7 @@ module Spaceship
15
15
 
16
16
  def find(email)
17
17
  all.each do |member|
18
- if member.email_address == email
18
+ if member.email_address.casecmp?(email)
19
19
  return member
20
20
  end
21
21
  end
@@ -579,10 +579,10 @@ module Spaceship
579
579
  }
580
580
 
581
581
  r = request(:post) do |req|
582
- req.url("https://analytics.itunes.apple.com/analytics/api/v1/data/time-series")
582
+ req.url("https://appstoreconnect.apple.com/analytics/api/v1/data/time-series")
583
583
  req.body = data.to_json
584
584
  req.headers['Content-Type'] = 'application/json'
585
- req.headers['X-Requested-By'] = 'analytics.itunes.apple.com'
585
+ req.headers['X-Requested-By'] = 'appstoreconnect.apple.com'
586
586
  end
587
587
 
588
588
  data = parse_response(r)
@@ -704,9 +704,9 @@ module Spaceship
704
704
  # ...
705
705
  # }, {
706
706
  # ...
707
- def pricing_tiers
707
+ def pricing_tiers(app_id)
708
708
  @pricing_tiers ||= begin
709
- r = request(:get, 'ra/apps/pricing/matrix')
709
+ r = request(:get, "ra/apps/#{app_id}/iaps/pricing/matrix")
710
710
  data = parse_response(r, 'data')['pricingTiers']
711
711
  data.map { |tier| Spaceship::Tunes::PricingTier.factory(tier) }
712
712
  end
@@ -4,6 +4,7 @@ require_relative 'tunes/tunes_client'
4
4
  module Spaceship
5
5
  class Client
6
6
  def handle_two_step_or_factor(response)
7
+ raise "2FA can only be performed in interactive mode" if ENV["SPACESHIP_ONLY_ALLOW_INTERACTIVE_2FA"] == "true" && ENV["FASTLANE_IS_INTERACTIVE"] == "false"
7
8
  # extract `x-apple-id-session-id` and `scnt` from response, to be used by `update_request_headers`
8
9
  @x_apple_id_session_id = response["x-apple-id-session-id"]
9
10
  @scnt = response["scnt"]
@@ -134,18 +135,20 @@ module Spaceship
134
135
 
135
136
  phone_number = env_2fa_sms_default_phone_number
136
137
  phone_id = phone_id_from_number(response.body["trustedPhoneNumbers"], phone_number)
138
+ push_mode = push_mode_from_number(response.body["trustedPhoneNumbers"], phone_number)
137
139
  # don't request sms if no trusted devices and env default is the only trusted number,
138
140
  # code was automatically sent
139
141
  should_request_code = !sms_automatically_sent(response)
140
142
  code_type = 'phone'
141
- body = request_two_factor_code_from_phone(phone_id, phone_number, code_length, should_request_code)
143
+ body = request_two_factor_code_from_phone(phone_id, phone_number, code_length, push_mode, should_request_code)
142
144
  elsif sms_automatically_sent(response) # sms fallback, code was automatically sent
143
145
  fallback_number = response.body["trustedPhoneNumbers"].first
144
146
  phone_number = fallback_number["numberWithDialCode"]
145
147
  phone_id = fallback_number["id"]
148
+ push_mode = fallback_number['pushMode']
146
149
 
147
150
  code_type = 'phone'
148
- body = request_two_factor_code_from_phone(phone_id, phone_number, code_length, false)
151
+ body = request_two_factor_code_from_phone(phone_id, phone_number, code_length, push_mode, false)
149
152
  elsif sms_fallback(response) # sms fallback but code wasn't sent bec > 1 phone number
150
153
  code_type = 'phone'
151
154
  body = request_two_factor_code_from_phone_choose(response.body["trustedPhoneNumbers"], code_length)
@@ -231,34 +234,8 @@ module Spaceship
231
234
  end
232
235
 
233
236
  def phone_id_from_number(phone_numbers, phone_number)
234
- characters_to_remove_from_phone_numbers = ' \-()"'
235
-
236
- # start with e.g. +49 162 1234585 or +1-123-456-7866
237
- phone_number = phone_number.tr(characters_to_remove_from_phone_numbers, '')
238
- # cleaned: +491621234585 or +11234567866
239
-
240
237
  phone_numbers.each do |phone|
241
- # rubocop:disable Style/AsciiComments
242
- # start with: +49 •••• •••••85 or +1 (•••) •••-••66
243
- number_with_dialcode_masked = phone['numberWithDialCode'].tr(characters_to_remove_from_phone_numbers, '')
244
- # cleaned: +49•••••••••85 or +1••••••••66
245
- # rubocop:enable Style/AsciiComments
246
-
247
- maskings_count = number_with_dialcode_masked.count('•') # => 9 or 8
248
- pattern = /^([0-9+]{2,4})([•]{#{maskings_count}})([0-9]{2})$/
249
- # following regex: range from maskings_count-2 because sometimes the masked number has 1 or 2 dots more than the actual number
250
- # e.g. https://github.com/fastlane/fastlane/issues/14969
251
- replacement = "\\1([0-9]{#{maskings_count - 2},#{maskings_count}})\\3"
252
- number_with_dialcode_regex_part = number_with_dialcode_masked.gsub(pattern, replacement)
253
- # => +49([0-9]{8,9})85 or +1([0-9]{7,8})66
254
-
255
- backslash = '\\'
256
- number_with_dialcode_regex_part = backslash + number_with_dialcode_regex_part
257
- number_with_dialcode_regex = /^#{number_with_dialcode_regex_part}$/
258
- # => /^\+49([0-9]{8})85$/ or /^\+1([0-9]{7,8})66$/
259
-
260
- return phone['id'] if phone_number =~ number_with_dialcode_regex
261
- # +491621234585 matches /^\+49([0-9]{8})85$/
238
+ return phone['id'] if match_phone_to_masked_phone(phone_number, phone['numberWithDialCode'])
262
239
  end
263
240
 
264
241
  # Handle case of phone_number not existing in phone_numbers because ENV var is wrong or matcher is broken
@@ -269,12 +246,60 @@ If it is, please open an issue at https://github.com/fastlane/fastlane/issues/ne
269
246
  )
270
247
  end
271
248
 
249
+ def push_mode_from_number(phone_numbers, phone_number)
250
+ phone_numbers.each do |phone|
251
+ return phone['pushMode'] if match_phone_to_masked_phone(phone_number, phone['numberWithDialCode'])
252
+ end
253
+
254
+ # If no pushMode was supplied, assume sms
255
+ return "sms"
256
+ end
257
+
258
+ def match_phone_to_masked_phone(phone_number, masked_number)
259
+ characters_to_remove_from_phone_numbers = ' \-()"'
260
+
261
+ # start with e.g. +49 162 1234585 or +1-123-456-7866
262
+ phone_number = phone_number.tr(characters_to_remove_from_phone_numbers, '')
263
+ # cleaned: +491621234585 or +11234567866
264
+
265
+ # rubocop:disable Style/AsciiComments
266
+ # start with: +49 •••• •••••85 or +1 (•••) •••-••66
267
+ number_with_dialcode_masked = masked_number.tr(characters_to_remove_from_phone_numbers, '')
268
+ # cleaned: +49•••••••••85 or +1••••••••66
269
+ # rubocop:enable Style/AsciiComments
270
+
271
+ maskings_count = number_with_dialcode_masked.count('•') # => 9 or 8
272
+ pattern = /^([0-9+]{2,4})([•]{#{maskings_count}})([0-9]{2})$/
273
+ # following regex: range from maskings_count-2 because sometimes the masked number has 1 or 2 dots more than the actual number
274
+ # e.g. https://github.com/fastlane/fastlane/issues/14969
275
+ replacement = "\\1([0-9]{#{maskings_count - 2},#{maskings_count}})\\3"
276
+ number_with_dialcode_regex_part = number_with_dialcode_masked.gsub(pattern, replacement)
277
+ # => +49([0-9]{8,9})85 or +1([0-9]{7,8})66
278
+
279
+ backslash = '\\'
280
+ number_with_dialcode_regex_part = backslash + number_with_dialcode_regex_part
281
+ number_with_dialcode_regex = /^#{number_with_dialcode_regex_part}$/
282
+ # => /^\+49([0-9]{8})85$/ or /^\+1([0-9]{7,8})66$/
283
+
284
+ return phone_number =~ number_with_dialcode_regex
285
+ # +491621234585 matches /^\+49([0-9]{8})85$/
286
+ end
287
+
272
288
  def phone_id_from_masked_number(phone_numbers, masked_number)
273
289
  phone_numbers.each do |phone|
274
290
  return phone['id'] if phone['numberWithDialCode'] == masked_number
275
291
  end
276
292
  end
277
293
 
294
+ def push_mode_from_masked_number(phone_numbers, masked_number)
295
+ phone_numbers.each do |phone|
296
+ return phone['pushMode'] if phone['numberWithDialCode'] == masked_number
297
+ end
298
+
299
+ # If no pushMode was supplied, assume sms
300
+ return "sms"
301
+ end
302
+
278
303
  def request_two_factor_code_from_phone_choose(phone_numbers, code_length)
279
304
  puts("Please select a trusted phone number to send code to:")
280
305
 
@@ -283,18 +308,19 @@ If it is, please open an issue at https://github.com/fastlane/fastlane/issues/ne
283
308
  end
284
309
  chosen = choose_phone_number(available)
285
310
  phone_id = phone_id_from_masked_number(phone_numbers, chosen)
311
+ push_mode = push_mode_from_masked_number(phone_numbers, chosen)
286
312
 
287
- request_two_factor_code_from_phone(phone_id, chosen, code_length)
313
+ request_two_factor_code_from_phone(phone_id, chosen, code_length, push_mode)
288
314
  end
289
315
 
290
316
  # this is used in two places: after choosing a phone number and when a phone number is set via ENV var
291
- def request_two_factor_code_from_phone(phone_id, phone_number, code_length, should_request_code = true)
317
+ def request_two_factor_code_from_phone(phone_id, phone_number, code_length, push_mode = "sms", should_request_code = true)
292
318
  if should_request_code
293
319
  # Request code
294
320
  r = request(:put) do |req|
295
321
  req.url("https://idmsa.apple.com/appleauth/auth/verify/phone")
296
322
  req.headers['Content-Type'] = 'application/json'
297
- req.body = { "phoneNumber" => { "id" => phone_id }, "mode" => "sms" }.to_json
323
+ req.body = { "phoneNumber" => { "id" => phone_id }, "mode" => push_mode }.to_json
298
324
  update_request_headers(req)
299
325
  end
300
326
 
@@ -307,7 +333,7 @@ If it is, please open an issue at https://github.com/fastlane/fastlane/issues/ne
307
333
 
308
334
  code = ask_for_2fa_code("Please enter the #{code_length} digit code you received at #{phone_number}:")
309
335
 
310
- return { "securityCode" => { "code" => code.to_s }, "phoneNumber" => { "id" => phone_id }, "mode" => "sms" }.to_json
336
+ return { "securityCode" => { "code" => code.to_s }, "phoneNumber" => { "id" => phone_id }, "mode" => push_mode }.to_json
311
337
  end
312
338
 
313
339
  def store_session