class Passbook::PKPass
Attributes
manifest_files[RW]
pass[RW]
Public Class Methods
new(pass)
click to toggle source
# File lib/passbook/pkpass.rb, line 10 def initialize pass @pass = pass @manifest_files = [] end
Public Instance Methods
addFile(file)
click to toggle source
# File lib/passbook/pkpass.rb, line 15 def addFile file @manifest_files << file end
addFiles(files)
click to toggle source
# File lib/passbook/pkpass.rb, line 19 def addFiles files @manifest_files += files end
build()
click to toggle source
# File lib/passbook/pkpass.rb, line 28 def build manifest = createManifest # Check pass for necessary files and fields checkPass manifest # Create pass signature signature = createSignature manifest return [manifest, signature] end
create()
click to toggle source
Backward compatibility
# File lib/passbook/pkpass.rb, line 41 def create self.file.path end
createSignature(manifest)
click to toggle source
# File lib/passbook/pkpass.rb, line 75 def createSignature manifest p12 = get_p12_cert_and_key wwdc = OpenSSL::X509::Certificate.new File.read(Passbook.wwdc_cert) pk7 = OpenSSL::PKCS7.sign p12[:cert], p12[:key], manifest.to_s, [wwdc], OpenSSL::PKCS7::BINARY | OpenSSL::PKCS7::DETACHED data = OpenSSL::PKCS7.write_smime pk7 str_debut = "filename=\"smime.p7s\"\n\n" data = data[data.index(str_debut)+str_debut.length..data.length-1] str_end = "\n\n------" data = data[0..data.index(str_end)-1] return Base64.decode64(data) end
file(options = {})
click to toggle source
Return a Tempfile containing our ZipStream
# File lib/passbook/pkpass.rb, line 46 def file(options = {}) options[:file_name] ||= 'pass.pkpass' temp_file = Tempfile.new(options[:file_name]) temp_file.write self.stream.string temp_file.close temp_file end
get_p12_cert_and_key()
click to toggle source
# File lib/passbook/pkpass.rb, line 63 def get_p12_cert_and_key key_hash = {} if Passbook.p12_key key_hash[:key] = OpenSSL::PKey::RSA.new File.read(Passbook.p12_key), Passbook.p12_password key_hash[:cert] = OpenSSL::X509::Certificate.new File.read(Passbook.p12_certificate) else p12 = OpenSSL::PKCS12.new File.read(Passbook.p12_cert), Passbook.p12_password key_hash[:key], key_hash[:cert] = p12.key, p12.certificate end key_hash end
json=(json)
click to toggle source
for backwards compatibility
# File lib/passbook/pkpass.rb, line 24 def json= json @pass = json end
stream()
click to toggle source
Return a ZipOutputStream
# File lib/passbook/pkpass.rb, line 57 def stream manifest, signature = build outputZip manifest, signature end
Private Instance Methods
checkPass(manifest)
click to toggle source
# File lib/passbook/pkpass.rb, line 91 def checkPass manifest # Check for default images raise 'Icon missing' unless manifest.include?('icon.png') raise 'Icon@2x missing' unless manifest.include?('icon@2x.png') # Check for developer field in JSON raise 'Pass Type Identifier missing' unless @pass.include?('passTypeIdentifier') raise 'Team Identifier missing' unless @pass.include?('teamIdentifier') raise 'Serial Number missing' unless @pass.include?('serialNumber') raise 'Organization Name Identifier missing' unless @pass.include?('organizationName') raise 'Format Version' unless @pass.include?('formatVersion') raise 'Description' unless @pass.include?('description') end
createManifest()
click to toggle source
# File lib/passbook/pkpass.rb, line 105 def createManifest sha1s = {} sha1s['pass.json'] = Digest::SHA1.hexdigest @pass @manifest_files.each do |file| if file.class == Hash sha1s[file[:name]] = Digest::SHA1.hexdigest file[:content] else sha1s[File.basename(file)] = Digest::SHA1.file(file).hexdigest end end return sha1s.to_json end
outputZip(manifest, signature)
click to toggle source
# File lib/passbook/pkpass.rb, line 120 def outputZip manifest, signature Zip::ZipOutputStream.write_buffer do |zip| zip.put_next_entry 'pass.json' zip.write @pass zip.put_next_entry 'manifest.json' zip.write manifest zip.put_next_entry 'signature' zip.write signature @manifest_files.each do |file| if file.class == Hash zip.put_next_entry file[:name] zip.print file[:content] else zip.put_next_entry File.basename(file) zip.print IO.read(file) end end end end