straight-server 0.2.3 → 1.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 (44) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +2 -2
  3. data/Gemfile +21 -16
  4. data/Gemfile.lock +44 -30
  5. data/Gemfile.travis +15 -16
  6. data/README.md +66 -47
  7. data/VERSION +1 -1
  8. data/db/migrations/011_add_callback_data_to_orders.rb +1 -1
  9. data/db/migrations/012_add_address_provider.rb +11 -0
  10. data/db/migrations/013_add_address_derivation_scheme.rb +11 -0
  11. data/db/migrations/014_pubkey_null_address_provider_not_null.rb +8 -0
  12. data/db/migrations/015_add_amount_paid_to_orders.rb +11 -0
  13. data/db/migrations/016_add_new_params_to_orders.rb +13 -0
  14. data/db/migrations/017_add_test_mode_to_gateways.rb +11 -0
  15. data/db/migrations/018_add_test_keychain_id_to_gateways.rb +11 -0
  16. data/db/migrations/019_add_test_pubkey_to_gateways.rb +11 -0
  17. data/db/migrations/020_add_test_mode_to_orders.rb +11 -0
  18. data/db/schema.rb +11 -1
  19. data/lib/straight-server.rb +11 -9
  20. data/lib/straight-server/config.rb +28 -18
  21. data/lib/straight-server/gateway.rb +167 -87
  22. data/lib/straight-server/initializer.rb +13 -7
  23. data/lib/straight-server/order.rb +39 -17
  24. data/lib/straight-server/orders_controller.rb +71 -21
  25. data/lib/straight-server/random_string.rb +3 -13
  26. data/lib/straight-server/server.rb +3 -4
  27. data/lib/straight-server/signature_validator.rb +69 -0
  28. data/lib/straight-server/thread.rb +19 -4
  29. data/lib/straight-server/throttler.rb +7 -13
  30. data/lib/tasks/db.rake +1 -1
  31. data/spec/.straight/config.yml +8 -3
  32. data/spec/.straight/default_test_last_keychain_id +1 -0
  33. data/spec/factories.rb +2 -1
  34. data/spec/lib/gateway_spec.rb +222 -94
  35. data/spec/lib/initializer_spec.rb +1 -1
  36. data/spec/lib/order_spec.rb +26 -7
  37. data/spec/lib/orders_controller_spec.rb +65 -6
  38. data/spec/lib/signature_validator_spec.rb +72 -0
  39. data/spec/lib/thread_spec.rb +16 -0
  40. data/spec/lib/throttle_spec.rb +2 -2
  41. data/spec/spec_helper.rb +17 -22
  42. data/straight-server.gemspec +31 -12
  43. data/templates/config.yml +19 -10
  44. metadata +52 -11
@@ -32,7 +32,7 @@ RSpec.describe StraightServer::Initializer do
32
32
  remove_tmp_dir
33
33
  end
34
34
 
35
- # as #create_config_files method contains #exit method we need to rescue SystemExix: exit() error
35
+ # as #create_config_files method contains #exit method we need to rescue SystemExit: exit() error
36
36
  # and at the same time its good to assert that method execution went well, which we do in rescue
37
37
  let(:create_config_files) do
38
38
  begin
@@ -1,3 +1,4 @@
1
+ # coding: utf-8
1
2
  require 'spec_helper'
2
3
 
3
4
  RSpec.describe StraightServer::Order do
@@ -9,6 +10,7 @@ RSpec.describe StraightServer::Order do
9
10
  allow(@gateway).to receive(:id).and_return(1)
10
11
  allow(@gateway).to receive(:active).and_return(true)
11
12
  allow(@gateway).to receive(:order_status_changed)
13
+ allow(@gateway).to receive(:test_mode).and_return(false)
12
14
  allow(@gateway).to receive(:save)
13
15
  allow(@gateway).to receive(:increment_order_counter!)
14
16
  allow(@gateway).to receive(:current_exchange_rate).and_return(111)
@@ -29,7 +31,7 @@ RSpec.describe StraightServer::Order do
29
31
 
30
32
  it "prepares data as http params" do
31
33
  allow(@order).to receive(:tid).and_return("tid1")
32
- expect(@order.to_http_params).to eq("order_id=#{@order.id}&amount=10&amount_in_btc=#{@order.amount_in_btc(as: :string)}&status=#{@order.status}&address=#{@order.address}&tid=tid1&keychain_id=#{@order.keychain_id}&last_keychain_id=#{@order.gateway.last_keychain_id}")
34
+ expect(@order.to_http_params).to eq("order_id=#{@order.id}&amount=10&amount_in_btc=#{@order.amount_in_btc(as: :string)}&amount_paid_in_btc=#{@order.amount_in_btc(field: @order.amount_paid, as: :string)}&status=#{@order.status}&address=#{@order.address}&tid=tid1&keychain_id=#{@order.keychain_id}&last_keychain_id=#{@order.gateway.last_keychain_id}")
33
35
  end
34
36
 
35
37
  it "generates a payment_id" do
@@ -46,9 +48,10 @@ RSpec.describe StraightServer::Order do
46
48
  end
47
49
 
48
50
  it "checks DB for a status update first if the respective option for the gateway is turned on" do
49
- allow(@order).to receive(:transaction).and_raise("Shouldn't ever be happening!")
51
+ # allow(@order).to receive(:transaction).and_raise("Shouldn't ever be happening!")
50
52
  StraightServer::Config.check_order_status_in_db_first = true
51
53
  StraightServer::Order.where(id: @order.id).update(status: 2)
54
+ allow(@order.gateway).to receive(:fetch_transactions_for).and_return([])
52
55
  allow(@order.gateway).to receive(:order_status_changed)
53
56
  expect(@order.status(reload: false)).to eq(0)
54
57
  expect(@order.status(reload: true)).to eq(2)
@@ -75,21 +78,37 @@ RSpec.describe StraightServer::Order do
75
78
 
76
79
  it "returns last_keychain_id for the gateway along with other order data" do
77
80
  order = create(:order, gateway_id: @gateway.id)
78
- expect(order.to_h).to include(keychain_id: order.keychain_id, last_keychain_id: @gateway.last_keychain_id)
81
+ expect(order.to_h).to include(keychain_id: order.keychain_id, last_keychain_id: @gateway.last_keychain_id)
82
+ end
83
+
84
+ it "returns test_last_keychain_id (as last_keychain_id) for the gateway in test mode" do
85
+ allow(@gateway).to receive(:test_mode).and_return(true)
86
+ allow(@gateway).to receive(:test_last_keychain_id).and_return(123)
87
+ order = create(:order, gateway_id: @gateway.id)
88
+ expect(order.to_h[:last_keychain_id]).to eq(123)
89
+ end
90
+
91
+ it 'is cancelable only while new' do
92
+ order = build(:order, gateway_id: @gateway.id, status: 0)
93
+ expect(order.cancelable?).to eq true
94
+ (1..6).each do |status|
95
+ order.instance_variable_set :@status, status
96
+ expect(order.cancelable?).to eq false
97
+ end
79
98
  end
80
99
 
81
100
  describe "DB interaction" do
82
101
 
83
102
  it "saves a new order into the database" do
84
- expect(DB[:orders][:keychain_id => @order.id]).not_to be_nil
103
+ expect(DB[:orders][:keychain_id => @order.id]).not_to be_nil
85
104
  end
86
105
 
87
106
  it "updates an existing order" do
88
107
  allow(@order).to receive(:gateway).and_return(@gateway)
89
- expect(DB[:orders][:keychain_id => @order.id][:status]).to eq(0)
108
+ expect(DB[:orders][:keychain_id => @order.id][:status]).to eq(0)
90
109
  @order.status = 1
91
110
  @order.save
92
- expect(DB[:orders][:keychain_id => @order.id][:status]).to eq(1)
111
+ expect(DB[:orders][:keychain_id => @order.id][:status]).to eq(1)
93
112
  end
94
113
 
95
114
  it "finds first order in the database by id" do
@@ -103,7 +122,7 @@ RSpec.describe StraightServer::Order do
103
122
  it "finds orders in the database by any conditions" do
104
123
  order1 = create(:order, gateway_id: @gateway.id)
105
124
  order2 = create(:order, gateway_id: @gateway.id)
106
-
125
+
107
126
  expect(StraightServer::Order.where(keychain_id: order1.keychain_id).first).to equal_order(order1)
108
127
  expect(StraightServer::Order.where(keychain_id: order2.keychain_id).first).to equal_order(order2)
109
128
  expect(StraightServer::Order.where(keychain_id: order2.keychain_id+1).first).to be_nil
@@ -5,7 +5,8 @@ RSpec.describe StraightServer::OrdersController do
5
5
  before(:each) do
6
6
  DB.run("DELETE FROM orders")
7
7
  @gateway = gateway = StraightServer::Gateway.find_by_id(2)
8
- allow(gateway).to receive(:address_for_keychain_id).and_return("address#{gateway.last_keychain_id+1}")
8
+ allow(gateway).to receive_message_chain("address_provider.takes_fees?").and_return(false)
9
+ allow(gateway).to receive_message_chain("address_provider.new_address").and_return("address#{gateway.last_keychain_id+1}")
9
10
  allow(gateway).to receive(:fetch_transactions_for).with(anything).and_return([])
10
11
  allow(gateway).to receive(:send_callback_http_request)
11
12
  end
@@ -18,15 +19,22 @@ RSpec.describe StraightServer::OrdersController do
18
19
  expect(response).to render_json_with(status: 0, amount: 10, address: "address1", tid: nil, id: :anything, keychain_id: @gateway.last_keychain_id, last_keychain_id: @gateway.last_keychain_id)
19
20
  end
20
21
 
21
- it "renders 409 error when an order cannot be created due to some validation errors" do
22
+ it "renders 409 error when an order cannot be created due to invalid amount" do
22
23
  send_request "POST", '/gateways/2/orders', amount: 0
23
24
  expect(response[0]).to eq(409)
24
- expect(response[2]).to eq("Invalid order: amount should be more than 0")
25
+ expect(response[2]).to eq("Invalid order: amount cannot be nil and should be more than 0")
26
+ end
27
+
28
+ it "renders 409 error when an order cannot be created due to other validation errors" do
29
+ send_request "POST", '/gateways/2/orders', amount: 1, description: 'A'*256
30
+ expect(response[0]).to eq(409)
31
+ expect(response[2]).to eq("Invalid order: description should be shorter than 256 characters")
25
32
  end
26
33
 
27
34
  it "starts tracking the order status in a separate thread" do
28
35
  order_mock = double("order mock")
29
36
  expect(order_mock).to receive(:start_periodic_status_check)
37
+ expect(order_mock).to receive(:payment_id).and_return('blabla')
30
38
  allow(order_mock).to receive(:to_h).and_return({})
31
39
  expect(@gateway).to receive(:create_order).and_return(order_mock)
32
40
  send_request "POST", '/gateways/2/orders', amount: 10
@@ -58,7 +66,7 @@ RSpec.describe StraightServer::OrdersController do
58
66
  end
59
67
 
60
68
  it 'limits creation of orders without signature' do
61
- new_config = StraightServer::Config.dup
69
+ new_config = StraightServer::Config.clone
62
70
  new_config.throttle = {requests_limit: 1, period: 1}
63
71
  stub_const 'StraightServer::Config', new_config
64
72
  allow(StraightServer::Thread).to receive(:new)
@@ -72,7 +80,7 @@ RSpec.describe StraightServer::OrdersController do
72
80
  @gateway1.check_signature = true
73
81
  5.times do |i|
74
82
  i += 1
75
- send_request "POST", '/gateways/1/orders', amount: 10, keychain_id: i, signature: @gateway1.sign_with_secret(i)
83
+ send_signed_request @gateway1, "POST", '/gateways/1/orders', amount: 10, keychain_id: i
76
84
  expect(response[0]).to eq 200
77
85
  expect(response).to render_json_with(status: 0, amount: 10, tid: nil, id: :anything, keychain_id: i, last_keychain_id: i)
78
86
  end
@@ -163,11 +171,62 @@ RSpec.describe StraightServer::OrdersController do
163
171
  send_request "GET", '/gateways/2/orders/payment_id/websocket'
164
172
  expect(response).to eq("ws rack response")
165
173
  end
174
+ end
175
+
176
+ describe "cancel action" do
177
+ it "cancels new order" do
178
+ allow(StraightServer::Thread).to receive(:new)
179
+ send_request "POST", '/gateways/2/orders', amount: 1
180
+ payment_id = JSON.parse(response[2])['payment_id']
181
+ send_request "POST", "/gateways/2/orders/#{payment_id}/cancel"
182
+ expect(response[0]).to eq 200
183
+ end
166
184
 
185
+ it "requires signature to cancel signed order" do
186
+ allow(StraightServer::Thread).to receive(:new)
187
+ @gateway1 = StraightServer::Gateway.find_by_id(1)
188
+ @gateway1.check_signature = true
189
+ @order_mock = double('order mock')
190
+ allow(@order_mock).to receive(:status).with(reload: true)
191
+ allow(@order_mock).to receive(:status_changed?).and_return(false)
192
+ allow(@order_mock).to receive(:cancelable?).and_return(true)
193
+ expect(@order_mock).to receive(:cancel)
194
+ allow(StraightServer::Order).to receive(:[]).and_return(@order_mock)
195
+ send_request "POST", "/gateways/1/orders/payment_id/cancel"
196
+ expect(response).to eq [409, {}, 'X-Nonce is invalid: nil']
197
+ send_signed_request @gateway1, "POST", "/gateways/1/orders/payment_id/cancel"
198
+ expect(response[0]).to eq 200
199
+ end
200
+
201
+ it "do not cancel orders with status != new" do
202
+ @order_mock = double('order mock')
203
+ allow(@order_mock).to receive(:status).with(reload: true)
204
+ allow(@order_mock).to receive(:status_changed?).and_return(true)
205
+ expect(@order_mock).to receive(:save)
206
+ allow(@order_mock).to receive(:cancelable?).and_return(false)
207
+ allow(StraightServer::Order).to receive(:[]).and_return(@order_mock)
208
+ send_request "POST", "/gateways/2/orders/payment_id/cancel"
209
+ expect(response).to eq [409, {}, "Order is not cancelable"]
210
+ end
211
+ end
212
+
213
+ it 'return last_keychain_id' do
214
+ lk_id = 123
215
+ @gateway = StraightServer::Gateway.find_by_id(1)
216
+ @gateway.last_keychain_id = lk_id
217
+ @gateway.save
218
+ send_request "GET", '/gateway/1/last_keychain_id'
219
+ expect(response).to render_json_with(gateway_id: @gateway.id, last_keychain_id: lk_id)
167
220
  end
168
221
 
169
222
  def send_request(method, path, params={})
170
- env = Hashie::Mash.new({ 'REQUEST_METHOD' => method, 'REQUEST_PATH' => path, 'params' => params })
223
+ env = Hashie::Mash.new('REQUEST_METHOD' => method, 'REQUEST_PATH' => path, 'params' => params)
224
+ @controller = StraightServer::OrdersController.new(env)
225
+ end
226
+
227
+ def send_signed_request(gateway, method, path, params={})
228
+ env = Hashie::Mash.new('REQUEST_METHOD' => method, 'REQUEST_PATH' => path, 'params' => params, 'HTTP_X_NONCE' => (Time.now.to_f * 1e6).to_i)
229
+ env['HTTP_X_SIGNATURE'] = StraightServer::SignatureValidator.new(gateway, env).signature
171
230
  @controller = StraightServer::OrdersController.new(env)
172
231
  end
173
232
 
@@ -0,0 +1,72 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe StraightServer::SignatureValidator do
4
+
5
+ it 'calculates signature' do
6
+ expect(described_class.signature(nonce: '123', body: '', method: 'GET', request_uri: '/somewhere', secret: 'gateway_secret')).to eq 'ZSWEKzuWy6QWCc05I+t4QYQhUtkeogkW7rCwieQvy/56Y+bVwxGGKB3yNQg1XL2LmtuNNwv2SXUxjlFEP7+0+A=='
7
+ expect(described_class.signature(nonce: '123', body: '', method: 'GET', request_uri: '/somewhere', secret: 'gateway-secret')).to eq 'nYLq7IXlgw5FAsXGc0+JoXmfHBEwl7zwVQhsix+FraIIFsPeGYnQ/22wkjPAwwyu0GoYEbM6gmN+sxEzciNkFg=='
8
+ expect(described_class.signature(nonce: '12345', body: 'text' * 10000, method: 'POST', request_uri: '/somewhere', secret: 'gateway_secret')).to eq 'F0GsyqPkxDgmqdTomIGVIRQ/ik2GiZtXy1GVNx0j+UDUL8VS496HsbcOlyUocKUM0fU96KkjhrpUh0LC29AXyQ=='
9
+ end
10
+
11
+ it 'validates signature' do
12
+ @validator = described_class.new(
13
+ Struct.new(:secret).new('abc'),
14
+ {
15
+ 'HTTP_X_NONCE' => '1',
16
+ 'rack.input' => 'request body',
17
+ 'REQUEST_METHOD' => 'POST',
18
+ 'REQUEST_URI' => '/gateway/123/orders',
19
+ }
20
+ )
21
+ expect(@validator.env['HTTP_X_SIGNATURE'] = @validator.signature).to eq '1EtQNASecMF85tyag+pSSdF2yxLfy3xCddM2ZGA86M8OTxleEixBnbOeMEBp37Ke5+7jWQm+Gpx95y6MZiW6wQ=='
22
+ expect(@validator.valid_signature?).to eq true
23
+ end
24
+
25
+ it 'validates nonce' do
26
+ @validator = described_class.new(
27
+ Struct.new(:id).new(1),
28
+ {'HTTP_X_NONCE' => '100500'}
29
+ )
30
+ expect(@validator.valid_nonce?).to eq true
31
+ expect(@validator.valid_nonce?).to eq false
32
+ @validator.env['HTTP_X_NONCE'] = '100499'
33
+ expect(@validator.valid_nonce?).to eq false
34
+ @validator.env['HTTP_X_NONCE'] = '100501'
35
+ expect(@validator.valid_nonce?).to eq true
36
+ expect(@validator.valid_nonce?).to eq false
37
+ end
38
+
39
+ it 'validates nonce in a thread-safe way' do
40
+ # TODO: test on real concurrency (JRuby?)
41
+ @validator = described_class.new(
42
+ Struct.new(:id).new(2),
43
+ {'HTTP_X_NONCE' => '100500'}
44
+ )
45
+ thread_number = 100
46
+ @threads = thread_number.times.map do |i|
47
+ Thread.new do
48
+ sleep (thread_number - i) / 10000.0
49
+ Thread.current[:result] = @validator.valid_nonce?
50
+ end
51
+ end
52
+ @threads.each(&:join)
53
+ expect(@threads.select { |thread| thread[:result] }.size).to eq 1
54
+ end
55
+
56
+ it 'raises exceptions if invalid' do
57
+ @validator = described_class.new(
58
+ Struct.new(:id, :secret).new(3, 'abc'),
59
+ {
60
+ 'HTTP_X_NONCE' => '1',
61
+ 'rack.input' => 'request body',
62
+ 'REQUEST_METHOD' => 'POST',
63
+ 'REQUEST_PATH' => '/gateway/123/orders',
64
+ }
65
+ )
66
+ @validator.env['HTTP_X_SIGNATURE'] = @validator.signature
67
+ expect(@validator.validate!).to eq true
68
+ expect { @validator.validate! }.to raise_error(described_class::InvalidNonce)
69
+ @validator.env['HTTP_X_NONCE'] = '2'
70
+ expect { @validator.validate! }.to raise_error(described_class::InvalidSignature)
71
+ end
72
+ end
@@ -0,0 +1,16 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe StraightServer::Thread do
4
+
5
+ it 'labels threads' do
6
+ thread = described_class.new(label: 'payment_id'){}
7
+ expect(thread[:label]).to eq 'payment_id'
8
+ end
9
+
10
+ it 'sets and clears interruption flag' do
11
+ thread = described_class.new(label: 'payment_id'){}
12
+ described_class.interrupt(label: 'payment_id')
13
+ expect(described_class.interrupted?(thread: thread)).to eq true
14
+ expect(described_class.interrupted?(thread: thread)).to eq false
15
+ end
16
+ end
@@ -4,7 +4,7 @@ require 'timecop'
4
4
  RSpec.describe StraightServer::Throttler do
5
5
 
6
6
  it 'throttles requests' do
7
- new_config = StraightServer::Config.dup
7
+ new_config = StraightServer::Config.clone
8
8
  new_config.throttle = {requests_limit: 1, period: 1}
9
9
  stub_const 'StraightServer::Config', new_config
10
10
  throttler1 = described_class.new(1)
@@ -29,7 +29,7 @@ RSpec.describe StraightServer::Throttler do
29
29
  end
30
30
 
31
31
  it 'bans by ip' do
32
- new_config = StraightServer::Config.dup
32
+ new_config = StraightServer::Config.clone
33
33
  new_config.throttle = {requests_limit: 3, period: 1, ip_ban_duration: 30}
34
34
  stub_const 'StraightServer::Config', new_config
35
35
  throttler1 = described_class.new(1)
@@ -12,40 +12,34 @@ DB = Sequel.sqlite
12
12
  # 2. Then we can run migrations BEFORE we load actual models
13
13
  Sequel::Migrator.run(DB, File.expand_path('../', File.dirname(__FILE__)) + '/db/migrations/')
14
14
 
15
- # 3. Load config and initializer so that we can read our test config file located in
16
- # spec/.straight/config.yml
15
+ # Actually load the initializer
16
+ require_relative '../lib/straight-server'
17
17
 
18
- # 3.1 This tells initializer where to read the config file from
18
+ # This tells initializer where to read the config file from
19
19
  ENV['HOME'] = File.expand_path(File.dirname(__FILE__))
20
20
 
21
- # 3.2 Actually load the initializer
22
- require_relative "../lib/straight-server/config"
23
- require_relative "../lib/straight-server/initializer"
24
- require_relative "../lib/straight-server/utils/hash_string_to_sym_keys"
25
- include StraightServer::Initializer
26
- StraightServer::Initializer::ConfigDir.set!
27
- read_config_file
28
- setup_redis_connection
29
-
30
- # 4. Load the rest of the files, including models, which are now ready
31
- # to be used as intended and will follow all the previous configuration.
32
- require_relative '../lib/straight-server/order'
21
+ initializer = Class.new do
22
+ include StraightServer::Initializer
23
+ end.new
24
+ initializer.prepare
33
25
  require_relative '../lib/straight-server/gateway'
34
- require_relative '../lib/straight-server/orders_controller'
35
- require_relative '../lib/straight-server'
26
+ require_relative '../lib/straight-server/order'
36
27
 
37
28
  require_relative 'support/custom_matchers'
38
29
 
39
30
  require "factory_girl"
40
31
  require_relative "factories"
41
32
 
42
- class StraightServer::Order
43
- alias :save! :save
44
- end
33
+ require 'webmock/rspec'
45
34
 
35
+ # class StraightServer::Order
36
+ # alias :save! :save
37
+ # end
38
+ #
46
39
  class StraightServer::Thread
47
- def self.new(&block)
40
+ def self.new(label: nil, &block)
48
41
  block.call
42
+ {label: label}
49
43
  end
50
44
  end
51
45
 
@@ -57,7 +51,8 @@ RSpec.configure do |config|
57
51
  StraightServer.db_connection = DB #use a memory DB
58
52
  end
59
53
 
60
- config.before(:each) do
54
+ config.before(:each) do |spec|
55
+ # puts spec.description
61
56
  DB[:orders].delete
62
57
  logger_mock = double("logger mock")
63
58
  [:debug, :info, :warn, :fatal, :unknown, :blank_lines].each do |e|
@@ -2,16 +2,16 @@
2
2
  # DO NOT EDIT THIS FILE DIRECTLY
3
3
  # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
4
  # -*- encoding: utf-8 -*-
5
- # stub: straight-server 0.2.3 ruby lib
5
+ # stub: straight-server 1.0.0 ruby lib
6
6
 
7
7
  Gem::Specification.new do |s|
8
8
  s.name = "straight-server"
9
- s.version = "0.2.3"
9
+ s.version = "1.0.0"
10
10
 
11
11
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
12
12
  s.require_paths = ["lib"]
13
13
  s.authors = ["Roman Snitko"]
14
- s.date = "2015-05-30"
14
+ s.date = "2015-07-31"
15
15
  s.description = "Accepts orders via http, returns payment info via http or streams updates via websockets, stores orders in a DB"
16
16
  s.email = "roman.snitko@gmail.com"
17
17
  s.executables = ["straight-console", "straight-server", "straight-server-benchmark"]
@@ -48,6 +48,15 @@ Gem::Specification.new do |s|
48
48
  "db/migrations/009_add_hashed_id_to_gateways.rb",
49
49
  "db/migrations/010_add_address_reusability_orders.rb",
50
50
  "db/migrations/011_add_callback_data_to_orders.rb",
51
+ "db/migrations/012_add_address_provider.rb",
52
+ "db/migrations/013_add_address_derivation_scheme.rb",
53
+ "db/migrations/014_pubkey_null_address_provider_not_null.rb",
54
+ "db/migrations/015_add_amount_paid_to_orders.rb",
55
+ "db/migrations/016_add_new_params_to_orders.rb",
56
+ "db/migrations/017_add_test_mode_to_gateways.rb",
57
+ "db/migrations/018_add_test_keychain_id_to_gateways.rb",
58
+ "db/migrations/019_add_test_pubkey_to_gateways.rb",
59
+ "db/migrations/020_add_test_mode_to_orders.rb",
51
60
  "db/schema.rb",
52
61
  "examples/client/client.dart",
53
62
  "examples/client/client.html",
@@ -61,11 +70,13 @@ Gem::Specification.new do |s|
61
70
  "lib/straight-server/orders_controller.rb",
62
71
  "lib/straight-server/random_string.rb",
63
72
  "lib/straight-server/server.rb",
73
+ "lib/straight-server/signature_validator.rb",
64
74
  "lib/straight-server/thread.rb",
65
75
  "lib/straight-server/throttler.rb",
66
76
  "lib/straight-server/utils/hash_string_to_sym_keys.rb",
67
77
  "lib/tasks/db.rake",
68
78
  "spec/.straight/config.yml",
79
+ "spec/.straight/default_test_last_keychain_id",
69
80
  "spec/.straight/server_secret",
70
81
  "spec/factories.rb",
71
82
  "spec/fixtures/addons.yml",
@@ -74,6 +85,8 @@ Gem::Specification.new do |s|
74
85
  "spec/lib/initializer_spec.rb",
75
86
  "spec/lib/order_spec.rb",
76
87
  "spec/lib/orders_controller_spec.rb",
88
+ "spec/lib/signature_validator_spec.rb",
89
+ "spec/lib/thread_spec.rb",
77
90
  "spec/lib/throttle_spec.rb",
78
91
  "spec/lib/utils/hash_string_to_sym_keys.rb",
79
92
  "spec/spec_helper.rb",
@@ -91,42 +104,48 @@ Gem::Specification.new do |s|
91
104
  s.specification_version = 4
92
105
 
93
106
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
94
- s.add_runtime_dependency(%q<straight>, ["= 0.2.2"])
95
- s.add_runtime_dependency(%q<satoshi-unit>, [">= 0"])
107
+ s.add_runtime_dependency(%q<straight>, ["= 1.0.0"])
108
+ s.add_runtime_dependency(%q<satoshi-unit>, [">= 0.1.8"])
96
109
  s.add_runtime_dependency(%q<goliath>, [">= 0"])
97
110
  s.add_runtime_dependency(%q<faye-websocket>, [">= 0"])
98
111
  s.add_runtime_dependency(%q<sequel>, [">= 0"])
99
112
  s.add_runtime_dependency(%q<logmaster>, ["= 0.1.5"])
100
113
  s.add_runtime_dependency(%q<ruby-hmac>, [">= 0"])
101
114
  s.add_runtime_dependency(%q<httparty>, [">= 0"])
102
- s.add_runtime_dependency(%q<money-tree>, ["= 0.9.0"])
115
+ s.add_runtime_dependency(%q<redis>, [">= 0"])
116
+ s.add_runtime_dependency(%q<btcruby>, [">= 0"])
117
+ s.add_development_dependency(%q<byebug>, [">= 0"])
103
118
  s.add_development_dependency(%q<bundler>, ["~> 1.0"])
104
119
  s.add_development_dependency(%q<jeweler>, ["~> 2.0.1"])
105
120
  s.add_development_dependency(%q<github_api>, ["= 0.11.3"])
106
121
  else
107
- s.add_dependency(%q<straight>, ["= 0.2.2"])
108
- s.add_dependency(%q<satoshi-unit>, [">= 0"])
122
+ s.add_dependency(%q<straight>, ["= 1.0.0"])
123
+ s.add_dependency(%q<satoshi-unit>, [">= 0.1.8"])
109
124
  s.add_dependency(%q<goliath>, [">= 0"])
110
125
  s.add_dependency(%q<faye-websocket>, [">= 0"])
111
126
  s.add_dependency(%q<sequel>, [">= 0"])
112
127
  s.add_dependency(%q<logmaster>, ["= 0.1.5"])
113
128
  s.add_dependency(%q<ruby-hmac>, [">= 0"])
114
129
  s.add_dependency(%q<httparty>, [">= 0"])
115
- s.add_dependency(%q<money-tree>, ["= 0.9.0"])
130
+ s.add_dependency(%q<redis>, [">= 0"])
131
+ s.add_dependency(%q<btcruby>, [">= 0"])
132
+ s.add_dependency(%q<byebug>, [">= 0"])
116
133
  s.add_dependency(%q<bundler>, ["~> 1.0"])
117
134
  s.add_dependency(%q<jeweler>, ["~> 2.0.1"])
118
135
  s.add_dependency(%q<github_api>, ["= 0.11.3"])
119
136
  end
120
137
  else
121
- s.add_dependency(%q<straight>, ["= 0.2.2"])
122
- s.add_dependency(%q<satoshi-unit>, [">= 0"])
138
+ s.add_dependency(%q<straight>, ["= 1.0.0"])
139
+ s.add_dependency(%q<satoshi-unit>, [">= 0.1.8"])
123
140
  s.add_dependency(%q<goliath>, [">= 0"])
124
141
  s.add_dependency(%q<faye-websocket>, [">= 0"])
125
142
  s.add_dependency(%q<sequel>, [">= 0"])
126
143
  s.add_dependency(%q<logmaster>, ["= 0.1.5"])
127
144
  s.add_dependency(%q<ruby-hmac>, [">= 0"])
128
145
  s.add_dependency(%q<httparty>, [">= 0"])
129
- s.add_dependency(%q<money-tree>, ["= 0.9.0"])
146
+ s.add_dependency(%q<redis>, [">= 0"])
147
+ s.add_dependency(%q<btcruby>, [">= 0"])
148
+ s.add_dependency(%q<byebug>, [">= 0"])
130
149
  s.add_dependency(%q<bundler>, ["~> 1.0"])
131
150
  s.add_dependency(%q<jeweler>, ["~> 2.0.1"])
132
151
  s.add_dependency(%q<github_api>, ["= 0.11.3"])