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 +4 -4
- data/README.md +98 -98
- data/fastlane/lib/fastlane/erb_template_helper.rb +2 -0
- data/fastlane/lib/fastlane/version.rb +1 -1
- data/fastlane/swift/Deliverfile.swift +1 -1
- data/fastlane/swift/DeliverfileProtocol.swift +1 -1
- data/fastlane/swift/Fastlane.swift +1 -1
- data/fastlane/swift/Gymfile.swift +1 -1
- data/fastlane/swift/GymfileProtocol.swift +1 -1
- data/fastlane/swift/LaneFileProtocol.swift +5 -1
- data/fastlane/swift/Matchfile.swift +1 -1
- data/fastlane/swift/MatchfileProtocol.swift +1 -1
- data/fastlane/swift/Precheckfile.swift +1 -1
- data/fastlane/swift/PrecheckfileProtocol.swift +1 -1
- data/fastlane/swift/Scanfile.swift +1 -1
- data/fastlane/swift/ScanfileProtocol.swift +1 -1
- data/fastlane/swift/Screengrabfile.swift +1 -1
- data/fastlane/swift/ScreengrabfileProtocol.swift +1 -1
- data/fastlane/swift/Snapshotfile.swift +1 -1
- data/fastlane/swift/SnapshotfileProtocol.swift +1 -1
- data/fastlane/swift/formatting/Brewfile.lock.json +15 -25
- data/match/lib/match/storage/s3_storage.rb +5 -2
- data/spaceship/lib/spaceship/client.rb +123 -22
- data/spaceship/lib/spaceship/connect_api/api_client.rb +1 -1
- data/spaceship/lib/spaceship/connect_api/token.rb +2 -1
- data/spaceship/lib/spaceship/errors.rb +15 -0
- data/spaceship/lib/spaceship/stats_middleware.rb +1 -0
- metadata +34 -20
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a1e77f8938ff5841875b3034ae791bdb74735771a039be4e5da709c92b49268b
|
4
|
+
data.tar.gz: 5aebfce31f8424bd6012576c361269061b0aece5040af945ef29849fcb233cd3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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='
|
39
|
-
<a href='https://github.com/
|
40
|
-
<img src='https://github.com/
|
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/
|
42
|
+
<h4 align='center'><a href='https://twitter.com/aligatr'>Olivier Halligon</a></h4>
|
43
43
|
</td>
|
44
|
-
<td id='
|
45
|
-
<a href='https://github.com/
|
46
|
-
<img src='https://github.com/
|
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/
|
48
|
+
<h4 align='center'><a href='https://twitter.com/snatchev'>Stefan Natchev</a></h4>
|
49
49
|
</td>
|
50
|
-
<td id='
|
51
|
-
<a href='https://github.com/
|
52
|
-
<img src='https://github.com/
|
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/
|
54
|
+
<h4 align='center'><a href='https://twitter.com/KrauseFx'>Felix Krause</a></h4>
|
55
55
|
</td>
|
56
|
-
<td id='
|
57
|
-
<a href='https://github.com/
|
58
|
-
<img src='https://github.com/
|
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/
|
60
|
+
<h4 align='center'><a href='https://twitter.com/giginet'>Kohki Miki</a></h4>
|
61
61
|
</td>
|
62
|
-
<td id='
|
63
|
-
<a href='https://github.com/
|
64
|
-
<img src='https://github.com/
|
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/
|
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='
|
77
|
-
<a href='https://github.com/
|
78
|
-
<img src='https://github.com/
|
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/
|
80
|
+
<h4 align='center'><a href='https://twitter.com/Revolt666'>Iulian Onofrei</a></h4>
|
81
81
|
</td>
|
82
|
-
<td id='
|
83
|
-
<a href='https://github.com/
|
84
|
-
<img src='https://github.com/
|
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/
|
86
|
+
<h4 align='center'><a href='https://twitter.com/lacostej'>Jérôme Lacoste</a></h4>
|
87
87
|
</td>
|
88
|
-
<td id='
|
89
|
-
<a href='https://github.com/
|
90
|
-
<img src='https://github.com/
|
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/
|
92
|
+
<h4 align='center'><a href='https://twitter.com/nafu003'>Fumiya Nakamura</a></h4>
|
93
93
|
</td>
|
94
|
-
<td id='
|
95
|
-
<a href='https://github.com/
|
96
|
-
<img src='https://github.com/
|
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/
|
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='
|
103
|
-
<a href='https://github.com/
|
104
|
-
<img src='https://github.com/
|
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'
|
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='
|
115
|
-
<a href='https://github.com/
|
116
|
-
<img src='https://github.com/
|
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/
|
124
|
+
<h4 align='center'><a href='https://twitter.com/taquitos'>Joshua Liebowitz</a></h4>
|
125
125
|
</td>
|
126
|
-
<td id='
|
127
|
-
<a href='https://github.com/
|
128
|
-
<img src='https://github.com/
|
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/
|
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='
|
135
|
-
<a href='https://github.com/
|
136
|
-
<img src='https://github.com/
|
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/
|
138
|
+
<h4 align='center'><a href='https://twitter.com/Sujan'>Jan Piotrowski</a></h4>
|
145
139
|
</td>
|
146
|
-
<td id='
|
147
|
-
<a href='https://github.com/
|
148
|
-
<img src='https://github.com/
|
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/
|
144
|
+
<h4 align='center'><a href='https://twitter.com/ainame'>Satoshi Namai</a></h4>
|
151
145
|
</td>
|
152
|
-
<td id='
|
153
|
-
<a href='https://github.com/
|
154
|
-
<img src='https://github.com/
|
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/
|
150
|
+
<h4 align='center'><a href='https://twitter.com/hjanuschka'>Helmut Januschka</a></h4>
|
157
151
|
</td>
|
158
|
-
<td id='
|
159
|
-
<a href='https://github.com/
|
160
|
-
<img src='https://github.com/
|
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/
|
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
|
-
|
173
|
-
<
|
174
|
-
<
|
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/
|
170
|
+
<h4 align='center'><a href='https://twitter.com/getaaron'>Aaron Brager</a></h4>
|
177
171
|
</td>
|
178
|
-
<td id='
|
179
|
-
<a href='https://github.com/
|
180
|
-
<img src='https://github.com/
|
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/
|
176
|
+
<h4 align='center'><a href='https://twitter.com/endocrimes'>Danielle Tomlinson</a></h4>
|
183
177
|
</td>
|
184
|
-
<td id='
|
185
|
-
<a href='https://github.com/
|
186
|
-
<img src='https://github.com/
|
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'>
|
182
|
+
<h4 align='center'><a href='https://twitter.com/rogerluan_'>Roger Oba</a></h4>
|
189
183
|
</td>
|
190
|
-
<td id='
|
191
|
-
<a href='https://github.com/
|
192
|
-
<img src='https://github.com/
|
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'
|
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='
|
199
|
-
<a href='https://github.com/
|
200
|
-
<img src='https://github.com/
|
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/
|
202
|
+
<h4 align='center'><a href='https://twitter.com/ott_max'>Max Ott</a></h4>
|
203
203
|
</td>
|
204
204
|
</table>
|
205
205
|
|
@@ -1,5 +1,5 @@
|
|
1
1
|
module Fastlane
|
2
|
-
VERSION = '2.
|
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
|
@@ -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.
|
13864
|
+
// FastlaneRunnerAPIVersion [0.9.184]
|
@@ -40,7 +40,11 @@ open class LaneFile: NSObject, LaneFileProtocol {
|
|
40
40
|
return String(laneName.prefix(laneName.count - 12))
|
41
41
|
}
|
42
42
|
|
43
|
-
|
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
|
|
@@ -2,50 +2,40 @@
|
|
2
2
|
"entries": {
|
3
3
|
"brew": {
|
4
4
|
"swiftformat": {
|
5
|
-
"version": "0.54.
|
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:
|
13
|
-
"sha256": "
|
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:
|
18
|
-
"sha256": "
|
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:
|
23
|
-
"sha256": "
|
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:
|
33
|
-
"sha256": "
|
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:
|
38
|
-
"sha256": "
|
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:
|
48
|
-
"sha256": "
|
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.
|
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.
|
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
|
-
|
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.
|
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
|
-
|
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.
|
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
|
-
-
|
13
|
+
- Danielle Tomlinson
|
14
|
+
- Jérôme Lacoste
|
15
|
+
- Jorge Revuelta H
|
16
|
+
- Helmut Januschka
|
17
|
+
- Joshua Liebowitz
|
9
18
|
- Felix Krause
|
10
|
-
-
|
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-
|
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
|