rhoconnect 3.2.1 → 3.3.1.beta2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (221) hide show
  1. data/CHANGELOG.md +24 -5
  2. data/Gemfile +2 -2
  3. data/Gemfile.lock +20 -20
  4. data/bench/benchapp/Gemfile +17 -20
  5. data/bench/benchapp/config.ru +2 -2
  6. data/bench/benchapp/settings/settings.yml +3 -3
  7. data/bench/blobapp/Gemfile +16 -13
  8. data/bench/blobapp/config.ru +2 -2
  9. data/bench/blobapp/settings/settings.yml +5 -3
  10. data/bench/lib/bench.rb +35 -32
  11. data/bench/lib/bench/session.rb +9 -1
  12. data/bench/scripts/blob_cud_script.rb +13 -17
  13. data/bench/scripts/cud_script.rb +11 -12
  14. data/bench/scripts/helpers.rb +5 -7
  15. data/bench/scripts/query_md_script.rb +18 -12
  16. data/bench/scripts/query_only_script.rb +19 -11
  17. data/bench/scripts/query_script.rb +17 -13
  18. data/bench/scripts/test_query_script.rb +46 -17
  19. data/bench/scripts/test_source_script.rb +7 -7
  20. data/commands/commands/dtach_commands/dtach_install.rb +44 -16
  21. data/commands/commands/rhoconnect/spec.rb +13 -9
  22. data/commands/commands/rhoconnect/version.rb +6 -0
  23. data/commands/execute.rb +10 -6
  24. data/doc/deploying.txt +75 -13
  25. data/doc/install.txt +3 -3
  26. data/doc/push-client-setup.txt +1 -1
  27. data/doc/rest-api.txt +4 -23
  28. data/doc/rhoconnect-redis-stack.txt +26 -7
  29. data/doc/settings.txt +9 -3
  30. data/examples/simple/Gemfile +3 -1
  31. data/examples/simple/application.rb +5 -0
  32. data/examples/simple/config.ru +3 -2
  33. data/examples/simple/my_server.rb +14 -0
  34. data/examples/simple/settings/settings.yml +1 -0
  35. data/generators/templates/application/Gemfile +4 -4
  36. data/generators/templates/application/application.rb +4 -0
  37. data/generators/templates/application/settings/settings.yml +4 -1
  38. data/installer/unix-like/create_texts.rb +39 -1
  39. data/installer/unix-like/rho_connect_install_constants.rb +1 -1
  40. data/installer/utils/package_upload/repos.rake +7 -5
  41. data/lib/rhoconnect.rb +3 -2
  42. data/lib/rhoconnect/api/app/ans_login.rb +3 -0
  43. data/lib/rhoconnect/api/app/bulk_data.rb +6 -0
  44. data/lib/rhoconnect/api/{source → app}/fast_delete.rb +1 -1
  45. data/lib/rhoconnect/api/{source → app}/fast_insert.rb +2 -2
  46. data/lib/rhoconnect/api/{source → app}/fast_update.rb +2 -2
  47. data/lib/rhoconnect/api/app/login.rb +5 -0
  48. data/lib/rhoconnect/api/{source → app}/push_deletes.rb +1 -1
  49. data/lib/rhoconnect/api/{source → app}/push_objects.rb +1 -1
  50. data/lib/rhoconnect/api/app/query.rb +4 -0
  51. data/lib/rhoconnect/api/app/queue_updates.rb +94 -0
  52. data/lib/rhoconnect/api/app/search.rb +4 -0
  53. data/lib/rhoconnect/api/client/client_get_db_doc.rb +5 -0
  54. data/lib/rhoconnect/api/client/client_set_db_doc.rb +8 -0
  55. data/lib/rhoconnect/api/client/create.rb +7 -0
  56. data/lib/rhoconnect/api/client/get_client_params.rb +2 -1
  57. data/lib/rhoconnect/api/client/list_client_docs.rb +2 -1
  58. data/lib/rhoconnect/api/client/register.rb +12 -0
  59. data/lib/rhoconnect/api/client/reset.rb +5 -0
  60. data/lib/rhoconnect/api/{source → readstate}/set_refresh_time.rb +2 -1
  61. data/lib/rhoconnect/api/source/get_source_params.rb +3 -2
  62. data/lib/rhoconnect/api/source/list_sources.rb +2 -1
  63. data/lib/rhoconnect/api/source/update_source_params.rb +3 -3
  64. data/lib/rhoconnect/api/store/get_db_doc.rb +4 -0
  65. data/lib/rhoconnect/api/store/set_db_doc.rb +7 -0
  66. data/lib/rhoconnect/api/system/get_adapter.rb +4 -0
  67. data/lib/rhoconnect/api/{admin → system}/get_license_info.rb +2 -1
  68. data/lib/rhoconnect/api/system/login.rb +15 -0
  69. data/lib/rhoconnect/api/{admin → system}/reset.rb +3 -2
  70. data/lib/rhoconnect/api/system/save_adapter.rb +4 -0
  71. data/lib/rhoconnect/api/{admin → system}/stats.rb +2 -1
  72. data/lib/rhoconnect/api/user/create_user.rb +2 -2
  73. data/lib/rhoconnect/api/user/delete_client.rb +6 -0
  74. data/lib/rhoconnect/api/user/delete_user.rb +2 -1
  75. data/lib/rhoconnect/api/user/list_clients.rb +4 -0
  76. data/lib/rhoconnect/api/user/list_source_docs.rb +11 -0
  77. data/lib/rhoconnect/api/user/list_users.rb +1 -1
  78. data/lib/rhoconnect/api/user/ping.rb +7 -0
  79. data/lib/rhoconnect/api/user/show_user.rb +3 -0
  80. data/lib/rhoconnect/api/user/update_user.rb +3 -2
  81. data/lib/rhoconnect/api/user/user_get_db_doc.rb +5 -0
  82. data/lib/rhoconnect/api/user/user_set_db_doc.rb +10 -0
  83. data/lib/rhoconnect/app.rb +12 -2
  84. data/lib/rhoconnect/async.rb +6 -10
  85. data/lib/rhoconnect/bulk_data/bulk_data.rb +4 -4
  86. data/lib/rhoconnect/client.rb +10 -9
  87. data/lib/rhoconnect/client_sync.rb +24 -19
  88. data/lib/rhoconnect/document.rb +18 -4
  89. data/lib/rhoconnect/graph_helper.rb +4 -2
  90. data/lib/rhoconnect/jobs/bulk_data_job.rb +1 -1
  91. data/lib/rhoconnect/jobs/ping_job.rb +39 -29
  92. data/lib/rhoconnect/middleware/admin_user.rb +23 -0
  93. data/lib/rhoconnect/middleware/body_content_type_parser.rb +35 -0
  94. data/lib/rhoconnect/{cors.rb → middleware/cors.rb} +1 -0
  95. data/lib/rhoconnect/middleware/current_app.rb +16 -0
  96. data/lib/rhoconnect/middleware/current_request.rb +16 -0
  97. data/lib/rhoconnect/middleware/current_user.rb +17 -0
  98. data/lib/rhoconnect/middleware/helpers.rb +105 -0
  99. data/lib/rhoconnect/middleware/login_required.rb +22 -0
  100. data/lib/rhoconnect/{stats/middleware.rb → middleware/stats.rb} +5 -3
  101. data/lib/rhoconnect/middleware/x_domain_session_wrapper.rb +58 -0
  102. data/lib/rhoconnect/ping.rb +1 -0
  103. data/lib/rhoconnect/ping/apple.rb +18 -16
  104. data/lib/rhoconnect/ping/blackberry.rb +9 -9
  105. data/lib/rhoconnect/ping/rhoconnect_push.rb +45 -0
  106. data/lib/rhoconnect/server.rb +98 -91
  107. data/lib/rhoconnect/source.rb +5 -1
  108. data/lib/rhoconnect/source_sync.rb +4 -3
  109. data/lib/rhoconnect/stats/record.rb +15 -15
  110. data/lib/rhoconnect/store.rb +253 -75
  111. data/lib/rhoconnect/tasks.rb +3 -3
  112. data/lib/rhoconnect/version.rb +1 -1
  113. data/lib/rhoconnect/web-console/controllers/admins.js +1 -14
  114. data/lib/rhoconnect/web-console/models/adapter.js +18 -8
  115. data/lib/rhoconnect/web-console/models/client.js +15 -9
  116. data/lib/rhoconnect/web-console/models/doc.js +7 -11
  117. data/lib/rhoconnect/web-console/models/session.js +5 -2
  118. data/lib/rhoconnect/web-console/models/source.js +55 -36
  119. data/lib/rhoconnect/web-console/models/user.js +20 -11
  120. data/lib/rhoconnect/web-console/public/backbone.js +8 -2
  121. data/lib/rhoconnect/web-console/templates/index.erb +11 -5
  122. data/lib/rhoconnect/web-console/views/doc.js +6 -8
  123. data/lib/rhoconnect/web-console/views/edit_user.js +6 -3
  124. data/lib/rhoconnect/web-console/views/home.js +98 -25
  125. data/lib/rhoconnect/web-console/views/index.js +1 -1
  126. data/lib/rhoconnect/web-console/views/new_ping.js +6 -3
  127. data/lib/rhoconnect/web-console/views/server_doc.js +12 -4
  128. data/lib/rhoconnect/web-console/views/show_device.js +6 -3
  129. data/rhoconnect.gemspec +1 -2
  130. data/spec/api/{source → app}/fast_delete_spec.rb +4 -4
  131. data/spec/api/{source → app}/fast_insert_spec.rb +4 -4
  132. data/spec/api/{source → app}/fast_update_spec.rb +22 -6
  133. data/spec/api/{source → app}/push_deletes_spec.rb +2 -2
  134. data/spec/api/app/push_objects_spec.rb +45 -0
  135. data/spec/api/client/client_get_db_doc_spec.rb +31 -0
  136. data/spec/api/client/client_set_db_doc_spec.rb +14 -0
  137. data/spec/api/client/get_client_params_spec.rb +3 -2
  138. data/spec/api/client/list_client_docs_spec.rb +2 -2
  139. data/spec/api/{source → readstate}/set_refresh_time_spec.rb +15 -9
  140. data/spec/api/source/get_source_params_spec.rb +3 -2
  141. data/spec/api/source/list_sources_spec.rb +3 -9
  142. data/spec/api/source/update_source_params_spec.rb +4 -4
  143. data/spec/api/store/get_db_doc_spec.rb +32 -0
  144. data/spec/api/store/set_db_doc_spec.rb +43 -0
  145. data/spec/api/system/adapter_spec.rb +33 -0
  146. data/spec/api/{admin → system}/get_license_info_spec.rb +2 -5
  147. data/spec/api/{admin/get_api_token_spec.rb → system/login_spec.rb} +4 -11
  148. data/spec/api/{admin → system}/reset_spec.rb +2 -2
  149. data/spec/api/{admin → system}/stats_spec.rb +19 -13
  150. data/spec/api/user/create_user_spec.rb +15 -8
  151. data/spec/api/{client → user}/delete_client_spec.rb +3 -4
  152. data/spec/api/user/delete_user_spec.rb +33 -4
  153. data/spec/api/user/list_clients_spec.rb +30 -0
  154. data/spec/api/user/list_source_docs_spec.rb +35 -0
  155. data/spec/api/user/list_users_spec.rb +5 -6
  156. data/spec/api/{client → user}/ping_spec.rb +4 -6
  157. data/spec/api/user/show_user_spec.rb +14 -0
  158. data/spec/api/user/update_user_spec.rb +28 -10
  159. data/spec/api/user/user_get_db_doc_spec.rb +16 -0
  160. data/spec/api/user/user_set_db_doc_spec.rb +41 -0
  161. data/spec/apps/rhotestapp/application.rb +4 -0
  162. data/spec/apps/rhotestapp/settings/settings.yml +3 -1
  163. data/spec/bulk_data/bulk_data_spec.rb +13 -0
  164. data/spec/client_sync_spec.rb +41 -59
  165. data/spec/document_spec.rb +23 -0
  166. data/spec/javascripts/doc_view_spec.js +1 -1
  167. data/spec/javascripts/home_view_spec.js +10 -5
  168. data/spec/javascripts/index_view_spec.js +1 -1
  169. data/spec/jobs/ping_job_spec.rb +26 -0
  170. data/spec/perf/store_perf_spec.rb +1 -1
  171. data/spec/ping/android_spec.rb +0 -7
  172. data/spec/ping/apple_spec.rb +7 -0
  173. data/spec/ping/blackberry_spec.rb +10 -0
  174. data/spec/ping/rhoconnect_push_spec.rb +58 -0
  175. data/spec/server/cors_spec.rb +1 -1
  176. data/spec/server/server_spec.rb +152 -104
  177. data/spec/{stats/middleware_spec.rb → server/stats_spec.rb} +4 -5
  178. data/spec/server/x_domain_session_wrapper_spec.rb +3 -3
  179. data/spec/source_spec.rb +2 -2
  180. data/spec/source_sync_spec.rb +2 -0
  181. data/spec/spec_helper.rb +17 -3
  182. data/spec/stats/record_spec.rb +18 -19
  183. data/spec/store_spec.rb +51 -26
  184. data/spec/support/shared_examples.rb +4 -0
  185. data/spec/sync_states_spec.rb +2 -2
  186. metadata +104 -88
  187. data/bench/benchapp/Gemfile.lock +0 -87
  188. data/bench/blobapp/Gemfile.lock +0 -107
  189. data/bench/lib/testdata/5-data.txt +0 -8
  190. data/doc/release.txt +0 -41
  191. data/lib/rhoconnect/api/admin/get_api_token.rb +0 -14
  192. data/lib/rhoconnect/api/admin/login.rb +0 -6
  193. data/lib/rhoconnect/api/application/bulk_data.rb +0 -7
  194. data/lib/rhoconnect/api/application/clientcreate.rb +0 -8
  195. data/lib/rhoconnect/api/application/clientlogin.rb +0 -6
  196. data/lib/rhoconnect/api/application/clientregister.rb +0 -13
  197. data/lib/rhoconnect/api/application/clientreset.rb +0 -6
  198. data/lib/rhoconnect/api/application/query.rb +0 -7
  199. data/lib/rhoconnect/api/application/queue_updates.rb +0 -20
  200. data/lib/rhoconnect/api/application/search.rb +0 -6
  201. data/lib/rhoconnect/api/client/create_client.rb +0 -3
  202. data/lib/rhoconnect/api/client/delete_client.rb +0 -5
  203. data/lib/rhoconnect/api/client/list_clients.rb +0 -3
  204. data/lib/rhoconnect/api/client/ping.rb +0 -7
  205. data/lib/rhoconnect/api/source/get_adapter.rb +0 -3
  206. data/lib/rhoconnect/api/source/get_db_doc.rb +0 -7
  207. data/lib/rhoconnect/api/source/list_source_docs.rb +0 -10
  208. data/lib/rhoconnect/api/source/save_adapter.rb +0 -3
  209. data/lib/rhoconnect/api/source/set_db_doc.rb +0 -10
  210. data/lib/rhoconnect/api/source/upload_file.rb +0 -4
  211. data/lib/rhoconnect/body_content_type_parser.rb +0 -32
  212. data/lib/rhoconnect/x_domain_session_wrapper.rb +0 -53
  213. data/spec/api/admin/api_token_spec.rb +0 -13
  214. data/spec/api/client/create_client_spec.rb +0 -13
  215. data/spec/api/client/list_clients_spec.rb +0 -22
  216. data/spec/api/source/adapter_spec.rb +0 -29
  217. data/spec/api/source/get_db_doc_spec.rb +0 -21
  218. data/spec/api/source/list_source_docs_spec.rb +0 -25
  219. data/spec/api/source/push_objects_spec.rb +0 -27
  220. data/spec/api/source/set_db_doc_spec.rb +0 -32
  221. data/spec/api/source/upload_file_spec.rb +0 -26
@@ -7,17 +7,17 @@ module Rhoconnect
7
7
  settings = get_config(Rhoconnect.base_directory)[Rhoconnect.environment]
8
8
  host = settings[:mdsserver]
9
9
  port = settings[:mdsserverport]
10
-
11
- headers = { "X-WAP-APPLICATION-ID" => "/",
12
- "X-RIM-PUSH-DEST-PORT" => params['device_port'],
13
- "CONTENT-TYPE" => 'multipart/related; type="application/xml"; boundary=asdlfkjiurwghasf'}
10
+ if (host and port)
11
+ headers = { "X-WAP-APPLICATION-ID" => "/",
12
+ "X-RIM-PUSH-DEST-PORT" => params['device_port'],
13
+ "CONTENT-TYPE" => 'multipart/related; type="application/xml"; boundary=asdlfkjiurwghasf'}
14
14
 
15
- Net::HTTP.new(host,port).start do |http|
16
- request = Net::HTTP::Post.new('/pap',headers)
17
- request.body = pap_message(params)
18
- http.request(request)
15
+ Net::HTTP.new(host,port).start do |http|
16
+ request = Net::HTTP::Post.new('/pap',headers)
17
+ request.body = pap_message(params)
18
+ http.request(request)
19
+ end
19
20
  end
20
-
21
21
  rescue Exception => error
22
22
  log "Error while sending ping: #{error}"
23
23
  raise error
@@ -0,0 +1,45 @@
1
+ require 'uri'
2
+
3
+ module Rhoconnect
4
+ class RhoconnectPush
5
+ class InvalidPushServer < Exception; end
6
+ class InvalidPushRequest < Exception; end
7
+
8
+ def self.ping(params)
9
+ begin
10
+ settings = get_config(Rhoconnect.base_directory)[Rhoconnect.environment]
11
+ if settings and settings[:push_server]
12
+ server = URI.join(settings[:push_server], "/messageQueue/#{params['device_pin']}")
13
+ RestClient.post(
14
+ server.to_s,self.push_message(params),:content_type => :json
15
+ ) do |response, request, result, &block|
16
+ case response.code
17
+ when 200, 204
18
+ response.return!(request, result, &block)
19
+ when 400
20
+ raise InvalidPushRequest.new("Invalid push request.")
21
+ end
22
+ end
23
+ else
24
+ raise InvalidPushServer.new("Missing or invalid `:push_server` in settings/settings.yml.")
25
+ end
26
+ rescue Exception => error
27
+ log "RhoConnect Push Error: #{error}"
28
+ log error.backtrace.join("\n")
29
+ raise error
30
+ end
31
+ end
32
+
33
+ # Generates push package
34
+ def self.push_message(params)
35
+ data = {}
36
+ data['collapseId'] = params['badge'].to_i if params['badge']
37
+ data['data'] = {}
38
+ data['data']['message'] = params['message'] if params['message']
39
+ data['data']['sound'] = params['sound'] if params['sound']
40
+ data['data']['vibrate'] = params['vibrate'] if params['vibrate']
41
+ data['data']['do_sync'] = params['sources'] if params['sources']
42
+ data.to_json
43
+ end
44
+ end
45
+ end
@@ -4,9 +4,9 @@ require 'erb'
4
4
  require 'json'
5
5
  require 'fileutils'
6
6
  require 'rhoconnect'
7
- require 'rhoconnect/x_domain_session_wrapper'
8
- require 'rhoconnect/body_content_type_parser'
9
- require 'rhoconnect/cors'
7
+
8
+ # all middlewares
9
+ Dir[File.join(File.dirname(__FILE__),'middleware','**','*.rb')].each { |mw| require mw }
10
10
 
11
11
  module Rhoconnect
12
12
 
@@ -34,23 +34,30 @@ module Rhoconnect
34
34
  set :use_middleware, Proc.new {
35
35
  return false if @middleware_configured # Middleware might be configured only once!
36
36
 
37
- use XDomainSessionWrapper
37
+ use Rhoconnect::Middleware::XDomainSessionWrapper
38
38
  use Rack::Cors do |cfg|
39
39
  cfg.allow do |allow|
40
- allow.origins /.*/
40
+ allow.origins(/.*/)
41
41
  allow.resource '/application', :headers => :any, :methods => [:get, :post, :put, :delete], :credentials => true
42
42
  allow.resource '/application/*', :headers => :any, :methods => [:get, :post, :put, :delete], :credentials => true
43
43
  allow.resource '/api/application', :headers => :any, :methods => [:get, :post, :put, :delete], :credentials => true
44
44
  allow.resource '/api/application/*', :headers => :any, :methods => [:get, :post, :put, :delete], :credentials => true
45
+ allow.resource "/app/#{Rhoconnect::API_VERSION}/*", :headers => :any, :methods => [:get, :post, :put, :delete], :credentials => true
46
+ allow.resource "/rc/#{Rhoconnect::API_VERSION}/app/*", :headers => :any, :methods => [:get, :post, :put, :delete], :credentials => true
45
47
  end
46
48
  end
47
- use Rhoconnect::BodyContentTypeParser
48
- use Rhoconnect::Stats::Middleware
49
+ use Rhoconnect::Middleware::BodyContentTypeParser
50
+ use Rhoconnect::Middleware::Stats
49
51
  Rhoconnect::Server.set :secret, @secret unless settings.respond_to?(:secret)
50
52
  use Rack::Session::Cookie,
51
53
  :key => 'rhoconnect_session', :expire_after => Rhoconnect.cookie_expire,
52
54
  :secret => Rhoconnect::Server.secret
53
-
55
+ use Rhoconnect::Middleware::CurrentRequest
56
+ use Rhoconnect::Middleware::CurrentApp
57
+ use Rhoconnect::Middleware::CurrentUser
58
+ use Rhoconnect::Middleware::AdminUser
59
+ use Rhoconnect::Middleware::LoginRequired
60
+
54
61
  @middleware_configured ||= true
55
62
  }
56
63
 
@@ -59,14 +66,9 @@ module Rhoconnect
59
66
  request.env['PATH_INFO'].split('/').last
60
67
  end
61
68
 
62
- def check_api_token
63
- request_action == 'login' or request_action == 'get_api_token' or
64
- (params[:api_token] and ApiToken.is_exist?(params[:api_token]))
65
- end
66
-
67
- def do_login
69
+ def check_login
68
70
  begin
69
- login ? status(200) : status(401)
71
+ yield
70
72
  rescue LoginException => le
71
73
  throw :halt, [401, le.message]
72
74
  rescue Exception => e
@@ -74,9 +76,21 @@ module Rhoconnect
74
76
  end
75
77
  end
76
78
 
77
- def login_required
78
- current_user.nil?
79
- end
79
+ def do_login
80
+ check_login do
81
+ if login
82
+ status(200)
83
+ else
84
+ raise LoginException.new("Unable to authenticate '#{params[:login]}'")
85
+ end
86
+ end
87
+ end
88
+
89
+ def do_ans_login
90
+ check_login do
91
+ ans_login ? status(204) : status(401)
92
+ end
93
+ end
80
94
 
81
95
  def login
82
96
  if params[:login].nil? or params[:login].empty?
@@ -95,33 +109,42 @@ module Rhoconnect
95
109
  end
96
110
  end
97
111
 
112
+ def ans_login
113
+ if current_app and current_app.can_ans_authenticate?
114
+ auth = Rack::Auth::Basic::Request.new(request.env)
115
+ current_app.ans_authenticate(
116
+ auth.credentials.first, auth.credentials.last
117
+ ) if auth.provided? and auth.basic? and auth.credentials
118
+ else
119
+ false
120
+ end
121
+ end
122
+
98
123
  def logout
99
124
  session[:login] = nil
100
125
  end
101
126
 
102
127
  def current_user
103
- if @user.nil? and User.is_exist?(session[:login])
104
- @user = User.load(session[:login])
105
- end
106
- if @user and (@user.admin == 1 || session[:app_name] == APP_NAME)
107
- @user
108
- else
109
- nil
110
- end
128
+ @env[Rhoconnect::CURRENT_USER]
111
129
  end
112
130
 
113
- def api_user
114
- if request_action == 'get_api_token' or request_action == 'login'
115
- current_user
116
- else
117
- u = ApiToken.load(params[:api_token])
118
- raise "Wrong API token - #{params[:api_token].inspect}" unless u
119
- u.user
120
- end
131
+ def current_app
132
+ @env[Rhoconnect::CURRENT_APP]
121
133
  end
122
134
 
123
- def current_app
124
- App.load(APP_NAME)
135
+ def current_client
136
+ if @client.nil?
137
+ client_id = @env[Rhoconnect::CLIENT_ID_HEADER]
138
+ client_id = params[:client_id] unless client_id
139
+ if client_id
140
+ @client = Client.load(client_id.to_s,
141
+ params[:source_name] ? {:source_name => current_source.name} : {:source_name => '*'})
142
+ if @client and current_user and @client.user_id != current_user.login
143
+ @client.switch_user(current_user.login)
144
+ end
145
+ end
146
+ end
147
+ @client
125
148
  end
126
149
 
127
150
  def current_source
@@ -144,17 +167,6 @@ module Rhoconnect
144
167
  end
145
168
  end
146
169
 
147
- def current_client
148
- if @client.nil? and params[:client_id]
149
- @client = Client.load(params[:client_id].to_s,
150
- params[:source_name] ? {:source_name => current_source.name} : {:source_name => '*'})
151
- if @client and current_user and @client.user_id != current_user.login
152
- @client.switch_user(current_user.login)
153
- end
154
- @client
155
- end
156
- end
157
-
158
170
  def current_client_sync
159
171
  ClientSync.new(current_source,current_client,params[:p_size])
160
172
  end
@@ -183,18 +195,22 @@ module Rhoconnect
183
195
  end
184
196
  end
185
197
 
198
+ def mark_deprecated_call_and_reroute_api4(verb, new_route, old_verb, old_route, client_call, &block)
199
+ warning_message = "Use of the #{old_verb.to_s.upcase} #{old_route} is deprecated. Use Rhoconnect API #{Rhoconnect::API_VERSION} instead."
200
+ response.headers['Warning'] = warning_message
201
+ Rhoconnect.log warning_message
202
+
203
+ execute_api_call(client_call, &block)
204
+ end
205
+
186
206
  def execute_api_call(client_call = false)
187
- if client_call or check_api_token
188
- catch_all do
189
- res = yield params, (client_call ? current_user : api_user), self
190
- if params.has_key? :warning
191
- Rhoconnect.log params[:warning]
192
- response.headers['Warning'] = params[:warning]
193
- end
194
- res
207
+ catch_all do
208
+ res = yield params, current_user, self
209
+ if params.has_key? :warning
210
+ Rhoconnect.log params[:warning]
211
+ response.headers['Warning'] = params[:warning]
195
212
  end
196
- else
197
- throw :halt, [422, "No API token provided"]
213
+ res
198
214
  end
199
215
  end
200
216
  end
@@ -269,47 +285,24 @@ _INSTALL_ASYNC_GEMS
269
285
  before do
270
286
  cache_control :no_cache
271
287
  headers({'pragma'=>'no-cache'})
272
-
273
- if params[:version] and params[:version].to_i < 3
274
- throw :halt, [404, "Server supports version 3 or higher of the protocol."]
275
- end
276
288
  end
277
-
289
+
278
290
  get '/' do
279
291
  redirect "/console/"
280
292
  end
281
293
 
282
- %w[get post].each do |verb|
283
- send(verb, "/*application*") do
284
- unless request_action == 'clientlogin'
285
- throw :halt, [401, "Not authenticated"] if login_required
286
- end
287
- pass
288
- end
289
- end
290
-
291
- # old routes
292
- post '/login' do
293
- mark_deprecated_call_and_reroute(:login, :admin, self, params)
294
- end
295
- get '/application' do
296
- mark_deprecated_call_and_reroute(:query, :application, self, params)
297
- end
298
- post '/application' do
299
- mark_deprecated_call_and_reroute(:queue_updates, :application, self, params)
300
- end
301
- # confusion routes - only because Rhodes didn't switch
302
- # to new style API yet
303
- get '/api/application' do
304
- mark_deprecated_call_and_reroute(:query, :application, self, params)
305
- end
306
- post '/api/application' do
307
- mark_deprecated_call_and_reroute(:queue_updates, :application, self, params)
308
- end
309
-
310
294
  def self.api(name, namespace = nil, verb = :post, &block)
295
+ # this method is deprecated - so we should warn the users
296
+ # that it will be removed in 4.0
297
+ warning_for_server_api = <<_DEPRECATE_SERVER_API
298
+ ***** WARNING *****
299
+ Server.api method is deprecated and will be removed in Rhoconnect 4.0
300
+ Please change your implementation to Server.api4
301
+ _DEPRECATE_SERVER_API
302
+ puts warning_for_server_api
303
+
311
304
  old_api_prefix = (namespace == :application) ? :application : :api
312
- client_call = (namespace == :application) ? true : false
305
+ client_call = (namespace == :application) ? true : false
313
306
  send verb, "/#{old_api_prefix}/#{name}" do
314
307
  mark_deprecated_call_and_reroute(name, namespace, params, &block)
315
308
  end
@@ -318,6 +311,20 @@ _INSTALL_ASYNC_GEMS
318
311
  execute_api_call(client_call, &block)
319
312
  end
320
313
  end
314
+
315
+ def self.api4(method_name, verb, route, admin = true, deprecated_route = nil, &block)
316
+ unless deprecated_route.nil?
317
+ deprecated_urls = deprecated_route[:url].is_a?(String) ? [deprecated_route[:url]] : deprecated_route[:url]
318
+ deprecated_urls.each do |deprecated_url|
319
+ send deprecated_route[:verb], deprecated_url do
320
+ mark_deprecated_call_and_reroute_api4(verb, route, deprecated_route[:verb], deprecated_url, !admin, &block)
321
+ end
322
+ end
323
+ end
324
+ send verb, route do
325
+ execute_api_call(!admin, &block)
326
+ end
327
+ end
321
328
  end
322
329
  end
323
330
 
@@ -186,7 +186,11 @@ module Rhoconnect
186
186
  blob_attribs = []
187
187
  schema['property'].each do |key,value|
188
188
  values = value ? value.split(',') : []
189
- blob_attribs << key if values.include?('blob')
189
+ if values.include?('blob')
190
+ attrib = key.dup
191
+ attrib << "," + (values.include?('overwrite') ? '1' : '0')
192
+ blob_attribs << attrib
193
+ end
190
194
  end
191
195
  blob_attribs.sort.join(',')
192
196
  end
@@ -91,7 +91,7 @@ module Rhoconnect
91
91
  def do_query(params=nil)
92
92
  result = nil
93
93
  @source.if_need_refresh do
94
- Stats::Record.update("source:query:#{@source.name}") do
94
+ Rhoconnect::Stats::Record.update("source:query:#{@source.name}") do
95
95
  if _auth_op('login')
96
96
  result = self.read(nil,params)
97
97
  _auth_op('logoff')
@@ -239,7 +239,7 @@ module Rhoconnect
239
239
  end
240
240
 
241
241
  def _measure_and_process_cud(operation)
242
- Stats::Record.update("source:#{operation}:#{@source.name}") do
242
+ Rhoconnect::Stats::Record.update("source:#{operation}:#{@source.name}") do
243
243
  _process_cud(operation)
244
244
  end
245
245
  end
@@ -354,9 +354,10 @@ module Rhoconnect
354
354
  if operation == 'delete'
355
355
  # Clean up deleted objects from master document and corresponding client document
356
356
  total_dels = {}
357
+ objs = {}
357
358
  dels.each do |client_id,client_doc|
358
359
  next if client_doc.empty?
359
- client = processed_clients[client_id]
360
+ client = processed_clients[client_id]
360
361
  client.delete_data(:cd,client_doc)
361
362
  client.update_count(:cd_size,-client_doc.size)
362
363
  total_dels.merge!(client_doc)
@@ -1,8 +1,8 @@
1
1
  module Rhoconnect
2
- module Stats
2
+ class Stats
3
3
  class Record
4
4
  class << self
5
-
5
+
6
6
  # Add a value to a metric. If zset already has a member,
7
7
  # update the existing member with an incremented value by default.
8
8
  # Also supports updating the value with a block (useful for averages)
@@ -25,11 +25,11 @@ module Rhoconnect
25
25
  Store.db.zremrangebyscore(key(metric), 0, start - record_size(metric))
26
26
  end
27
27
  end
28
-
28
+
29
29
  def add(metric, value = 1)
30
30
  set(metric,value) { |current,value| current.to_i + value }
31
31
  end
32
-
32
+
33
33
  # Saves the accumulated average for a resolution in a metric
34
34
  def save_average(metric, value)
35
35
  set(metric,value) do |current,value|
@@ -42,7 +42,7 @@ module Rhoconnect
42
42
  "#{current + 1},#{sum}"
43
43
  end
44
44
  end
45
-
45
+
46
46
  def update(metric)
47
47
  if Rhoconnect.stats
48
48
  start = Time.now.to_f
@@ -54,51 +54,51 @@ module Rhoconnect
54
54
  yield
55
55
  end
56
56
  end
57
-
57
+
58
58
  def keys(glob='*')
59
59
  Store.db.keys(key(glob)).collect {|c| c[5..-1]}
60
60
  end
61
-
61
+
62
62
  def reset(metric)
63
63
  Store.db.del(key(metric))
64
64
  end
65
-
65
+
66
66
  def reset_all
67
67
  Store.flash_data('stat:*')
68
68
  end
69
-
69
+
70
70
  # Returns simple string metric
71
71
  def get_value(metric)
72
72
  Store.get_value(key(metric))
73
73
  end
74
-
74
+
75
75
  # Sets a string metric
76
76
  def set_value(metric, value)
77
77
  Store.set_value(key(metric), value)
78
78
  end
79
-
79
+
80
80
  # Returns the metric data, uses array indexing
81
81
  def range(metric, start, finish = -1)
82
82
  Store.db.zrange(key(metric), start, finish)
83
83
  end
84
-
84
+
85
85
  # Returns the resolution for a given metric, default 60 seconds
86
86
  def resolution(metric)
87
87
  resolution = STATS_RECORD_RESOLUTION rescue nil
88
88
  resolution || 60 #=> 1 minute aggregate
89
89
  end
90
-
90
+
91
91
  # Returns the # of records to save for a given metric
92
92
  def record_size(metric)
93
93
  size = STATS_RECORD_SIZE rescue nil
94
94
  size || 60 * 24 * 31 #=> 44640 minutes
95
95
  end
96
-
96
+
97
97
  # Returns redis object type for a record
98
98
  def rtype(metric)
99
99
  Store.db.type(key(metric))
100
100
  end
101
-
101
+
102
102
  def key(metric)
103
103
  "stat:#{metric}"
104
104
  end