Class: Spaceship::Certificate
Overview
Represents a certificate from the Apple Developer Portal.
This can either be a code signing identity or a push profile
Direct Known Subclasses
ApplePay, Development, InHouse, Passbook, Production, PushCertificate
Defined Under Namespace
Classes: ApplePay, Development, DevelopmentPush, InHouse, Passbook, Production, ProductionPush, PushCertificate, VoipPush, WebsitePush
Constant Summary collapse
- CERTIFICATE_TYPE_IDS =
{ "5QPB9NHCEI" => Development, "R58UK2EWSO" => Production, "9RQEK7MSXA" => InHouse, "LA30L5BJEU" => Certificate, "BKLRAVXMGM" => DevelopmentPush, "3BQKVH9I2X" => ProductionPush, "Y3B2F3TYSI" => Passbook, "3T2ZP62QW8" => WebsitePush, "E5D663CMZW" => WebsitePush, "4APLUP237T" => ApplePay }
Instance Attribute Summary collapse
-
#created ⇒ Date
The date and time when the certificate was created.
-
#expires ⇒ Date
The date and time when the certificate will expire.
-
#id ⇒ String
The ID given from the developer portal.
-
#name ⇒ String
The name of the certificate.
-
#owner_id ⇒ String
The ID of the owner, that can be used to fetch more information.
-
#owner_name ⇒ String
The name of the owner.
-
#owner_type ⇒ String
The owner type that defines if it’s a push profile or a code signing identity.
-
#status ⇒ String
Status of the certificate.
-
#type_display_id ⇒ String
Indicates the type of this certificate which is automatically used to determine the class of the certificate.
Class Method Summary collapse
-
.all ⇒ Array
Returns all certificates of this account.
-
.create!(csr: nil, bundle_id: nil) ⇒ Device
Generate a new certificate based on a code certificate signing request.
-
.create_certificate_signing_request ⇒ Object
Create a new code signing request that can be used to generate a new certificate.
-
.factory(attrs) ⇒ Object
Create a new object based on a hash.
-
.find(certificate_id) ⇒ Certificate
Find a certificate based on the ID of the certificate.
Instance Method Summary collapse
-
#download ⇒ OpenSSL::X509::Certificate
Downloads and parses the certificate.
-
#download_raw ⇒ String
Download the raw data of the certificate without parsing.
-
#is_push? ⇒ Bool
: Is this certificate a push profile for apps?.
-
#revoke! ⇒ Object
Revoke the certificate.
Methods inherited from Base
attr_mapping, #client, #initialize, #inspect, method_missing, remap_keys!, set_client
Constructor Details
This class inherits a constructor from Spaceship::Base
Instance Attribute Details
#created ⇒ Date
Returns The date and time when the certificate was created.
28 29 30 |
# File 'lib/spaceship/certificate.rb', line 28 def created @created end |
#expires ⇒ Date
Returns The date and time when the certificate will expire.
33 34 35 |
# File 'lib/spaceship/certificate.rb', line 33 def expires @expires end |
#id ⇒ String
Returns The ID given from the developer portal. You’ll probably not need it.
11 12 13 |
# File 'lib/spaceship/certificate.rb', line 11 def id @id end |
#name ⇒ String
Returns The name of the certificate.
18 19 20 |
# File 'lib/spaceship/certificate.rb', line 18 def name @name end |
#owner_id ⇒ String
Returns The ID of the owner, that can be used to fetch more information.
56 57 58 |
# File 'lib/spaceship/certificate.rb', line 56 def owner_id @owner_id end |
#owner_name ⇒ String
Returns The name of the owner.
50 51 52 |
# File 'lib/spaceship/certificate.rb', line 50 def owner_name @owner_name end |
#owner_type ⇒ String
Returns The owner type that defines if it’s a push profile or a code signing identity.
42 43 44 |
# File 'lib/spaceship/certificate.rb', line 42 def owner_type @owner_type end |
#status ⇒ String
Returns Status of the certificate.
23 24 25 |
# File 'lib/spaceship/certificate.rb', line 23 def status @status end |
#type_display_id ⇒ String
Indicates the type of this certificate which is automatically used to determine the class of the certificate. Available values listed in CERTIFICATE_TYPE_IDS
66 67 68 |
# File 'lib/spaceship/certificate.rb', line 66 def type_display_id @type_display_id end |
Class Method Details
.all ⇒ Array
Returns all certificates of this account. If this is called from a subclass of Certificate, this will only include certificates matching the current type.
196 197 198 199 200 201 202 203 204 205 206 |
# File 'lib/spaceship/certificate.rb', line 196 def all if (self == Certificate) # are we the base-class? types = CERTIFICATE_TYPE_IDS.keys else types = [CERTIFICATE_TYPE_IDS.key(self)] end client.certificates(types).map do |cert| factory(cert) end end |
.create!(csr: nil, bundle_id: nil) ⇒ Device
Generate a new certificate based on a code certificate signing request
228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 |
# File 'lib/spaceship/certificate.rb', line 228 def create!(csr: nil, bundle_id: nil) type = CERTIFICATE_TYPE_IDS.key(self) # look up the app_id by the bundle_id if bundle_id app = Spaceship::App.find(bundle_id) raise "Could not find app with bundle id '#{bundle_id}'" unless app app_id = app.app_id end # ensure csr is a OpenSSL::X509::Request csr = OpenSSL::X509::Request.new(csr) if csr.is_a?(String) # if this succeeds, we need to save the .cer and the private key in keychain access or wherever they go in linux response = client.create_certificate!(type, csr.to_pem, app_id) # munge the response to make it work for the factory response['certificateTypeDisplayId'] = response['certificateType']['certificateTypeDisplayId'] self.new(response) end |
.create_certificate_signing_request ⇒ Object
Create a new code signing request that can be used to generate a new certificate
142 143 144 145 146 147 148 149 150 151 152 |
# File 'lib/spaceship/certificate.rb', line 142 def create_certificate_signing_request key = OpenSSL::PKey::RSA.new 2048 csr = OpenSSL::X509::Request.new csr.version = 0 csr.subject = OpenSSL::X509::Name.new([ ['CN', 'PEM', OpenSSL::ASN1::UTF8STRING] ]) csr.public_key = key.public_key csr.sign(key, OpenSSL::Digest::SHA1.new) return [csr, key] end |
.factory(attrs) ⇒ Object
Create a new object based on a hash. This is used to create a new object based on the server response.
156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 |
# File 'lib/spaceship/certificate.rb', line 156 def factory(attrs) # Example: # => {"name"=>"iOS Distribution: SunApps GmbH", # "certificateId"=>"XC5PH8DAAA", # "serialNumber"=>"797E732CCE8B7AAA", # "status"=>"Issued", # "statusCode"=>0, # "expirationDate"=>#<DateTime: 2015-11-25T22:45:50+00:00 ((2457352j,81950s,0n),+0s,2299161j)>, # "certificatePlatform"=>"ios", # "certificateType"=> # {"certificateTypeDisplayId"=>"R58UK2EAAA", # "name"=>"iOS Distribution", # "platform"=>"ios", # "permissionType"=>"distribution", # "distributionType"=>"store", # "distributionMethod"=>"app", # "ownerType"=>"team", # "daysOverlap"=>364, # "maxActive"=>2}} if attrs['certificateType'] # On some accounts this is nested, so we need to flatten it attrs.merge!(attrs['certificateType']) attrs.delete('certificateType') end # Parse the dates attrs['expirationDate'] = (Time.parse(attrs['expirationDate']) rescue attrs['expirationDate']) attrs['dateCreated'] = (Time.parse(attrs['dateCreated']) rescue attrs['dateCreated']) # Here we go klass = CERTIFICATE_TYPE_IDS[attrs['certificateTypeDisplayId']] klass ||= Certificate klass.client = @client klass.new(attrs) end |
.find(certificate_id) ⇒ Certificate
Returns Find a certificate based on the ID of the certificate.
209 210 211 212 213 |
# File 'lib/spaceship/certificate.rb', line 209 def find(certificate_id) all.find do |c| c.id == certificate_id end end |
Instance Method Details
#download ⇒ OpenSSL::X509::Certificate
Returns Downloads and parses the certificate.
257 258 259 |
# File 'lib/spaceship/certificate.rb', line 257 def download OpenSSL::X509::Certificate.new(download_raw) end |
#download_raw ⇒ String
Returns Download the raw data of the certificate without parsing.
252 253 254 |
# File 'lib/spaceship/certificate.rb', line 252 def download_raw client.download_certificate(id, type_display_id) end |
#is_push? ⇒ Bool
Returns : Is this certificate a push profile for apps?.
267 268 269 |
# File 'lib/spaceship/certificate.rb', line 267 def is_push? self.kind_of?PushCertificate end |
#revoke! ⇒ Object
Revoke the certificate. You shouldn’t use this method probably.
262 263 264 |
# File 'lib/spaceship/certificate.rb', line 262 def revoke! client.revoke_certificate!(id, type_display_id) end |