itunes_receipt_encoder 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
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