ipizza 1.0.0 → 2.0.0

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.
Files changed (72) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +3 -1
  3. data/CHANGELOG.md +9 -0
  4. data/Gemfile +1 -1
  5. data/Gemfile.lock +16 -14
  6. data/Guardfile +2 -2
  7. data/README.markdown +11 -7
  8. data/Rakefile +1 -1
  9. data/ipizza.gemspec +9 -9
  10. data/lib/ipizza.rb +3 -0
  11. data/lib/ipizza/authentication.rb +15 -0
  12. data/lib/ipizza/authentication_request.rb +1 -1
  13. data/lib/ipizza/authentication_response.rb +22 -9
  14. data/lib/ipizza/config.rb +3 -3
  15. data/lib/ipizza/payment.rb +4 -4
  16. data/lib/ipizza/payment_request.rb +1 -1
  17. data/lib/ipizza/payment_response.rb +15 -7
  18. data/lib/ipizza/provider.rb +8 -12
  19. data/lib/ipizza/provider/base.rb +90 -0
  20. data/lib/ipizza/provider/krediidipank.rb +1 -47
  21. data/lib/ipizza/provider/lhv.rb +4 -0
  22. data/lib/ipizza/provider/nordea/authentication_request.rb +2 -2
  23. data/lib/ipizza/provider/nordea/authentication_response.rb +7 -3
  24. data/lib/ipizza/provider/nordea/payment_request.rb +2 -2
  25. data/lib/ipizza/provider/nordea/payment_response.rb +4 -4
  26. data/lib/ipizza/provider/sampo.rb +1 -46
  27. data/lib/ipizza/provider/seb.rb +1 -78
  28. data/lib/ipizza/provider/swedbank.rb +1 -66
  29. data/lib/ipizza/request.rb +9 -2
  30. data/lib/ipizza/response.rb +7 -9
  31. data/lib/ipizza/util.rb +9 -5
  32. data/lib/ipizza/version.rb +2 -2
  33. data/spec/certificates/pangalink_danske_bank_cert.pem +22 -0
  34. data/spec/certificates/pangalink_danske_bank_key.pem +27 -0
  35. data/spec/certificates/pangalink_danske_user_key.pem +27 -0
  36. data/spec/certificates/pangalink_krediidipank_bank_cert.pem +22 -0
  37. data/spec/certificates/pangalink_krediidipank_bank_key.pem +27 -0
  38. data/spec/certificates/pangalink_krediidipank_user_key.pem +27 -0
  39. data/spec/certificates/pangalink_lhv_bank_cert.pem +22 -0
  40. data/spec/certificates/pangalink_lhv_bank_key.pem +27 -0
  41. data/spec/certificates/pangalink_lhv_user_key.pem +27 -0
  42. data/spec/certificates/pangalink_seb_bank_cert.pem +16 -0
  43. data/spec/certificates/pangalink_seb_bank_key.pem +15 -0
  44. data/spec/certificates/pangalink_seb_user_key.pem +15 -0
  45. data/spec/certificates/pangalink_swedbank_bank_cert.pem +22 -0
  46. data/spec/certificates/pangalink_swedbank_bank_key.pem +27 -0
  47. data/spec/certificates/pangalink_swedbank_user_key.pem +27 -0
  48. data/spec/config/config.yml +39 -6
  49. data/spec/config/plain_config.yml +3 -3
  50. data/spec/ipizza/authentication_response_spec.rb +11 -9
  51. data/spec/ipizza/config_spec.rb +9 -10
  52. data/spec/ipizza/provider/krediidipank_spec.rb +89 -0
  53. data/spec/ipizza/provider/lhv_spec.rb +89 -0
  54. data/spec/ipizza/provider/nordea/authentication_response_spec.rb +3 -3
  55. data/spec/ipizza/provider/sampo_spec.rb +85 -0
  56. data/spec/ipizza/provider/seb_spec.rb +60 -30
  57. data/spec/ipizza/provider/swedbank_spec.rb +63 -34
  58. data/spec/ipizza/provider_spec.rb +9 -1
  59. data/spec/ipizza/util_spec.rb +5 -1
  60. data/spec/spec_helper.rb +1 -1
  61. data/spec/support/pizza.rb +1 -1
  62. metadata +45 -25
  63. data/spec/certificates/bank.crt +0 -21
  64. data/spec/certificates/bank.csr +0 -17
  65. data/spec/certificates/bank.key +0 -27
  66. data/spec/certificates/bank.pub +0 -1
  67. data/spec/certificates/dealer.key +0 -30
  68. data/spec/certificates/dealer.pub +0 -1
  69. data/spec/certificates/seb_test_priv.pem +0 -16
  70. data/spec/certificates/seb_test_pub.crt +0 -20
  71. data/spec/certificates/seb_test_pub.pem +0 -20
  72. data/spec/certificates/swedbank_production.pem +0 -48
@@ -1,50 +1,4 @@
1
1
  module Ipizza::Provider
2
- class Krediidipank
3
-
4
- class << self
5
- attr_accessor :service_url, :return_url, :file_key, :key_secret, :file_cert, :snd_id, :encoding, :lang, :rec_acc, :rec_name
6
- end
7
-
8
- def payment_request(payment, service = 1002)
9
- req = Ipizza::PaymentRequest.new
10
- req.service_url = self.class.service_url
11
- req.sign_params = {
12
- 'VK_SERVICE' => service.to_s,
13
- 'VK_VERSION' => '008',
14
- 'VK_SND_ID' => self.class.snd_id,
15
- 'VK_STAMP' => payment.stamp,
16
- 'VK_AMOUNT' => sprintf('%.2f', payment.amount),
17
- 'VK_CURR' => payment.currency,
18
- 'VK_REF' => Ipizza::Util.sign_731(payment.refnum),
19
- 'VK_MSG' => payment.message
20
- }
21
-
22
- if service == 1001
23
- req.sign_params['VK_ACC'] = self.class.rec_acc
24
- req.sign_params['VK_NAME'] = self.class.rec_name
25
- end
26
-
27
- req.extra_params = {
28
- 'VK_CHARSET' => self.class.encoding,
29
- 'VK_RETURN' => self.class.return_url,
30
- 'VK_LANG' => self.class.lang
31
- }
32
-
33
- if service == 1001
34
- param_order = ['VK_SERVICE', 'VK_VERSION', 'VK_SND_ID', 'VK_STAMP', 'VK_AMOUNT', 'VK_CURR', 'VK_ACC', 'VK_NAME', 'VK_REF', 'VK_MSG']
35
- else
36
- param_order = ['VK_SERVICE', 'VK_VERSION', 'VK_SND_ID', 'VK_STAMP', 'VK_AMOUNT', 'VK_CURR', 'VK_REF', 'VK_MSG']
37
- end
38
-
39
- req.sign(self.class.file_key, self.class.key_secret, param_order)
40
- req
41
- end
42
-
43
- def payment_response(params)
44
- response = Ipizza::PaymentResponse.new(params)
45
- response.verify(self.class.file_cert)
46
-
47
- return response
48
- end
2
+ class Krediidipank < Ipizza::Provider::Base
49
3
  end
50
4
  end
@@ -0,0 +1,4 @@
1
+ module Ipizza::Provider
2
+ class Lhv < Ipizza::Provider::Base
3
+ end
4
+ end
@@ -18,7 +18,7 @@ module Ipizza::Provider
18
18
  private
19
19
 
20
20
  def mac_data_string(key)
21
- order = ['ACTION_ID', 'VERS', 'RCVID', 'LANGCODE', 'STAMP', 'IDTYPE', 'RETLINK', 'CANLINK', 'REJLINK', 'KEYVERS', 'ALG']
21
+ order = %w(ACTION_ID VERS RCVID LANGCODE STAMP IDTYPE RETLINK CANLINK REJLINK KEYVERS ALG)
22
22
 
23
23
  datastr = order.inject('') do |memo, param|
24
24
  memo << params[param].to_s << '&'
@@ -26,4 +26,4 @@ module Ipizza::Provider
26
26
  datastr << key << '&'
27
27
  end
28
28
  end
29
- end
29
+ end
@@ -27,11 +27,15 @@ module Ipizza::Provider
27
27
  def info_social_security_id
28
28
  valid? ? @params['B02K_CUSTID'] : ''
29
29
  end
30
-
30
+
31
+ def authentication_info
32
+ @authentication_info ||= Ipizza::Authentication.new(user_name: info_name, user_id: info_social_security_id)
33
+ end
34
+
31
35
  private
32
36
 
33
37
  def mac_data_string(key)
34
- order = ['VERS', 'TIMESTMP', 'IDNBR', 'STAMP', 'CUSTNAME', 'KEYVERS', 'ALG', 'CUSTID', 'CUSTTYPE']
38
+ order = %w(VERS TIMESTMP IDNBR STAMP CUSTNAME KEYVERS ALG CUSTID CUSTTYPE)
35
39
 
36
40
  datastr = order.inject('') do |memo, param|
37
41
  memo << @params["B02K_#{param}"].to_s << '&'
@@ -39,4 +43,4 @@ module Ipizza::Provider
39
43
  datastr << key << '&'
40
44
  end
41
45
  end
42
- end
46
+ end
@@ -18,7 +18,7 @@ module Ipizza::Provider
18
18
  private
19
19
 
20
20
  def mac_data_string(key)
21
- order = ['VERSION', 'STAMP', 'RCV_ID', 'AMOUNT', 'REF', 'DATE', 'CUR']
21
+ order = %w(VERSION STAMP RCV_ID AMOUNT REF DATE CUR)
22
22
 
23
23
  datastr = order.inject('') do |memo, param|
24
24
  memo << params[param].to_s
@@ -30,4 +30,4 @@ module Ipizza::Provider
30
30
  datastr
31
31
  end
32
32
  end
33
- end
33
+ end
@@ -13,7 +13,7 @@ module Ipizza::Provider
13
13
  end
14
14
 
15
15
  def success?
16
- if @valid && !@params['RETURN_PAID'].blank? then true else false end
16
+ @valid && !@params['RETURN_PAID'].blank?
17
17
  end
18
18
 
19
19
  def valid?
@@ -21,13 +21,13 @@ module Ipizza::Provider
21
21
  end
22
22
 
23
23
  def payment_info
24
- @payment_info ||= Ipizza::Payment.new(:stamp => @params['RETURN_STAMP'], :refnum => @params['RETURN_REF'])
24
+ @payment_info ||= Ipizza::Payment.new(stamp: @params['RETURN_STAMP'], refnum: @params['RETURN_REF'])
25
25
  end
26
26
 
27
27
  private
28
28
 
29
29
  def mac_data_string(key)
30
- order = ['RETURN_VERSION', 'RETURN_STAMP', 'RETURN_REF', 'RETURN_PAID']
30
+ order = %w(RETURN_VERSION RETURN_STAMP RETURN_REF RETURN_PAID)
31
31
 
32
32
  datastr = order.inject('') do |memo, param|
33
33
  memo << @params[param].to_s
@@ -40,4 +40,4 @@ module Ipizza::Provider
40
40
  datastr
41
41
  end
42
42
  end
43
- end
43
+ end
@@ -1,49 +1,4 @@
1
1
  module Ipizza::Provider
2
- class Sampo
3
-
4
- class << self
5
- attr_accessor :service_url, :return_url, :file_key, :key_secret, :file_cert, :snd_id, :lang, :rec_acc, :rec_name
6
- end
7
-
8
- def payment_request(payment, service = 1002)
9
- req = Ipizza::PaymentRequest.new
10
- req.service_url = self.class.service_url
11
- req.sign_params = {
12
- 'VK_SERVICE' => service.to_s,
13
- 'VK_VERSION' => '008',
14
- 'VK_SND_ID' => self.class.snd_id,
15
- 'VK_STAMP' => payment.stamp,
16
- 'VK_AMOUNT' => sprintf('%.2f', payment.amount),
17
- 'VK_CURR' => payment.currency,
18
- 'VK_REF' => Ipizza::Util.sign_731(payment.refnum),
19
- 'VK_MSG' => payment.message
20
- }
21
-
22
- if service == 1001
23
- req.sign_params['VK_ACC'] = self.class.rec_acc
24
- req.sign_params['VK_NAME'] = self.class.rec_name
25
- end
26
-
27
- req.extra_params = {
28
- 'VK_RETURN' => self.class.return_url,
29
- 'VK_LANG' => self.class.lang
30
- }
31
-
32
- if service == 1001
33
- param_order = ['VK_SERVICE', 'VK_VERSION', 'VK_SND_ID', 'VK_STAMP', 'VK_AMOUNT', 'VK_CURR', 'VK_ACC', 'VK_NAME', 'VK_REF', 'VK_MSG']
34
- else
35
- param_order = ['VK_SERVICE', 'VK_VERSION', 'VK_SND_ID', 'VK_STAMP', 'VK_AMOUNT', 'VK_CURR', 'VK_REF', 'VK_MSG']
36
- end
37
-
38
- req.sign(self.class.file_key, self.class.key_secret, param_order)
39
- req
40
- end
41
-
42
- def payment_response(params)
43
- response = Ipizza::PaymentResponse.new(params)
44
- response.verify(self.class.file_cert)
45
-
46
- return response
47
- end
2
+ class Sampo < Ipizza::Provider::Base
48
3
  end
49
4
  end
@@ -1,81 +1,4 @@
1
1
  module Ipizza::Provider
2
- class Seb
3
-
4
- class << self
5
- attr_accessor :service_url, :return_url, :cancel_url, :file_key, :key_secret, :file_cert, :snd_id, :encoding, :rec_acc, :rec_name
6
- end
7
-
8
- def payment_request(payment, service = 1002)
9
- req = Ipizza::PaymentRequest.new
10
- req.service_url = self.class.service_url
11
- req.sign_params = {
12
- 'VK_SERVICE' => service.to_s,
13
- 'VK_VERSION' => '008',
14
- 'VK_SND_ID' => self.class.snd_id,
15
- 'VK_STAMP' => payment.stamp,
16
- 'VK_AMOUNT' => sprintf('%.2f', payment.amount),
17
- 'VK_CURR' => payment.currency,
18
- 'VK_REF' => Ipizza::Util.sign_731(payment.refnum),
19
- 'VK_MSG' => payment.message
20
- }
21
-
22
- # TODO: add 1001 support
23
- # if service == 1001
24
- # req.sign_params['VK_ACC'] = self.rec_acc
25
- # req.sign_params['VK_NAME'] = self.rec_name
26
- # end
27
-
28
- req.extra_params = {
29
- 'VK_CHARSET' => self.class.encoding,
30
- 'VK_RETURN' => self.class.return_url,
31
- 'VK_CANCEL' => self.class.cancel_url
32
- }
33
-
34
- if service == 1001
35
- param_order = ['VK_SERVICE', 'VK_VERSION', 'VK_SND_ID', 'VK_STAMP', 'VK_AMOUNT', 'VK_CURR', 'VK_ACC', 'VK_NAME', 'VK_REF', 'VK_MSG']
36
- else
37
- param_order = ['VK_SERVICE', 'VK_VERSION', 'VK_SND_ID', 'VK_STAMP', 'VK_AMOUNT', 'VK_CURR', 'VK_REF', 'VK_MSG']
38
- end
39
-
40
- req.sign(self.class.file_key, self.class.key_secret, param_order)
41
- req
42
- end
43
-
44
- def payment_response(params)
45
- response = Ipizza::PaymentResponse.new(params)
46
- response.verify(self.class.file_cert)
47
-
48
- return response
49
- end
50
-
51
- def authentication_request(service_no = 4001)
52
- req = Ipizza::AuthenticationRequest.new
53
- req.service_url = self.class.service_url
54
- req.sign_params = {
55
- 'VK_SERVICE' => service_no,
56
- 'VK_VERSION' => '008',
57
- 'VK_SND_ID' => self.class.snd_id,
58
- 'VK_REPLY' => '3002',
59
- 'VK_RETURN' => self.class.return_url,
60
- 'VK_DATE' => Date.today.strftime('%d.%m.%Y'),
61
- 'VK_TIME' => Time.now.strftime('%H:%M:%S')
62
- }
63
-
64
- req.extra_params = {
65
- 'VK_CHARSET' => self.class.encoding
66
- }
67
-
68
- param_order = ['VK_SERVICE', 'VK_VERSION', 'VK_SND_ID', 'VK_REPLY', 'VK_RETURN', 'VK_DATE', 'VK_TIME']
69
-
70
- req.sign(self.class.file_key, self.class.key_secret, param_order)
71
- req
72
- end
73
-
74
- def authentication_response(params)
75
- response = Ipizza::AuthenticationResponse.new(params)
76
- response.verify(self.class.file_cert)
77
- return response
78
- end
79
-
2
+ class Seb < Ipizza::Provider::Base
80
3
  end
81
4
  end
@@ -1,69 +1,4 @@
1
1
  module Ipizza::Provider
2
- class Swedbank
3
-
4
- class << self
5
- attr_accessor :service_url, :return_url, :cancel_url, :file_key, :key_secret, :file_cert, :snd_id, :encoding
6
- end
7
-
8
- def payment_request(payment, service = 1002)
9
- req = Ipizza::PaymentRequest.new
10
- req.service_url = self.class.service_url
11
- req.sign_params = {
12
- 'VK_SERVICE' => '1002',
13
- 'VK_VERSION' => '008',
14
- 'VK_SND_ID' => self.class.snd_id,
15
- 'VK_STAMP' => payment.stamp,
16
- 'VK_AMOUNT' => sprintf('%.2f', payment.amount),
17
- 'VK_CURR' => payment.currency,
18
- 'VK_REF' => Ipizza::Util.sign_731(payment.refnum),
19
- 'VK_MSG' => payment.message
20
- }
21
-
22
- req.extra_params = {
23
- 'VK_CHARSET' => self.class.encoding,
24
- 'VK_RETURN' => self.class.return_url,
25
- 'VK_CANCEL' => self.class.cancel_url
26
- }
27
-
28
- param_order = ['VK_SERVICE', 'VK_VERSION', 'VK_SND_ID', 'VK_STAMP', 'VK_AMOUNT', 'VK_CURR', 'VK_REF', 'VK_MSG']
29
-
30
- req.sign(self.class.file_key, self.class.key_secret, param_order)
31
- req
32
- end
33
-
34
- def payment_response(params)
35
- response = Ipizza::PaymentResponse.new(params)
36
- response.verify(self.class.file_cert)
37
- return response
38
- end
39
-
40
- def authentication_request(service_no = 4001)
41
- req = Ipizza::AuthenticationRequest.new
42
- req.service_url = self.class.service_url
43
- req.sign_params = {
44
- 'VK_SERVICE' => service_no,
45
- 'VK_VERSION' => '008',
46
- 'VK_SND_ID' => self.class.snd_id,
47
- 'VK_REPLY' => '3002',
48
- 'VK_RETURN' => self.class.return_url,
49
- 'VK_DATE' => Date.today.strftime('%d.%m.%Y'),
50
- 'VK_TIME' => Time.now.strftime('%H:%M:%S')
51
- }
52
-
53
- req.extra_params = {
54
- 'VK_ENCODING' => self.class.encoding
55
- }
56
-
57
- param_order = ['VK_SERVICE', 'VK_VERSION', 'VK_SND_ID', 'VK_REPLY', 'VK_RETURN', 'VK_DATE', 'VK_TIME']
58
-
59
- req.sign(self.class.file_key, self.class.key_secret, param_order)
60
- req
61
- end
62
-
63
- def authentication_response(params)
64
- response = Ipizza::AuthenticationResponse.new(params)
65
- response.verify(self.class.file_cert, self.class.encoding)
66
- return response
67
- end
2
+ class Swedbank < Ipizza::Provider::Base
68
3
  end
69
4
  end
@@ -4,7 +4,14 @@ module Ipizza
4
4
  attr_accessor :extra_params
5
5
  attr_accessor :sign_params
6
6
  attr_accessor :service_url
7
-
7
+
8
+ PARAM_ORDER = {
9
+ '1011' => %w(VK_SERVICE VK_VERSION VK_SND_ID VK_STAMP VK_AMOUNT VK_CURR VK_ACC VK_NAME VK_REF VK_MSG VK_RETURN VK_CANCEL VK_DATETIME),
10
+ '1012' => %w(VK_SERVICE VK_VERSION VK_SND_ID VK_STAMP VK_AMOUNT VK_CURR VK_REF VK_MSG VK_RETURN VK_CANCEL VK_DATETIME),
11
+ '4011' => %w(VK_SERVICE VK_VERSION VK_SND_ID VK_REPLY VK_RETURN VK_DATETIME VK_RID),
12
+ '4012' => %w(VK_SERVICE VK_VERSION VK_SND_ID VK_REC_ID VK_NONCE VK_RETURN VK_DATETIME VK_RID)
13
+ }
14
+
8
15
  def sign(privkey_path, privkey_secret, order, mac_param = 'VK_MAC')
9
16
  signature = Ipizza::Util.sign(privkey_path, privkey_secret, Ipizza::Util.mac_data_string(sign_params, order))
10
17
  self.sign_params[mac_param] = signature
@@ -14,4 +21,4 @@ module Ipizza
14
21
  sign_params.merge(extra_params)
15
22
  end
16
23
  end
17
- end
24
+ end
@@ -3,21 +3,19 @@ class Ipizza::Response
3
3
  attr_accessor :verify_params
4
4
  attr_accessor :verify_params_order
5
5
 
6
- @@response_param_order = {
7
- '1101' => ['VK_SERVICE', 'VK_VERSION', 'VK_SND_ID', 'VK_REC_ID', 'VK_STAMP', 'VK_T_NO', 'VK_AMOUNT', 'VK_CURR', 'VK_REC_ACC', 'VK_REC_NAME', 'VK_SND_ACC', 'VK_SND_NAME', 'VK_REF', 'VK_MSG', 'VK_T_DATE'],
8
- '3002' => ['VK_SERVICE', 'VK_VERSION', 'VK_USER', 'VK_DATE', 'VK_TIME', 'VK_SND_ID', 'VK_INFO'],
9
- '1901' => ['VK_SERVICE', 'VK_VERSION', 'VK_SND_ID', 'VK_REC_ID', 'VK_STAMP', 'VK_REF', 'VK_MSG'],
10
- '1902' => ['VK_SERVICE', 'VK_VERSION', 'VK_SND_ID', 'VK_REC_ID', 'VK_STAMP', 'VK_REF', 'VK_MSG', 'VK_ERROR_CODE']
6
+ PARAM_ORDER = {
7
+ '1111' => %w(VK_SERVICE VK_VERSION VK_SND_ID VK_REC_ID VK_STAMP VK_T_NO VK_AMOUNT VK_CURR VK_REC_ACC VK_REC_NAME VK_SND_ACC VK_SND_NAME VK_REF VK_MSG VK_T_DATETIME),
8
+ '3012' => %w(VK_SERVICE VK_VERSION VK_USER VK_DATETIME VK_SND_ID VK_REC_ID VK_USER_NAME VK_USER_ID VK_COUNTRY VK_OTHER VK_TOKEN VK_RID),
9
+ '3013' => %w(VK_SERVICE VK_VERSION VK_DATETIME VK_SND_ID VK_REC_ID VK_NONCE VK_USER_NAME VK_USER_ID VK_COUNTRY VK_OTHER VK_TOKEN VK_RID),
10
+ '1911' => %w(VK_SERVICE VK_VERSION VK_SND_ID VK_REC_ID VK_STAMP VK_REF VK_MSG)
11
11
  }
12
12
 
13
13
  def initialize(params)
14
14
  @params = params
15
15
  end
16
16
 
17
- def verify(certificate_path, charset = 'UTF-8')
18
- param_order = @@response_param_order[@params['VK_SERVICE']]
19
- verify_params = param_order.inject(Hash.new) { |h, p| h[p] = @params[p]; h }
20
- mac_string = Ipizza::Util.mac_data_string(verify_params, param_order)
17
+ def verify(certificate_path)
18
+ mac_string = Ipizza::Util.mac_data_string(@params, PARAM_ORDER[@params['VK_SERVICE']])
21
19
 
22
20
  @valid = Ipizza::Util.verify_signature(certificate_path, @params['VK_MAC'], mac_string)
23
21
  end
@@ -56,14 +56,18 @@ module Ipizza
56
56
  end
57
57
  end
58
58
 
59
+ def time_to_iso8601(time)
60
+ time.strftime('%Y-%m-%dT%H:%M:%S%z')
61
+ end
62
+
59
63
  private
60
64
 
61
- # p(x) is length of the field x represented by three digits
65
+ # p(x) is length of the field x represented by three digits. When request encoding is in UTF-8 then characters count is calculated otherwise characters byte size is used.
62
66
  def func_p(val)
63
- if RUBY_VERSION < '1.9'
64
- sprintf("%03i", val.size)
65
- else
66
- sprintf("%03i", val.bytesize)
67
+ if RUBY_VERSION < '1.9' || val.encoding.name == 'UTF-8'
68
+ sprintf('%03i', val.size)
69
+ else
70
+ sprintf('%03i', val.bytesize)
67
71
  end
68
72
  end
69
73
  end
@@ -1,3 +1,3 @@
1
1
  module Ipizza
2
- VERSION = '1.0.0'
3
- end
2
+ VERSION = '2.0.0'
3
+ end
@@ -0,0 +1,22 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIDnjCCAoYCCQClrBEsOVn1vzANBgkqhkiG9w0BAQUFADCBkDELMAkGA1UEBhMC
3
+ RUUxETAPBgNVBAgMCEhhcmp1bWFhMRAwDgYDVQQHDAdUYWxsaW5uMREwDwYDVQQK
4
+ DAhFZGljeSBPVTERMA8GA1UECwwIYmFua2xpbmsxFjAUBgNVBAMMDXBhbmdhbGlu
5
+ ay5uZXQxHjAcBgkqhkiG9w0BCQEWD3RhbmVsQGVkaWN5LmNvbTAeFw0xNTAyMDIx
6
+ MDI3NTBaFw0zNTAxMjgxMDI3NTBaMIGQMQswCQYDVQQGEwJFRTERMA8GA1UECAwI
7
+ SGFyanVtYWExEDAOBgNVBAcMB1RhbGxpbm4xETAPBgNVBAoMCEVkaWN5IE9VMREw
8
+ DwYDVQQLDAhiYW5rbGluazEWMBQGA1UEAwwNcGFuZ2FsaW5rLm5ldDEeMBwGCSqG
9
+ SIb3DQEJARYPdGFuZWxAZWRpY3kuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
10
+ MIIBCgKCAQEAuxA7bXTG7uOub63Z/BHMNnD5QtMgEZLBsiARrdHaLCq0zmuk3lF8
11
+ 0jkihPrmuuNGKDBirsfxIX2cLpPgxChNb+F2NaOKc09eb4kb+Kgb6rXsHUCnhzHY
12
+ 4A1/YJ7r542aEGN/zdE2vj2Ci/H3ylOhGjmKaclSao3Je8tmiWgftEBO5ogWrHl6
13
+ Hdn4WoOuytog2NoPsI+EdzjEqRs0s9DO4n6RwSKNa0GrRjySWe2HZ977Mm8+3yc0
14
+ jZGsIHLHsqG+oMiFxpZ5PHovT/ZOEUp6uMB9N3MIUT0u1oSCduPYKWtRbky0MyUL
15
+ cx4mhBXzKaCmoQzZu3w952oyYqjIk4YquwIDAQABMA0GCSqGSIb3DQEBBQUAA4IB
16
+ AQCaoWTP6l6JVIiyLka5KHygz1Y5ICxa1XRz0tkSpfOpTRE9oxmJ/lnynOuJ21xA
17
+ cunc2ObLOX5FAQrt2STUtl7NNQ4GRRA5Y7+PUaqFr8r4SfB5B6/ZQoiBfE9h2dHm
18
+ DI5QlpaR2Z2MgiRCb4H4avBBKpXU6hvy5v6DBNV7w13KvRhz9whhcjANvterdyMp
19
+ gR24mgsTvbb9oE/s7AqjlJfAu+LPUPNRKDA/N/ZYeYUxLvRVJUdW5/3CZ6dXniH/
20
+ FpdVJmOX9l9mq7vHchLdGbRnLzUK1TFDZA1g8ubei0hEVHQJxhLx3IWVvGHF1tXB
21
+ 6m9i9JQpHu9zLWhzmWQWVLFe
22
+ -----END CERTIFICATE-----