spaceship 0.0.11 → 0.0.13
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 +4 -4
- data/README.md +4 -3
- data/lib/spaceship/app.rb +30 -1
- data/lib/spaceship/certificate.rb +20 -17
- data/lib/spaceship/client.rb +19 -11
- data/lib/spaceship/provisioning_profile.rb +2 -1
- data/lib/spaceship/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f295467cde461ab9cefe3b50cc952df41d5a0abc
|
4
|
+
data.tar.gz: ec652e7d8b65534e5d445dce8077a54c28346c20
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5a6af1ef32c660719ffe85ede0299f16eb1d9c5b2760d9404c4525c3ef6305078b6467156ec53f9965e3deafc833590c8456fddba301d4cc47fbbfcb0816dd89
|
7
|
+
data.tar.gz: d9c953aa6db8c66109405da514a2fe3187e73afda5867d2bc8ff4ee428de6ca7a337baa4adbbd073573dc66524ea1559625511ea21674884dd02a95456aca8b9
|
data/README.md
CHANGED
@@ -221,7 +221,8 @@ File.write("NewProfile.mobileprovision", profile.download)
|
|
221
221
|
```ruby
|
222
222
|
# Select all 'Invalid' or 'Expired' provisioning profiles
|
223
223
|
broken_profiles = Spaceship.provisioning_profile.all.find_all do |profile|
|
224
|
-
|
224
|
+
# the below could be replaced with `!profile.valid?`, which takes longer but also verifies the code signing identity
|
225
|
+
(profile.status == "Invalid" or profile.status == "Expired")
|
225
226
|
end
|
226
227
|
|
227
228
|
# Iterate over all broken profiles and repair them
|
@@ -229,8 +230,8 @@ broken_profiles.each do |profile|
|
|
229
230
|
profile.repair! # yes, that's all you need to repair a profile
|
230
231
|
end
|
231
232
|
|
232
|
-
# or to
|
233
|
-
Spaceship.provisioning_profile.all.find_all { |p|
|
233
|
+
# or to do the same thing, just more Ruby like
|
234
|
+
Spaceship.provisioning_profile.all.find_all { |p| !p.valid? }.map(&:repair!)
|
234
235
|
```
|
235
236
|
|
236
237
|
## Devices
|
data/lib/spaceship/app.rb
CHANGED
@@ -30,12 +30,27 @@ module Spaceship
|
|
30
30
|
# @return (Bool) Is this app a wildcard app (e.g. com.krausefx.*)
|
31
31
|
attr_accessor :is_wildcard
|
32
32
|
|
33
|
+
# @return (Hash) Feature details
|
34
|
+
attr_accessor :features
|
35
|
+
|
36
|
+
# @return (Array) List of enabled features
|
37
|
+
attr_accessor :enabled_features
|
38
|
+
|
33
39
|
# @return (Bool) Development Push Enabled?
|
34
40
|
attr_accessor :dev_push_enabled
|
35
41
|
|
36
42
|
# @return (Bool) Production Push Enabled?
|
37
43
|
attr_accessor :prod_push_enabled
|
38
44
|
|
45
|
+
# @return (Fixnum) Number of associated app groups
|
46
|
+
attr_accessor :app_groups_count
|
47
|
+
|
48
|
+
# @return (Fixnum) Number of associated cloud containers
|
49
|
+
attr_accessor :cloud_containers_count
|
50
|
+
|
51
|
+
# @return (Fixnum) Number of associated identifiers
|
52
|
+
attr_accessor :identifiers_count
|
53
|
+
|
39
54
|
attr_mapping(
|
40
55
|
'appIdId' => :app_id,
|
41
56
|
'name' => :name,
|
@@ -43,8 +58,14 @@ module Spaceship
|
|
43
58
|
'prefix' => :prefix,
|
44
59
|
'identifier' => :bundle_id,
|
45
60
|
'isWildCard' => :is_wildcard,
|
61
|
+
'features' => :features,
|
62
|
+
'enabledFeatures' => :enabled_features,
|
46
63
|
'isDevPushEnabled' => :dev_push_enabled,
|
47
|
-
'isProdPushEnabled' => :prod_push_enabled
|
64
|
+
'isProdPushEnabled' => :prod_push_enabled,
|
65
|
+
'associatedApplicationGroupsCount' => :app_groups_count,
|
66
|
+
'associatedCloudContainersCount' => :cloud_containers_count,
|
67
|
+
'associatedIdentifiersCount' => :identifiers_count
|
68
|
+
|
48
69
|
)
|
49
70
|
|
50
71
|
class << self
|
@@ -92,5 +113,13 @@ module Spaceship
|
|
92
113
|
client.delete_app!(app_id)
|
93
114
|
self
|
94
115
|
end
|
116
|
+
|
117
|
+
# Fetch a specific App ID details based on the bundle_id
|
118
|
+
# @return (App) The app you're looking for. This is nil if the app can't be found.
|
119
|
+
def details
|
120
|
+
app = client.details_for_app(self)
|
121
|
+
self.class.factory(app)
|
122
|
+
end
|
123
|
+
|
95
124
|
end
|
96
125
|
end
|
@@ -2,11 +2,11 @@ require 'openssl'
|
|
2
2
|
|
3
3
|
module Spaceship
|
4
4
|
# Represents a certificate from the Apple Developer Portal.
|
5
|
-
#
|
5
|
+
#
|
6
6
|
# This can either be a code signing identity or a push profile
|
7
7
|
class Certificate < Base
|
8
8
|
# @return (String) The ID given from the developer portal. You'll probably not need it.
|
9
|
-
# @example
|
9
|
+
# @example
|
10
10
|
# "P577TH3PAA"
|
11
11
|
attr_accessor :id
|
12
12
|
|
@@ -18,23 +18,23 @@ module Spaceship
|
|
18
18
|
attr_accessor :name
|
19
19
|
|
20
20
|
# @return (String) Status of the certificate
|
21
|
-
# @example
|
21
|
+
# @example
|
22
22
|
# "Issued"
|
23
23
|
attr_accessor :status
|
24
24
|
|
25
25
|
# @return (Date) The date and time when the certificate was created
|
26
|
-
# @example
|
26
|
+
# @example
|
27
27
|
# 2015-04-01 21:24:00 UTC
|
28
28
|
attr_accessor :created
|
29
29
|
|
30
30
|
# @return (Date) The date and time when the certificate will expire
|
31
|
-
# @example
|
31
|
+
# @example
|
32
32
|
# 2016-04-01 21:24:00 UTC
|
33
33
|
attr_accessor :expires
|
34
|
-
|
34
|
+
|
35
35
|
# @return (String) The owner type that defines if it's a push profile
|
36
36
|
# or a code signing identity
|
37
|
-
#
|
37
|
+
#
|
38
38
|
# @example Code Signing Identity
|
39
39
|
# "team"
|
40
40
|
# @example Push Certificate
|
@@ -42,21 +42,21 @@ module Spaceship
|
|
42
42
|
attr_accessor :owner_type
|
43
43
|
|
44
44
|
# @return (String) The name of the owner
|
45
|
-
#
|
45
|
+
#
|
46
46
|
# @example Code Signing Identity (usually the company name)
|
47
47
|
# "SunApps Gmbh"
|
48
48
|
# @example Push Certificate (the name of your App ID)
|
49
49
|
# "Awesome App"
|
50
50
|
attr_accessor :owner_name
|
51
51
|
|
52
|
-
# @return (String) The ID of the owner, that can be used to
|
52
|
+
# @return (String) The ID of the owner, that can be used to
|
53
53
|
# fetch more information
|
54
54
|
# @example
|
55
55
|
# "75B83SPLAA"
|
56
56
|
attr_accessor :owner_id
|
57
57
|
|
58
58
|
# Indicates the type of this certificate
|
59
|
-
# which is automatically used to determine the class of
|
59
|
+
# which is automatically used to determine the class of
|
60
60
|
# the certificate. Available values listed in CERTIFICATE_TYPE_IDS
|
61
61
|
# @return (String) The type of the certificate
|
62
62
|
# @example Production Certificate
|
@@ -131,12 +131,12 @@ module Spaceship
|
|
131
131
|
|
132
132
|
#class methods
|
133
133
|
class << self
|
134
|
-
# Create a new code signing request that can be used to
|
134
|
+
# Create a new code signing request that can be used to
|
135
135
|
# generate a new certificate
|
136
136
|
# @example
|
137
137
|
# Create a new certificate signing request
|
138
138
|
# csr, pkey = Spaceship.certificate.create_certificate_signing_request
|
139
|
-
#
|
139
|
+
#
|
140
140
|
# # Use the signing request to create a new distribution certificate
|
141
141
|
# Spaceship.certificate.production.create!(csr: csr)
|
142
142
|
def create_certificate_signing_request
|
@@ -205,7 +205,7 @@ module Spaceship
|
|
205
205
|
end
|
206
206
|
end
|
207
207
|
|
208
|
-
# @return (Certificate) Find a certificate based on the ID of the certificate.
|
208
|
+
# @return (Certificate) Find a certificate based on the ID of the certificate.
|
209
209
|
def find(certificate_id)
|
210
210
|
all.find do |c|
|
211
211
|
c.id == certificate_id
|
@@ -213,15 +213,15 @@ module Spaceship
|
|
213
213
|
end
|
214
214
|
|
215
215
|
# Generate a new certificate based on a code certificate signing request
|
216
|
-
# @param csr (required): The certificate signing request to use. Get one using
|
216
|
+
# @param csr (OpenSSL::X509::Request) (required): The certificate signing request to use. Get one using
|
217
217
|
# `create_certificate_signing_request`
|
218
218
|
# @param bundle_id (String) (optional): The app identifier this certificate is for.
|
219
219
|
# This value is only needed if you create a push profile. For normal code signing
|
220
220
|
# certificates, you must only pass a certificate signing request.
|
221
|
-
# @example
|
221
|
+
# @example
|
222
222
|
# # Create a new certificate signing request
|
223
223
|
# csr, pkey = Spaceship::Certificate.create_certificate_signing_request
|
224
|
-
#
|
224
|
+
#
|
225
225
|
# # Use the signing request to create a new distribution certificate
|
226
226
|
# Spaceship::Certificate::Production.create!(csr: csr)
|
227
227
|
# @return (Device): The newly created device
|
@@ -235,6 +235,9 @@ module Spaceship
|
|
235
235
|
app_id = app.app_id
|
236
236
|
end
|
237
237
|
|
238
|
+
# ensure csr is a OpenSSL::X509::Request
|
239
|
+
csr = OpenSSL::X509::Request.new(csr) if csr.is_a?(String)
|
240
|
+
|
238
241
|
# if this succeeds, we need to save the .cer and the private key in keychain access or wherever they go in linux
|
239
242
|
response = client.create_certificate!(type, csr.to_pem, app_id)
|
240
243
|
# munge the response to make it work for the factory
|
@@ -260,7 +263,7 @@ module Spaceship
|
|
260
263
|
client.revoke_certificate!(id, type_display_id)
|
261
264
|
end
|
262
265
|
|
263
|
-
# @return (Bool): Is this certificate a push profile for apps?
|
266
|
+
# @return (Bool): Is this certificate a push profile for apps?
|
264
267
|
def is_push?
|
265
268
|
self.kind_of?PushCertificate
|
266
269
|
end
|
data/lib/spaceship/client.rb
CHANGED
@@ -30,15 +30,15 @@ module Spaceship
|
|
30
30
|
# Authenticates with Apple's web services. This method has to be called once
|
31
31
|
# to generate a valid session. The session will automatically be used from then
|
32
32
|
# on.
|
33
|
-
#
|
33
|
+
#
|
34
34
|
# This method will automatically use the username from the Appfile (if available)
|
35
35
|
# and fetch the password from the Keychain (if available)
|
36
|
-
#
|
36
|
+
#
|
37
37
|
# @param user (String) (optional): The username (usually the email address)
|
38
38
|
# @param password (String) (optional): The password
|
39
|
-
#
|
39
|
+
#
|
40
40
|
# @raise InvalidUserCredentialsError: raised if authentication failed
|
41
|
-
#
|
41
|
+
#
|
42
42
|
# @return (Spaceship::Client) The client the login method was called for
|
43
43
|
def self.login(user = nil, password = nil)
|
44
44
|
instance = self.new
|
@@ -138,15 +138,15 @@ module Spaceship
|
|
138
138
|
# Authenticates with Apple's web services. This method has to be called once
|
139
139
|
# to generate a valid session. The session will automatically be used from then
|
140
140
|
# on.
|
141
|
-
#
|
141
|
+
#
|
142
142
|
# This method will automatically use the username from the Appfile (if available)
|
143
143
|
# and fetch the password from the Keychain (if available)
|
144
|
-
#
|
144
|
+
#
|
145
145
|
# @param user (String) (optional): The username (usually the email address)
|
146
146
|
# @param password (String) (optional): The password
|
147
|
-
#
|
147
|
+
#
|
148
148
|
# @raise InvalidUserCredentialsError: raised if authentication failed
|
149
|
-
#
|
149
|
+
#
|
150
150
|
# @return (Spaceship::Client) The client the login method was called for
|
151
151
|
def login(user = nil, password = nil)
|
152
152
|
if user.to_s.empty? or password.to_s.empty?
|
@@ -175,7 +175,7 @@ module Spaceship
|
|
175
175
|
end
|
176
176
|
end
|
177
177
|
|
178
|
-
# @return (Bool) Do we have a valid session?
|
178
|
+
# @return (Bool) Do we have a valid session?
|
179
179
|
def session?
|
180
180
|
!!@cookie
|
181
181
|
end
|
@@ -236,6 +236,14 @@ module Spaceship
|
|
236
236
|
end
|
237
237
|
end
|
238
238
|
|
239
|
+
def details_for_app(app)
|
240
|
+
r = request(:post, 'account/ios/identifiers/getAppIdDetail.action', {
|
241
|
+
teamId: team_id,
|
242
|
+
appIdId: app.app_id
|
243
|
+
})
|
244
|
+
parse_response(r, 'appId')
|
245
|
+
end
|
246
|
+
|
239
247
|
def create_app!(type, name, bundle_id)
|
240
248
|
ident_params = case type.to_sym
|
241
249
|
when :explicit
|
@@ -419,7 +427,7 @@ module Spaceship
|
|
419
427
|
end
|
420
428
|
end
|
421
429
|
end
|
422
|
-
|
430
|
+
|
423
431
|
# memoize the last csrf tokens from responses
|
424
432
|
def csrf_tokens
|
425
433
|
@csrf_tokens || {}
|
@@ -468,7 +476,7 @@ module Spaceship
|
|
468
476
|
|
469
477
|
return @client.send(method, url_or_path, params, headers, &block)
|
470
478
|
|
471
|
-
rescue Faraday::Error::TimeoutError => ex # New
|
479
|
+
rescue Faraday::Error::TimeoutError => ex # New Faraday version: Faraday::TimeoutError => ex
|
472
480
|
unless (tries -= 1).zero?
|
473
481
|
sleep 3
|
474
482
|
retry
|
@@ -241,6 +241,7 @@ module Spaceship
|
|
241
241
|
# @return (Array) Returns an array of provisioning
|
242
242
|
# profiles matching the bundle identifier
|
243
243
|
# Returns [] if no profiles were found
|
244
|
+
# This may also contain invalid or expired profiles
|
244
245
|
def find_by_bundle_id(bundle_id)
|
245
246
|
all.find_all do |profile|
|
246
247
|
profile.app.bundle_id == bundle_id
|
@@ -348,7 +349,7 @@ module Spaceship
|
|
348
349
|
|
349
350
|
# @return (Bool) Is the current provisioning profile valid?
|
350
351
|
def valid?
|
351
|
-
return status == 'Active'
|
352
|
+
return (status == 'Active' and certificate_valid?)
|
352
353
|
end
|
353
354
|
|
354
355
|
# @return (Bool) Is this profile managed by Xcode?
|
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.0.
|
4
|
+
version: 0.0.13
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Stefan Natchev
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2015-06-
|
12
|
+
date: 2015-06-27 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: credentials_manager
|