bank_link 0.0.2 → 0.0.3

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: 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