spaceship 0.15.1 → 0.15.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/spaceship/client.rb +5 -11
- data/lib/spaceship/portal/portal_client.rb +7 -3
- data/lib/spaceship/tunes/tunes_client.rb +48 -79
- data/lib/spaceship/version.rb +1 -1
- metadata +16 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0331855014bef933ae72ac1c53a5393245b03987
|
4
|
+
data.tar.gz: 469b03b9cefb35064f74904f2cf12911b3ba2851
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0ae10f270d59a7979d8e47f6ff1cd3aabbec0c5bcb69ed33c65028d6a306a9006a7feec83402dded431dd6fc35211539a4676c0f2d4d1a41fe300182a7424efe
|
7
|
+
data.tar.gz: d0c5bb81700c156275b7feda876628dfe66355b4a6e5e70233005d391cb4efcca7e9e39b8cfad3572910d8c4cefd93779e62fb467702b7c55eac5f297d5032b8
|
data/lib/spaceship/client.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
require 'faraday' # HTTP Client
|
2
2
|
require 'logger'
|
3
3
|
require 'faraday_middleware'
|
4
|
+
require 'faraday-cookie_jar'
|
4
5
|
require 'spaceship/ui'
|
5
6
|
require 'spaceship/helper/plist_middleware'
|
6
7
|
require 'spaceship/helper/net_http_generic_request'
|
@@ -14,9 +15,9 @@ end
|
|
14
15
|
module Spaceship
|
15
16
|
class Client
|
16
17
|
PROTOCOL_VERSION = "QH65B2"
|
18
|
+
USER_AGENT = "Spaceship #{Spaceship::VERSION}"
|
17
19
|
|
18
20
|
attr_reader :client
|
19
|
-
attr_accessor :cookie
|
20
21
|
|
21
22
|
# The user that is currently logged in
|
22
23
|
attr_accessor :user
|
@@ -67,6 +68,7 @@ module Spaceship
|
|
67
68
|
c.response :json, content_type: /\bjson$/
|
68
69
|
c.response :xml, content_type: /\bxml$/
|
69
70
|
c.response :plist, content_type: /\bplist$/
|
71
|
+
c.use :cookie_jar
|
70
72
|
c.adapter Faraday.default_adapter
|
71
73
|
|
72
74
|
if ENV['DEBUG']
|
@@ -169,11 +171,6 @@ module Spaceship
|
|
169
171
|
end
|
170
172
|
end
|
171
173
|
|
172
|
-
# @return (Bool) Do we have a valid session?
|
173
|
-
def session?
|
174
|
-
!!@cookie
|
175
|
-
end
|
176
|
-
|
177
174
|
def with_retry(tries = 5, &block)
|
178
175
|
return block.call
|
179
176
|
rescue Faraday::Error::TimeoutError, AppleTimeoutError => ex # New Faraday version: Faraday::TimeoutError => ex
|
@@ -204,11 +201,8 @@ module Spaceship
|
|
204
201
|
end
|
205
202
|
|
206
203
|
def request(method, url_or_path = nil, params = nil, headers = {}, &block)
|
207
|
-
|
208
|
-
|
209
|
-
headers.merge!(csrf_tokens)
|
210
|
-
end
|
211
|
-
headers.merge!({ 'User-Agent' => 'spaceship' })
|
204
|
+
headers.merge!(csrf_tokens)
|
205
|
+
headers.merge!({ 'User-Agent' => USER_AGENT })
|
212
206
|
|
213
207
|
# Before encoding the parameters, log them
|
214
208
|
log_request(method, url_or_path, params)
|
@@ -37,9 +37,11 @@ module Spaceship
|
|
37
37
|
appIdKey: api_key
|
38
38
|
})
|
39
39
|
|
40
|
-
|
41
|
-
|
42
|
-
return
|
40
|
+
case response.status
|
41
|
+
when 302
|
42
|
+
return response
|
43
|
+
when 200
|
44
|
+
raise InvalidUserCredentialsError.new, "Invalid username and password combination. Used '#{user}' as the username."
|
43
45
|
else
|
44
46
|
# Something went wrong. Was it invalid credentials or server issue
|
45
47
|
if (response.body || "").include?("Your Apple ID or password was entered incorrectly")
|
@@ -51,6 +53,8 @@ module Spaceship
|
|
51
53
|
info = [response.body, response['Set-Cookie']]
|
52
54
|
raise UnexpectedResponse.new, info.join("\n")
|
53
55
|
end
|
56
|
+
info = [response.body, response['Set-Cookie']]
|
57
|
+
raise UnexpectedResponse.new, info.join("\n")
|
54
58
|
end
|
55
59
|
end
|
56
60
|
|
@@ -56,24 +56,16 @@ module Spaceship
|
|
56
56
|
end
|
57
57
|
|
58
58
|
# Set a new team ID which will be used from now on
|
59
|
-
def team_id=(
|
60
|
-
|
59
|
+
def team_id=(team_id)
|
60
|
+
response = request(:post) do |req|
|
61
61
|
req.url "ra/v1/session/webSession"
|
62
|
-
req.body = { contentProviderId:
|
62
|
+
req.body = { contentProviderId: team_id }.to_json
|
63
63
|
req.headers['Content-Type'] = 'application/json'
|
64
64
|
end
|
65
65
|
|
66
|
-
|
67
|
-
raise "Looks like your Apple ID is not enabled for iTunes Connect, make sure to be able to login online"
|
68
|
-
end
|
69
|
-
|
70
|
-
itctx_regex = /itctx=([^;]*)/
|
71
|
-
new_itctx = r.headers['Set-Cookie'].match(itctx_regex).to_s
|
72
|
-
|
73
|
-
@cookie = @cookie.gsub(itctx_regex, new_itctx)
|
74
|
-
handle_itc_response(r.body)
|
66
|
+
handle_itc_response(response.body)
|
75
67
|
|
76
|
-
@current_team_id =
|
68
|
+
@current_team_id = team_id
|
77
69
|
end
|
78
70
|
|
79
71
|
# Shows a team selection for the user in the terminal. This should not be
|
@@ -120,32 +112,6 @@ module Spaceship
|
|
120
112
|
end
|
121
113
|
end
|
122
114
|
|
123
|
-
# returns wosinst, wosid and itctx
|
124
|
-
def login_overhead_cookies(myacinfo)
|
125
|
-
return @login_overhead_cookies if @login_overhead_cookies
|
126
|
-
|
127
|
-
response = request(:get, "route?noext") # for woinst and wosid
|
128
|
-
cookies = {
|
129
|
-
woinst: response['Set-Cookie'].match(/woinst=([^;]*)/)[1],
|
130
|
-
wosid: response['Set-Cookie'].match(/wosid=([^;]*)/)[1],
|
131
|
-
myacinfo: myacinfo
|
132
|
-
}
|
133
|
-
|
134
|
-
# The second request has to be after getting the woinst and wois
|
135
|
-
woa = request(:get) do |req|
|
136
|
-
req.url "https://itunesconnect.apple.com/WebObjects/iTunesConnect.woa"
|
137
|
-
req.headers["Cookie"] = cookies.collect { |k, v| "#{k}=#{v}; " }.join("")
|
138
|
-
end
|
139
|
-
|
140
|
-
unless woa['Set-Cookie'].include?("itctx")
|
141
|
-
raise "Looks like your Apple ID is not enabled for iTunes Connect, make sure to be able to login online"
|
142
|
-
end
|
143
|
-
|
144
|
-
cookies[:itctx] = woa['Set-Cookie'].match(/itctx=([^;]*)/)[1]
|
145
|
-
|
146
|
-
return @login_overhead_cookies ||= cookies
|
147
|
-
end
|
148
|
-
|
149
115
|
def service_key
|
150
116
|
return @service_key if @service_key
|
151
117
|
# We need a service key from a JS file to properly auth
|
@@ -164,31 +130,27 @@ module Spaceship
|
|
164
130
|
req.url "https://idmsa.apple.com/appleauth/auth/signin?widgetKey=#{service_key}"
|
165
131
|
req.body = data.to_json
|
166
132
|
req.headers['Content-Type'] = 'application/json'
|
133
|
+
req.headers['X-Requested-With'] = 'XMLHttpRequest'
|
134
|
+
req.headers['Accept'] = 'application/json, text/javascript'
|
167
135
|
end
|
168
136
|
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
# - woinst
|
173
|
-
# - wosid
|
174
|
-
# - itctx
|
175
|
-
begin
|
176
|
-
re = response['Set-Cookie']
|
177
|
-
myacinfo = re.match(/myacinfo=([^;]*)/)[1]
|
178
|
-
cookies = login_overhead_cookies(myacinfo)
|
179
|
-
|
180
|
-
@cookie = cookies.collect { |k, v| "#{k}=#{v}; " }.join("")
|
181
|
-
rescue
|
182
|
-
raise ITunesConnectError.new, [response.body, response['Set-Cookie']].join("\n")
|
183
|
-
end
|
137
|
+
# get woinst, wois, and itctx cookie values
|
138
|
+
request(:get, "https://itunesconnect.apple.com/WebObjects/iTunesConnect.woa/wa/route?noext")
|
139
|
+
request(:get, "https://itunesconnect.apple.com/WebObjects/iTunesConnect.woa")
|
184
140
|
|
185
|
-
|
141
|
+
case response.status
|
142
|
+
when 403, 401
|
143
|
+
raise InvalidUserCredentialsError.new, "Invalid username and password combination. Used '#{user}' as the username."
|
144
|
+
when 200
|
145
|
+
return response
|
186
146
|
else
|
187
147
|
if response["Location"] == "/auth" # redirect to 2 step auth page
|
188
148
|
raise "spaceship / fastlane doesn't support 2 step enabled accounts yet. Please temporary disable 2 step verification until spaceship was updated."
|
189
149
|
elsif (response.body || "").include?('invalid="true"')
|
190
150
|
# User Credentials are wrong
|
191
151
|
raise InvalidUserCredentialsError.new, "Invalid username and password combination. Used '#{user}' as the username."
|
152
|
+
elsif (response['Set-Cookie'] || "").include?("itctx")
|
153
|
+
raise "Looks like your Apple ID is not enabled for iTunes Connect, make sure to be able to login online"
|
192
154
|
else
|
193
155
|
info = [response.body, response['Set-Cookie']]
|
194
156
|
raise ITunesConnectError.new, info.join("\n")
|
@@ -598,11 +560,7 @@ module Spaceship
|
|
598
560
|
handle_itc_response(r.body)
|
599
561
|
end
|
600
562
|
|
601
|
-
def submit_testflight_build_for_review!(
|
602
|
-
app_id: nil,
|
603
|
-
train: nil,
|
604
|
-
build_number: nil,
|
605
|
-
|
563
|
+
def submit_testflight_build_for_review!(app_id: nil, train: nil, build_number: nil,
|
606
564
|
# Required Metadata:
|
607
565
|
changelog: nil,
|
608
566
|
description: nil,
|
@@ -620,14 +578,7 @@ module Spaceship
|
|
620
578
|
review_password: nil,
|
621
579
|
encryption: false)
|
622
580
|
|
623
|
-
|
624
|
-
r = request(:get) do |req|
|
625
|
-
req.url start_url
|
626
|
-
req.headers['Content-Type'] = 'application/json'
|
627
|
-
end
|
628
|
-
handle_itc_response(r.body)
|
629
|
-
|
630
|
-
build_info = r.body['data']
|
581
|
+
build_info = get_build_info_for_review(app_id: app_id, train: train, build_number: build_number)
|
631
582
|
# Now fill in the values provided by the user
|
632
583
|
|
633
584
|
# First the localised values:
|
@@ -648,27 +599,45 @@ module Spaceship
|
|
648
599
|
build_info['testInfo']['reviewPassword']['value'] = review_password
|
649
600
|
|
650
601
|
r = request(:post) do |req| # same URL, but a POST request
|
651
|
-
req.url
|
602
|
+
req.url "ra/apps/#{app_id}/trains/#{train}/builds/#{build_number}/submit/start"
|
603
|
+
|
652
604
|
req.body = build_info.to_json
|
653
605
|
req.headers['Content-Type'] = 'application/json'
|
654
606
|
end
|
655
607
|
handle_itc_response(r.body)
|
656
608
|
|
657
609
|
encryption_info = r.body['data']
|
658
|
-
|
659
|
-
|
610
|
+
update_encryption_compliance(app_id: app_id,
|
611
|
+
train: train,
|
612
|
+
build_number: build_number,
|
613
|
+
encryption_info: encryption_info,
|
614
|
+
encryption: encryption)
|
615
|
+
end
|
660
616
|
|
661
|
-
|
662
|
-
|
617
|
+
def get_build_info_for_review(app_id: nil, train: nil, build_number: nil)
|
618
|
+
r = request(:get) do |req|
|
619
|
+
req.url "ra/apps/#{app_id}/trains/#{train}/builds/#{build_number}/submit/start"
|
620
|
+
req.headers['Content-Type'] = 'application/json'
|
621
|
+
end
|
622
|
+
handle_itc_response(r.body)
|
663
623
|
|
664
|
-
|
665
|
-
|
666
|
-
|
667
|
-
|
668
|
-
|
624
|
+
r.body['data']
|
625
|
+
end
|
626
|
+
|
627
|
+
def update_encryption_compliance(app_id: nil, train: nil, build_number: nil, encryption_info: nil, encryption: nil)
|
628
|
+
return unless encryption_info['exportComplianceRequired']
|
629
|
+
# only sometimes this is required
|
630
|
+
|
631
|
+
encryption_info['usesEncryption']['value'] = encryption
|
632
|
+
encryption_info['encryptionUpdated']['value'] = encryption
|
669
633
|
|
670
|
-
|
634
|
+
r = request(:post) do |req|
|
635
|
+
req.url "ra/apps/#{app_id}/trains/#{train}/builds/#{build_number}/submit/complete"
|
636
|
+
req.body = encryption_info.to_json
|
637
|
+
req.headers['Content-Type'] = 'application/json'
|
671
638
|
end
|
639
|
+
|
640
|
+
handle_itc_response(r.body)
|
672
641
|
end
|
673
642
|
|
674
643
|
#####################################################
|
data/lib/spaceship/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: spaceship
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.15.
|
4
|
+
version: 0.15.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Felix Krause
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2015-12-
|
12
|
+
date: 2015-12-04 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: credentials_manager
|
@@ -81,6 +81,20 @@ dependencies:
|
|
81
81
|
- - "~>"
|
82
82
|
- !ruby/object:Gem::Version
|
83
83
|
version: '0.9'
|
84
|
+
- !ruby/object:Gem::Dependency
|
85
|
+
name: faraday-cookie_jar
|
86
|
+
requirement: !ruby/object:Gem::Requirement
|
87
|
+
requirements:
|
88
|
+
- - "~>"
|
89
|
+
- !ruby/object:Gem::Version
|
90
|
+
version: 0.0.6
|
91
|
+
type: :runtime
|
92
|
+
prerelease: false
|
93
|
+
version_requirements: !ruby/object:Gem::Requirement
|
94
|
+
requirements:
|
95
|
+
- - "~>"
|
96
|
+
- !ruby/object:Gem::Version
|
97
|
+
version: 0.0.6
|
84
98
|
- !ruby/object:Gem::Dependency
|
85
99
|
name: fastimage
|
86
100
|
requirement: !ruby/object:Gem::Requirement
|