bank_link 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 17edaa63bd0b16e3200d472d50a304c9672a78cf
4
+ data.tar.gz: 272d5a90cd589e4a4a7111551297f18a931760ff
5
+ SHA512:
6
+ metadata.gz: 38ede80101e30de26f795e396c3bd6f07a26d1af3bdcfea05e7ad144a9f953c251c9493ae77aaa6917f5df7c8583c06be6e11358fdfe85842e9e9433107a46cf
7
+ data.tar.gz: 13ec0a0f7ce8e98bbbd83083c0b2eb343be29ec1c368b786bf1f4df8867004a0517257c201662c61dc435718d4739347c3b781b21d677a5a8a2d262484a83373
data/.gitignore ADDED
@@ -0,0 +1,18 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
18
+ .rbx/
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --color --format documentation --require spec_helper
data/.travis.yml ADDED
@@ -0,0 +1,12 @@
1
+ language: ruby
2
+ rvm:
3
+ - 1.9.3
4
+ - 1.9.2
5
+ - jruby-18mode
6
+ - jruby-19mode
7
+ - rbx-18mode
8
+ - rbx-19mode
9
+ - ruby-head
10
+ - jruby-head
11
+ - 1.8.7
12
+ - ree
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in bank_link.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 Jahel
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,84 @@
1
+ # BankLink [![Gem Version](https://badge.fury.io/rb/bank_link.png)](http://badge.fury.io/rb/bank_link) [![Build Status](https://travis-ci.org/jhaesus/bank_link.png?branch=master)](https://travis-ci.org/jhaesus/bank_link)[![Dependency Status](https://gemnasium.com/jhaesus/bank_link.png)](https://gemnasium.com/jhaesus/bank_link)
2
+
3
+ Helper gem to simplify bank link usage in Rails projects
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+ ```ruby
9
+ gem 'bank_link'
10
+ ```
11
+ And then execute:
12
+ ```bash
13
+ $ bundle
14
+ ```
15
+ Or install it yourself as:
16
+ ```bash
17
+ $ gem install bank_link
18
+ ```
19
+ ## Usage
20
+
21
+ ### Set Up Initializer
22
+ ```ruby
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
34
+ ```ruby
35
+ data.encoding_key = "VK_CHARSET"
36
+ data.encoding_key = "VK_ENCODING"
37
+ data.encoding = "UTF-8"
38
+ ```
39
+ ##### Mac
40
+ ```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
+
50
+
51
+
52
+ data.mac_class = BankLink::Mac::Custom
53
+ ```
54
+ ### View Helper
55
+ ```haml
56
+ = bank_links @object do |link|
57
+ = submit_tag(link.name)
58
+ ```
59
+ ```haml
60
+ - BankLink.each do |link|
61
+ = bank_link_tag link, @object do
62
+ = submit_tag(link.name)
63
+ ```
64
+ #### Additional Options
65
+ ##### Override/Set Form Values
66
+ ```haml
67
+ - BankLink.each do |link|
68
+ = bank_link_tag link, @object, { :values => {:VK_AMOUNT => @object.price }} do
69
+ = submit_tag
70
+ ```
71
+ ##### Override/Set Form Attributes
72
+ ```haml
73
+ - BankLink.each do |link|
74
+ = bank_link_tag link, @object, { :form => {:method => :get }} do
75
+ = submit_tag
76
+ ```
77
+
78
+ ## Contributing
79
+
80
+ 1. Fork it
81
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
82
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
83
+ 4. Push to the branch (`git push origin my-new-feature`)
84
+ 5. Create new Pull Request
data/Rakefile ADDED
@@ -0,0 +1,7 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new
5
+
6
+ task :default => :spec
7
+ task :test => :spec
data/bank_link.gemspec ADDED
@@ -0,0 +1,29 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path("../lib", __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require "bank_link/version"
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "bank_link"
8
+ spec.version = BankLink::VERSION
9
+ spec.authors = ["Jhaesus"]
10
+ spec.email = ["jhaesus@gmail.com"]
11
+ spec.description = %q{Helper gem to simplify bank link usage}
12
+ spec.summary = %q{Gem for bank links}
13
+ spec.homepage = "http://github.com/jhaesus/bank_link"
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files`.split($/)
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_development_dependency "bundler"
22
+ spec.add_development_dependency "rake"
23
+ spec.add_development_dependency "rspec", "~> 2"
24
+ if RUBY_VERSION >= "1.9.3"
25
+ spec.add_development_dependency "rails"
26
+ else
27
+ spec.add_development_dependency "rails", "< 4"
28
+ end
29
+ end
data/lib/bank_link.rb ADDED
@@ -0,0 +1,20 @@
1
+ require "bank_link/version"
2
+ require "bank_link/configuration"
3
+ begin
4
+ require "rails/all"
5
+ rescue LoadError
6
+ else
7
+ require "bank_link/railtie" if defined?(Rails)
8
+ end
9
+
10
+ module BankLink
11
+ class << self
12
+ def configuration
13
+ block_given? ? yield(configuration) : (@configuration ||= BankLink::Configuration.instance)
14
+ end
15
+
16
+ def each &block
17
+ configuration.each(&block)
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,92 @@
1
+ require "bank_link/estruct"
2
+ require "bank_link/link"
3
+ require "singleton"
4
+
5
+ module BankLink
6
+ class Configuration
7
+ include Singleton
8
+
9
+ attr_accessor :links, :mac_fields, :default_encoding
10
+
11
+ def links name=nil, url=nil, &block
12
+ if name && url
13
+ links[name] = BankLink::Link.new(name, url, &block)
14
+ else
15
+ @links ||= BankLink::EStruct.new
16
+ end
17
+ end
18
+
19
+ def each &block
20
+ links.marshal_dump.each_value(&block)
21
+ end
22
+
23
+ def mac_fields &block
24
+ block_given? ? yield(mac_fields) : (@mac_fields ||= BankLink::EStruct.new)
25
+ end
26
+
27
+ def initialize
28
+ mac_fields do |ml|
29
+ ml.VK_SERVICE = BankLink::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 = BankLink::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
+ )
89
+ end
90
+ end
91
+ end
92
+ end
@@ -0,0 +1,26 @@
1
+ require "ostruct"
2
+ module BankLink
3
+ class EStruct < OpenStruct
4
+ def each &block
5
+ if block_given? && block.arity == 1
6
+ @table.each_value(&block)
7
+ else
8
+ @table.each(&block)
9
+ end
10
+ end
11
+
12
+ def count
13
+ marshal_dump.count
14
+ end
15
+
16
+ if RUBY_VERSION < "2.0.0"
17
+ def [](name)
18
+ @table[name.to_sym]
19
+ end
20
+
21
+ def []=(name, value)
22
+ modifiable[new_ostruct_member(name)] = value
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,33 @@
1
+ require "bank_link/estruct"
2
+ require "bank_link/mac"
3
+
4
+ module BankLink
5
+ class Link
6
+ attr_accessor :name, :url, :data, :form
7
+
8
+ def initialize name, url, &block
9
+ self.name = name
10
+ self.url = url
11
+ self.data = BankLink::EStruct.new(
12
+ :mac_class => BankLink::Mac::VK,
13
+ :encoding => BankLink.configuration.default_encoding
14
+ )
15
+ self.form = BankLink::EStruct.new
16
+ yield(data, form) if block_given?
17
+ end
18
+
19
+ def processed_data object, overrides={}
20
+ content = BankLink::EStruct.new(form.marshal_dump.merge(overrides))
21
+
22
+ content.each do |key, value|
23
+ content[key] = content[key].call(self, object) if content[key].is_a?(Proc)
24
+ end
25
+
26
+ content[data.encoding_key] = data.encoding if data.encoding && data.encoding_key
27
+
28
+ mac = data.mac_class.new(self, content)
29
+ content[mac.key] = mac.generate
30
+ content
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,2 @@
1
+ require "bank_link/mac/vk"
2
+ require "bank_link/mac/solo"
@@ -0,0 +1,45 @@
1
+ module BankLink
2
+ module Mac
3
+ class Base
4
+ attr_accessor :link, :data
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
16
+ end
17
+
18
+ def initialize link, data
19
+ self.link = link
20
+ self.data = data
21
+ end
22
+
23
+ def generate
24
+ raise NotImplementedError
25
+ end
26
+
27
+ def key
28
+ self.class.key
29
+ end
30
+
31
+ private
32
+ def query_key
33
+ self.class.query_key
34
+ end
35
+
36
+ def order
37
+ BankLink.configuration.mac_fields[query_key][data[query_key].intern]
38
+ end
39
+
40
+ def algorithm
41
+ link.data.algorithm || self.class.default_algorithm
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,35 @@
1
+ require "bank_link/mac/base"
2
+ require "openssl"
3
+
4
+ module BankLink
5
+ module Mac
6
+ class Solo < BankLink::Mac::Base
7
+ def self.query_key
8
+ :SOLOPMT_VERSION
9
+ end
10
+
11
+ def self.key
12
+ :SOLOPMT_MAC
13
+ end
14
+
15
+ def self.default_algorithm
16
+ OpenSSL::Digest::MD5
17
+ end
18
+
19
+ def generate
20
+ algorithm.hexdigest(request_data.join).upcase
21
+ end
22
+
23
+ private
24
+ def request_data
25
+ order.collect { |key_name|
26
+ field_for data[key_name].to_s
27
+ } + [field_for(link.data.mac_key)]
28
+ end
29
+
30
+ def field_for value
31
+ "#{value}&"
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,43 @@
1
+ require "bank_link/mac/base"
2
+ require "openssl"
3
+ require "base64"
4
+
5
+
6
+ module BankLink
7
+ module Mac
8
+ class VK < BankLink::Mac::Base
9
+ def self.query_key
10
+ :VK_SERVICE
11
+ end
12
+
13
+ def self.key
14
+ :VK_MAC
15
+ end
16
+
17
+ def self.default_algorithm
18
+ OpenSSL::Digest::SHA1
19
+ end
20
+
21
+ def generate
22
+ Base64.strict_encode64(
23
+ algorithm_key.sign(algorithm.new, request_data)
24
+ )
25
+ end
26
+
27
+ private
28
+ def algorithm_key
29
+ OpenSSL::PKey::RSA.new(link.data.mac_key, link.data.mac_key_passphrase)
30
+ end
31
+
32
+ def field_for value
33
+ ["%03d" % value.length, value]
34
+ end
35
+
36
+ def request_data
37
+ order.collect { |key_name|
38
+ field_for data[key_name].to_s
39
+ }.flatten.join
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,12 @@
1
+ require "bank_link/view_helpers"
2
+ require "rails/all"
3
+
4
+ module BankLink
5
+ class Railtie < ::Rails::Railtie
6
+ initializer "bank_link.helpers" do
7
+ ActiveSupport.on_load(:action_view) do
8
+ include BankLink::ViewHelpers
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,3 @@
1
+ module BankLink
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,34 @@
1
+ require "bank_link/estruct"
2
+
3
+ module BankLink
4
+ module ViewHelpers
5
+ 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] || {})
17
+
18
+ content_tag(:form, form_options) do
19
+ form_data.each do |key, value|
20
+ concat(hidden_field_tag(key, value, :id => nil))
21
+ end
22
+ concat(capture(link, &block)) if block_given?
23
+ end
24
+ end
25
+
26
+ def bank_links object=nil, options={}, &block
27
+ content_tag(:div, (options[:container] || {})) do
28
+ BankLink.each do |link|
29
+ concat(bank_link_tag(link, object, options, &block))
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,80 @@
1
+ describe BankLink::Configuration do
2
+ subject { BankLink::Configuration.send(:new) }
3
+ before do
4
+ subject.links(:aaa, "url") do |data, form|
5
+ data.bla = 5
6
+ form.something = 17
7
+ end
8
+ end
9
+ let(:test_link) do
10
+ subject.links[:aaa]
11
+ end
12
+
13
+ describe "#links" do
14
+ context "given arguments" do
15
+ it "should add link" do
16
+ expect(subject.links.count).to eq(1)
17
+ subject.links(:bbb, "url")
18
+ expect(subject.links.count).to eq(2)
19
+ end
20
+ end
21
+ context "given block" do
22
+ it "should insert new link" do
23
+ expect(subject.links.count).to eq(1)
24
+ subject.links(:ccc, "url") do |data, form|
25
+ data.in_block = true
26
+ form.x = "false"
27
+ end
28
+ expect(subject.links.count).to eq(2)
29
+ ccc = subject.links[:ccc]
30
+ expect(ccc.name).to eq(:ccc)
31
+ expect(ccc.url).to eq("url")
32
+ expect(ccc.data.in_block).to be_true
33
+ expect(ccc.form.x).to eq("false")
34
+ end
35
+ end
36
+
37
+ context "without arguments" do
38
+ specify { expect(subject.links).to be_a BankLink::EStruct }
39
+ end
40
+ end
41
+
42
+ describe "#mac_fields" do
43
+ context "given block" do
44
+ specify do
45
+ subject.mac_fields do |mf|
46
+ expect(mf).to be_a BankLink::EStruct
47
+ end
48
+ end
49
+ end
50
+
51
+ context "without arguments" do
52
+ specify { expect(subject.mac_fields).to be_a BankLink::EStruct }
53
+ end
54
+ end
55
+
56
+ describe "#each" do
57
+ context "given block" do
58
+ specify do
59
+ subject.each do |link|
60
+ expect(link).to be_a BankLink::Link
61
+ end
62
+ end
63
+ end
64
+
65
+ context "without arguments" do
66
+ specify { expect(subject.each).to be_a Enumerator }
67
+ end
68
+ end
69
+
70
+ describe "#default_encoding" do
71
+ specify { expect(subject.default_encoding).to be_nil }
72
+ end
73
+
74
+ describe "#default_encoding=" do
75
+ it "should set default_encoding" do
76
+ subject.default_encoding = "bla"
77
+ expect(subject.default_encoding).to_not be_nil
78
+ end
79
+ end
80
+ end
@@ -0,0 +1,37 @@
1
+ describe BankLink::EStruct do
2
+ specify { expect(subject).to be_kind_of(OpenStruct) }
3
+
4
+ describe ".each" do
5
+ specify { expect(subject.each).to be_a(Enumerator) }
6
+
7
+ context "given block" do
8
+ let(:estruct) do
9
+ x = BankLink::EStruct.new(
10
+ :x => 5
11
+ )
12
+ end
13
+
14
+ context "with 1 parameter" do
15
+ specify do
16
+ estruct.each do |x|
17
+ expect(x).to eq(5)
18
+ end
19
+ end
20
+ end
21
+
22
+ context "with 2 parameters" do
23
+ it do
24
+ estruct.each do |x,y|
25
+ expect(y).to eq(5)
26
+ end
27
+ end
28
+
29
+ it do
30
+ estruct.each do |x,y|
31
+ expect(x).to eq(:x)
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,65 @@
1
+ describe BankLink::Link do
2
+ describe "#new" do
3
+ let(:link) do
4
+ link = BankLink::Link.new :name, "url" do |data, form|
5
+ data.bla = 5
6
+ form.bla = 17
7
+ end
8
+ link
9
+ end
10
+ specify { expect(link.data).to be_a BankLink::EStruct }
11
+ specify { expect(link.form).to be_a BankLink::EStruct }
12
+ specify { expect(link.name).to eq(:name) }
13
+ specify { expect(link.url).to eq("url") }
14
+ specify { expect(link.data.bla).to eq(5) }
15
+ specify { expect(link.form.bla).to eq(17) }
16
+ end
17
+
18
+ describe ".processed_data" do
19
+ let(:link) do
20
+ BankLink::Link.new :name, "url" do |data, form|
21
+ form.value1 = 1
22
+ form.value2 = 2
23
+ form.value3 = Proc.new { 3 }
24
+ form.value4 = Proc.new { |link, object| "aaaaa" }
25
+ data.encoding_key = "ENCODING_KEY"
26
+ data.encoding = "UTF8"
27
+ end
28
+ end
29
+
30
+ let(:data) { link.processed_data(nil) }
31
+
32
+ before(:each) do
33
+ allow_any_instance_of(BankLink::Mac::VK).to receive(:generate).and_return { "aaaaaaaaaaa" }
34
+ end
35
+
36
+ context "encoding" do
37
+ let(:link_without_encoding) do
38
+ BankLink::Link.new :name, "url" do |data, form|
39
+ form.value1 = 1
40
+ form.value2 = 2
41
+ form.value3 = Proc.new { 3 }
42
+ form.value4 = Proc.new { |link, object| "aaaaa" }
43
+ data.encoding_key = :ENCODING_KEY
44
+ end
45
+ end
46
+ context "should set encoding" do
47
+ it "when given encoding key and encoding" do
48
+ data = link.processed_data(nil)
49
+ expect(data[:ENCODING_KEY]).to eq("UTF8")
50
+ end
51
+ it "unless encoding is set" do
52
+ data = link_without_encoding.processed_data(nil)
53
+ expect(data[:ENCODING_KEY]).to be_nil
54
+ end
55
+ end
56
+ end
57
+ it "should calculate mac" do
58
+ expect(data[:VK_MAC]).to eq("aaaaaaaaaaa")
59
+ end
60
+ it "should calculate procs" do
61
+ expect(data.value3).to eq(3)
62
+ expect(data.value4).to eq("aaaaa")
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,24 @@
1
+ describe BankLink::Mac::Base do
2
+ it { expect { BankLink::Mac::Base.query_key }.to raise_error(NotImplementedError) }
3
+ it { expect { BankLink::Mac::Base.key }.to raise_error(NotImplementedError) }
4
+ it { expect { BankLink::Mac::Base.default_algorithm }.to raise_error(NotImplementedError) }
5
+
6
+ let(:link) { BankLink::Link.new(:aaa, "aaa") }
7
+
8
+ let(:xx) { BankLink::EStruct.new(:x => 5) }
9
+
10
+ subject { BankLink::Mac::Base.new(link, xx) }
11
+
12
+ describe "#new" do
13
+ specify { expect(subject.data).to be_a(BankLink::EStruct) }
14
+ specify { expect(subject.link).to be_a(BankLink::Link) }
15
+ end
16
+
17
+ describe ".generate" do
18
+ it { expect { subject.generate }.to raise_error(NotImplementedError) }
19
+ end
20
+
21
+ describe ".key" do
22
+ it { expect { subject.key }.to raise_error(NotImplementedError) }
23
+ end
24
+ end
@@ -0,0 +1,44 @@
1
+ describe BankLink::Mac::Solo do
2
+ specify { expect(BankLink::Mac::Solo.query_key).to eq(:SOLOPMT_VERSION) }
3
+ specify { expect(BankLink::Mac::Solo.key).to eq(:SOLOPMT_MAC) }
4
+ specify { expect(BankLink::Mac::Solo.default_algorithm).to eq(OpenSSL::Digest::MD5) }
5
+
6
+ let(:link_sha1) do
7
+ BankLink::Link.new(:link, :url) do |data, form|
8
+ data.algorithm = OpenSSL::Digest::SHA1
9
+ data.mac_key = "SOMEKEY"
10
+ end
11
+ end
12
+
13
+ let(:link_md5) do
14
+ BankLink::Link.new(:link, :url) do |data, form|
15
+ data.mac_key = "SOMEKEY"
16
+ end
17
+ end
18
+
19
+ let(:data) { BankLink::EStruct.new(:SOLOPMT_VERSION => "0003") }
20
+
21
+ let(:mac_sha1) { BankLink::Mac::Solo.new(link_sha1,data) }
22
+ let(:mac_md5) { BankLink::Mac::Solo.new(link_md5,data) }
23
+
24
+
25
+ specify { expect(mac_sha1.key).to eq(BankLink::Mac::Solo.key) }
26
+ specify { expect(mac_md5.key).to eq(BankLink::Mac::Solo.key) }
27
+
28
+ let(:sha1_result) { "08233F97B068D5CFF7EAD4F9C16779504E638301" }
29
+ let(:md5_result) { "7990ACDD585F151ED8C9405B5838EEDC" }
30
+
31
+ describe ".generate" do
32
+ context "algorithm is sha1" do
33
+ specify { expect(mac_sha1.generate).to eq(sha1_result)}
34
+ end
35
+ context "algirithm is md5" do
36
+ specify { expect(mac_md5.generate).to eq(md5_result)}
37
+ end
38
+ end
39
+
40
+ describe ".request_data" do
41
+ specify { expect(mac_sha1.instance_eval { request_data }).to eq(["0003&", "&", "&", "&", "&", "&", "&", "SOMEKEY&"]) }
42
+ specify { expect(mac_md5.instance_eval { request_data }).to eq(["0003&", "&", "&", "&", "&", "&", "&", "SOMEKEY&"]) }
43
+ end
44
+ end
@@ -0,0 +1,35 @@
1
+ describe BankLink::Mac::VK do
2
+ specify { expect(BankLink::Mac::VK.query_key).to eq(:VK_SERVICE) }
3
+ specify { expect(BankLink::Mac::VK.key).to eq(:VK_MAC) }
4
+ specify { expect(BankLink::Mac::VK.default_algorithm).to eq(OpenSSL::Digest::SHA1) }
5
+
6
+ let(:link) do
7
+ BankLink::Link.new(:link, :url) do |data, form|
8
+ data.algorithm = OpenSSL::Digest::MD5
9
+ end
10
+ end
11
+
12
+ let(:data) { BankLink::EStruct.new(:VK_SERVICE => "1001") }
13
+
14
+ subject { BankLink::Mac::VK.new(link,data) }
15
+
16
+ specify { expect(subject.key).to eq(BankLink::Mac::VK.key) }
17
+
18
+ let(:private_key) { double("Key") }
19
+
20
+ let(:base64_result) {
21
+ Base64.strict_encode64("signed_content")
22
+ }
23
+
24
+ describe ".generate" do
25
+ before do
26
+ allow(private_key).to receive(:sign) { "signed_content" }
27
+ expect(OpenSSL::PKey::RSA).to receive(:new).and_return { private_key }
28
+ end
29
+ specify { expect(subject.generate).to eq(base64_result) }
30
+ end
31
+
32
+ describe ".request_data" do
33
+ specify { expect(subject.instance_eval { request_data }).to eq("0041001000000000000000000000000000") }
34
+ end
35
+ end
@@ -0,0 +1,118 @@
1
+ class BLVHDummy
2
+ include ActionView::Helpers::UrlHelper
3
+ include ActionView::Helpers::TagHelper
4
+ include ActionView::Helpers::CaptureHelper
5
+ include ActionView::Helpers::FormTagHelper
6
+ include ActionView::Context
7
+ include BankLink::ViewHelpers
8
+ end
9
+
10
+ describe BankLink::ViewHelpers do
11
+ subject { BLVHDummy.new }
12
+ before(:all) do
13
+ BankLink.configuration do |config|
14
+ config.links(:dummy_link, "https://some.where.com") do |data, form|
15
+ form[:SOLOPMT_VERSION] = "0003"
16
+ form[:SOLOPMT_STAMP] = "555"
17
+ form[:SOLOPMT_RCV_ID] = "99999999"
18
+ form[:SOLOPMT_AMOUNT] = "55.12"
19
+ form[:SOLOPMT_REF] = "55"
20
+ form[:SOLOPMT_MSG] = Proc.new { |link, object| "message for payment" }
21
+ form[:SOLOPMT_RETURN] = Proc.new { |link, object| "http://some.where.else1.com" }
22
+ form[:SOLOPMT_CANCEL] = Proc.new { |link, object| "http://some.where.else2.com" }
23
+ form[:SOLOPMT_REJECT] = Proc.new { |link, object| "http://some.where.else3.com" }
24
+
25
+ form[:SOLOPMT_CONFIRM] = "YES"
26
+ form[:SOLOPMT_KEYVERS] = "0001"
27
+ form[:SOLOPMT_DATE] = "EXPRESS"
28
+ form[:SOLOPMT_CUR] = "EUR"
29
+ form[:SOLOPMT_LANGUAGE] = "3"
30
+ data.mac_class = BankLink::Mac::Solo
31
+ data.mac_key = "MY MAC KEY"
32
+ end
33
+
34
+ config.links(:dummy_link_w_encoding, "https://some.where.com") do |data, form|
35
+ form[:SOLOPMT_VERSION] = "0003"
36
+ form[:SOLOPMT_STAMP] = "555"
37
+ form[:SOLOPMT_RCV_ID] = "99999999"
38
+ form[:SOLOPMT_AMOUNT] = "55.12"
39
+ data.encoding_key = "VK_ENCODING"
40
+ data.encoding = "UTF-8"
41
+ form[:SOLOPMT_REF] = "55"
42
+ form[:SOLOPMT_MSG] = Proc.new { |link, object| "message for payment" }
43
+ form[:SOLOPMT_RETURN] = Proc.new { |link, object| "http://some.where.else1.com" }
44
+ form[:SOLOPMT_CANCEL] = Proc.new { |link, object| "http://some.where.else2.com" }
45
+ form[:SOLOPMT_REJECT] = Proc.new { |link, object| "http://some.where.else3.com" }
46
+
47
+ form[:SOLOPMT_CONFIRM] = "YES"
48
+ form[:SOLOPMT_KEYVERS] = "0001"
49
+ form[:SOLOPMT_DATE] = "EXPRESS"
50
+ form[:SOLOPMT_CUR] = "EUR"
51
+ form[:SOLOPMT_LANGUAGE] = "3"
52
+ data.mac_class = BankLink::Mac::Solo
53
+ data.mac_key = "MY MAC KEY"
54
+ end
55
+ end
56
+ end
57
+
58
+ let(:dummy_link) { BankLink.configuration.links[:dummy_link] }
59
+
60
+ let(:dummy_link_w_encoding) { BankLink.configuration.links[:dummy_link_w_encoding] }
61
+
62
+ let(:result_plain) { subject.bank_link_tag(dummy_link) }
63
+
64
+ let(:result_encoding) { subject.bank_link_tag(dummy_link_w_encoding) }
65
+
66
+ let(:result_block) {
67
+ subject.bank_link_tag(dummy_link_w_encoding) do
68
+ "aaaaaaaaaaaaaaaaaaaaaaa"
69
+ end
70
+ }
71
+
72
+ describe ".bank_link_tag" do
73
+ before(:all) do
74
+ @proc = Proc.new { |result|
75
+ expect(result).to start_with("<form ")
76
+ expect(result).to include("action=\"https://some.where.com\"")
77
+ expect(result).to include("method=\"post\"")
78
+ expect(result).to include("<input name=\"SOLOPMT_VERSION\" type=\"hidden\" value=\"0003\" />")
79
+ expect(result).to include("<input name=\"SOLOPMT_STAMP\" type=\"hidden\" value=\"555\" />")
80
+ expect(result).to include("<input name=\"SOLOPMT_RCV_ID\" type=\"hidden\" value=\"99999999\" />")
81
+ expect(result).to include("<input name=\"SOLOPMT_AMOUNT\" type=\"hidden\" value=\"55.12\" />")
82
+ expect(result).to include("<input name=\"SOLOPMT_REF\" type=\"hidden\" value=\"55\" />")
83
+ expect(result).to include("<input name=\"SOLOPMT_MSG\" type=\"hidden\" value=\"message for payment\" />")
84
+ expect(result).to include("<input name=\"SOLOPMT_RETURN\" type=\"hidden\" value=\"http://some.where.else1.com\" />")
85
+ expect(result).to include("<input name=\"SOLOPMT_CANCEL\" type=\"hidden\" value=\"http://some.where.else2.com\" />")
86
+ expect(result).to include("<input name=\"SOLOPMT_REJECT\" type=\"hidden\" value=\"http://some.where.else3.com\" />")
87
+ expect(result).to include("<input name=\"SOLOPMT_CONFIRM\" type=\"hidden\" value=\"YES\" />")
88
+ expect(result).to include("<input name=\"SOLOPMT_KEYVERS\" type=\"hidden\" value=\"0001\" />")
89
+ expect(result).to include("<input name=\"SOLOPMT_DATE\" type=\"hidden\" value=\"EXPRESS\" />")
90
+ expect(result).to include("<input name=\"SOLOPMT_CUR\" type=\"hidden\" value=\"EUR\" />")
91
+ expect(result).to include("<input name=\"SOLOPMT_LANGUAGE\" type=\"hidden\" value=\"3\" />")
92
+ expect(result).to include("<input name=\"SOLOPMT_MAC\" type=\"hidden\" value=\"C4E032FC50F78B6D5DED36F283A1193B\" />")
93
+ expect(result).to end_with("</form>")
94
+ }
95
+ end
96
+
97
+ context "regular data" do
98
+ it do
99
+ [result_plain, result_encoding, result_block].each do |result|
100
+ @proc.call(result)
101
+ end
102
+ end
103
+ end
104
+
105
+ context "without encoding" do
106
+ specify { expect(result_plain).not_to include("accept-charset") }
107
+ end
108
+
109
+ context "with encoding" do
110
+ specify { expect(result_encoding).to include("accept-charset=\"UTF-8\"") }
111
+ specify { expect(result_encoding).to include("<input name=\"VK_ENCODING\" type=\"hidden\" value=\"UTF-8\" />") }
112
+ end
113
+
114
+ context "with block" do
115
+ specify { expect(result_block).to include("aaaaaaaaaaaaaaaaaaaaaaa") }
116
+ end
117
+ end
118
+ end
@@ -0,0 +1,17 @@
1
+ describe BankLink do
2
+ it { should respond_to :each }
3
+ describe "#configuration" do
4
+ context "given block" do
5
+ it "should allow access to configuration" do
6
+ subject.configuration do |config|
7
+ expect(config).to be_a BankLink::Configuration
8
+ end
9
+ end
10
+ end
11
+ context "without arguments" do
12
+ it "should return configuration" do
13
+ expect(subject.configuration).to be_a BankLink::Configuration
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,21 @@
1
+ require "bank_link"
2
+
3
+ if RUBY_VERSION == "1.8.7"
4
+ Enumerator = Enumerable
5
+ end
6
+ # This file was generated by the `rspec --init` command. Conventionally, all
7
+ # specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
8
+ # Require this file using `require "spec_helper"` to ensure that it is only
9
+ # loaded once.
10
+ #
11
+ # See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
12
+ RSpec.configure do |config|
13
+ config.treat_symbols_as_metadata_keys_with_true_values = true
14
+ config.run_all_when_everything_filtered = true
15
+ # config.filter_run :focus
16
+ # Run specs in random order to surface order dependencies. If you find an
17
+ # order dependency and want to debug it, you can fix the order by providing
18
+ # the seed, which is printed after each run.
19
+ # --seed 1234
20
+ config.order = 'random'
21
+ end
metadata ADDED
@@ -0,0 +1,137 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: bank_link
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Jhaesus
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2013-10-13 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '>='
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '>='
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ~>
46
+ - !ruby/object:Gem::Version
47
+ version: '2'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ~>
53
+ - !ruby/object:Gem::Version
54
+ version: '2'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rails
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - '>='
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ description: Helper gem to simplify bank link usage
70
+ email:
71
+ - jhaesus@gmail.com
72
+ executables: []
73
+ extensions: []
74
+ extra_rdoc_files: []
75
+ files:
76
+ - .gitignore
77
+ - .rspec
78
+ - .travis.yml
79
+ - Gemfile
80
+ - LICENSE.txt
81
+ - README.md
82
+ - Rakefile
83
+ - bank_link.gemspec
84
+ - lib/bank_link.rb
85
+ - lib/bank_link/configuration.rb
86
+ - lib/bank_link/estruct.rb
87
+ - lib/bank_link/link.rb
88
+ - lib/bank_link/mac.rb
89
+ - lib/bank_link/mac/base.rb
90
+ - lib/bank_link/mac/solo.rb
91
+ - lib/bank_link/mac/vk.rb
92
+ - lib/bank_link/railtie.rb
93
+ - lib/bank_link/version.rb
94
+ - lib/bank_link/view_helpers.rb
95
+ - spec/lib/bank_link/configuration_spec.rb
96
+ - spec/lib/bank_link/estruct_spec.rb
97
+ - spec/lib/bank_link/link_spec.rb
98
+ - spec/lib/bank_link/mac/base_spec.rb
99
+ - spec/lib/bank_link/mac/solo_spec.rb
100
+ - spec/lib/bank_link/mac/vk_spec.rb
101
+ - spec/lib/bank_link/view_helpers_spec.rb
102
+ - spec/lib/bank_link_spec.rb
103
+ - spec/spec_helper.rb
104
+ homepage: http://github.com/jhaesus/bank_link
105
+ licenses:
106
+ - MIT
107
+ metadata: {}
108
+ post_install_message:
109
+ rdoc_options: []
110
+ require_paths:
111
+ - lib
112
+ required_ruby_version: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - '>='
115
+ - !ruby/object:Gem::Version
116
+ version: '0'
117
+ required_rubygems_version: !ruby/object:Gem::Requirement
118
+ requirements:
119
+ - - '>='
120
+ - !ruby/object:Gem::Version
121
+ version: '0'
122
+ requirements: []
123
+ rubyforge_project:
124
+ rubygems_version: 2.0.6
125
+ signing_key:
126
+ specification_version: 4
127
+ summary: Gem for bank links
128
+ test_files:
129
+ - spec/lib/bank_link/configuration_spec.rb
130
+ - spec/lib/bank_link/estruct_spec.rb
131
+ - spec/lib/bank_link/link_spec.rb
132
+ - spec/lib/bank_link/mac/base_spec.rb
133
+ - spec/lib/bank_link/mac/solo_spec.rb
134
+ - spec/lib/bank_link/mac/vk_spec.rb
135
+ - spec/lib/bank_link/view_helpers_spec.rb
136
+ - spec/lib/bank_link_spec.rb
137
+ - spec/spec_helper.rb