fastlane 2.223.1 → 2.225.0

Sign up to get free protection for your applications and to get access to all the features.
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