straight-server 0.2.3 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +2 -2
- data/Gemfile +21 -16
- data/Gemfile.lock +44 -30
- data/Gemfile.travis +15 -16
- data/README.md +66 -47
- data/VERSION +1 -1
- data/db/migrations/011_add_callback_data_to_orders.rb +1 -1
- data/db/migrations/012_add_address_provider.rb +11 -0
- data/db/migrations/013_add_address_derivation_scheme.rb +11 -0
- data/db/migrations/014_pubkey_null_address_provider_not_null.rb +8 -0
- data/db/migrations/015_add_amount_paid_to_orders.rb +11 -0
- data/db/migrations/016_add_new_params_to_orders.rb +13 -0
- data/db/migrations/017_add_test_mode_to_gateways.rb +11 -0
- data/db/migrations/018_add_test_keychain_id_to_gateways.rb +11 -0
- data/db/migrations/019_add_test_pubkey_to_gateways.rb +11 -0
- data/db/migrations/020_add_test_mode_to_orders.rb +11 -0
- data/db/schema.rb +11 -1
- data/lib/straight-server.rb +11 -9
- data/lib/straight-server/config.rb +28 -18
- data/lib/straight-server/gateway.rb +167 -87
- data/lib/straight-server/initializer.rb +13 -7
- data/lib/straight-server/order.rb +39 -17
- data/lib/straight-server/orders_controller.rb +71 -21
- data/lib/straight-server/random_string.rb +3 -13
- data/lib/straight-server/server.rb +3 -4
- data/lib/straight-server/signature_validator.rb +69 -0
- data/lib/straight-server/thread.rb +19 -4
- data/lib/straight-server/throttler.rb +7 -13
- data/lib/tasks/db.rake +1 -1
- data/spec/.straight/config.yml +8 -3
- data/spec/.straight/default_test_last_keychain_id +1 -0
- data/spec/factories.rb +2 -1
- data/spec/lib/gateway_spec.rb +222 -94
- data/spec/lib/initializer_spec.rb +1 -1
- data/spec/lib/order_spec.rb +26 -7
- data/spec/lib/orders_controller_spec.rb +65 -6
- data/spec/lib/signature_validator_spec.rb +72 -0
- data/spec/lib/thread_spec.rb +16 -0
- data/spec/lib/throttle_spec.rb +2 -2
- data/spec/spec_helper.rb +17 -22
- data/straight-server.gemspec +31 -12
- data/templates/config.yml +19 -10
- metadata +52 -11
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8c948e3fe9fa5c45507abf1d99c8d79d208a8c38
|
4
|
+
data.tar.gz: 6bb99e03b2ab6d086cab4dd9afec47de95a85a34
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6eeaaf80ea4161fa7857739fbb25939e4bd7d159a389acff8880a0b208daaa46a5f90fdbca3752d7e563cc896bc1eb9d5ffb54e169918b5dfad426898b38eaab
|
7
|
+
data.tar.gz: 6cf3c16258ffd4b3b762ce8b2ebe287cb6a6c0e5e959dcae12a8c9d32d40de3d9b5f5a3dccbbb80d9ee3c9c4a4c62c54ff83c514e3a1dd9cb0302e9071649db8
|
data/.travis.yml
CHANGED
data/Gemfile
CHANGED
@@ -1,21 +1,26 @@
|
|
1
|
-
source
|
1
|
+
source 'https://rubygems.org' do
|
2
|
+
gem 'straight', '1.0.0' #, path: '../straight-engine'
|
3
|
+
gem 'satoshi-unit', '>= 0.1.8'
|
4
|
+
gem 'goliath'
|
5
|
+
gem 'faye-websocket'
|
6
|
+
gem 'sequel'
|
7
|
+
gem 'logmaster', '0.1.5'
|
8
|
+
gem 'ruby-hmac'
|
9
|
+
gem 'httparty'
|
10
|
+
gem 'redis'
|
11
|
+
gem 'btcruby'
|
12
|
+
end
|
2
13
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
gem "sequel"
|
8
|
-
gem "logmaster", '0.1.5'
|
9
|
-
gem "ruby-hmac"
|
10
|
-
gem "httparty"
|
11
|
-
gem "money-tree", "0.9.0"
|
14
|
+
unless ENV['STRAIGHT_SERVER_IGNORE_ADDONS_GEMFILE'] # use this flag when building straight-server.gemspec
|
15
|
+
addons_gemfile = File.join(ENV['STRAIGHT_SERVER_CONFIG_DIR'] || File.join(ENV['HOME'], '.straight'), 'AddonsGemfile')
|
16
|
+
eval_gemfile addons_gemfile if File.exists?(addons_gemfile)
|
17
|
+
end
|
12
18
|
|
13
|
-
# Add dependencies to develop your gem here.
|
14
|
-
# Include everything needed to run rake, tests, features, etc.
|
15
19
|
group :development do
|
16
|
-
gem
|
17
|
-
gem
|
18
|
-
gem
|
20
|
+
gem 'byebug'
|
21
|
+
gem 'bundler', '~> 1.0'
|
22
|
+
gem 'jeweler', '~> 2.0.1'
|
23
|
+
gem 'github_api', '0.11.3'
|
19
24
|
end
|
20
25
|
|
21
26
|
group :test do
|
@@ -24,5 +29,5 @@ group :test do
|
|
24
29
|
gem 'factory_girl'
|
25
30
|
gem 'sqlite3'
|
26
31
|
gem 'hashie'
|
27
|
-
gem '
|
32
|
+
gem 'webmock', require: false
|
28
33
|
end
|
data/Gemfile.lock
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
GEM
|
2
|
-
remote:
|
2
|
+
remote: https://rubygems.org/
|
3
3
|
specs:
|
4
4
|
activesupport (4.2.1)
|
5
5
|
i18n (~> 0.7)
|
@@ -10,7 +10,14 @@ GEM
|
|
10
10
|
addressable (2.3.8)
|
11
11
|
async-rack (0.5.1)
|
12
12
|
rack (~> 1.1)
|
13
|
+
btcruby (1.0.6)
|
14
|
+
ffi (~> 1.9, >= 1.9.3)
|
13
15
|
builder (3.2.2)
|
16
|
+
byebug (5.0.0)
|
17
|
+
columnize (= 0.9.0)
|
18
|
+
columnize (0.9.0)
|
19
|
+
crack (0.4.2)
|
20
|
+
safe_yaml (~> 1.0.0)
|
14
21
|
descendants_tracker (0.0.4)
|
15
22
|
thread_safe (~> 0.3, >= 0.3.1)
|
16
23
|
diff-lcs (1.2.5)
|
@@ -24,11 +31,12 @@ GEM
|
|
24
31
|
activesupport (>= 3.0.0)
|
25
32
|
faraday (0.9.1)
|
26
33
|
multipart-post (>= 1.2, < 3)
|
27
|
-
faye-websocket (0.
|
34
|
+
faye-websocket (0.10.0)
|
28
35
|
eventmachine (>= 0.12.0)
|
29
36
|
websocket-driver (>= 0.5.1)
|
30
|
-
ffi (1.9.
|
37
|
+
ffi (1.9.10)
|
31
38
|
git (1.2.9.1)
|
39
|
+
git-version-bump (0.15.1)
|
32
40
|
github_api (0.11.3)
|
33
41
|
addressable (~> 2.3)
|
34
42
|
descendants_tracker (~> 0.0.1)
|
@@ -64,18 +72,16 @@ GEM
|
|
64
72
|
nokogiri (>= 1.5.10)
|
65
73
|
rake
|
66
74
|
rdoc
|
67
|
-
json (1.8.
|
68
|
-
jwt (1.
|
75
|
+
json (1.8.3)
|
76
|
+
jwt (1.5.0)
|
69
77
|
log4r (1.1.10)
|
70
78
|
logmaster (0.1.5)
|
71
79
|
pony
|
72
80
|
mail (2.6.3)
|
73
81
|
mime-types (>= 1.16, < 3)
|
74
|
-
mime-types (2.
|
82
|
+
mime-types (2.6.1)
|
75
83
|
mini_portile (0.6.2)
|
76
|
-
minitest (5.
|
77
|
-
money-tree (0.9.0)
|
78
|
-
ffi
|
84
|
+
minitest (5.7.0)
|
79
85
|
multi_json (1.11.0)
|
80
86
|
multi_xml (0.5.5)
|
81
87
|
multipart-post (2.0.0)
|
@@ -89,10 +95,11 @@ GEM
|
|
89
95
|
rack (~> 1.2)
|
90
96
|
pony (1.11)
|
91
97
|
mail (>= 2.0)
|
92
|
-
rack (1.6.
|
98
|
+
rack (1.6.1)
|
93
99
|
rack-accept-media-types (0.9)
|
94
|
-
rack-contrib (1.
|
95
|
-
|
100
|
+
rack-contrib (1.3.0)
|
101
|
+
git-version-bump (~> 0.15)
|
102
|
+
rack (~> 1.4)
|
96
103
|
rack-respond_to (0.9.8)
|
97
104
|
rack-accept-media-types (>= 0.6)
|
98
105
|
rake (10.4.2)
|
@@ -112,18 +119,23 @@ GEM
|
|
112
119
|
rspec-support (~> 3.2.0)
|
113
120
|
rspec-support (3.2.2)
|
114
121
|
ruby-hmac (0.4.0)
|
115
|
-
|
116
|
-
|
122
|
+
safe_yaml (1.0.4)
|
123
|
+
satoshi-unit (0.1.8)
|
124
|
+
sequel (4.24.0)
|
117
125
|
sqlite3 (1.3.10)
|
118
|
-
straight (0.
|
119
|
-
|
120
|
-
|
121
|
-
|
126
|
+
straight (1.0.0)
|
127
|
+
btcruby (~> 1.0)
|
128
|
+
faraday
|
129
|
+
httparty (~> 0.13.5)
|
130
|
+
satoshi-unit (~> 0.1)
|
122
131
|
thread_safe (0.3.5)
|
123
|
-
timecop (0.7.
|
132
|
+
timecop (0.7.4)
|
124
133
|
tzinfo (1.2.2)
|
125
134
|
thread_safe (~> 0.1)
|
126
|
-
|
135
|
+
webmock (1.21.0)
|
136
|
+
addressable (>= 2.3.6)
|
137
|
+
crack (>= 0.3.2)
|
138
|
+
websocket-driver (0.6.0)
|
127
139
|
websocket-extensions (>= 0.1.0)
|
128
140
|
websocket-extensions (0.1.2)
|
129
141
|
|
@@ -131,21 +143,23 @@ PLATFORMS
|
|
131
143
|
ruby
|
132
144
|
|
133
145
|
DEPENDENCIES
|
146
|
+
btcruby!
|
134
147
|
bundler (~> 1.0)
|
148
|
+
byebug
|
135
149
|
factory_girl
|
136
|
-
faye-websocket
|
150
|
+
faye-websocket!
|
137
151
|
github_api (= 0.11.3)
|
138
|
-
goliath
|
152
|
+
goliath!
|
139
153
|
hashie
|
140
|
-
httparty
|
154
|
+
httparty!
|
141
155
|
jeweler (~> 2.0.1)
|
142
|
-
logmaster (= 0.1.5)
|
143
|
-
|
144
|
-
redis
|
156
|
+
logmaster (= 0.1.5)!
|
157
|
+
redis!
|
145
158
|
rspec
|
146
|
-
ruby-hmac
|
147
|
-
satoshi-unit
|
148
|
-
sequel
|
159
|
+
ruby-hmac!
|
160
|
+
satoshi-unit (>= 0.1.8)!
|
161
|
+
sequel!
|
149
162
|
sqlite3
|
150
|
-
straight (= 0.
|
163
|
+
straight (= 1.0.0)!
|
151
164
|
timecop
|
165
|
+
webmock
|
data/Gemfile.travis
CHANGED
@@ -1,21 +1,20 @@
|
|
1
|
-
source
|
1
|
+
source 'https://rubygems.org'
|
2
2
|
|
3
|
-
gem
|
4
|
-
gem
|
5
|
-
gem
|
6
|
-
gem
|
7
|
-
gem
|
8
|
-
gem
|
9
|
-
gem
|
10
|
-
gem
|
11
|
-
gem
|
3
|
+
gem 'straight', github: "snitko/straight"
|
4
|
+
gem 'satoshi-unit'
|
5
|
+
gem 'goliath'
|
6
|
+
gem 'faye-websocket'
|
7
|
+
gem 'sequel'
|
8
|
+
gem 'logmaster', '0.1.5'
|
9
|
+
gem 'ruby-hmac'
|
10
|
+
gem 'httparty'
|
11
|
+
gem 'redis'
|
12
12
|
|
13
|
-
# Add dependencies to develop your gem here.
|
14
|
-
# Include everything needed to run rake, tests, features, etc.
|
15
13
|
group :development do
|
16
|
-
gem
|
17
|
-
gem
|
18
|
-
gem
|
14
|
+
gem 'byebug'
|
15
|
+
gem 'bundler', '~> 1.0'
|
16
|
+
gem 'jeweler', '~> 2.0.1'
|
17
|
+
gem 'github_api', '0.11.3'
|
19
18
|
end
|
20
19
|
|
21
20
|
group :test do
|
@@ -24,5 +23,5 @@ group :test do
|
|
24
23
|
gem 'factory_girl'
|
25
24
|
gem 'sqlite3'
|
26
25
|
gem 'hashie'
|
27
|
-
gem '
|
26
|
+
gem 'webmock', require: false
|
28
27
|
end
|
data/README.md
CHANGED
@@ -10,7 +10,7 @@ Straight server
|
|
10
10
|
|
11
11
|
> Website: http://gear.mycelium.com
|
12
12
|
|
13
|
-
[![Build Status](https://travis-ci.org/
|
13
|
+
[![Build Status](https://travis-ci.org/MyceliumGear/straight-server.svg)](https://travis-ci.org/MyceliumGear/straight-server)
|
14
14
|
|
15
15
|
If you'd like to accept Bitcoin payments on your website automatically, but you're not
|
16
16
|
fond of services like Coinbase or Bitpay, which hold your bitcoins for you and require a ton
|
@@ -35,7 +35,7 @@ Installation
|
|
35
35
|
------------
|
36
36
|
I currently only tested it on Unix machines.
|
37
37
|
|
38
|
-
1. Install RVM
|
38
|
+
1. Install RVM, Ruby 2.1 (see [RVM guide](http://rvm.io/rvm/install)) and Redis.
|
39
39
|
|
40
40
|
2. run `gem install straight-server`
|
41
41
|
|
@@ -70,7 +70,7 @@ in the `~/.straight/config.yml` file for the current gateway. This callback requ
|
|
70
70
|
|
71
71
|
Here's an example of a callback url request that could be made by Straight server when order status changes:
|
72
72
|
|
73
|
-
GET http://mystore.com/payment-callback?order_id=234&amount=1&status=2&address=1NZov2nm6gRCGW6r4q1qHtxXurrWNpPr1q&tid=tid1&callback_data=some+random+data&keychain_id=1&last_keychain_id=1
|
73
|
+
GET http://mystore.com/payment-callback?order_id=234&amount=1&amount_in_btc=0.00000001&amoint_paid_in_btc=0.00000001&status=2&address=1NZov2nm6gRCGW6r4q1qHtxXurrWNpPr1q&tid=tid1&callback_data=some+random+data&keychain_id=1&last_keychain_id=1
|
74
74
|
|
75
75
|
As you may have noticed, there's a parameter called `callback_data`. It is a way for you to pass info back
|
76
76
|
to your app. It will have the same value as the `callback_data` parameter you passed to the create order request:
|
@@ -96,7 +96,7 @@ where `:id` can either be order `id` (CAUTION: order `id` is NOT the same as `ke
|
|
96
96
|
`payment_id` - both are returned in the json data when the order
|
97
97
|
is created (see above). The request above may return something like:
|
98
98
|
|
99
|
-
{"status":2,"amount":1,"address":"1NZov2nm6gRCGW6r4q1qHtxXurrWNpPr1q","tid":"f0f9205e41bf1b79cb7634912e86bb840cedf8b1d108bd2faae1651ca79a5838","id":1, "keychain_id": 1,
|
99
|
+
{"status":2,"amount":1,"address":"1NZov2nm6gRCGW6r4q1qHtxXurrWNpPr1q","tid":"f0f9205e41bf1b79cb7634912e86bb840cedf8b1d108bd2faae1651ca79a5838","id":1,"amount_in_btc": 0.00000001,"amount_paid_in_btc": 0.00000001,"keychain_id": 1,"last_keychain_id": 1 }
|
100
100
|
|
101
101
|
**Subscribing to the order using websockets**:
|
102
102
|
You can also subscribe to the order status changes using websockets at:
|
@@ -112,6 +112,15 @@ its creation time in `#created_at` field. In turn, each order's gateway has a fi
|
|
112
112
|
depending on what approach to storing gateways you use). After this time has passed, straight-server stops
|
113
113
|
checking whether new transactions appear on the order's bitcoin address and also changes order's status to 5 (expired).
|
114
114
|
|
115
|
+
**Get last keychain id**
|
116
|
+
You can get last keychain id for gateway with the following request:
|
117
|
+
|
118
|
+
GET /gateway/1/last_keychain_id
|
119
|
+
|
120
|
+
The request above return something like:
|
121
|
+
|
122
|
+
{"gateway_id": 1, "last_keychain_id": "11"}
|
123
|
+
|
115
124
|
Implications of restarting the server
|
116
125
|
-------------------------------------
|
117
126
|
|
@@ -197,35 +206,36 @@ Go to your `~/.straight/config.yml` directory and set two options for each of yo
|
|
197
206
|
secret: 'a long string of random chars'
|
198
207
|
check_signature: true
|
199
208
|
|
200
|
-
This will force gateways to check signatures when you try to create a new order.
|
201
|
-
|
202
|
-
to actually provide it manually in the params. It can be any integer > 0, but it's better
|
203
|
-
that it is a consecutive integer, so keep track of the last keychain_id that was used in your
|
204
|
-
application. A possible request (assuming secret is the line mentioned above in the sample config) would look like this:
|
205
|
-
|
206
|
-
POST /gateways/1/orders?amount=1&keychain_id=1&signature=aa14c26b2ae892a8719b0c2c57f162b967bfbfbdcc38d8883714a0680cf20467
|
209
|
+
This will force gateways to check signatures when you try to create a new order.
|
210
|
+
A signature is a `X-Signature` header with a string of about 88 chars:
|
207
211
|
|
208
|
-
|
212
|
+
Base64StrictEncode(
|
213
|
+
HMAC-SHA512(
|
214
|
+
REQUEST_METHOD + REQUEST_URI + SHA512(X-Nonce + REQUEST_BODY),
|
215
|
+
GATEWAY_SECRET
|
216
|
+
)
|
217
|
+
)
|
209
218
|
|
210
|
-
|
211
|
-
|
212
|
-
secret = 'a long string of random chars'
|
213
|
-
OpenSSL::HMAC.digest('sha256', secret, "1").unpack("H*").first # "1" may be order_id here
|
219
|
+
Where
|
214
220
|
|
215
|
-
|
216
|
-
|
217
|
-
|
221
|
+
* `REQUEST_METHOD`: `GET`, `POST`, etc.
|
222
|
+
* `REQUEST_URI`: `/full/path/with?arguments&and#fragment`
|
223
|
+
* `REQUEST_BODY`: final string with JSON or blank string
|
224
|
+
* `X-Nonce`: header with an integer which must be incremented with each request (protects from replay attack), for example `(Time.now.to_f * 1000).to_i`
|
225
|
+
* `SHA512`: [binary SHA-2, 512 bits](https://en.wikipedia.org/wiki/SHA-2)
|
226
|
+
* `HMAC-SHA512`: [binary HMAC with SHA512](https://en.wikipedia.org/wiki/Hash-based_message_authentication_code)
|
227
|
+
* `GATEWAY_SECRET`: key for HMAC
|
228
|
+
* `Base64StrictEncode`: [Base64 encoding according to RFC 4648](https://en.wikipedia.org/wiki/Base64#RFC_4648)
|
218
229
|
|
219
|
-
|
220
|
-
secret = 'a long string of random chars'
|
221
|
-
h = OpenSSL::HMAC.digest('sha256', secret, 234).unpack("H*").first
|
230
|
+
For Ruby users signing is already implemented in `straight-server-kit` gem.
|
222
231
|
|
223
|
-
|
232
|
+
Straight server will also sign the callback url request. However, it will use blank X-Nonce.
|
224
233
|
|
225
|
-
GET http://mystore.com/payment-callback?order_id=
|
234
|
+
GET http://mystore.com/payment-callback?order_id=1&amount=10&amount_in_btc=0.0000001&amount_paid_in_btc=0.&status=1&address=address_1&tid=tid1&keychain_id=1&last_keychain_id=1&callback_data=so%3Fme+ran%26dom+data
|
235
|
+
X-Signature: S2P8A16+RPaegTzJnb0Eg91csb1SExjdnvadABmQvfoIry4POBp6WbA6UOSqXojzRevyC8Ya/5QrQTnNxIb4og==
|
226
236
|
|
227
|
-
It is now up to your application to calculate that signature
|
228
|
-
|
237
|
+
It is now up to your application to calculate that signature and compare it.
|
238
|
+
If it doesn't match, do not trust data, instead log it for further investigation and return 200 in order to prevent retries.
|
229
239
|
|
230
240
|
What is keychain_id and why do we need it?
|
231
241
|
------------------------------------------
|
@@ -245,13 +255,6 @@ If you have 20 orders in a row and try to create another one, straight-server wi
|
|
245
255
|
automatically reuse the `keychain_id` (and consequently, the address too) of the 20-th order. It will
|
246
256
|
also set the 21-st order's `reused` field to the value of `1`.
|
247
257
|
|
248
|
-
CAUTION: while you don't need to provide `keychain_id` when creating orders with gateways that
|
249
|
-
do not require signatures, you still must do it with gateways that do require signatures.
|
250
|
-
In this case, it is very important to make sure that you don't accidentally provide `keychain_id`
|
251
|
-
that is too far away from the last used one. For example, if the gateway's `last_keychain_id` is `10`,
|
252
|
-
do not use `35` for the next order, use `11`. `last_gateway_id` is always returned with other info
|
253
|
-
when you create or check order status.
|
254
|
-
|
255
258
|
Querying the blockchain
|
256
259
|
-----------------------
|
257
260
|
Straight currently uses third-party services, such as Blokchain.info and Helloblock.io to track
|
@@ -267,30 +270,40 @@ to query the blockchain.
|
|
267
270
|
Counting orders
|
268
271
|
---------------
|
269
272
|
For easy statistics and reports, it is desirable to know how many orders of each particular status each gateway has.
|
270
|
-
For that reason optional order counters are implemented. To enable order counters,
|
271
|
-
and then *redis* rubygem.
|
272
|
-
|
273
|
-
Then edit your config file and make sure the following options are set:
|
273
|
+
For that reason optional order counters are implemented. To enable order counters, make sure the following options are set:
|
274
274
|
|
275
|
-
environment: development # name your environment here
|
276
275
|
count_orders: true # enable order counting feature
|
277
276
|
|
278
|
-
redis:
|
279
|
-
host: localhost
|
280
|
-
port: 6379
|
281
|
-
db: null # change to 1, 2, 3 etc. or leave as is
|
282
|
-
password: null # if no password is needed, leave as is
|
283
|
-
|
284
277
|
After restarting the server, you can use `Gateway#order_counters` method which will
|
285
278
|
return a hash of all the counters. Here's an example output:
|
286
279
|
|
287
|
-
{ new: 132, unconfirmed: 0, paid: 34, underpaid: 1, overpaid: 2, expired: 55 }
|
280
|
+
{ new: 132, unconfirmed: 0, paid: 34, underpaid: 1, overpaid: 2, expired: 55, canceled: 10 }
|
288
281
|
|
289
282
|
The default behaviour is to cache the output, so if you want fresh values, use `reload: true`
|
290
283
|
option on this method:
|
291
284
|
|
292
285
|
Gateway#order_counters(reload: true)
|
293
286
|
|
287
|
+
Throttling
|
288
|
+
----------
|
289
|
+
|
290
|
+
If Gateway does not require signature check (e.g. it's a public widget), you may wish to limit orders creation.
|
291
|
+
This may help to mitigate potential DoS attacks.
|
292
|
+
In order to enable throttler, edit your config file and make sure the following options are set:
|
293
|
+
|
294
|
+
throttle:
|
295
|
+
requests_limit: 21
|
296
|
+
period: 60
|
297
|
+
ip_ban_duration: 300
|
298
|
+
|
299
|
+
This will allow maximum 21 new orders per 60 seconds per gateway to be created.
|
300
|
+
`ip_ban_duration` is optional and prevents users from the banned IP (think of NAT) to create orders via any gateway for 300 seconds.
|
301
|
+
When using this option, make sure that `HTTP_X_FORWARDED_FOR` header contains end user's IP. For example, in nginx config:
|
302
|
+
|
303
|
+
proxy_set_header X-Forwarded-For $remote_addr;
|
304
|
+
|
305
|
+
Also, check out [ngx_http_realip_module](http://nginx.org/en/docs/http/ngx_http_realip_module.html).
|
306
|
+
|
294
307
|
Running in production
|
295
308
|
---------------------
|
296
309
|
Running in production usually assumes running server as daemon with a pid. Straight server
|
@@ -346,14 +359,20 @@ adding controllers and routes for them. Now let's look at how we should do that:
|
|
346
359
|
|
347
360
|
1. All addons are placed under `~/.straight/addons/` (of course, it is wise to use symlinks).
|
348
361
|
|
349
|
-
2.
|
362
|
+
2. `~/.straight/addons.yml` file lists addons and tells straight-server what are the names of the files to be loaded.
|
350
363
|
The format of the file is the following:
|
351
364
|
|
365
|
+
|
352
366
|
my_addon # <- name doesn't affect anything, just shows up in the log file
|
353
367
|
path: addons/my_addon/lib/my_addon # <- This is unnecessary if addon is already in the LOAD_PATH
|
354
368
|
module: MyAddon # <- actual module should be a submodule of StraightServer::Addon
|
355
369
|
|
356
|
-
3.
|
370
|
+
3. If addon has dependencies, they can be listed in `~/.straight/AddonsGemfile` and will be installed along with `straight-server` dependencies.
|
371
|
+
|
372
|
+
|
373
|
+
eval_gemfile '/home/app/.straight/addons/my_addon/Gemfile'
|
374
|
+
|
375
|
+
4. In `./straight/addons/my_addon/lib/` we will place two files, `my_addon.rb` and 'my_controller.rb'. Below is their contents:
|
357
376
|
|
358
377
|
|
359
378
|
# my_addon.rb
|