bank_link 0.0.2 → 0.0.3

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: cf7f8b590b2742c1ae490a77ad95036bf87eac3a
4
- data.tar.gz: e81b6cbbb3aa1389d868076e81f432e0bd8a7528
3
+ metadata.gz: 6f1f740303014c35a3e0973b7e434e2c014279aa
4
+ data.tar.gz: 98aa010fd3057255e52dc0a53458063a31e60d52
5
5
  SHA512:
6
- metadata.gz: 819995ba76040b17c1e8090b40c25704e8bf35d209940c8da6eb8c31c91da9ae142ad7938c82c017dd59d8eb35f302b36ea5994d0fdf1d4479fb3a4be865e857
7
- data.tar.gz: e404ddf596bba1842b645592f56f728f404ed92d412f31b1b8c396f31de1cf2042dc5f9fb4967bfea601cafbccb4bf82c19e5b5526b276797d6ec72c4b9a0cf9
6
+ metadata.gz: 223593b63c1650511b08874da3ed73ceadf58a3850cd9a557b744ebbe9fbafc864c2f7b5126665d352f24f4c6603066f3c3e8b2826e19d33dd21cd0f5b4708a5
7
+ data.tar.gz: e18324989715dc1bdf7798264e955002ee71aec21f6ac66c12e9003e6a521650f6bd02ed52f59e87c63bfde51eefee58daea527069021a1a7aa55048f3629159
data/README.md CHANGED
@@ -21,69 +21,108 @@ $ gem install bank_link
21
21
  ### Set Up Initializer
22
22
  ```ruby
23
23
  BankLink.configuration do |config|
24
- config.default_encoding = "UTF-8" #used only if link.data.encoding_key is set
25
-
26
- config.links(:name_of_link, "https://url.of.link") do |data, form|
27
- form[:VK_SERVICE] = "1001"
28
- form[:VK_VERSION] = "008"
29
- form[:VK_AMOUNT] = Proc.new { |link, object| object.price }
30
- form[:VK_CURR] = "EUR"
31
- ```
32
- #### Additional Options
33
- ##### Encoding
24
+ ```
34
25
  ```ruby
35
- data.encoding_key = "VK_CHARSET"
36
- data.encoding_key = "VK_ENCODING"
37
- data.encoding = "UTF-8"
26
+ BankLink do |config|
38
27
  ```
39
- ##### Mac
28
+ #### Override mac fields if you so wish
29
+ Defaults can be found in [mac_fields.yml](https://github.com/jhaesus/bank_link/blob/master/mac_fields.yml)
40
30
  ```ruby
41
- data.mac_class = BankLink::Mac::VK #default
42
- data.mac_key = File.read("my/private_key.pem")
43
- data.mac_key_passphrase = File.read("my_password")
44
- data.algorithm = OpenSSL::Digest::SHA1 #default for VK
45
-
46
- data.mac_class = BankLink::Mac::Solo
47
- data.mac_key = File.read("my_key.txt")
48
- data.algorithm = OpenSSL::Digest::MD5 #default for Solo
49
-
31
+ config.mac_fields do |mac_fields|
32
+ mac_fields.SOLOPMT_VERSION["0003"] = [
33
+ :VERSION,
34
+ :STAMP,
35
+ :RCV_ID,
36
+ :AMOUNT,
37
+ :REF,
38
+ :DATE,
39
+ :CUR
40
+ ]
41
+ end
42
+ ```
43
+ #### Add banks
44
+ ```ruby
45
+ config.banks :name_of_bank do |bank|
46
+ ```
47
+ ##### Change bank settings
48
+ ```ruby
49
+ bank.settings do |settings|
50
+ ```
51
+ ###### Encoding
52
+ ```ruby
53
+ settings.encoding_key = "VK_CHARSET"
54
+ settings.encoding = "UTF-8"
55
+ ```
56
+ ###### Private/Public keys and passphrases
57
+ ```ruby
58
+ settings.private_key = File.read("my/private_key.pem")
59
+ settings.private_key_passphrase = File.read("my_password")
60
+ settings.public_key = File.read("bank/certificate")
61
+ ```
62
+ ###### Mac calculation settings
63
+ ```ruby
64
+ settings.mac_class = BankLink::Mac::VK
65
+ settings.digest = OpenSSL::Digest::SHA1
50
66
 
67
+ settings.mac_class = BankLink::Mac::Solo
68
+ settings.digest = OpenSSL::Digest::MD5
51
69
 
52
- data.mac_class = BankLink::Mac::Custom
70
+ settings.mac_class = BankLink::Mac::Custom #Or roll your own
71
+ end
72
+ ```
73
+ ##### Add link(s)
74
+ All the correct form fields can be found in various bank documentations, [listed below](https://github.com/jhaesus/bank_link/edit/master/README.md#additional-info). "Have fun"
75
+ ```ruby
76
+ bank.payment_link "https://url.of.link" do |form|
77
+ form[:VK_SERVICE] = "1001"
78
+ form[:VK_VERSION] = "008"
79
+ form[:VK_AMOUNT] = Proc.new { |link, object| object.price }
80
+ form[:VK_CURR] = "EUR"
81
+ end
82
+ bank.authorization_link "https://url.of.link/auth" do |form|
83
+ form[:VK_SERVICE] = "1001"
84
+ form[:VK_VERSION] = "008"
85
+ end
53
86
  ```
54
87
  ### View Helper
55
88
  ```haml
56
- = bank_links @object do |link|
57
- = submit_tag(link.name)
89
+ = payment_links @object do |link|
90
+ = submit_tag(link.bank.name)
58
91
  ```
59
92
  ```haml
60
- - BankLink.each do |link|
93
+ - BankLink.payment_links do |link|
61
94
  = bank_link_tag link, @object do
62
- = submit_tag(link.name)
95
+ = submit_tag(link.bank.name)
63
96
  ```
64
- #### Additional Options
65
- ##### Override/Set Form Values
97
+ #### Override/Set Form Values
66
98
  ```haml
67
- - BankLink.each do |link|
99
+ - payment_links @object, { :values => { :VK_AMOUNT => Proc.new { |link, object| object.price * 2 } }} do |link|
100
+ = submit_tag
101
+ ```
102
+ ```haml
103
+ - BankLink.payment_links do |link|
68
104
  = bank_link_tag link, @object, { :values => {:VK_AMOUNT => @object.price }} do
69
105
  = submit_tag
70
106
  ```
71
- ##### Override/Set Form Attributes
107
+ #### Override/Set Form Attributes
72
108
  ```haml
73
- - BankLink.each do |link|
109
+ - payment_links @object, { :form => { :data => { :something => "other" } } } do |link|
110
+ = submit_tag
111
+ ```
112
+ ```haml
113
+ - BankLink.payment_links do |link|
74
114
  = bank_link_tag link, @object, { :form => {:method => :get }} do
75
115
  = submit_tag
76
116
  ```
77
-
78
- #### Verifying Responses
117
+ ### Verifying Responses
79
118
  ```ruby
80
- link = BankLink.configuration.links.name_of_link
119
+ link = BankLink.configuration.banks.name_of_link
81
120
  link.verify params
82
121
  ```
83
122
 
84
- ### Additional Info
123
+ ## Additional Info
85
124
  [Pangalink.net](https://pangalink.net/info)
86
- #### Documentations
125
+ ### Documentations
87
126
  - [Danske Bank Documentation](http://www.danskebank.ee/et/14732.html)
88
127
  - [Krediidipank Documentation](http://www.krediidipank.ee/business/settlements/bank-link/tehniline_kirjeldus.pdf)
89
128
  - [LHV Documentation](http://www.lhv.ee/images/docs/Bank_Link_Technical_Specification-ET.pdf)
data/bank_link.gemspec CHANGED
@@ -18,6 +18,8 @@ Gem::Specification.new do |spec|
18
18
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
19
  spec.require_paths = ["lib"]
20
20
 
21
+ spec.add_dependency "hashie"
22
+
21
23
  spec.add_development_dependency "bundler"
22
24
  spec.add_development_dependency "rake"
23
25
  spec.add_development_dependency "rspec", "~> 2"
@@ -0,0 +1,28 @@
1
+ require "bank_link/link"
2
+
3
+ module BankLink
4
+ class Bank
5
+ attr_accessor :name, :settings, :payment_link, :authorization_link
6
+
7
+ def initialize name, &block
8
+ self.name = name
9
+ self.settings = Hashie::Mash.new(
10
+ :mac_class => Mac::VK,
11
+ :digest => OpenSSL::Digest::SHA1
12
+ )
13
+ yield(self) if block_given?
14
+ end
15
+
16
+ def settings &block
17
+ block_given? ? yield(@settings) : @settings
18
+ end
19
+
20
+ def payment_link url=nil, &block
21
+ url ? (@payment_link = Link.new(self, url, &block)) : @payment_link
22
+ end
23
+
24
+ def authorization_link url=nil, &block
25
+ url ? (@authorization_link = Link.new(self, url, &block)) : @authorization_link
26
+ end
27
+ end
28
+ end
@@ -1,92 +1,44 @@
1
- require "bank_link/estruct"
2
- require "bank_link/link"
1
+ require "bank_link/bank"
3
2
  require "singleton"
4
3
 
5
4
  module BankLink
6
5
  class Configuration
7
6
  include Singleton
8
7
 
9
- attr_accessor :links, :mac_fields, :default_encoding
8
+ attr_accessor :banks, :mac_fields, :default_encoding
10
9
 
11
- def links name=nil, url=nil, &block
12
- if name && url
13
- links[name] = Link.new(name, url, &block)
10
+ def banks name=nil, &block
11
+ if name && block_given?
12
+ @banks[name] = Bank.new(name, &block)
13
+ elsif name
14
+ @banks[name]
14
15
  else
15
- @links ||= EStruct.new
16
+ @banks
16
17
  end
17
18
  end
18
19
 
19
- def each &block
20
- links.marshal_dump.each_value(&block)
20
+ def authorization_links &block
21
+ each_link :authorization_link, &block
22
+ end
23
+
24
+ def payment_links &block
25
+ each_link :payment_link, &block
21
26
  end
22
27
 
23
28
  def mac_fields &block
24
- block_given? ? yield(mac_fields) : (@mac_fields ||= EStruct.new)
29
+ block_given? ? yield(mac_fields) : (@mac_fields ||= Hashie::Mash.new)
25
30
  end
26
31
 
27
32
  def initialize
28
- mac_fields do |ml|
29
- ml.VK_SERVICE = EStruct.new(
30
- "1001" => [
31
- :VK_SERVICE,
32
- :VK_VERSION,
33
- :VK_SND_ID,
34
- :VK_STAMP,
35
- :VK_AMOUNT,
36
- :VK_CURR,
37
- :VK_ACC,
38
- :VK_NAME,
39
- :VK_REF,
40
- :VK_MSG
41
- ],
42
- "1101" => [
43
- :VK_SERVICE,
44
- :VK_VERSION,
45
- :VK_SND_ID,
46
- :VK_REC_ID,
47
- :VK_STAMP,
48
- :VK_T_NO,
49
- :VK_AMOUNT,
50
- :VK_CURR,
51
- :VK_REC_ACC,
52
- :VK_REC_NAME,
53
- :VK_SND_ACC,
54
- :VK_SND_NAME,
55
- :VK_REF,
56
- :VK_MSG,
57
- :VK_T_DATE
58
- ],
59
- "1901" => [
60
- :VK_SERVICE,
61
- :VK_VERSION,
62
- :VK_SND_ID,
63
- :VK_REC_ID,
64
- :VK_STAMP,
65
- :VK_REF,
66
- :VK_MSG
67
- ]
68
- )
69
- ml.SOLOPMT_VERSION = EStruct.new(
70
- "0003" => [
71
- :SOLOPMT_VERSION,
72
- :SOLOPMT_STAMP,
73
- :SOLOPMT_RCV_ID,
74
- :SOLOPMT_AMOUNT,
75
- :SOLOPMT_REF,
76
- :SOLOPMT_DATE,
77
- :SOLOPMT_CUR
78
- ],
79
- "0002" => [
80
- :SOLOPMT_VERSION,
81
- :SOLOPMT_STAMP,
82
- :SOLOPMT_RCV_ID,
83
- :SOLOPMT_AMOUNT,
84
- :SOLOPMT_REF,
85
- :SOLOPMT_DATE,
86
- :SOLOPMT_CUR
87
- ]
88
- )
33
+ file_data = YAML.load(File.read(File.dirname(__FILE__) + "/../../mac_fields.yml"))
34
+ file_data.each do |type, versions|
35
+ mac_fields { |mf| mf[type] = Hashie::Mash.new(versions) }
89
36
  end
37
+ @banks ||= Hashie::Mash.new
38
+ end
39
+
40
+ def each_link type, &block
41
+ banks.collect { |name, bank| bank.method(type).call() }.compact.each(&block)
90
42
  end
91
43
  end
92
- end
44
+ end
@@ -1,40 +1,47 @@
1
- require "bank_link/estruct"
2
- require "bank_link/mac"
3
-
4
1
  module BankLink
5
2
  class Link
6
- attr_accessor :name, :url, :data, :form
3
+ attr_accessor :bank, :url, :form
7
4
 
8
- def initialize name, url, &block
9
- self.name = name
5
+ def initialize bank, url, &block
6
+ self.bank = bank
10
7
  self.url = url
11
- self.data = EStruct.new(
12
- :mac_class => Mac::VK,
13
- :encoding => BankLink.configuration.default_encoding
14
- )
15
- self.form = EStruct.new
16
- yield(data, form) if block_given?
8
+ self.form = Hashie::Mash.new
9
+ yield(form) if block_given?
10
+ end
11
+
12
+ def settings *args, &block
13
+ bank.settings *args, &block
17
14
  end
18
15
 
19
16
  def processed_data object, overrides={}
20
- content = EStruct.new(form.marshal_dump.merge(overrides))
17
+ content = Hashie::Mash.new(form.merge(overrides))
18
+ apply_encoding content
19
+ calculate_keys content, object
20
+ calculate_mac content
21
+ content
22
+ end
21
23
 
24
+ def verify params
25
+ content = Hashie::Mash.new(params)
26
+ mac = settings.mac_class.new(self, content)
27
+ version = params[mac.query_key]
28
+ mac.verify version, params[mac.key]
29
+ end
30
+
31
+ def calculate_keys content, object
22
32
  content.each do |key, value|
23
33
  content[key] = content[key].call(self, object) if content[key].is_a?(Proc)
24
34
  end
35
+ end
25
36
 
26
- content[data.encoding_key] = data.encoding if data.encoding && data.encoding_key
37
+ def apply_encoding content
38
+ content[settings.encoding_key] = settings.encoding if settings.encoding && settings.encoding_key
39
+ end
27
40
 
28
- mac = data.mac_class.new(self, content)
41
+ def calculate_mac content
42
+ mac = settings.mac_class.new(self, content)
29
43
  content[mac.key] = mac.generate
30
- content
31
44
  end
32
45
 
33
- def verify params
34
- content = EStruct.new(params)
35
- mac = data.mac_class.new(self, content)
36
- version = params[mac.query_key]
37
- mac.verify version, params[mac.key]
38
- end
39
46
  end
40
- end
47
+ end
@@ -3,16 +3,8 @@ module BankLink
3
3
  class Base
4
4
  attr_accessor :link, :data
5
5
 
6
- def self.query_key
7
- raise NotImplementedError
8
- end
9
-
10
- def self.key
11
- raise NotImplementedError
12
- end
13
-
14
- def self.default_algorithm
15
- raise NotImplementedError
6
+ def settings *args, &block
7
+ link.settings *args, &block
16
8
  end
17
9
 
18
10
  def initialize link, data
@@ -20,30 +12,25 @@ module BankLink
20
12
  self.data = data
21
13
  end
22
14
 
23
- def generate
15
+ def generate *args
24
16
  raise NotImplementedError
25
17
  end
26
18
 
27
- def verify version, mac
28
- public_key = OpenSSL::X509::Certificate.new(link.data.public_key).public_key
29
- public_key.verify algorithm.new, Base64.strict_decode64(mac), request_data(version)
19
+ def key *args
20
+ raise NotImplementedError
30
21
  end
31
22
 
32
- def key
33
- self.class.key
23
+ def query_key *args
24
+ raise NotImplementedError
34
25
  end
35
26
 
36
- def query_key
37
- self.class.query_key
27
+ def verify *args
28
+ raise NotImplementedError
38
29
  end
39
30
 
40
- def order version
31
+ def keys version
41
32
  BankLink.configuration.mac_fields[query_key][version.intern]
42
33
  end
43
-
44
- def algorithm
45
- link.data.algorithm || self.class.default_algorithm
46
- end
47
34
  end
48
35
  end
49
36
  end
@@ -1,30 +1,25 @@
1
1
  require "bank_link/mac/base"
2
- require "openssl"
3
2
 
4
3
  module BankLink
5
4
  module Mac
6
5
  class Solo < BankLink::Mac::Base
7
- def self.query_key
6
+ def query_key
8
7
  :SOLOPMT_VERSION
9
8
  end
10
9
 
11
- def self.key
10
+ def key
12
11
  :SOLOPMT_MAC
13
12
  end
14
13
 
15
- def self.default_algorithm
16
- OpenSSL::Digest::MD5
17
- end
18
-
19
14
  def generate version=data[query_key]
20
- algorithm.hexdigest(request_data(version).join).upcase
15
+ settings.digest.hexdigest(request_data(version).join).upcase
21
16
  end
22
17
 
23
18
  private
24
19
  def request_data version
25
- order(version).collect { |key_name|
20
+ keys(version).collect { |key_name|
26
21
  field_for data[key_name].to_s
27
- } + [field_for(link.data.mac_key)]
22
+ } + [field_for(settings.private_key)]
28
23
  end
29
24
 
30
25
  def field_for value
@@ -6,27 +6,29 @@ require "base64"
6
6
  module BankLink
7
7
  module Mac
8
8
  class VK < BankLink::Mac::Base
9
- def self.query_key
9
+ def query_key
10
10
  :VK_SERVICE
11
11
  end
12
12
 
13
- def self.key
13
+ def key
14
14
  :VK_MAC
15
15
  end
16
16
 
17
- def self.default_algorithm
18
- OpenSSL::Digest::SHA1
19
- end
20
-
21
17
  def generate version=data[query_key]
22
18
  Base64.strict_encode64(
23
- algorithm_key.sign(algorithm.new, request_data(version))
19
+ private_key.sign(settings.digest.new, request_data(version))
24
20
  )
25
21
  end
26
22
 
23
+ def verify version, mac
24
+ public_key = OpenSSL::X509::Certificate.new(settings.public_key).public_key
25
+ public_key.verify settings.digest.new, Base64.strict_decode64(mac), request_data(version)
26
+ end
27
+
27
28
  private
28
- def algorithm_key
29
- OpenSSL::PKey::RSA.new(link.data.mac_key, link.data.mac_key_passphrase)
29
+
30
+ def private_key
31
+ OpenSSL::PKey::RSA.new(settings.private_key, settings.private_key_passphrase)
30
32
  end
31
33
 
32
34
  def field_for value
@@ -34,7 +36,7 @@ module BankLink
34
36
  end
35
37
 
36
38
  def request_data version
37
- order(version).collect { |key_name|
39
+ keys(version).collect { |key_name|
38
40
  field_for data[key_name].to_s
39
41
  }.flatten.join
40
42
  end
@@ -1,3 +1,3 @@
1
1
  module BankLink
2
- VERSION = "0.0.2"
2
+ VERSION = "0.0.3"
3
3
  end
@@ -1,19 +1,8 @@
1
- require "bank_link/estruct"
2
-
3
1
  module BankLink
4
2
  module ViewHelpers
5
3
  def bank_link_tag link, object=nil, options={}, &block
6
- form_data = BankLink::EStruct.new(link.processed_data(object, options[:values] || {}))
7
-
8
- form_options = { :action => link.url, :method => :post }
9
-
10
- if encoding_key = link.data.encoding_key
11
- if encoding = form_data[link.data.encoding_key]
12
- form_options[:"accept-charset"] = encoding
13
- end
14
- end
15
-
16
- form_options.merge!(options[:form] || {})
4
+ form_data = Hashie::Mash.new(link.processed_data(object, options[:values] || {}))
5
+ form_options = bank_link_form_options link, form_data, options
17
6
 
18
7
  content_tag(:form, form_options) do
19
8
  form_data.each do |key, value|
@@ -23,12 +12,36 @@ module BankLink
23
12
  end
24
13
  end
25
14
 
26
- def bank_links object=nil, options={}, &block
15
+ def authorization_links object=nil, options={}, &block
16
+ content_tag(:div, (options[:container] || {})) do
17
+ BankLink.authorization_links do |link|
18
+ concat(bank_link_tag(link, object, options, &block))
19
+ end
20
+ end
21
+ end
22
+
23
+ def payment_links object=nil, options={}, &block
27
24
  content_tag(:div, (options[:container] || {})) do
28
- BankLink.each do |link|
25
+ BankLink.payment_links do |link|
29
26
  concat(bank_link_tag(link, object, options, &block))
30
27
  end
31
28
  end
32
29
  end
30
+
31
+ private
32
+
33
+ def bank_link_form_options link, form_data, options={}
34
+ form_options = { :action => link.url, :method => :post }
35
+
36
+ if encoding_key = link.settings.encoding_key
37
+ if encoding = form_data[link.settings.encoding_key]
38
+ form_options[:"accept-charset"] = encoding
39
+ end
40
+ end
41
+
42
+ form_options.merge!(options[:form] || {})
43
+
44
+ form_options
45
+ end
33
46
  end
34
- end
47
+ end
data/lib/bank_link.rb CHANGED
@@ -1,5 +1,9 @@
1
1
  require "bank_link/version"
2
2
  require "bank_link/configuration"
3
+ require "bank_link/mac"
4
+
5
+ require "hashie"
6
+
3
7
  begin
4
8
  require "rails/all"
5
9
  rescue LoadError
@@ -13,8 +17,16 @@ module BankLink
13
17
  block_given? ? yield(configuration) : (@configuration ||= Configuration.instance)
14
18
  end
15
19
 
16
- def each &block
17
- configuration.each(&block)
20
+ def payment_links *args, &block
21
+ configuration.payment_links(*args, &block)
22
+ end
23
+
24
+ def authorization_links *args, &block
25
+ configuration.authorization_links(*args, &block)
18
26
  end
19
27
  end
20
28
  end
29
+
30
+ def BankLink &block
31
+ ::BankLink.configuration(&block)
32
+ end