fastlane 2.223.1 → 2.225.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 14274b2abc21a737dad175e4f6a78ebd86979cb84c94e1971b5002d348736bc0
4
- data.tar.gz: f5ce93eeaa569f021b7c3d6ca80e83e202b071a6faf088ed17fa4ebf05bb4a6b
3
+ metadata.gz: a1e77f8938ff5841875b3034ae791bdb74735771a039be4e5da709c92b49268b
4
+ data.tar.gz: 5aebfce31f8424bd6012576c361269061b0aece5040af945ef29849fcb233cd3
5
5
  SHA512:
6
- metadata.gz: d796b0ee770f953882fe861c1602583fdba65c281db608b5d2b3d9d87f88ee0d93e0d8ae3f9085eb1c333c6f95a6bdcda43a862cfca769adab01b286c7a443f1
7
- data.tar.gz: b46b75471e5d902d2a20143ca8e3be564a1cbb793a0951f6c2c6f4e22e1bd66af7f69d5003338f510d55afaf5617443e018ca4678e4b7cce75ca8eb4c1691180
6
+ metadata.gz: eff23b206daaf4616253f90a657b30ddc8dc135f6bb60f8a0880b21fcd5919da487d4b3aa799a024a60cc0324be9cbf556bc90f3f90e55b685f28fa3d5737a16
7
+ data.tar.gz: f31da0896a7cf725d9bf29e22129fd1b6f9d73b383bd5048475c01fbf206a32642f2ef93252f91e0872dbb49dd18ca9365cf4a1e4b604f4802194bcdb24663f1
data/README.md CHANGED
@@ -35,35 +35,35 @@ If the above doesn't help, please [submit an issue](https://github.com/fastlane/
35
35
  <!-- This table is regenerated and resorted on each release -->
36
36
  <table id='team'>
37
37
  <tr>
38
- <td id='danielle-tomlinson'>
39
- <a href='https://github.com/endocrimes'>
40
- <img src='https://github.com/endocrimes.png' width='140px;'>
38
+ <td id='olivier-halligon'>
39
+ <a href='https://github.com/AliSoftware'>
40
+ <img src='https://github.com/AliSoftware.png' width='140px;'>
41
41
  </a>
42
- <h4 align='center'><a href='https://twitter.com/endocrimes'>Danielle Tomlinson</a></h4>
42
+ <h4 align='center'><a href='https://twitter.com/aligatr'>Olivier Halligon</a></h4>
43
43
  </td>
44
- <td id='jan-piotrowski'>
45
- <a href='https://github.com/janpio'>
46
- <img src='https://github.com/janpio.png' width='140px;'>
44
+ <td id='stefan-natchev'>
45
+ <a href='https://github.com/snatchev'>
46
+ <img src='https://github.com/snatchev.png' width='140px;'>
47
47
  </a>
48
- <h4 align='center'><a href='https://twitter.com/Sujan'>Jan Piotrowski</a></h4>
48
+ <h4 align='center'><a href='https://twitter.com/snatchev'>Stefan Natchev</a></h4>
49
49
  </td>
50
- <td id='helmut-januschka'>
51
- <a href='https://github.com/hjanuschka'>
52
- <img src='https://github.com/hjanuschka.png' width='140px;'>
50
+ <td id='felix-krause'>
51
+ <a href='https://github.com/KrauseFx'>
52
+ <img src='https://github.com/KrauseFx.png' width='140px;'>
53
53
  </a>
54
- <h4 align='center'><a href='https://twitter.com/hjanuschka'>Helmut Januschka</a></h4>
54
+ <h4 align='center'><a href='https://twitter.com/KrauseFx'>Felix Krause</a></h4>
55
55
  </td>
56
- <td id='aaron-brager'>
57
- <a href='https://github.com/getaaron'>
58
- <img src='https://github.com/getaaron.png' width='140px;'>
56
+ <td id='kohki-miki'>
57
+ <a href='https://github.com/giginet'>
58
+ <img src='https://github.com/giginet.png' width='140px;'>
59
59
  </a>
60
- <h4 align='center'><a href='https://twitter.com/getaaron'>Aaron Brager</a></h4>
60
+ <h4 align='center'><a href='https://twitter.com/giginet'>Kohki Miki</a></h4>
61
61
  </td>
62
- <td id='iulian-onofrei'>
63
- <a href='https://github.com/revolter'>
64
- <img src='https://github.com/revolter.png' width='140px;'>
62
+ <td id='luka-mirosevic'>
63
+ <a href='https://github.com/lmirosevic'>
64
+ <img src='https://github.com/lmirosevic.png' width='140px;'>
65
65
  </a>
66
- <h4 align='center'><a href='https://twitter.com/Revolt666'>Iulian Onofrei</a></h4>
66
+ <h4 align='center'><a href='https://twitter.com/lmirosevic'>Luka Mirosevic</a></h4>
67
67
  </td>
68
68
  </tr>
69
69
  <tr>
@@ -73,37 +73,43 @@ If the above doesn't help, please [submit an issue](https://github.com/fastlane/
73
73
  </a>
74
74
  <h4 align='center'><a href='https://twitter.com/mellis1995'>Matthew Ellis</a></h4>
75
75
  </td>
76
- <td id='max-ott'>
77
- <a href='https://github.com/max-ott'>
78
- <img src='https://github.com/max-ott.png' width='140px;'>
76
+ <td id='iulian-onofrei'>
77
+ <a href='https://github.com/revolter'>
78
+ <img src='https://github.com/revolter.png' width='140px;'>
79
79
  </a>
80
- <h4 align='center'><a href='https://twitter.com/ott_max'>Max Ott</a></h4>
80
+ <h4 align='center'><a href='https://twitter.com/Revolt666'>Iulian Onofrei</a></h4>
81
81
  </td>
82
- <td id='roger-oba'>
83
- <a href='https://github.com/rogerluan'>
84
- <img src='https://github.com/rogerluan.png' width='140px;'>
82
+ <td id='jérôme-lacoste'>
83
+ <a href='https://github.com/lacostej'>
84
+ <img src='https://github.com/lacostej.png' width='140px;'>
85
85
  </a>
86
- <h4 align='center'><a href='https://twitter.com/rogerluan_'>Roger Oba</a></h4>
86
+ <h4 align='center'><a href='https://twitter.com/lacostej'>Jérôme Lacoste</a></h4>
87
87
  </td>
88
- <td id='olivier-halligon'>
89
- <a href='https://github.com/AliSoftware'>
90
- <img src='https://github.com/AliSoftware.png' width='140px;'>
88
+ <td id='fumiya-nakamura'>
89
+ <a href='https://github.com/nafu'>
90
+ <img src='https://github.com/nafu.png' width='140px;'>
91
91
  </a>
92
- <h4 align='center'><a href='https://twitter.com/aligatr'>Olivier Halligon</a></h4>
92
+ <h4 align='center'><a href='https://twitter.com/nafu003'>Fumiya Nakamura</a></h4>
93
93
  </td>
94
- <td id='manish-rathi'>
95
- <a href='https://github.com/crazymanish'>
96
- <img src='https://github.com/crazymanish.png' width='140px;'>
94
+ <td id='maksym-grebenets'>
95
+ <a href='https://github.com/mgrebenets'>
96
+ <img src='https://github.com/mgrebenets.png' width='140px;'>
97
97
  </a>
98
- <h4 align='center'><a href='https://twitter.com/iammanishrathi'>Manish Rathi</a></h4>
98
+ <h4 align='center'><a href='https://twitter.com/mgrebenets'>Maksym Grebenets</a></h4>
99
99
  </td>
100
100
  </tr>
101
101
  <tr>
102
- <td id='felix-krause'>
103
- <a href='https://github.com/KrauseFx'>
104
- <img src='https://github.com/KrauseFx.png' width='140px;'>
102
+ <td id='jimmy-dee'>
103
+ <a href='https://github.com/jdee'>
104
+ <img src='https://github.com/jdee.png' width='140px;'>
105
105
  </a>
106
- <h4 align='center'><a href='https://twitter.com/KrauseFx'>Felix Krause</a></h4>
106
+ <h4 align='center'>Jimmy Dee</h4>
107
+ </td>
108
+ <td id='manu-wallner'>
109
+ <a href='https://github.com/milch'>
110
+ <img src='https://github.com/milch.png' width='140px;'>
111
+ </a>
112
+ <h4 align='center'><a href='https://twitter.com/acrooow'>Manu Wallner</a></h4>
107
113
  </td>
108
114
  <td id='josh-holtz'>
109
115
  <a href='https://github.com/joshdholtz'>
@@ -111,95 +117,89 @@ If the above doesn't help, please [submit an issue](https://github.com/fastlane/
111
117
  </a>
112
118
  <h4 align='center'><a href='https://twitter.com/joshdholtz'>Josh Holtz</a></h4>
113
119
  </td>
114
- <td id='łukasz-grabowski'>
115
- <a href='https://github.com/lucgrabowski'>
116
- <img src='https://github.com/lucgrabowski.png' width='140px;'>
117
- </a>
118
- <h4 align='center'>Łukasz Grabowski</h4>
119
- </td>
120
- <td id='fumiya-nakamura'>
121
- <a href='https://github.com/nafu'>
122
- <img src='https://github.com/nafu.png' width='140px;'>
120
+ <td id='joshua-liebowitz'>
121
+ <a href='https://github.com/taquitos'>
122
+ <img src='https://github.com/taquitos.png' width='140px;'>
123
123
  </a>
124
- <h4 align='center'><a href='https://twitter.com/nafu003'>Fumiya Nakamura</a></h4>
124
+ <h4 align='center'><a href='https://twitter.com/taquitos'>Joshua Liebowitz</a></h4>
125
125
  </td>
126
- <td id='maksym-grebenets'>
127
- <a href='https://github.com/mgrebenets'>
128
- <img src='https://github.com/mgrebenets.png' width='140px;'>
126
+ <td id='jorge-revuelta-h'>
127
+ <a href='https://github.com/minuscorp'>
128
+ <img src='https://github.com/minuscorp.png' width='140px;'>
129
129
  </a>
130
- <h4 align='center'><a href='https://twitter.com/mgrebenets'>Maksym Grebenets</a></h4>
130
+ <h4 align='center'><a href='https://twitter.com/minuscorp'>Jorge Revuelta H</a></h4>
131
131
  </td>
132
132
  </tr>
133
133
  <tr>
134
- <td id='luka-mirosevic'>
135
- <a href='https://github.com/lmirosevic'>
136
- <img src='https://github.com/lmirosevic.png' width='140px;'>
137
- </a>
138
- <h4 align='center'><a href='https://twitter.com/lmirosevic'>Luka Mirosevic</a></h4>
139
- </td>
140
- <td id='jérôme-lacoste'>
141
- <a href='https://github.com/lacostej'>
142
- <img src='https://github.com/lacostej.png' width='140px;'>
134
+ <td id='jan-piotrowski'>
135
+ <a href='https://github.com/janpio'>
136
+ <img src='https://github.com/janpio.png' width='140px;'>
143
137
  </a>
144
- <h4 align='center'><a href='https://twitter.com/lacostej'>Jérôme Lacoste</a></h4>
138
+ <h4 align='center'><a href='https://twitter.com/Sujan'>Jan Piotrowski</a></h4>
145
139
  </td>
146
- <td id='andrew-mcburney'>
147
- <a href='https://github.com/armcburney'>
148
- <img src='https://github.com/armcburney.png' width='140px;'>
140
+ <td id='satoshi-namai'>
141
+ <a href='https://github.com/ainame'>
142
+ <img src='https://github.com/ainame.png' width='140px;'>
149
143
  </a>
150
- <h4 align='center'><a href='https://twitter.com/armcburney'>Andrew McBurney</a></h4>
144
+ <h4 align='center'><a href='https://twitter.com/ainame'>Satoshi Namai</a></h4>
151
145
  </td>
152
- <td id='stefan-natchev'>
153
- <a href='https://github.com/snatchev'>
154
- <img src='https://github.com/snatchev.png' width='140px;'>
146
+ <td id='helmut-januschka'>
147
+ <a href='https://github.com/hjanuschka'>
148
+ <img src='https://github.com/hjanuschka.png' width='140px;'>
155
149
  </a>
156
- <h4 align='center'><a href='https://twitter.com/snatchev'>Stefan Natchev</a></h4>
150
+ <h4 align='center'><a href='https://twitter.com/hjanuschka'>Helmut Januschka</a></h4>
157
151
  </td>
158
- <td id='manu-wallner'>
159
- <a href='https://github.com/milch'>
160
- <img src='https://github.com/milch.png' width='140px;'>
152
+ <td id='manish-rathi'>
153
+ <a href='https://github.com/crazymanish'>
154
+ <img src='https://github.com/crazymanish.png' width='140px;'>
161
155
  </a>
162
- <h4 align='center'><a href='https://twitter.com/acrooow'>Manu Wallner</a></h4>
156
+ <h4 align='center'><a href='https://twitter.com/iammanishrathi'>Manish Rathi</a></h4>
163
157
  </td>
164
- </tr>
165
- <tr>
166
158
  <td id='daniel-jankowski'>
167
159
  <a href='https://github.com/mollyIV'>
168
160
  <img src='https://github.com/mollyIV.png' width='140px;'>
169
161
  </a>
170
162
  <h4 align='center'><a href='https://twitter.com/mollyIV'>Daniel Jankowski</a></h4>
171
163
  </td>
172
- <td id='jorge-revuelta-h'>
173
- <a href='https://github.com/minuscorp'>
174
- <img src='https://github.com/minuscorp.png' width='140px;'>
164
+ </tr>
165
+ <tr>
166
+ <td id='aaron-brager'>
167
+ <a href='https://github.com/getaaron'>
168
+ <img src='https://github.com/getaaron.png' width='140px;'>
175
169
  </a>
176
- <h4 align='center'><a href='https://twitter.com/minuscorp'>Jorge Revuelta H</a></h4>
170
+ <h4 align='center'><a href='https://twitter.com/getaaron'>Aaron Brager</a></h4>
177
171
  </td>
178
- <td id='joshua-liebowitz'>
179
- <a href='https://github.com/taquitos'>
180
- <img src='https://github.com/taquitos.png' width='140px;'>
172
+ <td id='danielle-tomlinson'>
173
+ <a href='https://github.com/endocrimes'>
174
+ <img src='https://github.com/endocrimes.png' width='140px;'>
181
175
  </a>
182
- <h4 align='center'><a href='https://twitter.com/taquitos'>Joshua Liebowitz</a></h4>
176
+ <h4 align='center'><a href='https://twitter.com/endocrimes'>Danielle Tomlinson</a></h4>
183
177
  </td>
184
- <td id='jimmy-dee'>
185
- <a href='https://github.com/jdee'>
186
- <img src='https://github.com/jdee.png' width='140px;'>
178
+ <td id='roger-oba'>
179
+ <a href='https://github.com/rogerluan'>
180
+ <img src='https://github.com/rogerluan.png' width='140px;'>
187
181
  </a>
188
- <h4 align='center'>Jimmy Dee</h4>
182
+ <h4 align='center'><a href='https://twitter.com/rogerluan_'>Roger Oba</a></h4>
189
183
  </td>
190
- <td id='satoshi-namai'>
191
- <a href='https://github.com/ainame'>
192
- <img src='https://github.com/ainame.png' width='140px;'>
184
+ <td id='łukasz-grabowski'>
185
+ <a href='https://github.com/lucgrabowski'>
186
+ <img src='https://github.com/lucgrabowski.png' width='140px;'>
193
187
  </a>
194
- <h4 align='center'><a href='https://twitter.com/ainame'>Satoshi Namai</a></h4>
188
+ <h4 align='center'>Łukasz Grabowski</h4>
189
+ </td>
190
+ <td id='andrew-mcburney'>
191
+ <a href='https://github.com/armcburney'>
192
+ <img src='https://github.com/armcburney.png' width='140px;'>
193
+ </a>
194
+ <h4 align='center'><a href='https://twitter.com/armcburney'>Andrew McBurney</a></h4>
195
195
  </td>
196
196
  </tr>
197
197
  <tr>
198
- <td id='kohki-miki'>
199
- <a href='https://github.com/giginet'>
200
- <img src='https://github.com/giginet.png' width='140px;'>
198
+ <td id='max-ott'>
199
+ <a href='https://github.com/max-ott'>
200
+ <img src='https://github.com/max-ott.png' width='140px;'>
201
201
  </a>
202
- <h4 align='center'><a href='https://twitter.com/giginet'>Kohki Miki</a></h4>
202
+ <h4 align='center'><a href='https://twitter.com/ott_max'>Max Ott</a></h4>
203
203
  </td>
204
204
  </table>
205
205
 
@@ -1,3 +1,5 @@
1
+ require 'ostruct'
2
+
1
3
  module Fastlane
2
4
  class ErbTemplateHelper
3
5
  require "erb"
@@ -1,5 +1,5 @@
1
1
  module Fastlane
2
- VERSION = '2.223.1'.freeze
2
+ VERSION = '2.225.0'.freeze
3
3
  SUMMARY = "The easiest way to build and release mobile apps.".freeze
4
4
  DESCRIPTION = "The easiest way to automate beta deployments and releases for your iOS and Android apps".freeze
5
5
  MINIMUM_XCODE_RELEASE = "7.0".freeze
@@ -17,4 +17,4 @@ public class Deliverfile: DeliverfileProtocol {
17
17
  // during the `init` process, and you won't see this message
18
18
  }
19
19
 
20
- // Generated with fastlane 2.223.1
20
+ // Generated with fastlane 2.225.0
@@ -272,4 +272,4 @@ public extension DeliverfileProtocol {
272
272
 
273
273
  // Please don't remove the lines below
274
274
  // They are used to detect outdated files
275
- // FastlaneRunnerAPIVersion [0.9.129]
275
+ // FastlaneRunnerAPIVersion [0.9.131]
@@ -13861,4 +13861,4 @@ public let snapshotfile: Snapshotfile = .init()
13861
13861
 
13862
13862
  // Please don't remove the lines below
13863
13863
  // They are used to detect outdated files
13864
- // FastlaneRunnerAPIVersion [0.9.182]
13864
+ // FastlaneRunnerAPIVersion [0.9.184]
@@ -17,4 +17,4 @@ public class Gymfile: GymfileProtocol {
17
17
  // during the `init` process, and you won't see this message
18
18
  }
19
19
 
20
- // Generated with fastlane 2.223.1
20
+ // Generated with fastlane 2.225.0
@@ -212,4 +212,4 @@ public extension GymfileProtocol {
212
212
 
213
213
  // Please don't remove the lines below
214
214
  // They are used to detect outdated files
215
- // FastlaneRunnerAPIVersion [0.9.132]
215
+ // FastlaneRunnerAPIVersion [0.9.134]
@@ -40,7 +40,11 @@ open class LaneFile: NSObject, LaneFileProtocol {
40
40
  return String(laneName.prefix(laneName.count - 12))
41
41
  }
42
42
 
43
- public func onError(currentLane: String, errorInfo _: String, errorClass _: String?, errorMessage _: String?) {
43
+ open func beforeAll(with _: String) {}
44
+
45
+ open func afterAll(with _: String) {}
46
+
47
+ open func onError(currentLane: String, errorInfo _: String, errorClass _: String?, errorMessage _: String?) {
44
48
  LaneFile.onErrorCalled.insert(currentLane)
45
49
  }
46
50
 
@@ -17,4 +17,4 @@ public class Matchfile: MatchfileProtocol {
17
17
  // during the `init` process, and you won't see this message
18
18
  }
19
19
 
20
- // Generated with fastlane 2.223.1
20
+ // Generated with fastlane 2.225.0
@@ -232,4 +232,4 @@ public extension MatchfileProtocol {
232
232
 
233
233
  // Please don't remove the lines below
234
234
  // They are used to detect outdated files
235
- // FastlaneRunnerAPIVersion [0.9.126]
235
+ // FastlaneRunnerAPIVersion [0.9.128]
@@ -17,4 +17,4 @@ public class Precheckfile: PrecheckfileProtocol {
17
17
  // during the `init` process, and you won't see this message
18
18
  }
19
19
 
20
- // Generated with fastlane 2.223.1
20
+ // Generated with fastlane 2.225.0
@@ -52,4 +52,4 @@ public extension PrecheckfileProtocol {
52
52
 
53
53
  // Please don't remove the lines below
54
54
  // They are used to detect outdated files
55
- // FastlaneRunnerAPIVersion [0.9.125]
55
+ // FastlaneRunnerAPIVersion [0.9.127]
@@ -17,4 +17,4 @@ public class Scanfile: ScanfileProtocol {
17
17
  // during the `init` process, and you won't see this message
18
18
  }
19
19
 
20
- // Generated with fastlane 2.223.1
20
+ // Generated with fastlane 2.225.0
@@ -324,4 +324,4 @@ public extension ScanfileProtocol {
324
324
 
325
325
  // Please don't remove the lines below
326
326
  // They are used to detect outdated files
327
- // FastlaneRunnerAPIVersion [0.9.137]
327
+ // FastlaneRunnerAPIVersion [0.9.139]
@@ -17,4 +17,4 @@ public class Screengrabfile: ScreengrabfileProtocol {
17
17
  // during the `init` process, and you won't see this message
18
18
  }
19
19
 
20
- // Generated with fastlane 2.223.1
20
+ // Generated with fastlane 2.225.0
@@ -96,4 +96,4 @@ public extension ScreengrabfileProtocol {
96
96
 
97
97
  // Please don't remove the lines below
98
98
  // They are used to detect outdated files
99
- // FastlaneRunnerAPIVersion [0.9.127]
99
+ // FastlaneRunnerAPIVersion [0.9.129]
@@ -17,4 +17,4 @@ public class Snapshotfile: SnapshotfileProtocol {
17
17
  // during the `init` process, and you won't see this message
18
18
  }
19
19
 
20
- // Generated with fastlane 2.223.1
20
+ // Generated with fastlane 2.225.0
@@ -208,4 +208,4 @@ public extension SnapshotfileProtocol {
208
208
 
209
209
  // Please don't remove the lines below
210
210
  // They are used to detect outdated files
211
- // FastlaneRunnerAPIVersion [0.9.121]
211
+ // FastlaneRunnerAPIVersion [0.9.123]
@@ -2,50 +2,40 @@
2
2
  "entries": {
3
3
  "brew": {
4
4
  "swiftformat": {
5
- "version": "0.54.5",
5
+ "version": "0.54.6",
6
6
  "bottle": {
7
7
  "rebuild": 0,
8
8
  "root_url": "https://ghcr.io/v2/homebrew/core",
9
9
  "files": {
10
10
  "arm64_sequoia": {
11
11
  "cellar": ":any_skip_relocation",
12
- "url": "https://ghcr.io/v2/homebrew/core/swiftformat/blobs/sha256:3fc57cb9abcbfd64106a3b16f51c8851c9877327553ec5fd9b21683d42b3c18d",
13
- "sha256": "3fc57cb9abcbfd64106a3b16f51c8851c9877327553ec5fd9b21683d42b3c18d"
12
+ "url": "https://ghcr.io/v2/homebrew/core/swiftformat/blobs/sha256:fda0a46091e8c4a1a913e08e29a92159ed747d83403508e0b5408e88e68cdf0c",
13
+ "sha256": "fda0a46091e8c4a1a913e08e29a92159ed747d83403508e0b5408e88e68cdf0c"
14
14
  },
15
15
  "arm64_sonoma": {
16
16
  "cellar": ":any_skip_relocation",
17
- "url": "https://ghcr.io/v2/homebrew/core/swiftformat/blobs/sha256:4d1f7565498827bbc53230f01c2fca4a7d082f4ae16d32ae568ba633c090c6ee",
18
- "sha256": "4d1f7565498827bbc53230f01c2fca4a7d082f4ae16d32ae568ba633c090c6ee"
17
+ "url": "https://ghcr.io/v2/homebrew/core/swiftformat/blobs/sha256:2c937e3425e9b44a73eb5ae4a83604b4476f901866014c01c1ebd3f3a8d9c198",
18
+ "sha256": "2c937e3425e9b44a73eb5ae4a83604b4476f901866014c01c1ebd3f3a8d9c198"
19
19
  },
20
20
  "arm64_ventura": {
21
21
  "cellar": ":any_skip_relocation",
22
- "url": "https://ghcr.io/v2/homebrew/core/swiftformat/blobs/sha256:416b54dc7938754980f9b2d732254ce7a36c401c2df3b68eba47f54db9bb956c",
23
- "sha256": "416b54dc7938754980f9b2d732254ce7a36c401c2df3b68eba47f54db9bb956c"
24
- },
25
- "arm64_monterey": {
26
- "cellar": ":any_skip_relocation",
27
- "url": "https://ghcr.io/v2/homebrew/core/swiftformat/blobs/sha256:3b14b0bacb0938c650e2d0d30d1f546ea7bac4feac510be16f09a89abd9f95d4",
28
- "sha256": "3b14b0bacb0938c650e2d0d30d1f546ea7bac4feac510be16f09a89abd9f95d4"
22
+ "url": "https://ghcr.io/v2/homebrew/core/swiftformat/blobs/sha256:d68be9490bce8cb196933f1f421f791b0b9758a759956edfaf166f88dfca78e1",
23
+ "sha256": "d68be9490bce8cb196933f1f421f791b0b9758a759956edfaf166f88dfca78e1"
29
24
  },
30
25
  "sonoma": {
31
26
  "cellar": ":any_skip_relocation",
32
- "url": "https://ghcr.io/v2/homebrew/core/swiftformat/blobs/sha256:445a0e38bda1f1dbda7c34dbb75a1b4432c5f0de7f9fa8bd4e03a9220b9bda19",
33
- "sha256": "445a0e38bda1f1dbda7c34dbb75a1b4432c5f0de7f9fa8bd4e03a9220b9bda19"
27
+ "url": "https://ghcr.io/v2/homebrew/core/swiftformat/blobs/sha256:784d61fca33bdbbdf96f8f23db2a0ea849ef62cb251eedfe83863869db84359b",
28
+ "sha256": "784d61fca33bdbbdf96f8f23db2a0ea849ef62cb251eedfe83863869db84359b"
34
29
  },
35
30
  "ventura": {
36
31
  "cellar": ":any_skip_relocation",
37
- "url": "https://ghcr.io/v2/homebrew/core/swiftformat/blobs/sha256:508b2e8000078773c7884e17b8d1ca711f4313ba14ff0000f7a28af68b02e71a",
38
- "sha256": "508b2e8000078773c7884e17b8d1ca711f4313ba14ff0000f7a28af68b02e71a"
39
- },
40
- "monterey": {
41
- "cellar": ":any_skip_relocation",
42
- "url": "https://ghcr.io/v2/homebrew/core/swiftformat/blobs/sha256:8c367a76ca05ba07ffc38a6bb2f5ee0231d363655ed982284afcb4d685fa524e",
43
- "sha256": "8c367a76ca05ba07ffc38a6bb2f5ee0231d363655ed982284afcb4d685fa524e"
32
+ "url": "https://ghcr.io/v2/homebrew/core/swiftformat/blobs/sha256:7845bd9bf8f0f94980f38d0ac322a5ee41bde07d18ec0c93a343c4aa7d2606fe",
33
+ "sha256": "7845bd9bf8f0f94980f38d0ac322a5ee41bde07d18ec0c93a343c4aa7d2606fe"
44
34
  },
45
35
  "x86_64_linux": {
46
36
  "cellar": "/home/linuxbrew/.linuxbrew/Cellar",
47
- "url": "https://ghcr.io/v2/homebrew/core/swiftformat/blobs/sha256:8e8abc969e1b10e7411a92717703c8cd944c7a3f3fd04e2d232918971ae14662",
48
- "sha256": "8e8abc969e1b10e7411a92717703c8cd944c7a3f3fd04e2d232918971ae14662"
37
+ "url": "https://ghcr.io/v2/homebrew/core/swiftformat/blobs/sha256:14756d1f83aedf183be980541393c3e4d9cfa47dee3dbfdb665a3461f5045e13",
38
+ "sha256": "14756d1f83aedf183be980541393c3e4d9cfa47dee3dbfdb665a3461f5045e13"
49
39
  }
50
40
  }
51
41
  }
@@ -87,12 +77,12 @@
87
77
  "macOS": "13.6"
88
78
  },
89
79
  "sonoma": {
90
- "HOMEBREW_VERSION": "4.3.24",
80
+ "HOMEBREW_VERSION": "4.4.1",
91
81
  "HOMEBREW_PREFIX": "/opt/homebrew",
92
82
  "Homebrew/homebrew-core": "api",
93
83
  "CLT": "16.0.0.0.1.1724870825",
94
84
  "Xcode": "15.4",
95
- "macOS": "14.6.1"
85
+ "macOS": "14.7"
96
86
  }
97
87
  }
98
88
  }
@@ -101,8 +101,11 @@ module Match
101
101
  # No existing working directory, creating a new one now
102
102
  self.working_directory = Dir.mktmpdir
103
103
 
104
- s3_client.find_bucket!(s3_bucket).objects(prefix: s3_object_prefix).each do |object|
104
+ # If team_id is defined, use `:team/` as a prefix (appending it at the end of the `s3_object_prefix` if one provided by the user),
105
+ # so that we limit the download to only files that are specific to this team, and avoid downloads + decryption of unnecessary files.
106
+ key_prefix = team_id.nil? ? s3_object_prefix : File.join(s3_object_prefix, team_id, '').delete_prefix('/')
105
107
 
108
+ s3_client.find_bucket!(s3_bucket).objects(prefix: key_prefix).each do |object|
106
109
  # Prevent download if the file path is a directory.
107
110
  # We need to check if string ends with "/" instead of using `File.directory?` because
108
111
  # the string represent a remote location, not a local file in disk.
@@ -181,7 +184,7 @@ module Match
181
184
  end
182
185
 
183
186
  def strip_s3_object_prefix(object_path)
184
- object_path.gsub(/^#{s3_object_prefix}/, "")
187
+ object_path.delete_prefix(s3_object_prefix.to_s).delete_prefix('/')
185
188
  end
186
189
 
187
190
  def sanitize_file_name(file_name)
@@ -450,6 +450,94 @@ module Spaceship
450
450
  return false
451
451
  end
452
452
 
453
+ def do_sirp(user, password, modified_cookie)
454
+ require 'fastlane-sirp'
455
+ require 'base64'
456
+
457
+ client = SIRP::Client.new(2048)
458
+ a = client.start_authentication
459
+
460
+ data = {
461
+ a: Base64.strict_encode64(to_byte(a)),
462
+ accountName: user,
463
+ protocols: ['s2k', 's2k_fo']
464
+ }
465
+
466
+ response = request(:post) do |req|
467
+ req.url("https://idmsa.apple.com/appleauth/auth/signin/init")
468
+ req.body = data.to_json
469
+ req.headers['Content-Type'] = 'application/json'
470
+ req.headers['X-Requested-With'] = 'XMLHttpRequest'
471
+ req.headers['X-Apple-Widget-Key'] = self.itc_service_key
472
+ req.headers['Accept'] = 'application/json, text/javascript'
473
+ req.headers["Cookie"] = modified_cookie if modified_cookie
474
+ end
475
+
476
+ puts("Received SIRP signin init response: #{response.body}") if Spaceship::Globals.verbose?
477
+
478
+ body = response.body
479
+ iterations = body["iteration"]
480
+ salt = Base64.strict_decode64(body["salt"])
481
+ b = Base64.strict_decode64(body["b"])
482
+ c = body["c"]
483
+
484
+ key_length = 32
485
+ encrypted_password = pbkdf2(password, salt, iterations, key_length)
486
+
487
+ m1 = client.process_challenge(
488
+ user,
489
+ to_hex(encrypted_password),
490
+ to_hex(salt),
491
+ to_hex(b),
492
+ is_password_encrypted: true
493
+ )
494
+ m2 = client.H_AMK
495
+
496
+ if m1 == false
497
+ puts("Error processing SIRP challenge") if Spaceship::Globals.verbose?
498
+ raise SIRPAuthenticationError
499
+ end
500
+
501
+ data = {
502
+ accountName: user,
503
+ c: c,
504
+ m1: Base64.encode64(to_byte(m1)).strip,
505
+ m2: Base64.encode64(to_byte(m2)).strip,
506
+ rememberMe: false
507
+ }
508
+
509
+ hashcash = self.fetch_hashcash
510
+
511
+ response = request(:post) do |req|
512
+ req.url("https://idmsa.apple.com/appleauth/auth/signin/complete?isRememberMeEnabled=false")
513
+ req.body = data.to_json
514
+ req.headers['Content-Type'] = 'application/json'
515
+ req.headers['X-Requested-With'] = 'XMLHttpRequest'
516
+ req.headers['X-Apple-Widget-Key'] = self.itc_service_key
517
+ req.headers['Accept'] = 'application/json, text/javascript'
518
+ req.headers["Cookie"] = modified_cookie if modified_cookie
519
+ req.headers["X-Apple-HC"] = hashcash if hashcash
520
+ end
521
+
522
+ puts("Completed SIRP authentication with status of #{response.status}") if Spaceship::Globals.verbose?
523
+
524
+ return response
525
+ end
526
+
527
+ def pbkdf2(password, salt, iterations, key_length, digest = OpenSSL::Digest::SHA256.new)
528
+ require 'openssl'
529
+ password = OpenSSL::Digest::SHA256.digest(password)
530
+ OpenSSL::PKCS5.pbkdf2_hmac(password, salt, iterations, key_length, digest)
531
+ end
532
+
533
+ def to_hex(str)
534
+ str.unpack1('H*')
535
+ end
536
+
537
+ def to_byte(str)
538
+ [str].pack('H*')
539
+ end
540
+
453
541
  # This method is used for both the Apple Dev Portal and App Store Connect
454
542
  # This will also handle 2 step verification and 2 factor authentication
455
543
  #
@@ -465,12 +553,6 @@ module Spaceship
465
553
  # If the session is valid no need to attempt to generate a new one.
466
554
  return true if has_valid_session
467
555
 
468
- data = {
469
- accountName: user,
470
- password: password,
471
- rememberMe: true
472
- }
473
-
474
556
  begin
475
557
  # The below workaround is only needed for 2 step verified machines
476
558
  # Due to escaping of cookie values we have a little workaround here
@@ -491,22 +573,7 @@ module Spaceship
491
573
  modified_cookie.gsub!(unescaped_important_cookie, escaped_important_cookie)
492
574
  end
493
575
 
494
- # Fixes issue https://github.com/fastlane/fastlane/issues/21071
495
- # On 2023-02-23, Apple added a custom implementation
496
- # of hashcash to their auth flow
497
- # hashcash = nil
498
- hashcash = self.fetch_hashcash
499
-
500
- response = request(:post) do |req|
501
- req.url("https://idmsa.apple.com/appleauth/auth/signin")
502
- req.body = data.to_json
503
- req.headers['Content-Type'] = 'application/json'
504
- req.headers['X-Requested-With'] = 'XMLHttpRequest'
505
- req.headers['X-Apple-Widget-Key'] = self.itc_service_key
506
- req.headers['Accept'] = 'application/json, text/javascript'
507
- req.headers["Cookie"] = modified_cookie if modified_cookie
508
- req.headers["X-Apple-HC"] = hashcash if hashcash
509
- end
576
+ response = perform_login_method(user, password, modified_cookie)
510
577
  rescue UnauthorizedAccessError
511
578
  raise InvalidUserCredentialsError.new, "Invalid username and password combination. Used '#{user}' as the username."
512
579
  end
@@ -552,6 +619,40 @@ module Spaceship
552
619
  end
553
620
  # rubocop:enable Metrics/PerceivedComplexity
554
621
 
622
+ def perform_login_method(user, password, modified_cookie)
623
+ do_legacy_signin = ENV['FASTLANE_USE_LEGACY_PRE_SIRP_AUTH']
624
+ if do_legacy_signin
625
+ puts("Starting legacy Apple ID login") if Spaceship::Globals.verbose?
626
+
627
+ # Fixes issue https://github.com/fastlane/fastlane/issues/21071
628
+ # On 2023-02-23, Apple added a custom implementation
629
+ # of hashcash to their auth flow
630
+ # hashcash = nil
631
+ hashcash = self.fetch_hashcash
632
+
633
+ data = {
634
+ accountName: user,
635
+ password: password,
636
+ rememberMe: true
637
+ }
638
+
639
+ return request(:post) do |req|
640
+ req.url("https://idmsa.apple.com/appleauth/auth/signin")
641
+ req.body = data.to_json
642
+ req.headers['Content-Type'] = 'application/json'
643
+ req.headers['X-Requested-With'] = 'XMLHttpRequest'
644
+ req.headers['X-Apple-Widget-Key'] = self.itc_service_key
645
+ req.headers['Accept'] = 'application/json, text/javascript'
646
+ req.headers["Cookie"] = modified_cookie if modified_cookie
647
+ req.headers["X-Apple-HC"] = hashcash if hashcash
648
+ end
649
+ else
650
+ # Fixes issue https://github.com/fastlane/fastlane/issues/26368#issuecomment-2424190032
651
+ puts("Starting SIRP Apple ID login") if Spaceship::Globals.verbose?
652
+ return do_sirp(user, password, modified_cookie)
653
+ end
654
+ end
655
+
555
656
  def fetch_hashcash
556
657
  response = request(:get, "https://idmsa.apple.com/appleauth/auth/signin?widgetKey=#{self.itc_service_key}")
557
658
  headers = response.headers
@@ -69,7 +69,7 @@ module Spaceship
69
69
  # Forwarding to class level if using web session.
70
70
  def hostname
71
71
  if @token
72
- return "https://api.appstoreconnect.apple.com/"
72
+ return @token.in_house ? "https://api.enterprise.developer.apple.com/" : "https://api.appstoreconnect.apple.com/"
73
73
  end
74
74
  return self.class.hostname
75
75
  end
@@ -29,6 +29,7 @@ module Spaceship
29
29
  attr_accessor :in_house
30
30
 
31
31
  def self.from(hash: nil, filepath: nil)
32
+ # FIXME: Ensure `in_house` value is a boolean.
32
33
  api_token ||= self.create(**hash.transform_keys(&:to_sym)) if hash
33
34
  api_token ||= self.from_json_file(filepath) if filepath
34
35
  return api_token
@@ -101,7 +102,7 @@ module Spaceship
101
102
  # Reduce the issued-at-time in case our time is slighly ahead of Apple's servers, which causes the token to be rejected.
102
103
  iat: now.to_i - 60,
103
104
  exp: @expiration.to_i,
104
- aud: 'appstoreconnect-v1'
105
+ aud: @in_house ? 'apple-developer-enterprise-v1' : 'appstoreconnect-v1'
105
106
  }
106
107
  if issuer_id
107
108
  payload[:iss] = issuer_id
@@ -43,6 +43,21 @@ module Spaceship
43
43
  end
44
44
  end
45
45
 
46
+ # User doesn't have enough permission for given action
47
+ class SIRPAuthenticationError < BasicPreferredInfoError
48
+ TITLE = 'Authentication issue validating secrets:'.freeze
49
+
50
+ def preferred_error_info
51
+ message ? [TITLE, message] : nil
52
+ end
53
+
54
+ # We don't want to show similar GitHub issues, as the error message
55
+ # should be pretty clear
56
+ def show_github_issues
57
+ false
58
+ end
59
+ end
60
+
46
61
  # Raised when 429 is received from App Store Connect
47
62
  class TooManyRequestsError < BasicPreferredInfoError
48
63
  attr_reader :retry_after
@@ -18,6 +18,7 @@ module Spaceship
18
18
  @services ||= [
19
19
  ServiceOption.new("App Store Connect API (official)", "api.appstoreconnect.apple.com", "JWT"),
20
20
  ServiceOption.new("App Store Connect API (web session)", Spaceship::ConnectAPI::TestFlight::Client.hostname.gsub("https://", ""), "Web session"),
21
+ ServiceOption.new("Enterprise Program API (official)", "api.enterprise.developer.apple.com", "JWT"),
21
22
  ServiceOption.new("Legacy iTunesConnect Auth", "idmsa.apple.com", "Web session"),
22
23
  ServiceOption.new("Legacy iTunesConnect Auth", "appstoreconnect.apple.com/olympus/v1/", "Web session"),
23
24
  ServiceOption.new("Legacy iTunesConnect", Spaceship::TunesClient.hostname.gsub("https://", ""), "Web session"),
metadata CHANGED
@@ -1,39 +1,39 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fastlane
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.223.1
4
+ version: 2.225.0
5
5
  platform: ruby
6
6
  authors:
7
+ - Andrew McBurney
8
+ - Łukasz Grabowski
9
+ - Jimmy Dee
10
+ - Manish Rathi
11
+ - Aaron Brager
7
12
  - Satoshi Namai
8
- - Manu Wallner
13
+ - Danielle Tomlinson
14
+ - Jérôme Lacoste
15
+ - Jorge Revuelta H
16
+ - Helmut Januschka
17
+ - Joshua Liebowitz
9
18
  - Felix Krause
10
- - Kohki Miki
19
+ - Stefan Natchev
20
+ - Iulian Onofrei
21
+ - Roger Oba
22
+ - Manu Wallner
11
23
  - Max Ott
12
- - Jorge Revuelta H
13
- - Jérôme Lacoste
14
- - Aaron Brager
15
24
  - Olivier Halligon
16
- - Jimmy Dee
17
- - Manish Rathi
18
- - Iulian Onofrei
19
- - Stefan Natchev
20
25
  - Maksym Grebenets
21
- - Roger Oba
22
26
  - Fumiya Nakamura
23
- - Matthew Ellis
24
- - Łukasz Grabowski
25
- - Danielle Tomlinson
26
- - Josh Holtz
27
- - Daniel Jankowski
28
- - Andrew McBurney
29
- - Joshua Liebowitz
30
27
  - Jan Piotrowski
31
- - Helmut Januschka
32
28
  - Luka Mirosevic
29
+ - Josh Holtz
30
+ - Kohki Miki
31
+ - Matthew Ellis
32
+ - Daniel Jankowski
33
33
  autorequire:
34
34
  bindir: bin
35
35
  cert_chain: []
36
- date: 2024-09-27 00:00:00.000000000 Z
36
+ date: 2024-10-21 00:00:00.000000000 Z
37
37
  dependencies:
38
38
  - !ruby/object:Gem::Dependency
39
39
  name: addressable
@@ -293,6 +293,20 @@ dependencies:
293
293
  - - "<"
294
294
  - !ruby/object:Gem::Version
295
295
  version: 3.0.0
296
+ - !ruby/object:Gem::Dependency
297
+ name: fastlane-sirp
298
+ requirement: !ruby/object:Gem::Requirement
299
+ requirements:
300
+ - - ">="
301
+ - !ruby/object:Gem::Version
302
+ version: 1.0.0
303
+ type: :runtime
304
+ prerelease: false
305
+ version_requirements: !ruby/object:Gem::Requirement
306
+ requirements:
307
+ - - ">="
308
+ - !ruby/object:Gem::Version
309
+ version: 1.0.0
296
310
  - !ruby/object:Gem::Dependency
297
311
  name: gh_inspector
298
312
  requirement: !ruby/object:Gem::Requirement