itunes_receipt_encoder 0.0.1 → 0.0.2

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 389838e63604ad8eca54e6ffce19a8f846a2a159
4
- data.tar.gz: 5717db2e0eef76637858030ff38a30de9f82fd6e
3
+ metadata.gz: 764169e8628039b7be28cf64669011048fb7e396
4
+ data.tar.gz: 244e326b8df96c21910d892c97224d6c026cb540
5
5
  SHA512:
6
- metadata.gz: 2e098be05c5b76611439a75836814c02c179024945d683bffb9f9d019964108ebc18dfbb19fc591d80386e396bb45e650b6919d006efde253c6383ac538cb4b6
7
- data.tar.gz: 3d5a71c47406936b24507df03b18acc5ca5ff71fba3bd2a026fe4e77fcc6188029e742b85d59afb50253d0dc7b7b4a7dcd8c4467eff98806ce2f228ba209258c
6
+ metadata.gz: 760e7ee222a82a8bd4654ff541f8e26e0707e350ef20ab6ef9ffab22b3507175084c880767d80768a3fa4136f259aecb1316afca1224bd68d24c38182d6c4b73
7
+ data.tar.gz: 601c632f5d57810e057b36b6e61b5cecd4011f1b643e5ea4f82f31d3aadbf5492ec11aea986ff4908556ee318c2ce55db322ec87d24748e2f19e90a2de8e029b
@@ -0,0 +1,94 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ $LOAD_PATH.push File.expand_path('../../lib', __FILE__)
4
+
5
+ require 'json'
6
+ require 'optparse'
7
+ require 'itunes_receipt_encoder'
8
+
9
+ options = {
10
+ style: :unified
11
+ }
12
+ optparse = OptionParser.new do |opts|
13
+ opts.program_name = 'itunes_receipt_encoder'
14
+ opts.banner = 'Usage: itunes_receipt_encoder [options] file'
15
+
16
+ opts.separator ''
17
+ opts.separator 'file: receipt data as JSON'
18
+
19
+ opts.separator ''
20
+ opts.separator 'Options:'
21
+
22
+ opts.on('-s', '--style STYLE',
23
+ %i(unified transaction),
24
+ 'iTunes receipt output style',
25
+ 'unified or transaction',
26
+ 'defaults to unified') do |style|
27
+ options[:style] = style
28
+ end
29
+
30
+ opts.on('-r', '--raw', 'Return raw ouptput instead of Base64') do |raw|
31
+ options[:raw] = raw
32
+ end
33
+
34
+ opts.separator ''
35
+ opts.separator 'Unified receipt style options:'
36
+
37
+ opts.on('-c', '--cert FILE',
38
+ 'SSL certificate file to create P7 payload') do |file|
39
+ options[:cert] = File.read(file)
40
+ end
41
+
42
+ opts.on('-k', '--key FILE',
43
+ 'SSL private key file to create P7 payload') do |file|
44
+ options[:key] = File.read(file)
45
+ end
46
+
47
+ opts.separator ''
48
+ opts.separator 'Transaction receipt style options:'
49
+
50
+ opts.on('-i', '--index N',
51
+ 'Use the specific index from in_app') do |index|
52
+ options[:index] = index
53
+ end
54
+
55
+ opts.on('-m', '--no-ms-dates',
56
+ 'Exclude millisecond timestamps from results') do |no_ms_dates|
57
+ options[:no_ms_dates] = no_ms_dates
58
+ end
59
+
60
+ opts.on('-p', '--no-pst-dates',
61
+ 'Exclude PST timestamps from results') do |no_pst_dates|
62
+ options[:no_pst_dates] = no_pst_dates
63
+ end
64
+
65
+ opts.separator ''
66
+ opts.separator 'Additional options:'
67
+
68
+ opts.on_tail('-h', '--help', 'Show this message') do
69
+ puts opts
70
+ exit
71
+ end
72
+
73
+ opts.on_tail('-v', '--version', 'Display the version number') do
74
+ puts ItunesReceiptEncoder::VERSION
75
+ exit
76
+ end
77
+ end
78
+
79
+ optparse.parse!
80
+
81
+ if ARGV.empty?
82
+ puts optparse.to_s
83
+ exit
84
+ end
85
+
86
+ json = JSON.parse(File.read(ARGV.first), symbolize_names: true)
87
+ encoder = ItunesReceiptEncoder.new(json)
88
+ case options.delete(:style)
89
+ when :unified
90
+ puts encoder.to_unified(options)
91
+ when :transaction
92
+ puts encoder.to_transaction(options)
93
+ end
94
+ exit(1)
@@ -16,9 +16,5 @@ module ItunesReceiptEncoder
16
16
  def self.set(array)
17
17
  OpenSSL::ASN1::Set.new(array.compact)
18
18
  end
19
-
20
- def self.time(time)
21
- time && time.utc.strftime('%FT%TZ')
22
- end
23
19
  end
24
20
  end
@@ -10,9 +10,10 @@ module ItunesReceiptEncoder
10
10
  include Utils
11
11
 
12
12
  attr_accessor :quantity, :product_id, :transaction_id,
13
- :original_transaction_id, :purchase_date,
14
- :original_purchase_date, :expires_date, :cancellation_date,
15
- :web_order_line_item_id, :item_id
13
+ :original_transaction_id, :web_order_line_item_id, :item_id
14
+
15
+ timestamp_accessor :purchase_date, :original_purchase_date, :expires_date,
16
+ :cancellation_date
16
17
 
17
18
  def initialize(attrs = {})
18
19
  attrs.each { |key, val| send("#{key}=", val) }
@@ -24,9 +25,9 @@ module ItunesReceiptEncoder
24
25
  asn1_product_id,
25
26
  asn1_transaction_id,
26
27
  asn1_original_transaction_id,
27
- asn1_purchase_date,
28
- asn1_original_purchase_date,
29
28
  asn1_web_order_line_item_id,
29
+ (asn1_purchase_date if purchase_date),
30
+ (asn1_original_purchase_date if original_purchase_date),
30
31
  (asn1_expires_date if expires_date),
31
32
  (asn1_cancellation_date if cancellation_date)
32
33
  ]
@@ -36,6 +37,7 @@ module ItunesReceiptEncoder
36
37
  hash = {
37
38
  'quantity' => quantity,
38
39
  'product-id' => product_id,
40
+ 'item-id' => item_id,
39
41
  'transaction-id' => transaction_id,
40
42
  'original_transaction-id' => original_transaction_id,
41
43
  'purchase-date' => gmt_time(purchase_date),
@@ -74,23 +76,23 @@ module ItunesReceiptEncoder
74
76
  end
75
77
 
76
78
  def asn1_web_order_line_item_id
77
- ASN1.sequence web_order_line_item_id, 1711, :integer
79
+ ASN1.sequence web_order_line_item_id || 0, 1711, :integer
78
80
  end
79
81
 
80
82
  def asn1_purchase_date
81
- ASN1.sequence ASN1.time(purchase_date), 1704, :ia5_string
83
+ ASN1.sequence asn1_time(purchase_date), 1704, :ia5_string
82
84
  end
83
85
 
84
86
  def asn1_original_purchase_date
85
- ASN1.sequence ASN1.time(original_purchase_date), 1706, :ia5_string
87
+ ASN1.sequence asn1_time(original_purchase_date), 1706, :ia5_string
86
88
  end
87
89
 
88
90
  def asn1_expires_date
89
- ASN1.sequence ASN1.time(expires_date), 1708, :ia5_string
91
+ ASN1.sequence asn1_time(expires_date), 1708, :ia5_string
90
92
  end
91
93
 
92
94
  def asn1_cancellation_date
93
- ASN1.sequence ASN1.time(cancellation_date), 1712, :ia5_string
95
+ ASN1.sequence asn1_time(cancellation_date), 1712, :ia5_string
94
96
  end
95
97
  end
96
98
  end
@@ -11,9 +11,10 @@ module ItunesReceiptEncoder
11
11
  include Utils
12
12
 
13
13
  attr_accessor :environment, :bundle_id, :application_version,
14
- :original_application_version, :creation_date,
15
- :expiration_date, :opaque_value, :sha1_hash, :in_app,
16
- :unique_vendor_identifier
14
+ :original_application_version, :opaque_value, :sha1_hash,
15
+ :in_app, :unique_vendor_identifier
16
+
17
+ timestamp_accessor :creation_date, :expiration_date
17
18
 
18
19
  def initialize(attrs = {})
19
20
  attrs.each { |key, val| send("#{key}=", val) }
@@ -27,7 +28,7 @@ module ItunesReceiptEncoder
27
28
  asn1_bundle_id,
28
29
  asn1_application_version,
29
30
  asn1_original_application_version,
30
- asn1_creation_date,
31
+ (asn1_creation_date if creation_date),
31
32
  (asn1_opaque_value if opaque_value),
32
33
  (asn1_sha1_hash if sha1_hash),
33
34
  (asn1_expiration_date if expiration_date)
@@ -40,7 +41,7 @@ module ItunesReceiptEncoder
40
41
  'bid' => bundle_id.to_s,
41
42
  'bvrs' => application_version.to_s,
42
43
  'unique-vendor-identifier' => unique_vendor_identifier.to_s
43
- }.merge(transaction.to_plist_hash(options))
44
+ }.merge(transaction.to_plist_hash(options)).delete_if { |_, v| v.nil? }
44
45
  end
45
46
 
46
47
  private
@@ -70,11 +71,11 @@ module ItunesReceiptEncoder
70
71
  end
71
72
 
72
73
  def asn1_creation_date
73
- ASN1.sequence ASN1.time(creation_date), 12, :ia5_string
74
+ ASN1.sequence asn1_time(creation_date), 12, :ia5_string
74
75
  end
75
76
 
76
77
  def asn1_expiration_date
77
- ASN1.sequence ASN1.time(expiration_date), 21, :ia5_string
78
+ ASN1.sequence asn1_time(expiration_date), 21, :ia5_string
78
79
  end
79
80
 
80
81
  def asn1_in_app
@@ -1,20 +1,61 @@
1
+ require 'time'
2
+
1
3
  ##
2
4
  # ItunesReceiptEncoder
3
5
  module ItunesReceiptEncoder
4
6
  ##
5
- # ItunesReceiptEncoder::Receipt
7
+ # ItunesReceiptEncoder::Utils
6
8
  module Utils
9
+ ##
10
+ # ItunesReceiptEncoder::Utils::ClassMethods
11
+ module ClassMethods
12
+ private
13
+
14
+ def timestamp_writer(*attrs)
15
+ attrs.each do |attr|
16
+ define_method("#{attr}=".to_sym) do |value|
17
+ instance_variable_set "@#{attr}".to_sym, parse_timestamp(value)
18
+ end
19
+ end
20
+ end
21
+
22
+ def timestamp_accessor(*attrs)
23
+ attr_reader(*attrs)
24
+ timestamp_writer(*attrs)
25
+ end
26
+ end
27
+
28
+ private
29
+
30
+ def self.included(base)
31
+ base.extend(ClassMethods)
32
+ end
33
+
7
34
  def gmt_time(time)
8
- time.utc.strftime('%F %T') + ' Etc/GMT'
35
+ time && time.utc.strftime('%F %T Etc/GMT')
9
36
  end
10
37
 
11
38
  def pst_time(time)
12
- (time + Time.zone_offset('PST'))
13
- .strftime('%F %T') + ' America/Los_Angeles'
39
+ time && (time + Time.zone_offset('PST'))
40
+ .strftime('%F %T America/Los_Angeles')
14
41
  end
15
42
 
16
43
  def ms_time(time)
17
- (time.to_i * 1000).to_s
44
+ time && time.to_i * 1000
45
+ end
46
+
47
+ def asn1_time(time)
48
+ time && time.utc.strftime('%FT%TZ')
49
+ end
50
+
51
+ def parse_timestamp(value)
52
+ if value.is_a?(Time)
53
+ value
54
+ elsif value.is_a?(Integer)
55
+ Time.at(value)
56
+ else
57
+ Time.parse(value)
58
+ end
18
59
  end
19
60
  end
20
61
  end
@@ -1,5 +1,5 @@
1
1
  ##
2
2
  # ItunesReceiptEncoder
3
3
  module ItunesReceiptEncoder
4
- VERSION = '0.0.1'
4
+ VERSION = '0.0.2'
5
5
  end
@@ -1,3 +1,4 @@
1
+ require 'itunes_receipt_encoder/version'
1
2
  require 'itunes_receipt_encoder/receipt'
2
3
 
3
4
  ##
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: itunes_receipt_encoder
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - mbaasy.com
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-12-14 00:00:00.000000000 Z
11
+ date: 2015-12-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: CFPropertyList
@@ -168,10 +168,12 @@ description: |2
168
168
  Encodes receipt data into iTunes encoded receipts and exports as
169
169
  appStoreReceiptURL or transactionReceipt formats.
170
170
  email: hello@mbaasy.com
171
- executables: []
171
+ executables:
172
+ - itunes_receipt_encoder
172
173
  extensions: []
173
174
  extra_rdoc_files: []
174
175
  files:
176
+ - bin/itunes_receipt_encoder
175
177
  - lib/itunes_receipt_encoder.rb
176
178
  - lib/itunes_receipt_encoder/asn1.rb
177
179
  - lib/itunes_receipt_encoder/asn1/sequence.rb