rhoconnect 5.1.1 → 5.5.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 (156) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +11 -8
  3. data/CREDITS +100 -100
  4. data/Gemfile +0 -2
  5. data/Gemfile.lock +56 -71
  6. data/LICENSE +5 -72
  7. data/README.md +0 -0
  8. data/Rakefile +0 -0
  9. data/bench/bench +0 -0
  10. data/bench/benchapp/settings/settings.yml +0 -3
  11. data/bench/blobapp/settings/settings.yml +0 -3
  12. data/bench/distr_bench/distr_bench +0 -0
  13. data/bench/distr_bench/distr_bench_main +0 -0
  14. data/bench/distr_bench/run_distr_client.sh +0 -0
  15. data/bench/distr_bench/run_test_query_script.sh +0 -0
  16. data/bench/lib/bench/bench_result_processor.rb +0 -0
  17. data/bench/lib/bench.rb +0 -8
  18. data/bench/lib/testdata/images/icon.ico +0 -0
  19. data/bench/lib/testdata/images/icon.png +0 -0
  20. data/bench/lib/testdata/images/loading-Landscape.png +0 -0
  21. data/bench/lib/testdata/images/loading-LandscapeLeft.png +0 -0
  22. data/bench/lib/testdata/images/loading-LandscapeRight.png +0 -0
  23. data/bench/lib/testdata/images/loading-Portrait.png +0 -0
  24. data/bench/lib/testdata/images/loading-PortraitUpsideDown.png +0 -0
  25. data/bench/lib/testdata/images/loading.png +0 -0
  26. data/bench/lib/testdata/images/loading@2x.png +0 -0
  27. data/bench/prepare_bench +0 -0
  28. data/bench/run_bench.sh +0 -0
  29. data/bench/run_blob_script.sh +0 -0
  30. data/bench/run_cud_script.sh +0 -0
  31. data/bench/run_query_md_script.sh +0 -0
  32. data/bench/run_query_only_script.sh +0 -0
  33. data/bench/run_query_script.sh +0 -0
  34. data/bench/run_test_query_script.sh +0 -0
  35. data/bench/run_test_source_script.sh +0 -0
  36. data/bin/rhoconnect-benchmark +0 -22
  37. data/commands/rhoconnect/restart.rb +0 -1
  38. data/commands/rhoconnect/start.rb +2 -14
  39. data/doc/adapters-crm.txt +1 -1
  40. data/doc/benchmarks-running.txt +1 -1
  41. data/doc/benchmarks.txt +0 -1
  42. data/doc/bulk-sync.txt +0 -1
  43. data/doc/command-line.txt +0 -6
  44. data/doc/java-plugin.txt +0 -6
  45. data/doc/preparing-production.txt +1 -7
  46. data/doc/public/cli.txt +0 -2
  47. data/doc/public/css/print.css +0 -0
  48. data/doc/public/css/screen.css +0 -0
  49. data/doc/public/css/style.css +0 -0
  50. data/doc/push-client-setup-android.txt +0 -1
  51. data/doc/push-client-setup-ios.txt +0 -1
  52. data/doc/push-client-setup-rps.txt +3 -3
  53. data/doc/push-server-setup.txt +1 -4
  54. data/doc/rails-plugin.txt +0 -5
  55. data/doc/rest-api.txt +2 -14
  56. data/doc/rhoconnect-redis-stack.txt +0 -1
  57. data/doc/settings.txt +0 -3
  58. data/doc/supported-platforms.txt +0 -1
  59. data/doc/tutorial.txt +0 -2
  60. data/examples/simple/config.ru +0 -0
  61. data/examples/simple/settings/settings.yml +1 -4
  62. data/generators/rhoconnect.rb +0 -1
  63. data/generators/templates/application/config.ru +0 -0
  64. data/generators/templates/application/rcgemfile +1 -0
  65. data/generators/templates/application/settings/settings.yml +0 -3
  66. data/install.sh +0 -0
  67. data/installer/utils/create_sha1.rb +0 -0
  68. data/installer/utils/delete_from_s3.rb +0 -0
  69. data/installer/utils/download_from_s3.rb +0 -0
  70. data/installer/utils/nix_install_test.rb +0 -0
  71. data/installer/utils/package_upload/repos.rake +2 -2
  72. data/installer/utils/package_upload/s3_single_file.rb +0 -0
  73. data/installer/utils/package_upload/s3_upload.rb +0 -0
  74. data/installer/utils/verify_checksum.rb +0 -0
  75. data/lib/rhoconnect/api_token.rb +0 -0
  76. data/lib/rhoconnect/app.rb +0 -0
  77. data/lib/rhoconnect/bulk_data/bulk_data.rb +0 -0
  78. data/lib/rhoconnect/bulk_data/syncdb.index.schema +0 -0
  79. data/lib/rhoconnect/bulk_data/syncdb.schema +0 -0
  80. data/lib/rhoconnect/bulk_data.rb +0 -0
  81. data/lib/rhoconnect/client.rb +0 -2
  82. data/lib/rhoconnect/controller/system_controller.rb +0 -9
  83. data/lib/rhoconnect/credential.rb +0 -0
  84. data/lib/rhoconnect/document.rb +0 -0
  85. data/lib/rhoconnect/middleware/cors.rb +209 -209
  86. data/lib/rhoconnect/middleware/x_domain_session_wrapper.rb +57 -57
  87. data/lib/rhoconnect/model/base.rb +0 -0
  88. data/lib/rhoconnect/read_state.rb +0 -0
  89. data/lib/rhoconnect/rho_indifferent_access.rb +0 -0
  90. data/lib/rhoconnect/server.rb +0 -0
  91. data/lib/rhoconnect/source.rb +0 -0
  92. data/lib/rhoconnect/store.rb +2 -0
  93. data/lib/rhoconnect/store_orm.rb +0 -0
  94. data/lib/rhoconnect/user.rb +0 -0
  95. data/lib/rhoconnect/version.rb +1 -1
  96. data/lib/rhoconnect/web-console/models/doc.js +0 -13
  97. data/lib/rhoconnect/web-console/models/source.js +0 -31
  98. data/lib/rhoconnect/web-console/public/logo.png +0 -0
  99. data/lib/rhoconnect/web-console/server.rb +0 -0
  100. data/lib/rhoconnect/web-console/templates/index.erb +1 -2
  101. data/lib/rhoconnect/web-console/views/home.js +4 -6
  102. data/lib/rhoconnect.rb +1 -3
  103. data/spec/api/api_helper.rb +0 -0
  104. data/spec/api/system/login_spec.rb +0 -0
  105. data/spec/api/system/reset_spec.rb +0 -0
  106. data/spec/api/user/create_user_spec.rb +0 -0
  107. data/spec/api/user/update_user_spec.rb +0 -0
  108. data/spec/api_token_spec.rb +0 -0
  109. data/spec/app_spec.rb +0 -0
  110. data/spec/apps/emptyapp/settings/settings.yml +1 -4
  111. data/spec/apps/jstestapp/settings/settings.yml +0 -3
  112. data/spec/apps/rhotestapp/controllers/ruby/application_controller.rb +0 -0
  113. data/spec/apps/rhotestapp/models/ruby/sample_adapter.rb +0 -0
  114. data/spec/apps/rhotestapp/models/ruby/simple_adapter.rb +0 -0
  115. data/spec/apps/rhotestapp/settings/settings.yml +0 -3
  116. data/spec/apps/rhotestapp/vendor/mygem-0.1.0/lib/mygem/mygem.rb +0 -0
  117. data/spec/apps/rhotestapp/vendor/mygem-0.1.0/lib/mygem.rb +0 -0
  118. data/spec/bulk_data/bulk_data_spec.rb +0 -0
  119. data/spec/client_spec.rb +0 -14
  120. data/spec/client_sync_spec.rb +0 -0
  121. data/spec/doc/base.html +0 -0
  122. data/spec/doc/doc_spec.rb +0 -0
  123. data/spec/doc/footer.html +0 -0
  124. data/spec/doc/header.html +0 -0
  125. data/spec/document_spec.rb +0 -0
  126. data/spec/generator/generator_spec.rb +1 -3
  127. data/spec/jobs/bulk_data_job_spec.rb +0 -0
  128. data/spec/perf/bulk_data_perf_spec.rb +0 -0
  129. data/spec/perf/perf_spec_helper.rb +0 -0
  130. data/spec/perf/store_perf_spec.rb +0 -0
  131. data/spec/read_state_spec.rb +0 -0
  132. data/spec/server/cors_spec.rb +283 -283
  133. data/spec/server/server_spec.rb +0 -15
  134. data/spec/server/x_domain_session_wrapper_spec.rb +150 -150
  135. data/spec/source_adapter_spec.rb +0 -0
  136. data/spec/source_spec.rb +0 -0
  137. data/spec/source_sync_spec.rb +0 -0
  138. data/spec/spec_helper.rb +0 -0
  139. data/spec/store_orm_spec.rb +0 -0
  140. data/spec/store_spec.rb +0 -0
  141. data/spec/sync_states_spec.rb +0 -0
  142. data/spec/testdata/1000-data.txt +0 -0
  143. data/spec/testdata/compressed/compress-data.txt +0 -0
  144. data/spec/user_spec.rb +0 -9
  145. metadata +116 -132
  146. data/bench/benchapp/settings/license.key +0 -1
  147. data/bench/blobapp/settings/license.key +0 -1
  148. data/doc/licensing.txt +0 -18
  149. data/examples/simple/settings/license.key +0 -1
  150. data/generators/templates/application/settings/license.key +0 -1
  151. data/lib/rhoconnect/license.rb +0 -94
  152. data/spec/api/system/get_license_info_spec.rb +0 -15
  153. data/spec/apps/emptyapp/settings/license.key +0 -1
  154. data/spec/apps/jstestapp/settings/license.key +0 -1
  155. data/spec/apps/rhotestapp/settings/license.key +0 -1
  156. data/spec/license_spec.rb +0 -67
@@ -1,209 +1,209 @@
1
- require 'logger'
2
- require 'rhoconnect/middleware/helpers'
3
-
4
- module Rack
5
- class Cors
6
- def initialize(app, opts={})
7
- @app = app
8
- @logger = opts[:logger]
9
- yield self if block_given?
10
- end
11
-
12
- def allow
13
- all_resources << (resources = Resources.new)
14
- yield resources
15
- end
16
-
17
- def call(env)
18
- if env['HTTP_ORIGIN'] == 'null'
19
- env['HTTP_ORIGIN'] = 'file://'
20
- end
21
- if env['HTTP_X_ORIGIN'] and not env['HTTP_ORIGIN']
22
- log 'ORIGIN header is empty, X-ORIGIN workaround header applied.'
23
- env['HTTP_ORIGIN'] = env['HTTP_X_ORIGIN']
24
- end
25
- cors_headers = nil
26
- if env['HTTP_ORIGIN']
27
- if env['REQUEST_METHOD'] == 'OPTIONS'
28
- if headers = process_preflight(env)
29
- return [200, headers, ['']]
30
- end
31
- else
32
- cors_headers = process_cors(env)
33
- end
34
- end
35
- status, headers, body = @app.call env
36
- headers = headers.merge(cors_headers) if cors_headers
37
- [status, headers, body]
38
- end
39
-
40
- protected
41
- def all_resources
42
- @all_resources ||= []
43
- end
44
-
45
- def process_preflight(env)
46
- resource = find_resource(env['HTTP_ORIGIN'], env['PATH_INFO'])
47
- resource && resource.process_preflight(env)
48
- end
49
-
50
- def process_cors(env)
51
- resource = find_resource(env['HTTP_ORIGIN'], env['PATH_INFO'])
52
- resource.to_headers(env) if resource
53
- end
54
-
55
- def find_resource(origin, path)
56
- allowed = all_resources.detect {|r| r.allow_origin?(origin)}
57
- allowed ? allowed.find_resource(path) : nil
58
- end
59
-
60
- class Resources
61
-
62
- def initialize
63
- @origins = []
64
- @resources = []
65
- @public_resources = false
66
- end
67
-
68
- def origins(*args)
69
- @origins = args.flatten.collect do |n|
70
- if n.class == Regexp
71
- n
72
- else
73
- case n
74
- when /^[a-z]+:\/\// then n
75
- when '*'
76
- @public_resources = true
77
- n
78
- else
79
- "http://#{n}"
80
- end
81
- end
82
- end
83
- end
84
-
85
- def resource(path, opts={})
86
- @resources << Resource.new(public_resources?, path, opts)
87
- end
88
-
89
- def public_resources?
90
- @public_resources
91
- end
92
-
93
- def allow_origin?(source)
94
- result = public_resources? || @origins.include?(source) ||
95
- (not (@origins.select {|n| n.class == Regexp && n.match(source)}).empty?)
96
- #TODO: to fix "n.match(source)". Unsure, but it may lead to security risks.
97
- result
98
- end
99
-
100
- def find_resource(path)
101
- @resources.detect{|r| r.match?(path)}
102
- end
103
- end
104
-
105
- class Resource
106
- attr_accessor :path, :methods, :headers, :expose, :max_age, :credentials, :pattern
107
-
108
- def initialize(public_resource, path, opts={})
109
- self.path = path
110
- self.methods = ensure_enum(opts[:methods]) || [:get]
111
- self.credentials = opts[:credentials] || true
112
- self.max_age = opts[:max_age] || 1728000
113
- self.pattern = compile(path)
114
- @public_resource = public_resource
115
-
116
- self.headers = case opts[:headers]
117
- when :any then :any
118
- when nil then nil
119
- else
120
- [opts[:headers]].flatten.collect{|h| h.downcase}
121
- end
122
-
123
- self.expose = case opts[:expose]
124
- when nil then nil
125
- else
126
- [opts[:expose]].flatten
127
- end
128
- end
129
-
130
- def match?(path)
131
- pattern =~ path
132
- end
133
-
134
- def process_preflight(env)
135
- return nil if invalid_method_request?(env) || invalid_headers_request?(env)
136
- {'Content-Type' => 'text/plain'}.merge(to_preflight_headers(env))
137
- end
138
-
139
- def to_headers(env)
140
- x_origin = env['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']
141
- h = { 'Access-Control-Allow-Origin' => public_resource? ? '*' : env['HTTP_ORIGIN'],
142
- 'Access-Control-Allow-Methods' => methods.collect{|m| m.to_s.upcase}.join(', '),
143
- 'Access-Control-Expose-Headers' => expose.nil? ? '' : expose.join(', '),
144
- 'Access-Control-Max-Age' => max_age.to_s }
145
- h['Access-Control-Allow-Credentials'] = 'true' if credentials
146
- h
147
- end
148
-
149
- protected
150
- def public_resource?
151
- @public_resource
152
- end
153
-
154
- def to_preflight_headers(env)
155
- h = to_headers(env)
156
- if env['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']
157
- h.merge!('Access-Control-Allow-Headers' => env['HTTP_ACCESS_CONTROL_REQUEST_HEADERS'])
158
- end
159
- h
160
- end
161
-
162
- def invalid_method_request?(env)
163
- request_method = env['HTTP_ACCESS_CONTROL_REQUEST_METHOD']
164
- request_method.nil? || !methods.include?(request_method.downcase.to_sym)
165
- end
166
-
167
- def invalid_headers_request?(env)
168
- request_headers = env['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']
169
- request_headers && !allow_headers?(request_headers)
170
- end
171
-
172
- def allow_headers?(request_headers)
173
- return false if headers.nil?
174
- headers == :any || begin
175
- request_headers = request_headers.split(/,\s*/) if request_headers.kind_of?(String)
176
- request_headers.all?{|h| headers.include?(h.downcase)}
177
- end
178
- end
179
-
180
- def ensure_enum(v)
181
- return nil if v.nil?
182
- [v].flatten
183
- end
184
-
185
- def compile(path)
186
- if path.respond_to? :to_str
187
- special_chars = %w{. + ( )}
188
- pattern =
189
- path.to_str.gsub(/((:\w+)|[\*#{special_chars.join}])/) do |match|
190
- case match
191
- when "*"
192
- "(.*?)"
193
- when *special_chars
194
- Regexp.escape(match)
195
- else
196
- "([^/?&#]+)"
197
- end
198
- end
199
- /^#{pattern}$/
200
- elsif path.respond_to? :match
201
- path
202
- else
203
- raise TypeError, path
204
- end
205
- end
206
- end
207
-
208
- end
209
- end
1
+ require 'logger'
2
+ require 'rhoconnect/middleware/helpers'
3
+
4
+ module Rack
5
+ class Cors
6
+ def initialize(app, opts={})
7
+ @app = app
8
+ @logger = opts[:logger]
9
+ yield self if block_given?
10
+ end
11
+
12
+ def allow
13
+ all_resources << (resources = Resources.new)
14
+ yield resources
15
+ end
16
+
17
+ def call(env)
18
+ if env['HTTP_ORIGIN'] == 'null'
19
+ env['HTTP_ORIGIN'] = 'file://'
20
+ end
21
+ if env['HTTP_X_ORIGIN'] and not env['HTTP_ORIGIN']
22
+ log 'ORIGIN header is empty, X-ORIGIN workaround header applied.'
23
+ env['HTTP_ORIGIN'] = env['HTTP_X_ORIGIN']
24
+ end
25
+ cors_headers = nil
26
+ if env['HTTP_ORIGIN']
27
+ if env['REQUEST_METHOD'] == 'OPTIONS'
28
+ if headers = process_preflight(env)
29
+ return [200, headers, ['']]
30
+ end
31
+ else
32
+ cors_headers = process_cors(env)
33
+ end
34
+ end
35
+ status, headers, body = @app.call env
36
+ headers = headers.merge(cors_headers) if cors_headers
37
+ [status, headers, body]
38
+ end
39
+
40
+ protected
41
+ def all_resources
42
+ @all_resources ||= []
43
+ end
44
+
45
+ def process_preflight(env)
46
+ resource = find_resource(env['HTTP_ORIGIN'], env['PATH_INFO'])
47
+ resource && resource.process_preflight(env)
48
+ end
49
+
50
+ def process_cors(env)
51
+ resource = find_resource(env['HTTP_ORIGIN'], env['PATH_INFO'])
52
+ resource.to_headers(env) if resource
53
+ end
54
+
55
+ def find_resource(origin, path)
56
+ allowed = all_resources.detect {|r| r.allow_origin?(origin)}
57
+ allowed ? allowed.find_resource(path) : nil
58
+ end
59
+
60
+ class Resources
61
+
62
+ def initialize
63
+ @origins = []
64
+ @resources = []
65
+ @public_resources = false
66
+ end
67
+
68
+ def origins(*args)
69
+ @origins = args.flatten.collect do |n|
70
+ if n.class == Regexp
71
+ n
72
+ else
73
+ case n
74
+ when /^[a-z]+:\/\// then n
75
+ when '*'
76
+ @public_resources = true
77
+ n
78
+ else
79
+ "http://#{n}"
80
+ end
81
+ end
82
+ end
83
+ end
84
+
85
+ def resource(path, opts={})
86
+ @resources << Resource.new(public_resources?, path, opts)
87
+ end
88
+
89
+ def public_resources?
90
+ @public_resources
91
+ end
92
+
93
+ def allow_origin?(source)
94
+ result = public_resources? || @origins.include?(source) ||
95
+ (not (@origins.select {|n| n.class == Regexp && n.match(source)}).empty?)
96
+ #TODO: to fix "n.match(source)". Unsure, but it may lead to security risks.
97
+ result
98
+ end
99
+
100
+ def find_resource(path)
101
+ @resources.detect{|r| r.match?(path)}
102
+ end
103
+ end
104
+
105
+ class Resource
106
+ attr_accessor :path, :methods, :headers, :expose, :max_age, :credentials, :pattern
107
+
108
+ def initialize(public_resource, path, opts={})
109
+ self.path = path
110
+ self.methods = ensure_enum(opts[:methods]) || [:get]
111
+ self.credentials = opts[:credentials] || true
112
+ self.max_age = opts[:max_age] || 1728000
113
+ self.pattern = compile(path)
114
+ @public_resource = public_resource
115
+
116
+ self.headers = case opts[:headers]
117
+ when :any then :any
118
+ when nil then nil
119
+ else
120
+ [opts[:headers]].flatten.collect{|h| h.downcase}
121
+ end
122
+
123
+ self.expose = case opts[:expose]
124
+ when nil then nil
125
+ else
126
+ [opts[:expose]].flatten
127
+ end
128
+ end
129
+
130
+ def match?(path)
131
+ pattern =~ path
132
+ end
133
+
134
+ def process_preflight(env)
135
+ return nil if invalid_method_request?(env) || invalid_headers_request?(env)
136
+ {'Content-Type' => 'text/plain'}.merge(to_preflight_headers(env))
137
+ end
138
+
139
+ def to_headers(env)
140
+ x_origin = env['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']
141
+ h = { 'Access-Control-Allow-Origin' => public_resource? ? '*' : env['HTTP_ORIGIN'],
142
+ 'Access-Control-Allow-Methods' => methods.collect{|m| m.to_s.upcase}.join(', '),
143
+ 'Access-Control-Expose-Headers' => expose.nil? ? '' : expose.join(', '),
144
+ 'Access-Control-Max-Age' => max_age.to_s }
145
+ h['Access-Control-Allow-Credentials'] = 'true' if credentials
146
+ h
147
+ end
148
+
149
+ protected
150
+ def public_resource?
151
+ @public_resource
152
+ end
153
+
154
+ def to_preflight_headers(env)
155
+ h = to_headers(env)
156
+ if env['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']
157
+ h.merge!('Access-Control-Allow-Headers' => env['HTTP_ACCESS_CONTROL_REQUEST_HEADERS'])
158
+ end
159
+ h
160
+ end
161
+
162
+ def invalid_method_request?(env)
163
+ request_method = env['HTTP_ACCESS_CONTROL_REQUEST_METHOD']
164
+ request_method.nil? || !methods.include?(request_method.downcase.to_sym)
165
+ end
166
+
167
+ def invalid_headers_request?(env)
168
+ request_headers = env['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']
169
+ request_headers && !allow_headers?(request_headers)
170
+ end
171
+
172
+ def allow_headers?(request_headers)
173
+ return false if headers.nil?
174
+ headers == :any || begin
175
+ request_headers = request_headers.split(/,\s*/) if request_headers.kind_of?(String)
176
+ request_headers.all?{|h| headers.include?(h.downcase)}
177
+ end
178
+ end
179
+
180
+ def ensure_enum(v)
181
+ return nil if v.nil?
182
+ [v].flatten
183
+ end
184
+
185
+ def compile(path)
186
+ if path.respond_to? :to_str
187
+ special_chars = %w{. + ( )}
188
+ pattern =
189
+ path.to_str.gsub(/((:\w+)|[\*#{special_chars.join}])/) do |match|
190
+ case match
191
+ when "*"
192
+ "(.*?)"
193
+ when *special_chars
194
+ Regexp.escape(match)
195
+ else
196
+ "([^/?&#]+)"
197
+ end
198
+ end
199
+ /^#{pattern}$/
200
+ elsif path.respond_to? :match
201
+ path
202
+ else
203
+ raise TypeError, path
204
+ end
205
+ end
206
+ end
207
+
208
+ end
209
+ end
@@ -1,58 +1,58 @@
1
- require "cgi"
2
- require 'rhoconnect/middleware/helpers'
3
-
4
- module Rhoconnect
5
- module Middleware
6
- class XDomainSessionWrapper
7
- def initialize(app, opts={})
8
- @app = app
9
- @session_cookie = opts[:session_cookie] || 'rhoconnect_session'
10
- @api_uri_regexp = opts[:api_uri_regexp] || /\A\/api\/application/
11
- @login_uri_regexp = opts[:login_uri_regexp] || /\A\/api\/application\/clientlogin/
12
- yield self if block_given?
13
- end
14
-
15
- def is_sync_protocol(env)
16
- # if it is rhoconnect protocol URI
17
- @api_uri_regexp.match(env['PATH_INFO'])
18
- end
19
-
20
- def call(env)
21
- if is_sync_protocol(env)
22
- env['HTTP_COOKIE'] = env['HTTP_COOKIE'] || CGI.unescape(get_session_from_url(env))
23
- end
24
- #puts "and here #{@app.inspect} #{env.inspect}"
25
- status, headers, body = @app.call(env)
26
-
27
- if is_sync_protocol(env)
28
- cookies = headers['Set-Cookie'].to_s
29
- #puts "<----- Cookies: #{cookies}"
30
- # put cookies to body as JSON on login success
31
- if @login_uri_regexp.match(env['PATH_INFO']) && status == 200
32
- body = session_json_from(cookies)
33
- headers['Content-Length'] = body.length.to_s
34
- end
35
- end
36
-
37
- # The Body itself should not be an instance of String,as this will break in Ruby 1.9
38
- body = ["#{body}"] if body.is_a?(String)
39
- [status, headers, body]
40
- end
41
-
42
- def session_json_from(cookies)
43
- rexp = Regexp.new(@session_cookie +'=[^\s]*')
44
- sc = cookies.to_s.slice rexp
45
- "{\"" +@session_cookie +"\": \"#{CGI.escape sc.to_s}\"}"
46
- end
47
-
48
- def get_session_from_url(env)
49
- rexp = Regexp.new(@session_cookie +'=.*\Z')
50
- qs = env['QUERY_STRING'].to_s.slice rexp
51
- qs = qs.to_s.split(/&/)[0]
52
- nv = qs.to_s.split(/=/)
53
- return nv[1] if nv.length > 1
54
- ''
55
- end
56
- end
57
- end
1
+ require "cgi"
2
+ require 'rhoconnect/middleware/helpers'
3
+
4
+ module Rhoconnect
5
+ module Middleware
6
+ class XDomainSessionWrapper
7
+ def initialize(app, opts={})
8
+ @app = app
9
+ @session_cookie = opts[:session_cookie] || 'rhoconnect_session'
10
+ @api_uri_regexp = opts[:api_uri_regexp] || /\A\/api\/application/
11
+ @login_uri_regexp = opts[:login_uri_regexp] || /\A\/api\/application\/clientlogin/
12
+ yield self if block_given?
13
+ end
14
+
15
+ def is_sync_protocol(env)
16
+ # if it is rhoconnect protocol URI
17
+ @api_uri_regexp.match(env['PATH_INFO'])
18
+ end
19
+
20
+ def call(env)
21
+ if is_sync_protocol(env)
22
+ env['HTTP_COOKIE'] = env['HTTP_COOKIE'] || CGI.unescape(get_session_from_url(env))
23
+ end
24
+ #puts "and here #{@app.inspect} #{env.inspect}"
25
+ status, headers, body = @app.call(env)
26
+
27
+ if is_sync_protocol(env)
28
+ cookies = headers['Set-Cookie'].to_s
29
+ #puts "<----- Cookies: #{cookies}"
30
+ # put cookies to body as JSON on login success
31
+ if @login_uri_regexp.match(env['PATH_INFO']) && status == 200
32
+ body = session_json_from(cookies)
33
+ headers['Content-Length'] = body.length.to_s
34
+ end
35
+ end
36
+
37
+ # The Body itself should not be an instance of String,as this will break in Ruby 1.9
38
+ body = ["#{body}"] if body.is_a?(String)
39
+ [status, headers, body]
40
+ end
41
+
42
+ def session_json_from(cookies)
43
+ rexp = Regexp.new(@session_cookie +'=[^\s]*')
44
+ sc = cookies.to_s.slice rexp
45
+ "{\"" +@session_cookie +"\": \"#{CGI.escape sc.to_s}\"}"
46
+ end
47
+
48
+ def get_session_from_url(env)
49
+ rexp = Regexp.new(@session_cookie +'=.*\Z')
50
+ qs = env['QUERY_STRING'].to_s.slice rexp
51
+ qs = qs.to_s.split(/&/)[0]
52
+ nv = qs.to_s.split(/=/)
53
+ return nv[1] if nv.length > 1
54
+ ''
55
+ end
56
+ end
57
+ end
58
58
  end
File without changes
File without changes
File without changes
File without changes
File without changes
@@ -307,6 +307,8 @@ module Rhoconnect
307
307
  get_value(dockey)
308
308
  elsif doctype == 'list'
309
309
  get_data(dockey, Array).to_json
310
+ elsif doctype == 'zset'
311
+ get_zdata(dockey).to_json
310
312
  else
311
313
  get_data(dockey).to_json
312
314
  end
File without changes
File without changes
@@ -1,3 +1,3 @@
1
1
  module Rhoconnect
2
- VERSION = '5.1.1'
2
+ VERSION = '5.5.0'
3
3
  end
@@ -10,19 +10,6 @@ var Doc = Backbone.Model.extend({
10
10
  var session = new Session();
11
11
  this.set('api_token', session.getApiKey())
12
12
  },
13
-
14
- methodUrl: {
15
- 'read': '/rc/v1/system/license'
16
- },
17
-
18
- sync: function(method, model, options) {
19
- if (model.methodUrl && model.methodUrl[method.toLowerCase()]) {
20
- options = options || {};
21
- options.url = model.methodUrl[method.toLowerCase()];
22
- options.token = this.get('api_token')
23
- }
24
- Backbone.sync(method, model, options);
25
- },
26
13
 
27
14
  get_doc: function(dbkey,d_type){
28
15
  self = this;
@@ -3,7 +3,6 @@ var Source = Backbone.Model.extend({
3
3
  defaults: {
4
4
  api_token: null,
5
5
  rhoconnect_version: null,
6
- licensee: null,
7
6
  seats: null,
8
7
  issued: null,
9
8
  source_id: null,
@@ -48,36 +47,6 @@ var Source = Backbone.Model.extend({
48
47
  $('tr.remove-tr-user').remove();
49
48
  $('#source-table tr:last').after(adapters);
50
49
  },
51
-
52
- get_license_info: function(){
53
- var session = new Session();
54
- $.ajax({
55
- type: 'GET',
56
- url: '/rc/v1/system/license',
57
- beforeSend: function (HttpRequest) {
58
- HttpRequest.setRequestHeader("X-RhoConnect-API-TOKEN", session.getApiKey());
59
- },
60
- success: function(resp){
61
- if(resp != 'testtoken'){
62
- var r = JSON.parse(resp)
63
- var license_text = "Licensed to &nbsp;" + r["licensee"] +
64
- "&nbsp;on&nbsp;" + r["issued"] + ", available&nbsp;" +
65
- r["available"] + "&nbsp;out of&nbsp;" +
66
- r['seats'] + "&nbsp;devices"
67
- var license_footer = "Licensed to Rhomobile&nbsp;"+r['available']+"/"+r['seats']+"&nbsp;devices available"
68
- $('#license').html(license_text);
69
- $('#license_info').html(license_footer);
70
- }
71
- },
72
- error: function(resp){
73
- if(resp.status == 422){
74
- new App.Views.Index()
75
- }
76
- $('#docalert')[0].innerHTML = resp.responseText;
77
- $('#docalert').css('display','block');
78
- }
79
- })
80
- },
81
50
 
82
51
  list_source_docs: function(source_id,user_id){
83
52
  var session = new Session();
File without changes
@@ -84,10 +84,9 @@
84
84
  <footer>
85
85
  <div class="pull-left">
86
86
  RhoConnect
87
- <p>© <a href="http://www.rhomobile.com/">Rhomobile</a> All rights reserved.</p>
87
+ <p>© Rhomobile All rights reserved.</p>
88
88
  </div>
89
89
  <div class="pull-right">
90
- <div id='license_info'></div>
91
90
  RhoConnect v<%=@version%>
92
91
  </div>
93
92
  </footer>