Class: AppleReceipt::Validator
- Inherits:
-
Object
- Object
- AppleReceipt::Validator
- Defined in:
- lib/apple_receipt/validator.rb
Overview
Validator allows one to check the validity of a receipt.
Constant Summary collapse
- INTERMEDIATE_CERT_MAPPING =
{ 3 => 'AppleWorldwideDeveloperRelationsCertificationAuthority', 2 => 'AppleITunesStoreCertificationAuthority' }.freeze
Instance Method Summary collapse
- #add_certificates(certificates) ⇒ Object
- #add_named_certificate(name) ⇒ Object
-
#initialize(receipt, certificates: []) ⇒ Validator
constructor
A new instance of Validator.
- #populate_certificate_store(version, provided_certificates) ⇒ Object
- #public_key ⇒ Object
- #signed_data ⇒ Object
- #store ⇒ Object
- #valid? ⇒ Boolean
Constructor Details
#initialize(receipt, certificates: []) ⇒ Validator
Returns a new instance of Validator.
13 14 15 16 |
# File 'lib/apple_receipt/validator.rb', line 13 def initialize(receipt, certificates: []) populate_certificate_store(receipt.version, certificates) @receipt = receipt end |
Instance Method Details
#add_certificates(certificates) ⇒ Object
32 33 34 35 36 |
# File 'lib/apple_receipt/validator.rb', line 32 def add_certificates(certificates) certificates.each do |cert| store.add_cert(cert) end end |
#add_named_certificate(name) ⇒ Object
27 28 29 30 |
# File 'lib/apple_receipt/validator.rb', line 27 def add_named_certificate(name) cert_file = File.read("./certificates/#{name}.cer") store.add_cert(OpenSSL::X509::Certificate.new(cert_file)) end |
#populate_certificate_store(version, provided_certificates) ⇒ Object
18 19 20 21 22 23 24 25 |
# File 'lib/apple_receipt/validator.rb', line 18 def populate_certificate_store(version, provided_certificates) if provided_certificates.any? add_certificates(provided_certificates) else add_named_certificate('AppleRootCA') add_named_certificate(INTERMEDIATE_CERT_MAPPING[version]) end end |
#public_key ⇒ Object
44 45 46 |
# File 'lib/apple_receipt/validator.rb', line 44 def public_key receipt.certificate.public_key end |
#signed_data ⇒ Object
48 49 50 |
# File 'lib/apple_receipt/validator.rb', line 48 def signed_data [receipt.version, receipt.data].pack('CA*') end |
#store ⇒ Object
52 53 54 |
# File 'lib/apple_receipt/validator.rb', line 52 def store @store ||= OpenSSL::X509::Store.new end |
#valid? ⇒ Boolean
38 39 40 41 42 |
# File 'lib/apple_receipt/validator.rb', line 38 def valid? store.verify(receipt.certificate) && public_key.verify(OpenSSL::Digest::SHA1.new, receipt.signature, signed_data) end |