rhoconnect 5.1.1 → 5.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +11 -8
- data/CREDITS +100 -100
- data/Gemfile +0 -2
- data/Gemfile.lock +56 -71
- data/LICENSE +5 -72
- data/README.md +0 -0
- data/Rakefile +0 -0
- data/bench/bench +0 -0
- data/bench/benchapp/settings/settings.yml +0 -3
- data/bench/blobapp/settings/settings.yml +0 -3
- data/bench/distr_bench/distr_bench +0 -0
- data/bench/distr_bench/distr_bench_main +0 -0
- data/bench/distr_bench/run_distr_client.sh +0 -0
- data/bench/distr_bench/run_test_query_script.sh +0 -0
- data/bench/lib/bench/bench_result_processor.rb +0 -0
- data/bench/lib/bench.rb +0 -8
- data/bench/lib/testdata/images/icon.ico +0 -0
- data/bench/lib/testdata/images/icon.png +0 -0
- data/bench/lib/testdata/images/loading-Landscape.png +0 -0
- data/bench/lib/testdata/images/loading-LandscapeLeft.png +0 -0
- data/bench/lib/testdata/images/loading-LandscapeRight.png +0 -0
- data/bench/lib/testdata/images/loading-Portrait.png +0 -0
- data/bench/lib/testdata/images/loading-PortraitUpsideDown.png +0 -0
- data/bench/lib/testdata/images/loading.png +0 -0
- data/bench/lib/testdata/images/loading@2x.png +0 -0
- data/bench/prepare_bench +0 -0
- data/bench/run_bench.sh +0 -0
- data/bench/run_blob_script.sh +0 -0
- data/bench/run_cud_script.sh +0 -0
- data/bench/run_query_md_script.sh +0 -0
- data/bench/run_query_only_script.sh +0 -0
- data/bench/run_query_script.sh +0 -0
- data/bench/run_test_query_script.sh +0 -0
- data/bench/run_test_source_script.sh +0 -0
- data/bin/rhoconnect-benchmark +0 -22
- data/commands/rhoconnect/restart.rb +0 -1
- data/commands/rhoconnect/start.rb +2 -14
- data/doc/adapters-crm.txt +1 -1
- data/doc/benchmarks-running.txt +1 -1
- data/doc/benchmarks.txt +0 -1
- data/doc/bulk-sync.txt +0 -1
- data/doc/command-line.txt +0 -6
- data/doc/java-plugin.txt +0 -6
- data/doc/preparing-production.txt +1 -7
- data/doc/public/cli.txt +0 -2
- data/doc/public/css/print.css +0 -0
- data/doc/public/css/screen.css +0 -0
- data/doc/public/css/style.css +0 -0
- data/doc/push-client-setup-android.txt +0 -1
- data/doc/push-client-setup-ios.txt +0 -1
- data/doc/push-client-setup-rps.txt +3 -3
- data/doc/push-server-setup.txt +1 -4
- data/doc/rails-plugin.txt +0 -5
- data/doc/rest-api.txt +2 -14
- data/doc/rhoconnect-redis-stack.txt +0 -1
- data/doc/settings.txt +0 -3
- data/doc/supported-platforms.txt +0 -1
- data/doc/tutorial.txt +0 -2
- data/examples/simple/config.ru +0 -0
- data/examples/simple/settings/settings.yml +1 -4
- data/generators/rhoconnect.rb +0 -1
- data/generators/templates/application/config.ru +0 -0
- data/generators/templates/application/rcgemfile +1 -0
- data/generators/templates/application/settings/settings.yml +0 -3
- data/install.sh +0 -0
- data/installer/utils/create_sha1.rb +0 -0
- data/installer/utils/delete_from_s3.rb +0 -0
- data/installer/utils/download_from_s3.rb +0 -0
- data/installer/utils/nix_install_test.rb +0 -0
- data/installer/utils/package_upload/repos.rake +2 -2
- data/installer/utils/package_upload/s3_single_file.rb +0 -0
- data/installer/utils/package_upload/s3_upload.rb +0 -0
- data/installer/utils/verify_checksum.rb +0 -0
- data/lib/rhoconnect/api_token.rb +0 -0
- data/lib/rhoconnect/app.rb +0 -0
- data/lib/rhoconnect/bulk_data/bulk_data.rb +0 -0
- data/lib/rhoconnect/bulk_data/syncdb.index.schema +0 -0
- data/lib/rhoconnect/bulk_data/syncdb.schema +0 -0
- data/lib/rhoconnect/bulk_data.rb +0 -0
- data/lib/rhoconnect/client.rb +0 -2
- data/lib/rhoconnect/controller/system_controller.rb +0 -9
- data/lib/rhoconnect/credential.rb +0 -0
- data/lib/rhoconnect/document.rb +0 -0
- data/lib/rhoconnect/middleware/cors.rb +209 -209
- data/lib/rhoconnect/middleware/x_domain_session_wrapper.rb +57 -57
- data/lib/rhoconnect/model/base.rb +0 -0
- data/lib/rhoconnect/read_state.rb +0 -0
- data/lib/rhoconnect/rho_indifferent_access.rb +0 -0
- data/lib/rhoconnect/server.rb +0 -0
- data/lib/rhoconnect/source.rb +0 -0
- data/lib/rhoconnect/store.rb +2 -0
- data/lib/rhoconnect/store_orm.rb +0 -0
- data/lib/rhoconnect/user.rb +0 -0
- data/lib/rhoconnect/version.rb +1 -1
- data/lib/rhoconnect/web-console/models/doc.js +0 -13
- data/lib/rhoconnect/web-console/models/source.js +0 -31
- data/lib/rhoconnect/web-console/public/logo.png +0 -0
- data/lib/rhoconnect/web-console/server.rb +0 -0
- data/lib/rhoconnect/web-console/templates/index.erb +1 -2
- data/lib/rhoconnect/web-console/views/home.js +4 -6
- data/lib/rhoconnect.rb +1 -3
- data/spec/api/api_helper.rb +0 -0
- data/spec/api/system/login_spec.rb +0 -0
- data/spec/api/system/reset_spec.rb +0 -0
- data/spec/api/user/create_user_spec.rb +0 -0
- data/spec/api/user/update_user_spec.rb +0 -0
- data/spec/api_token_spec.rb +0 -0
- data/spec/app_spec.rb +0 -0
- data/spec/apps/emptyapp/settings/settings.yml +1 -4
- data/spec/apps/jstestapp/settings/settings.yml +0 -3
- data/spec/apps/rhotestapp/controllers/ruby/application_controller.rb +0 -0
- data/spec/apps/rhotestapp/models/ruby/sample_adapter.rb +0 -0
- data/spec/apps/rhotestapp/models/ruby/simple_adapter.rb +0 -0
- data/spec/apps/rhotestapp/settings/settings.yml +0 -3
- data/spec/apps/rhotestapp/vendor/mygem-0.1.0/lib/mygem/mygem.rb +0 -0
- data/spec/apps/rhotestapp/vendor/mygem-0.1.0/lib/mygem.rb +0 -0
- data/spec/bulk_data/bulk_data_spec.rb +0 -0
- data/spec/client_spec.rb +0 -14
- data/spec/client_sync_spec.rb +0 -0
- data/spec/doc/base.html +0 -0
- data/spec/doc/doc_spec.rb +0 -0
- data/spec/doc/footer.html +0 -0
- data/spec/doc/header.html +0 -0
- data/spec/document_spec.rb +0 -0
- data/spec/generator/generator_spec.rb +1 -3
- data/spec/jobs/bulk_data_job_spec.rb +0 -0
- data/spec/perf/bulk_data_perf_spec.rb +0 -0
- data/spec/perf/perf_spec_helper.rb +0 -0
- data/spec/perf/store_perf_spec.rb +0 -0
- data/spec/read_state_spec.rb +0 -0
- data/spec/server/cors_spec.rb +283 -283
- data/spec/server/server_spec.rb +0 -15
- data/spec/server/x_domain_session_wrapper_spec.rb +150 -150
- data/spec/source_adapter_spec.rb +0 -0
- data/spec/source_spec.rb +0 -0
- data/spec/source_sync_spec.rb +0 -0
- data/spec/spec_helper.rb +0 -0
- data/spec/store_orm_spec.rb +0 -0
- data/spec/store_spec.rb +0 -0
- data/spec/sync_states_spec.rb +0 -0
- data/spec/testdata/1000-data.txt +0 -0
- data/spec/testdata/compressed/compress-data.txt +0 -0
- data/spec/user_spec.rb +0 -9
- metadata +116 -132
- data/bench/benchapp/settings/license.key +0 -1
- data/bench/blobapp/settings/license.key +0 -1
- data/doc/licensing.txt +0 -18
- data/examples/simple/settings/license.key +0 -1
- data/generators/templates/application/settings/license.key +0 -1
- data/lib/rhoconnect/license.rb +0 -94
- data/spec/api/system/get_license_info_spec.rb +0 -15
- data/spec/apps/emptyapp/settings/license.key +0 -1
- data/spec/apps/jstestapp/settings/license.key +0 -1
- data/spec/apps/rhotestapp/settings/license.key +0 -1
- data/spec/license_spec.rb +0 -67
data/spec/server/cors_spec.rb
CHANGED
@@ -1,283 +1,283 @@
|
|
1
|
-
require 'rhoconnect/middleware/cors'
|
2
|
-
require File.join(File.dirname(__FILE__),'..','spec_helper')
|
3
|
-
|
4
|
-
require "cgi"
|
5
|
-
|
6
|
-
COOKIE_NAME = 'some_cookie'
|
7
|
-
COOKIE_VALUE = 'some_session_key=some_session_value'
|
8
|
-
|
9
|
-
COOKIE_NV = "#{COOKIE_NAME}=#{COOKIE_VALUE}"
|
10
|
-
COOKIE_ANOTHER_NV = "#{COOKIE_NAME}=#{COOKIE_VALUE}_another"
|
11
|
-
|
12
|
-
PROPER_QUERY_STRING = "?abc=123&#{COOKIE_NAME}=#{CGI.escape(COOKIE_VALUE)}&de=45"
|
13
|
-
WRONG_QUERY_STRING = "?abc=123&#{COOKIE_NAME}_wrong=#{CGI.escape(COOKIE_VALUE)}&de=45"
|
14
|
-
|
15
|
-
PROPER_URI_NEW = '/api/application'
|
16
|
-
PROPER_URI_OLD = '/application'
|
17
|
-
WRONG_URI = '/some/wrong/path/to/rhoconnect/application'
|
18
|
-
|
19
|
-
LOGIN_URI_NEW = '/api/application/clientlogin'
|
20
|
-
LOGIN_URI_OLD = '/application/clientlogin'
|
21
|
-
|
22
|
-
describe "CORS middleware" do
|
23
|
-
|
24
|
-
class StubApp
|
25
|
-
def call(env)
|
26
|
-
[200, {'Set-Cookie' => 'someCookie=someValue', 'Content-Length' => '0'}, '']
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
before(:each) do
|
31
|
-
@app = StubApp.new
|
32
|
-
|
33
|
-
@middleware = Rack::Cors.new @app, {} do |cfg|
|
34
|
-
cfg.allow do |allow|
|
35
|
-
allow.origins /allowed_origin/, 'file://'
|
36
|
-
allow.resource "/StubAdapter", :headers => 'allowed_header', :methods => [:get, :post, :put, :delete], :credentials => true, :expose => 'Content-Length'
|
37
|
-
allow.resource "/StubAdapter/any_header_allowed_here", :headers => :any, :methods => [:get, :post, :put, :delete], :credentials => true
|
38
|
-
allow.resource "/StubAdapter/no_default_exposed_headers", :headers => :any, :methods => [:get, :post, :put, :delete], :credentials => true
|
39
|
-
end
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
|
-
it "preflight check should allow unknown origins if public access is configured" do
|
44
|
-
mv = Rack::Cors.new @app, {} do |cfg|
|
45
|
-
cfg.allow do |allow|
|
46
|
-
allow.origins '*', 'mock_value'
|
47
|
-
allow.resource '/mock+path', :headers => :any, :methods => [:get, :post, :put, :delete], :credentials => true
|
48
|
-
allow.resource '/mock%20path', :headers => :any, :methods => [:get, :post, :put, :delete], :credentials => true
|
49
|
-
allow.resource /\/mock_path/, :headers => :any, :methods => [:get, :post, :put, :delete], :credentials => true
|
50
|
-
|
51
|
-
exception_happens = false
|
52
|
-
begin
|
53
|
-
allow.resource nil, :headers => :any, :methods => [:get, :post, :put, :delete], :credentials => true
|
54
|
-
rescue Exception => e
|
55
|
-
exception_happens = true
|
56
|
-
e.is_a?(TypeError).should == true
|
57
|
-
end
|
58
|
-
exception_happens.should == true
|
59
|
-
|
60
|
-
allow.resource "/*", :headers => :any, :methods => [:get, :post, :put, :delete], :credentials => true
|
61
|
-
end
|
62
|
-
end
|
63
|
-
|
64
|
-
env = {
|
65
|
-
'REQUEST_METHOD' => 'OPTIONS',
|
66
|
-
'PATH_INFO' => '/StubAdapter',
|
67
|
-
'HTTP_ORIGIN' => 'wrong_origin',
|
68
|
-
'HTTP_ACCESS_CONTROL_REQUEST_METHOD' => 'POST'
|
69
|
-
}
|
70
|
-
status, headers, body = mv.call(env)
|
71
|
-
200.should == status
|
72
|
-
headers['Access-Control-Allow-Origin'].should == '*'
|
73
|
-
end
|
74
|
-
|
75
|
-
it "preflight check should disable unknown origins" do
|
76
|
-
env = {
|
77
|
-
'REQUEST_METHOD' => 'OPTIONS',
|
78
|
-
'PATH_INFO' => '/StubAdapter',
|
79
|
-
'HTTP_ORIGIN' => 'wrong_origin',
|
80
|
-
'HTTP_ACCESS_CONTROL_REQUEST_METHOD' => 'POST'
|
81
|
-
}
|
82
|
-
status, headers, body = @middleware.call(env)
|
83
|
-
200.should == status
|
84
|
-
headers['Access-Control-Allow-Origin'].should_not == 'wrong_origin'
|
85
|
-
end
|
86
|
-
|
87
|
-
it "preflight check should allow known origins" do
|
88
|
-
env = {
|
89
|
-
'REQUEST_METHOD' => 'OPTIONS',
|
90
|
-
'PATH_INFO' => '/StubAdapter',
|
91
|
-
'HTTP_ORIGIN' => 'allowed_origin',
|
92
|
-
'HTTP_ACCESS_CONTROL_REQUEST_METHOD' => 'POST'
|
93
|
-
}
|
94
|
-
status, headers, body = @middleware.call(env)
|
95
|
-
200.should == status
|
96
|
-
headers['Access-Control-Allow-Origin'].should == 'allowed_origin'
|
97
|
-
end
|
98
|
-
|
99
|
-
it "able to use fallback X-ORIGIN request header if ORIGIN header is undefined" do
|
100
|
-
env = {
|
101
|
-
'REQUEST_METHOD' => 'POST',
|
102
|
-
'PATH_INFO' => '/StubAdapter',
|
103
|
-
'HTTP_X_ORIGIN' => 'allowed_origin',
|
104
|
-
'HTTP_ACCESS_CONTROL_REQUEST_METHOD' => 'POST'
|
105
|
-
}
|
106
|
-
status, headers, body = @middleware.call(env)
|
107
|
-
200.should == status
|
108
|
-
headers['Access-Control-Allow-Origin'].should == 'allowed_origin'
|
109
|
-
end
|
110
|
-
|
111
|
-
it "preflight check treats empty 'null' origin as 'file://' one" do
|
112
|
-
env = {
|
113
|
-
'REQUEST_METHOD' => 'OPTIONS',
|
114
|
-
'PATH_INFO' => '/StubAdapter',
|
115
|
-
'HTTP_ORIGIN' => 'null',
|
116
|
-
'HTTP_ACCESS_CONTROL_REQUEST_METHOD' => 'POST'
|
117
|
-
}
|
118
|
-
status, headers, body = @middleware.call(env)
|
119
|
-
200.should == status
|
120
|
-
headers['Access-Control-Allow-Origin'].should == 'file://'
|
121
|
-
end
|
122
|
-
|
123
|
-
it "preflight check should enable allowed request headers" do
|
124
|
-
env = {
|
125
|
-
'REQUEST_METHOD' => 'OPTIONS',
|
126
|
-
'PATH_INFO' => '/StubAdapter',
|
127
|
-
'HTTP_ORIGIN' => 'allowed_origin',
|
128
|
-
'HTTP_ACCESS_CONTROL_REQUEST_METHOD' => 'POST',
|
129
|
-
'HTTP_ACCESS_CONTROL_REQUEST_HEADERS' => 'allowed_header'
|
130
|
-
}
|
131
|
-
status, headers, body = @middleware.call(env)
|
132
|
-
200.should == status
|
133
|
-
#headers['Access-Control-Allow-Origin'].should == 'allowed_origin'
|
134
|
-
headers['Access-Control-Allow-Headers'].should == 'allowed_header'
|
135
|
-
end
|
136
|
-
|
137
|
-
it "preflight check should disable not allowed request headers" do
|
138
|
-
env = {
|
139
|
-
'REQUEST_METHOD' => 'OPTIONS',
|
140
|
-
'PATH_INFO' => '/StubAdapter',
|
141
|
-
'HTTP_ORIGIN' => 'allowed_origin',
|
142
|
-
'HTTP_ACCESS_CONTROL_REQUEST_METHOD' => 'POST',
|
143
|
-
'HTTP_ACCESS_CONTROL_REQUEST_HEADERS' => 'not_allowed_header'
|
144
|
-
}
|
145
|
-
status, headers, body = @middleware.call(env)
|
146
|
-
200.should == status
|
147
|
-
#headers['Access-Control-Allow-Origin'].should == 'allowed_origin'
|
148
|
-
headers['Access-Control-Allow-Headers'].should_not == 'not_allowed_header'
|
149
|
-
end
|
150
|
-
|
151
|
-
it "preflight check should allow any request headers if configured so" do
|
152
|
-
env = {
|
153
|
-
'REQUEST_METHOD' => 'OPTIONS',
|
154
|
-
'PATH_INFO' => '/StubAdapter/any_header_allowed_here',
|
155
|
-
'HTTP_ORIGIN' => 'allowed_origin',
|
156
|
-
'HTTP_ACCESS_CONTROL_REQUEST_METHOD' => 'POST',
|
157
|
-
'HTTP_ACCESS_CONTROL_REQUEST_HEADERS' => 'not_allowed_header'
|
158
|
-
}
|
159
|
-
status, headers, body = @middleware.call(env)
|
160
|
-
200.should == status
|
161
|
-
#headers['Access-Control-Allow-Origin'].should == 'allowed_origin'
|
162
|
-
headers['Access-Control-Allow-Headers'].should == 'not_allowed_header'
|
163
|
-
end
|
164
|
-
|
165
|
-
|
166
|
-
it "only allowed response headers should be exposed" do
|
167
|
-
env = {
|
168
|
-
'REQUEST_METHOD' => 'POST',
|
169
|
-
'PATH_INFO' => '/StubAdapter',
|
170
|
-
'HTTP_ORIGIN' => 'allowed_origin',
|
171
|
-
'HTTP_ACCESS_CONTROL_REQUEST_METHOD' => 'POST'
|
172
|
-
}
|
173
|
-
status, headers, body = @middleware.call(env)
|
174
|
-
200.should == status
|
175
|
-
headers['Access-Control-Expose-Headers'].should == 'Content-Length'
|
176
|
-
end
|
177
|
-
|
178
|
-
it "no response headers should be exposed by default" do
|
179
|
-
env = {
|
180
|
-
'REQUEST_METHOD' => 'POST',
|
181
|
-
'PATH_INFO' => '/StubAdapter/no_default_exposed_headers',
|
182
|
-
'HTTP_ORIGIN' => 'allowed_origin',
|
183
|
-
'HTTP_ACCESS_CONTROL_REQUEST_METHOD' => 'POST'
|
184
|
-
}
|
185
|
-
status, headers, body = @middleware.call(env)
|
186
|
-
200.should == status
|
187
|
-
headers['Access-Control-Expose-Headers'].should == ''
|
188
|
-
end
|
189
|
-
|
190
|
-
|
191
|
-
=begin
|
192
|
-
it "should skip if it isn't a sync protocol URI, for old REST routes" do
|
193
|
-
env = {
|
194
|
-
'PATH_INFO' => WRONG_URI,
|
195
|
-
'QUERY_STRING' => PROPER_QUERY_STRING
|
196
|
-
}
|
197
|
-
status, headers, body = @middleware_old_routes.call(env)
|
198
|
-
200.should == status
|
199
|
-
COOKIE_ANOTHER_NV.should == headers['Set-Cookie']
|
200
|
-
COOKIE_NV.should_not == env['HTTP_COOKIE']
|
201
|
-
headers['Content-Length'].should == body.length.to_s
|
202
|
-
''.should == body
|
203
|
-
end
|
204
|
-
|
205
|
-
it "should process cookie from QUERY_STRING if it is a sync protocol URI, for new REST routes" do
|
206
|
-
env = {
|
207
|
-
'PATH_INFO' => PROPER_URI_NEW,
|
208
|
-
'QUERY_STRING' => PROPER_QUERY_STRING
|
209
|
-
}
|
210
|
-
status, headers, body = @middleware_new_routes.call(env)
|
211
|
-
200.should == status
|
212
|
-
COOKIE_ANOTHER_NV.should == headers['Set-Cookie']
|
213
|
-
env['HTTP_COOKIE'].should == COOKIE_VALUE
|
214
|
-
headers['Content-Length'].should == body.length.to_s
|
215
|
-
''.should == body
|
216
|
-
end
|
217
|
-
|
218
|
-
it "should process cookie from QUERY_STRING if it is a sync protocol URI, for old REST routes" do
|
219
|
-
env = {
|
220
|
-
'PATH_INFO' => PROPER_URI_OLD,
|
221
|
-
'QUERY_STRING' => PROPER_QUERY_STRING
|
222
|
-
}
|
223
|
-
status, headers, body = @middleware_old_routes.call(env)
|
224
|
-
200.should == status
|
225
|
-
COOKIE_ANOTHER_NV.should == headers['Set-Cookie']
|
226
|
-
env['HTTP_COOKIE'].should == COOKIE_VALUE
|
227
|
-
headers['Content-Length'].should == body.length.to_s
|
228
|
-
''.should == body
|
229
|
-
end
|
230
|
-
|
231
|
-
it "shouldn't process cookie from QUERY_STRING if there is no appropriate parameter name or value, for new REST routes" do
|
232
|
-
env = {
|
233
|
-
'PATH_INFO' => PROPER_URI_NEW,
|
234
|
-
'QUERY_STRING' => WRONG_QUERY_STRING
|
235
|
-
}
|
236
|
-
status, headers, body = @middleware_new_routes.call(env)
|
237
|
-
200.should == status
|
238
|
-
COOKIE_ANOTHER_NV.should == headers['Set-Cookie']
|
239
|
-
env['HTTP_COOKIE'].should_not == COOKIE_VALUE
|
240
|
-
headers['Content-Length'].should == body.length.to_s
|
241
|
-
''.should == body
|
242
|
-
end
|
243
|
-
|
244
|
-
it "shouldn't process cookie from QUERY_STRING if there is no appropriate parameter name or value, for old REST routes" do
|
245
|
-
env = {
|
246
|
-
'PATH_INFO' => PROPER_URI_OLD,
|
247
|
-
'QUERY_STRING' => WRONG_QUERY_STRING
|
248
|
-
}
|
249
|
-
status, headers, body = @middleware_old_routes.call(env)
|
250
|
-
200.should == status
|
251
|
-
COOKIE_ANOTHER_NV.should == headers['Set-Cookie']
|
252
|
-
env['HTTP_COOKIE'].should_not == COOKIE_VALUE
|
253
|
-
headers['Content-Length'].should == body.length.to_s
|
254
|
-
''.should == body
|
255
|
-
end
|
256
|
-
|
257
|
-
it "should respond with cookie in a body if it is a login URI, for new REST routes" do
|
258
|
-
env = {
|
259
|
-
'PATH_INFO' => LOGIN_URI_NEW,
|
260
|
-
'QUERY_STRING' => PROPER_QUERY_STRING
|
261
|
-
}
|
262
|
-
status, headers, body = @middleware_new_routes.call(env)
|
263
|
-
200.should == status
|
264
|
-
headers['Set-Cookie'].should == COOKIE_ANOTHER_NV
|
265
|
-
env['HTTP_COOKIE'].should == COOKIE_VALUE
|
266
|
-
headers['Content-Length'].should == body.length.to_s
|
267
|
-
''.should_not == body
|
268
|
-
end
|
269
|
-
|
270
|
-
it "should respond with cookie in a body if it is a login URI, for old REST routes" do
|
271
|
-
env = {
|
272
|
-
'PATH_INFO' => LOGIN_URI_OLD,
|
273
|
-
'QUERY_STRING' => PROPER_QUERY_STRING
|
274
|
-
}
|
275
|
-
status, headers, body = @middleware_old_routes.call(env)
|
276
|
-
200.should == status
|
277
|
-
headers['Set-Cookie'].should == COOKIE_ANOTHER_NV
|
278
|
-
env['HTTP_COOKIE'].should == COOKIE_VALUE
|
279
|
-
headers['Content-Length'].should == body.length.to_s
|
280
|
-
''.should_not == body
|
281
|
-
end
|
282
|
-
=end
|
283
|
-
end
|
1
|
+
require 'rhoconnect/middleware/cors'
|
2
|
+
require File.join(File.dirname(__FILE__),'..','spec_helper')
|
3
|
+
|
4
|
+
require "cgi"
|
5
|
+
|
6
|
+
COOKIE_NAME = 'some_cookie'
|
7
|
+
COOKIE_VALUE = 'some_session_key=some_session_value'
|
8
|
+
|
9
|
+
COOKIE_NV = "#{COOKIE_NAME}=#{COOKIE_VALUE}"
|
10
|
+
COOKIE_ANOTHER_NV = "#{COOKIE_NAME}=#{COOKIE_VALUE}_another"
|
11
|
+
|
12
|
+
PROPER_QUERY_STRING = "?abc=123&#{COOKIE_NAME}=#{CGI.escape(COOKIE_VALUE)}&de=45"
|
13
|
+
WRONG_QUERY_STRING = "?abc=123&#{COOKIE_NAME}_wrong=#{CGI.escape(COOKIE_VALUE)}&de=45"
|
14
|
+
|
15
|
+
PROPER_URI_NEW = '/api/application'
|
16
|
+
PROPER_URI_OLD = '/application'
|
17
|
+
WRONG_URI = '/some/wrong/path/to/rhoconnect/application'
|
18
|
+
|
19
|
+
LOGIN_URI_NEW = '/api/application/clientlogin'
|
20
|
+
LOGIN_URI_OLD = '/application/clientlogin'
|
21
|
+
|
22
|
+
describe "CORS middleware" do
|
23
|
+
|
24
|
+
class StubApp
|
25
|
+
def call(env)
|
26
|
+
[200, {'Set-Cookie' => 'someCookie=someValue', 'Content-Length' => '0'}, '']
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
before(:each) do
|
31
|
+
@app = StubApp.new
|
32
|
+
|
33
|
+
@middleware = Rack::Cors.new @app, {} do |cfg|
|
34
|
+
cfg.allow do |allow|
|
35
|
+
allow.origins /allowed_origin/, 'file://'
|
36
|
+
allow.resource "/StubAdapter", :headers => 'allowed_header', :methods => [:get, :post, :put, :delete], :credentials => true, :expose => 'Content-Length'
|
37
|
+
allow.resource "/StubAdapter/any_header_allowed_here", :headers => :any, :methods => [:get, :post, :put, :delete], :credentials => true
|
38
|
+
allow.resource "/StubAdapter/no_default_exposed_headers", :headers => :any, :methods => [:get, :post, :put, :delete], :credentials => true
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
it "preflight check should allow unknown origins if public access is configured" do
|
44
|
+
mv = Rack::Cors.new @app, {} do |cfg|
|
45
|
+
cfg.allow do |allow|
|
46
|
+
allow.origins '*', 'mock_value'
|
47
|
+
allow.resource '/mock+path', :headers => :any, :methods => [:get, :post, :put, :delete], :credentials => true
|
48
|
+
allow.resource '/mock%20path', :headers => :any, :methods => [:get, :post, :put, :delete], :credentials => true
|
49
|
+
allow.resource /\/mock_path/, :headers => :any, :methods => [:get, :post, :put, :delete], :credentials => true
|
50
|
+
|
51
|
+
exception_happens = false
|
52
|
+
begin
|
53
|
+
allow.resource nil, :headers => :any, :methods => [:get, :post, :put, :delete], :credentials => true
|
54
|
+
rescue Exception => e
|
55
|
+
exception_happens = true
|
56
|
+
e.is_a?(TypeError).should == true
|
57
|
+
end
|
58
|
+
exception_happens.should == true
|
59
|
+
|
60
|
+
allow.resource "/*", :headers => :any, :methods => [:get, :post, :put, :delete], :credentials => true
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
env = {
|
65
|
+
'REQUEST_METHOD' => 'OPTIONS',
|
66
|
+
'PATH_INFO' => '/StubAdapter',
|
67
|
+
'HTTP_ORIGIN' => 'wrong_origin',
|
68
|
+
'HTTP_ACCESS_CONTROL_REQUEST_METHOD' => 'POST'
|
69
|
+
}
|
70
|
+
status, headers, body = mv.call(env)
|
71
|
+
200.should == status
|
72
|
+
headers['Access-Control-Allow-Origin'].should == '*'
|
73
|
+
end
|
74
|
+
|
75
|
+
it "preflight check should disable unknown origins" do
|
76
|
+
env = {
|
77
|
+
'REQUEST_METHOD' => 'OPTIONS',
|
78
|
+
'PATH_INFO' => '/StubAdapter',
|
79
|
+
'HTTP_ORIGIN' => 'wrong_origin',
|
80
|
+
'HTTP_ACCESS_CONTROL_REQUEST_METHOD' => 'POST'
|
81
|
+
}
|
82
|
+
status, headers, body = @middleware.call(env)
|
83
|
+
200.should == status
|
84
|
+
headers['Access-Control-Allow-Origin'].should_not == 'wrong_origin'
|
85
|
+
end
|
86
|
+
|
87
|
+
it "preflight check should allow known origins" do
|
88
|
+
env = {
|
89
|
+
'REQUEST_METHOD' => 'OPTIONS',
|
90
|
+
'PATH_INFO' => '/StubAdapter',
|
91
|
+
'HTTP_ORIGIN' => 'allowed_origin',
|
92
|
+
'HTTP_ACCESS_CONTROL_REQUEST_METHOD' => 'POST'
|
93
|
+
}
|
94
|
+
status, headers, body = @middleware.call(env)
|
95
|
+
200.should == status
|
96
|
+
headers['Access-Control-Allow-Origin'].should == 'allowed_origin'
|
97
|
+
end
|
98
|
+
|
99
|
+
it "able to use fallback X-ORIGIN request header if ORIGIN header is undefined" do
|
100
|
+
env = {
|
101
|
+
'REQUEST_METHOD' => 'POST',
|
102
|
+
'PATH_INFO' => '/StubAdapter',
|
103
|
+
'HTTP_X_ORIGIN' => 'allowed_origin',
|
104
|
+
'HTTP_ACCESS_CONTROL_REQUEST_METHOD' => 'POST'
|
105
|
+
}
|
106
|
+
status, headers, body = @middleware.call(env)
|
107
|
+
200.should == status
|
108
|
+
headers['Access-Control-Allow-Origin'].should == 'allowed_origin'
|
109
|
+
end
|
110
|
+
|
111
|
+
it "preflight check treats empty 'null' origin as 'file://' one" do
|
112
|
+
env = {
|
113
|
+
'REQUEST_METHOD' => 'OPTIONS',
|
114
|
+
'PATH_INFO' => '/StubAdapter',
|
115
|
+
'HTTP_ORIGIN' => 'null',
|
116
|
+
'HTTP_ACCESS_CONTROL_REQUEST_METHOD' => 'POST'
|
117
|
+
}
|
118
|
+
status, headers, body = @middleware.call(env)
|
119
|
+
200.should == status
|
120
|
+
headers['Access-Control-Allow-Origin'].should == 'file://'
|
121
|
+
end
|
122
|
+
|
123
|
+
it "preflight check should enable allowed request headers" do
|
124
|
+
env = {
|
125
|
+
'REQUEST_METHOD' => 'OPTIONS',
|
126
|
+
'PATH_INFO' => '/StubAdapter',
|
127
|
+
'HTTP_ORIGIN' => 'allowed_origin',
|
128
|
+
'HTTP_ACCESS_CONTROL_REQUEST_METHOD' => 'POST',
|
129
|
+
'HTTP_ACCESS_CONTROL_REQUEST_HEADERS' => 'allowed_header'
|
130
|
+
}
|
131
|
+
status, headers, body = @middleware.call(env)
|
132
|
+
200.should == status
|
133
|
+
#headers['Access-Control-Allow-Origin'].should == 'allowed_origin'
|
134
|
+
headers['Access-Control-Allow-Headers'].should == 'allowed_header'
|
135
|
+
end
|
136
|
+
|
137
|
+
it "preflight check should disable not allowed request headers" do
|
138
|
+
env = {
|
139
|
+
'REQUEST_METHOD' => 'OPTIONS',
|
140
|
+
'PATH_INFO' => '/StubAdapter',
|
141
|
+
'HTTP_ORIGIN' => 'allowed_origin',
|
142
|
+
'HTTP_ACCESS_CONTROL_REQUEST_METHOD' => 'POST',
|
143
|
+
'HTTP_ACCESS_CONTROL_REQUEST_HEADERS' => 'not_allowed_header'
|
144
|
+
}
|
145
|
+
status, headers, body = @middleware.call(env)
|
146
|
+
200.should == status
|
147
|
+
#headers['Access-Control-Allow-Origin'].should == 'allowed_origin'
|
148
|
+
headers['Access-Control-Allow-Headers'].should_not == 'not_allowed_header'
|
149
|
+
end
|
150
|
+
|
151
|
+
it "preflight check should allow any request headers if configured so" do
|
152
|
+
env = {
|
153
|
+
'REQUEST_METHOD' => 'OPTIONS',
|
154
|
+
'PATH_INFO' => '/StubAdapter/any_header_allowed_here',
|
155
|
+
'HTTP_ORIGIN' => 'allowed_origin',
|
156
|
+
'HTTP_ACCESS_CONTROL_REQUEST_METHOD' => 'POST',
|
157
|
+
'HTTP_ACCESS_CONTROL_REQUEST_HEADERS' => 'not_allowed_header'
|
158
|
+
}
|
159
|
+
status, headers, body = @middleware.call(env)
|
160
|
+
200.should == status
|
161
|
+
#headers['Access-Control-Allow-Origin'].should == 'allowed_origin'
|
162
|
+
headers['Access-Control-Allow-Headers'].should == 'not_allowed_header'
|
163
|
+
end
|
164
|
+
|
165
|
+
|
166
|
+
it "only allowed response headers should be exposed" do
|
167
|
+
env = {
|
168
|
+
'REQUEST_METHOD' => 'POST',
|
169
|
+
'PATH_INFO' => '/StubAdapter',
|
170
|
+
'HTTP_ORIGIN' => 'allowed_origin',
|
171
|
+
'HTTP_ACCESS_CONTROL_REQUEST_METHOD' => 'POST'
|
172
|
+
}
|
173
|
+
status, headers, body = @middleware.call(env)
|
174
|
+
200.should == status
|
175
|
+
headers['Access-Control-Expose-Headers'].should == 'Content-Length'
|
176
|
+
end
|
177
|
+
|
178
|
+
it "no response headers should be exposed by default" do
|
179
|
+
env = {
|
180
|
+
'REQUEST_METHOD' => 'POST',
|
181
|
+
'PATH_INFO' => '/StubAdapter/no_default_exposed_headers',
|
182
|
+
'HTTP_ORIGIN' => 'allowed_origin',
|
183
|
+
'HTTP_ACCESS_CONTROL_REQUEST_METHOD' => 'POST'
|
184
|
+
}
|
185
|
+
status, headers, body = @middleware.call(env)
|
186
|
+
200.should == status
|
187
|
+
headers['Access-Control-Expose-Headers'].should == ''
|
188
|
+
end
|
189
|
+
|
190
|
+
|
191
|
+
=begin
|
192
|
+
it "should skip if it isn't a sync protocol URI, for old REST routes" do
|
193
|
+
env = {
|
194
|
+
'PATH_INFO' => WRONG_URI,
|
195
|
+
'QUERY_STRING' => PROPER_QUERY_STRING
|
196
|
+
}
|
197
|
+
status, headers, body = @middleware_old_routes.call(env)
|
198
|
+
200.should == status
|
199
|
+
COOKIE_ANOTHER_NV.should == headers['Set-Cookie']
|
200
|
+
COOKIE_NV.should_not == env['HTTP_COOKIE']
|
201
|
+
headers['Content-Length'].should == body.length.to_s
|
202
|
+
''.should == body
|
203
|
+
end
|
204
|
+
|
205
|
+
it "should process cookie from QUERY_STRING if it is a sync protocol URI, for new REST routes" do
|
206
|
+
env = {
|
207
|
+
'PATH_INFO' => PROPER_URI_NEW,
|
208
|
+
'QUERY_STRING' => PROPER_QUERY_STRING
|
209
|
+
}
|
210
|
+
status, headers, body = @middleware_new_routes.call(env)
|
211
|
+
200.should == status
|
212
|
+
COOKIE_ANOTHER_NV.should == headers['Set-Cookie']
|
213
|
+
env['HTTP_COOKIE'].should == COOKIE_VALUE
|
214
|
+
headers['Content-Length'].should == body.length.to_s
|
215
|
+
''.should == body
|
216
|
+
end
|
217
|
+
|
218
|
+
it "should process cookie from QUERY_STRING if it is a sync protocol URI, for old REST routes" do
|
219
|
+
env = {
|
220
|
+
'PATH_INFO' => PROPER_URI_OLD,
|
221
|
+
'QUERY_STRING' => PROPER_QUERY_STRING
|
222
|
+
}
|
223
|
+
status, headers, body = @middleware_old_routes.call(env)
|
224
|
+
200.should == status
|
225
|
+
COOKIE_ANOTHER_NV.should == headers['Set-Cookie']
|
226
|
+
env['HTTP_COOKIE'].should == COOKIE_VALUE
|
227
|
+
headers['Content-Length'].should == body.length.to_s
|
228
|
+
''.should == body
|
229
|
+
end
|
230
|
+
|
231
|
+
it "shouldn't process cookie from QUERY_STRING if there is no appropriate parameter name or value, for new REST routes" do
|
232
|
+
env = {
|
233
|
+
'PATH_INFO' => PROPER_URI_NEW,
|
234
|
+
'QUERY_STRING' => WRONG_QUERY_STRING
|
235
|
+
}
|
236
|
+
status, headers, body = @middleware_new_routes.call(env)
|
237
|
+
200.should == status
|
238
|
+
COOKIE_ANOTHER_NV.should == headers['Set-Cookie']
|
239
|
+
env['HTTP_COOKIE'].should_not == COOKIE_VALUE
|
240
|
+
headers['Content-Length'].should == body.length.to_s
|
241
|
+
''.should == body
|
242
|
+
end
|
243
|
+
|
244
|
+
it "shouldn't process cookie from QUERY_STRING if there is no appropriate parameter name or value, for old REST routes" do
|
245
|
+
env = {
|
246
|
+
'PATH_INFO' => PROPER_URI_OLD,
|
247
|
+
'QUERY_STRING' => WRONG_QUERY_STRING
|
248
|
+
}
|
249
|
+
status, headers, body = @middleware_old_routes.call(env)
|
250
|
+
200.should == status
|
251
|
+
COOKIE_ANOTHER_NV.should == headers['Set-Cookie']
|
252
|
+
env['HTTP_COOKIE'].should_not == COOKIE_VALUE
|
253
|
+
headers['Content-Length'].should == body.length.to_s
|
254
|
+
''.should == body
|
255
|
+
end
|
256
|
+
|
257
|
+
it "should respond with cookie in a body if it is a login URI, for new REST routes" do
|
258
|
+
env = {
|
259
|
+
'PATH_INFO' => LOGIN_URI_NEW,
|
260
|
+
'QUERY_STRING' => PROPER_QUERY_STRING
|
261
|
+
}
|
262
|
+
status, headers, body = @middleware_new_routes.call(env)
|
263
|
+
200.should == status
|
264
|
+
headers['Set-Cookie'].should == COOKIE_ANOTHER_NV
|
265
|
+
env['HTTP_COOKIE'].should == COOKIE_VALUE
|
266
|
+
headers['Content-Length'].should == body.length.to_s
|
267
|
+
''.should_not == body
|
268
|
+
end
|
269
|
+
|
270
|
+
it "should respond with cookie in a body if it is a login URI, for old REST routes" do
|
271
|
+
env = {
|
272
|
+
'PATH_INFO' => LOGIN_URI_OLD,
|
273
|
+
'QUERY_STRING' => PROPER_QUERY_STRING
|
274
|
+
}
|
275
|
+
status, headers, body = @middleware_old_routes.call(env)
|
276
|
+
200.should == status
|
277
|
+
headers['Set-Cookie'].should == COOKIE_ANOTHER_NV
|
278
|
+
env['HTTP_COOKIE'].should == COOKIE_VALUE
|
279
|
+
headers['Content-Length'].should == body.length.to_s
|
280
|
+
''.should_not == body
|
281
|
+
end
|
282
|
+
=end
|
283
|
+
end
|
data/spec/server/server_spec.rb
CHANGED
@@ -38,21 +38,6 @@ describe "Server" do
|
|
38
38
|
last_response.should be_ok
|
39
39
|
end
|
40
40
|
|
41
|
-
it "should extract api token from the header" do
|
42
|
-
post "/rc/#{Rhoconnect::API_VERSION}/system/login", "login" => 'rhoadmin', "password" => ''
|
43
|
-
last_response.should be_ok
|
44
|
-
api_token = last_response.body
|
45
|
-
|
46
|
-
get "/rc/#{Rhoconnect::API_VERSION}/system/license", {}, {Rhoconnect::API_TOKEN_HEADER => api_token}
|
47
|
-
last_response.should be_ok
|
48
|
-
JSON.parse(last_response.body).should == {
|
49
|
-
"available" => 9,
|
50
|
-
"issued" => "Fri Apr 23 17:20:13 -0700 2010",
|
51
|
-
"seats" => 10,
|
52
|
-
"rhoconnect_version" => "Version 1",
|
53
|
-
"licensee" => "Rhomobile" }
|
54
|
-
end
|
55
|
-
|
56
41
|
it "should respond with 404 if controller name is not specified" do
|
57
42
|
get "/app/#{Rhoconnect::API_VERSION}/"
|
58
43
|
last_response.status.should == 404
|