rsence-pre 2.1.0.1.pre

Sign up to get free protection for your applications and to get access to all the features.
Files changed (313) hide show
  1. data/.yardopts +10 -0
  2. data/INSTALL.rdoc +330 -0
  3. data/LICENSE.txt +622 -0
  4. data/README.rdoc +98 -0
  5. data/VERSION +1 -0
  6. data/bin/rsence +25 -0
  7. data/bin/rsence-pre +25 -0
  8. data/conf/default_conf.yaml +346 -0
  9. data/conf/default_strings.yaml +76 -0
  10. data/conf/rsence_command_strings.yaml +444 -0
  11. data/docs/ExampleGuiPlugin.rdoc +193 -0
  12. data/docs/JavascriptBundles.rdoc +0 -0
  13. data/docs/PluginBundleInfo.rdoc +173 -0
  14. data/docs/PluginBundles.rdoc +96 -0
  15. data/docs/Values.rdoc +163 -0
  16. data/js/comm/autosync/autosync.js +17 -0
  17. data/js/comm/autosync/js.inc +0 -0
  18. data/js/comm/comm.js +203 -0
  19. data/js/comm/js.inc +0 -0
  20. data/js/comm/jsloader/js.inc +0 -0
  21. data/js/comm/jsloader/jsloader.js +112 -0
  22. data/js/comm/queue/js.inc +0 -0
  23. data/js/comm/queue/queue.js +184 -0
  24. data/js/comm/session/js.inc +0 -0
  25. data/js/comm/session/session.js +52 -0
  26. data/js/comm/sessionwatcher/js.inc +0 -0
  27. data/js/comm/sessionwatcher/sessionwatcher.js +44 -0
  28. data/js/comm/transporter/js.inc +0 -0
  29. data/js/comm/transporter/transporter.js +261 -0
  30. data/js/comm/urlresponder/js.inc +0 -0
  31. data/js/comm/urlresponder/urlresponder.js +149 -0
  32. data/js/comm/values/js.inc +0 -0
  33. data/js/comm/values/values.js +433 -0
  34. data/js/controls/button/button.js +72 -0
  35. data/js/controls/button/js.inc +0 -0
  36. data/js/controls/button/themes/bright/button.css +89 -0
  37. data/js/controls/button/themes/bright/button.html +7 -0
  38. data/js/controls/button/themes/bright/button_parts1-ie6.gif +0 -0
  39. data/js/controls/button/themes/bright/button_parts1.png +0 -0
  40. data/js/controls/button/themes/default/button.css +89 -0
  41. data/js/controls/button/themes/default/button.html +7 -0
  42. data/js/controls/button/themes/default/button_parts1-ie6.gif +0 -0
  43. data/js/controls/button/themes/default/button_parts1.png +0 -0
  44. data/js/controls/checkbox/checkbox.js +49 -0
  45. data/js/controls/checkbox/js.inc +0 -0
  46. data/js/controls/checkbox/themes/default/checkbox.css +69 -0
  47. data/js/controls/checkbox/themes/default/checkbox.html +5 -0
  48. data/js/controls/checkbox/themes/default/checkbox_parts1-ie6.gif +0 -0
  49. data/js/controls/checkbox/themes/default/checkbox_parts1.png +0 -0
  50. data/js/controls/dialogs/alert_sheet/alert_sheet.js +63 -0
  51. data/js/controls/dialogs/alert_sheet/js.inc +0 -0
  52. data/js/controls/dialogs/confirm_sheet/confirm_sheet.js +37 -0
  53. data/js/controls/dialogs/confirm_sheet/js.inc +0 -0
  54. data/js/controls/dialogs/sheet/js.inc +0 -0
  55. data/js/controls/dialogs/sheet/sheet.js +84 -0
  56. data/js/controls/dialogs/sheet/themes/default/sheet.css +64 -0
  57. data/js/controls/dialogs/sheet/themes/default/sheet.html +14 -0
  58. data/js/controls/dialogs/sheet/themes/default/sheet_bg-ie6.gif +0 -0
  59. data/js/controls/dialogs/sheet/themes/default/sheet_bg.png +0 -0
  60. data/js/controls/dialogs/sheet/themes/default/sheet_dim-ie6.gif +0 -0
  61. data/js/controls/dialogs/sheet/themes/default/sheet_dim.png +0 -0
  62. data/js/controls/dialogs/sheet/themes/default/sheet_parts1-ie6.gif +0 -0
  63. data/js/controls/dialogs/sheet/themes/default/sheet_parts1.png +0 -0
  64. data/js/controls/dialogs/sheet/themes/default/sheet_parts2-ie6.gif +0 -0
  65. data/js/controls/dialogs/sheet/themes/default/sheet_parts2.png +0 -0
  66. data/js/controls/dialogs/sheet/themes/default/sheet_warning-ie6.gif +0 -0
  67. data/js/controls/dialogs/sheet/themes/default/sheet_warning.png +0 -0
  68. data/js/controls/imageview/imageview.js +109 -0
  69. data/js/controls/imageview/js.inc +0 -0
  70. data/js/controls/imageview/themes/default/blank.gif +0 -0
  71. data/js/controls/passwordcontrol/js.inc +0 -0
  72. data/js/controls/passwordcontrol/passwordcontrol.js +23 -0
  73. data/js/controls/passwordcontrol/themes/default/passwordcontrol.css +0 -0
  74. data/js/controls/passwordcontrol/themes/default/passwordcontrol.html +18 -0
  75. data/js/controls/progress/progressbar/js.inc +0 -0
  76. data/js/controls/progress/progressbar/progressbar.js +40 -0
  77. data/js/controls/progress/progressbar/themes/default/progressbar.css +16 -0
  78. data/js/controls/progress/progressbar/themes/default/progressbar.html +2 -0
  79. data/js/controls/progress/progressindicator/js.inc +0 -0
  80. data/js/controls/progress/progressindicator/progressindicator.js +44 -0
  81. data/js/controls/radiobutton/js.inc +0 -0
  82. data/js/controls/radiobutton/radiobutton.js +43 -0
  83. data/js/controls/radiobutton/themes/default/radiobutton.css +69 -0
  84. data/js/controls/radiobutton/themes/default/radiobutton.html +5 -0
  85. data/js/controls/radiobutton/themes/default/radiobutton_parts1-ie6.gif +0 -0
  86. data/js/controls/radiobutton/themes/default/radiobutton_parts1.png +0 -0
  87. data/js/controls/sliders/slider/js.inc +0 -0
  88. data/js/controls/sliders/slider/slider.js +357 -0
  89. data/js/controls/sliders/slider/themes/default/hslider_tracks-ie6.gif +0 -0
  90. data/js/controls/sliders/slider/themes/default/hslider_tracks.png +0 -0
  91. data/js/controls/sliders/slider/themes/default/slider.css +108 -0
  92. data/js/controls/sliders/slider/themes/default/slider.html +5 -0
  93. data/js/controls/sliders/slider/themes/default/slider_thumbs-ie6.gif +0 -0
  94. data/js/controls/sliders/slider/themes/default/slider_thumbs.png +0 -0
  95. data/js/controls/sliders/vslider/js.inc +0 -0
  96. data/js/controls/sliders/vslider/themes/default/vslider.css +52 -0
  97. data/js/controls/sliders/vslider/themes/default/vslider.html +5 -0
  98. data/js/controls/sliders/vslider/themes/default/vslider_tracks-ie6.gif +0 -0
  99. data/js/controls/sliders/vslider/themes/default/vslider_tracks.png +0 -0
  100. data/js/controls/sliders/vslider/vslider.js +41 -0
  101. data/js/controls/stepper/js.inc +0 -0
  102. data/js/controls/stepper/stepper.js +213 -0
  103. data/js/controls/stepper/themes/default/stepper-ie6.gif +0 -0
  104. data/js/controls/stepper/themes/default/stepper.css +14 -0
  105. data/js/controls/stepper/themes/default/stepper.html +2 -0
  106. data/js/controls/stepper/themes/default/stepper.png +0 -0
  107. data/js/controls/stringview/js.inc +0 -0
  108. data/js/controls/stringview/stringview.js +49 -0
  109. data/js/controls/stringview/themes/default/stringview.css +8 -0
  110. data/js/controls/stringview/themes/default/stringview.html +1 -0
  111. data/js/controls/tab/js.inc +0 -0
  112. data/js/controls/tab/tab.js +280 -0
  113. data/js/controls/tab/themes/bright/tab.css +76 -0
  114. data/js/controls/tab/themes/bright/tab.html +6 -0
  115. data/js/controls/tab/themes/bright/tab_bg_color-ie6.gif +0 -0
  116. data/js/controls/tab/themes/bright/tab_bg_color.png +0 -0
  117. data/js/controls/tab/themes/bright/tab_border_pattern-ie6.gif +0 -0
  118. data/js/controls/tab/themes/bright/tab_border_pattern.png +0 -0
  119. data/js/controls/tab/themes/bright/tab_parts1-ie6.gif +0 -0
  120. data/js/controls/tab/themes/bright/tab_parts1.png +0 -0
  121. data/js/controls/tab/themes/default/tab.css +77 -0
  122. data/js/controls/tab/themes/default/tab.html +6 -0
  123. data/js/controls/tab/themes/default/tab_bg_color-ie6.gif +0 -0
  124. data/js/controls/tab/themes/default/tab_bg_color.png +0 -0
  125. data/js/controls/tab/themes/default/tab_border_pattern-ie6.gif +0 -0
  126. data/js/controls/tab/themes/default/tab_border_pattern.png +0 -0
  127. data/js/controls/tab/themes/default/tab_parts1-ie6.gif +0 -0
  128. data/js/controls/tab/themes/default/tab_parts1.png +0 -0
  129. data/js/controls/textarea/js.inc +0 -0
  130. data/js/controls/textarea/textarea.js +24 -0
  131. data/js/controls/textarea/themes/default/textarea.css +21 -0
  132. data/js/controls/textarea/themes/default/textarea.html +18 -0
  133. data/js/controls/textcontrol/js.inc +0 -0
  134. data/js/controls/textcontrol/textcontrol.js +374 -0
  135. data/js/controls/textcontrol/themes/default/textcontrol.css +107 -0
  136. data/js/controls/textcontrol/themes/default/textcontrol.html +18 -0
  137. data/js/controls/textcontrol/themes/default/textcontrol_parts1-ie6.gif +0 -0
  138. data/js/controls/textcontrol/themes/default/textcontrol_parts1.png +0 -0
  139. data/js/controls/textcontrol/themes/default/textcontrol_parts2-ie6.gif +0 -0
  140. data/js/controls/textcontrol/themes/default/textcontrol_parts2.png +0 -0
  141. data/js/controls/textcontrol/themes/default/textcontrol_parts3-ie6.gif +0 -0
  142. data/js/controls/textcontrol/themes/default/textcontrol_parts3.png +0 -0
  143. data/js/controls/uploader/js.inc +0 -0
  144. data/js/controls/uploader/themes/default/upload_progress.gif +0 -0
  145. data/js/controls/uploader/themes/default/uploader.css +108 -0
  146. data/js/controls/uploader/themes/default/uploader.html +27 -0
  147. data/js/controls/uploader/uploader.js +154 -0
  148. data/js/controls/validatorview/js.inc +0 -0
  149. data/js/controls/validatorview/themes/default/validator-ie6.gif +0 -0
  150. data/js/controls/validatorview/themes/default/validator.png +0 -0
  151. data/js/controls/validatorview/themes/default/validatorview.css +0 -0
  152. data/js/controls/validatorview/themes/default/validatorview.html +0 -0
  153. data/js/controls/validatorview/validatorview.js +62 -0
  154. data/js/controls/window/js.inc +0 -0
  155. data/js/controls/window/themes/default/window.css +219 -0
  156. data/js/controls/window/themes/default/window.html +17 -0
  157. data/js/controls/window/themes/default/window_bg_active-ie6.gif +0 -0
  158. data/js/controls/window/themes/default/window_bg_active.png +0 -0
  159. data/js/controls/window/themes/default/window_bg_inactive-ie6.gif +0 -0
  160. data/js/controls/window/themes/default/window_bg_inactive.png +0 -0
  161. data/js/controls/window/themes/default/window_buttons-ie6.gif +0 -0
  162. data/js/controls/window/themes/default/window_buttons.png +0 -0
  163. data/js/controls/window/themes/default/window_parts1-ie6.gif +0 -0
  164. data/js/controls/window/themes/default/window_parts1.png +0 -0
  165. data/js/controls/window/themes/default/window_parts2-ie6.gif +0 -0
  166. data/js/controls/window/themes/default/window_parts2.png +0 -0
  167. data/js/controls/window/window.js +286 -0
  168. data/js/core/class/class.js +318 -0
  169. data/js/core/class/js.inc +0 -0
  170. data/js/core/elem/elem.js +1383 -0
  171. data/js/core/elem/js.inc +0 -0
  172. data/js/core/event/event.js +153 -0
  173. data/js/core/event/js.inc +0 -0
  174. data/js/core/iefix/ie_css_element.htc +5 -0
  175. data/js/core/iefix/ie_css_style.htc +5 -0
  176. data/js/core/iefix/iefix.js +359 -0
  177. data/js/core/iefix/js.inc +0 -0
  178. data/js/core/rsence_ns/js.inc +0 -0
  179. data/js/core/rsence_ns/rsence_ns.js +21 -0
  180. data/js/datetime/calendar/calendar.js +198 -0
  181. data/js/datetime/calendar/js.inc +0 -0
  182. data/js/datetime/calendar/themes/default/calendar.css +108 -0
  183. data/js/datetime/calendar/themes/default/calendar.html +9 -0
  184. data/js/datetime/calendar/themes/default/calendar_arrows-ie6.gif +0 -0
  185. data/js/datetime/calendar/themes/default/calendar_arrows.png +0 -0
  186. data/js/datetime/datetimevalue/datetimevalue.js +247 -0
  187. data/js/datetime/datetimevalue/js.inc +0 -0
  188. data/js/datetime/timesheet/js.inc +0 -0
  189. data/js/datetime/timesheet/themes/default/timesheet.css +30 -0
  190. data/js/datetime/timesheet/themes/default/timesheet.html +2 -0
  191. data/js/datetime/timesheet/timesheet.js +183 -0
  192. data/js/datetime/timesheet_item/js.inc +0 -0
  193. data/js/datetime/timesheet_item/themes/default/timesheet_item.css +42 -0
  194. data/js/datetime/timesheet_item/themes/default/timesheet_item.html +8 -0
  195. data/js/datetime/timesheet_item/timesheet_item.js +248 -0
  196. data/js/datetime/timesheet_item_edit/js.inc +0 -0
  197. data/js/datetime/timesheet_item_edit/timesheet_item_edit.js +274 -0
  198. data/js/foundation/application/application.js +208 -0
  199. data/js/foundation/application/js.inc +0 -0
  200. data/js/foundation/control/control.js +339 -0
  201. data/js/foundation/control/controldefaults/controldefaults.js +56 -0
  202. data/js/foundation/control/controldefaults/js.inc +0 -0
  203. data/js/foundation/control/dummyvalue/dummyvalue.js +51 -0
  204. data/js/foundation/control/dummyvalue/js.inc +0 -0
  205. data/js/foundation/control/dyncontrol/dyncontrol.js +500 -0
  206. data/js/foundation/control/dyncontrol/js.inc +0 -0
  207. data/js/foundation/control/dyncontrol/themes/default/dyncontrol.css +0 -0
  208. data/js/foundation/control/dyncontrol/themes/default/dyncontrol.html +0 -0
  209. data/js/foundation/control/eventresponder/eventresponder.js +750 -0
  210. data/js/foundation/control/eventresponder/js.inc +0 -0
  211. data/js/foundation/control/js.inc +0 -0
  212. data/js/foundation/control/valuematrix/js.inc +0 -0
  213. data/js/foundation/control/valuematrix/valuematrix.js +135 -0
  214. data/js/foundation/control/valueresponder/js.inc +0 -0
  215. data/js/foundation/control/valueresponder/valueresponder.js +79 -0
  216. data/js/foundation/eventmanager/eventmanager.js +991 -0
  217. data/js/foundation/eventmanager/js.inc +0 -0
  218. data/js/foundation/geom/point/js.inc +0 -0
  219. data/js/foundation/geom/point/point.js +202 -0
  220. data/js/foundation/geom/rect/js.inc +0 -0
  221. data/js/foundation/geom/rect/rect.js +651 -0
  222. data/js/foundation/json_renderer/js.inc +0 -0
  223. data/js/foundation/json_renderer/json_renderer.js +246 -0
  224. data/js/foundation/system/js.inc +0 -0
  225. data/js/foundation/system/system.js +381 -0
  226. data/js/foundation/thememanager/js.inc +0 -0
  227. data/js/foundation/thememanager/thememanager.js +393 -0
  228. data/js/foundation/value/js.inc +0 -0
  229. data/js/foundation/value/value.js +183 -0
  230. data/js/foundation/view/js.inc +0 -0
  231. data/js/foundation/view/markupview/js.inc +0 -0
  232. data/js/foundation/view/markupview/markupview.js +114 -0
  233. data/js/foundation/view/morphanimation/js.inc +0 -0
  234. data/js/foundation/view/morphanimation/morphanimation.js +237 -0
  235. data/js/foundation/view/view.js +1812 -0
  236. data/js/foundation/view/viewdefaults/js.inc +0 -0
  237. data/js/foundation/view/viewdefaults/viewdefaults.js +26 -0
  238. data/js/lists/checkboxlist/checkboxlist.js +171 -0
  239. data/js/lists/checkboxlist/js.inc +0 -0
  240. data/js/lists/listitems/js.inc +0 -0
  241. data/js/lists/listitems/listitems.js +88 -0
  242. data/js/lists/propertylist/js.inc +0 -0
  243. data/js/lists/propertylist/propertylist.js +326 -0
  244. data/js/lists/radiobuttonlist/js.inc +0 -0
  245. data/js/lists/radiobuttonlist/radiobuttonlist.js +116 -0
  246. data/js/util/reloadapp/js.inc +0 -0
  247. data/js/util/reloadapp/reloadapp.js +152 -0
  248. data/js/util/reloadapp/themes/default/reloadapp_warning-ie6.gif +0 -0
  249. data/js/util/reloadapp/themes/default/reloadapp_warning.png +0 -0
  250. data/js/util/sha/js.inc +0 -0
  251. data/js/util/sha/sha.js +426 -0
  252. data/js/views/centerview/centerview.js +75 -0
  253. data/js/views/centerview/js.inc +0 -0
  254. data/js/views/inlineview/inlineview.js +15 -0
  255. data/js/views/inlineview/js.inc +0 -0
  256. data/js/views/scrollview/js.inc +0 -0
  257. data/js/views/scrollview/scrollview.js +40 -0
  258. data/lib/conf/argv.rb +850 -0
  259. data/lib/conf/default.rb +219 -0
  260. data/lib/daemon/daemon.rb +387 -0
  261. data/lib/daemon/sigcomm.rb +64 -0
  262. data/lib/http/broker.rb +150 -0
  263. data/lib/http/rackup.rb +91 -0
  264. data/lib/http/request.rb +66 -0
  265. data/lib/http/response.rb +65 -0
  266. data/lib/plugins/dependencies.rb +285 -0
  267. data/lib/plugins/gui_plugin.rb +160 -0
  268. data/lib/plugins/guiparser.rb +123 -0
  269. data/lib/plugins/plugin.rb +438 -0
  270. data/lib/plugins/plugin_base.rb +162 -0
  271. data/lib/plugins/plugin_plugins.rb +81 -0
  272. data/lib/plugins/plugin_sqlite_db.rb +98 -0
  273. data/lib/plugins/pluginmanager.rb +635 -0
  274. data/lib/plugins/plugins.rb +169 -0
  275. data/lib/plugins/servlet.rb +108 -0
  276. data/lib/rsence.rb +32 -0
  277. data/lib/session/msg.rb +327 -0
  278. data/lib/session/sessionmanager.rb +522 -0
  279. data/lib/session/sessionstorage.rb +340 -0
  280. data/lib/transporter/transporter.rb +263 -0
  281. data/lib/util/gzstring.rb +9 -0
  282. data/lib/util/ruby19_fixes.rb +18 -0
  283. data/lib/values/hvalue.rb +378 -0
  284. data/lib/values/valuemanager.rb +172 -0
  285. data/plugins/client_pkg/client_pkg.rb +157 -0
  286. data/plugins/client_pkg/info.yaml +25 -0
  287. data/plugins/client_pkg/lib/client_pkg_build.rb +561 -0
  288. data/plugins/client_pkg/lib/client_pkg_cache.rb +50 -0
  289. data/plugins/client_pkg/lib/client_pkg_serve.rb +218 -0
  290. data/plugins/index_html/img/loading.gif +0 -0
  291. data/plugins/index_html/img/riassence.gif +0 -0
  292. data/plugins/index_html/index_html.rb +120 -0
  293. data/plugins/index_html/info.yaml +18 -0
  294. data/plugins/index_html/tmpl/index.html +15 -0
  295. data/plugins/main/info.yaml +18 -0
  296. data/plugins/main/js/main.js +84 -0
  297. data/plugins/main/main.rb +255 -0
  298. data/plugins/main/values.yaml +8 -0
  299. data/plugins/ticket/info.yaml +21 -0
  300. data/plugins/ticket/lib/common.rb +392 -0
  301. data/plugins/ticket/lib/favicon.rb +39 -0
  302. data/plugins/ticket/lib/file.rb +58 -0
  303. data/plugins/ticket/lib/img.rb +50 -0
  304. data/plugins/ticket/lib/objblob.rb +66 -0
  305. data/plugins/ticket/lib/rsrc.rb +34 -0
  306. data/plugins/ticket/lib/upload.rb +236 -0
  307. data/plugins/ticket/ticket.rb +333 -0
  308. data/setup/welcome/gui/welcome.yaml +92 -0
  309. data/setup/welcome/info.yaml +13 -0
  310. data/setup/welcome/text/welcome.html +9 -0
  311. data/setup/welcome/values.yaml +9 -0
  312. data/setup/welcome/welcome.rb +54 -0
  313. metadata +407 -0
@@ -0,0 +1,340 @@
1
+ ## RSence
2
+ # Copyright 2006 Riassence Inc.
3
+ # http://riassence.com/
4
+ #
5
+ # You should have received a copy of the GNU General Public License along
6
+ # with this software package. If not, contact licensing@riassence.com
7
+ ##
8
+
9
+
10
+
11
+ module RSence
12
+
13
+ require 'rubygems'
14
+ require 'sequel'
15
+
16
+ ## HValue class for session restoration
17
+ require 'values/hvalue'
18
+
19
+ # SessionStorage doesn't do anything by itself, it's simply
20
+ # the superclass for SessionManager that does all the boring
21
+ # housekeeping duties.
22
+ #
23
+ # Spliced of as a separate file to reduce the complexity
24
+ # of SessionManager.
25
+ class SessionStorage
26
+ attr_accessor :db
27
+ def initialize
28
+ ## Session data storage (by ses_id)
29
+ @sessions = {}
30
+
31
+ ## Session id by key
32
+ @session_keys = {}
33
+
34
+ ## Session id by cookie key
35
+ @session_cookie_keys = {}
36
+
37
+ @clone_origins = {
38
+ # id => [ id, id, id ... ]
39
+ }
40
+ @clone_sources = {
41
+ # id => id
42
+ }
43
+ @clone_targets = {
44
+ # id => [ id, id, id ... ]
45
+ }
46
+
47
+ ## Disposable keys (new ses_key each request)
48
+ @config = RSence.config[:session_conf]
49
+
50
+ @db_uri = RSence.config[:database][:ses_db]
51
+
52
+ if db_test
53
+ @db_avail = true
54
+ db_init
55
+ else
56
+ @db_avail = false
57
+ puts "Warning: Session database is not available. Can't use persistent sessions."
58
+ @id_counter = 0
59
+ end
60
+
61
+ @accept_requests = true
62
+
63
+ end
64
+
65
+ attr_reader :accept_requests
66
+
67
+ def db_test
68
+ begin
69
+ db_open
70
+ if @db.table_exists?(:rsence_test)
71
+ @db.drop_table(:rsence_test)
72
+ end
73
+ @db.create_table(:rsence_test) { primary_key :id; String :test }
74
+ test_id = @db[:rsence_test].insert( :test => 'TestFoo' )
75
+ @db[:rsence_test].filter( :id => test_id ).update( :test => 'TestFoo2' )
76
+ @db[:rsence_test].filter( :id => test_id ).delete
77
+ @db[:rsence_test].delete
78
+ @db.drop_table(:rsence_test)
79
+ db_close
80
+ return true
81
+ rescue => e
82
+ if RSence.args[:debug]
83
+ err_msg = [
84
+ "ERROR: SessionStorage couldn't open database",
85
+ "#{e.class.to_s}, #{e.message}",
86
+ "Backtrace:",
87
+ "\t"+e.backtrace.join("\n\t")
88
+ ].join("\n")+"\n"
89
+ $stderr.write( err_msg )
90
+ elsif RSence.args[:verbose]
91
+ puts "Failed to open database '#{@db_uri}'."
92
+ puts "Run RSence in debug mode for full error output."
93
+ end
94
+ return false
95
+ end
96
+ end
97
+
98
+ def db_close
99
+ @db.disconnect
100
+ end
101
+
102
+ def db_open
103
+ # work-around for windows (drive letters causing confusion)
104
+ if @db_uri.start_with?('sqlite://')
105
+ @db = Sequel.sqlite( @db_uri.split('sqlite://')[1] )
106
+ else
107
+ @db = Sequel.connect(@db_uri)
108
+ end
109
+ end
110
+
111
+ ## Creates the 'rsence_session' table, if necessary
112
+ ## This table is used to store sessions
113
+ def create_session_table
114
+ db_open
115
+ unless @db.table_exists?(:rsence_session)
116
+ puts "Creating session table..." if RSence.args[:verbose]
117
+ @db.create_table :rsence_session do
118
+ primary_key( :id )
119
+ column( :cookie_key, String )
120
+ column( :ses_key, String )
121
+ column( :ses_timeout, Integer )
122
+ column( :user_id, Integer )
123
+ column( :ses_active, TrueClass )
124
+ column( :ses_stored, Integer )
125
+ column( :ses_data, File )
126
+ end
127
+ end
128
+ db_close
129
+ end
130
+
131
+ ## Creates the 'rsence_version' table, if necessary
132
+ ## This table is used to check for the need of future database upgrades
133
+ def create_version_table
134
+ db_open
135
+ unless @db.table_exists?(:rsence_version)
136
+ puts "Creating version info table..." if RSence.args[:verbose]
137
+ @db.create_table :rsence_version do
138
+ Integer :version
139
+ end
140
+ @db[:rsence_version].insert(:version => 586)
141
+ end
142
+ db_close
143
+ end
144
+
145
+ ## Creates the 'rsence_uploads' table, if necessary
146
+ ## This table is used for storing temporary uploads before processing
147
+ def create_uploads_table
148
+ db_open
149
+ unless @db.table_exists?(:rsence_uploads)
150
+ puts "Creating uploads table..." if RSence.args[:verbose]
151
+ @db.create_table :rsence_uploads do
152
+ primary_key( :id )
153
+ foreign_key( :ses_id, :rsence_session )
154
+ column( :upload_date, Integer )
155
+ column( :upload_done, Integer )
156
+ column( :ticket_id, String )
157
+ column( :file_size, Integer )
158
+ column( :file_name, String )
159
+ column( :file_mime, String )
160
+ column( :file_data, File )
161
+ end
162
+ end
163
+ db_close
164
+ end
165
+
166
+ # returns the version in the rsence_version table
167
+ def table_version
168
+ db_open
169
+ rsence_version = @db[:rsence_version].select(:version).all[0][:version]
170
+ db_close
171
+ return rsence_version
172
+ end
173
+
174
+ ## Checks database connectivity and loads stored sessions from the database
175
+ def db_init
176
+
177
+ create_session_table
178
+ create_version_table
179
+ create_uploads_table
180
+
181
+ ## Used for future upgrades:
182
+ # version = table_version
183
+
184
+ if @config[:reset_sessions]
185
+ puts "Resetting all sessions..."
186
+ reset_sessions()
187
+ else
188
+ restore_sessions()
189
+ end
190
+
191
+ return true
192
+ end
193
+
194
+ ## Deletes all rows from rsence_session as well as rsence_uploads
195
+ def reset_sessions
196
+ unless @db_avail
197
+ puts "Warning: Can't reset sessions: No database!" if RSence.args[:verbose]
198
+ return
199
+ end
200
+ db_open
201
+ @db[:rsence_session].delete if @db.table_exists?(:rsence_session)
202
+ @db[:rsence_uploads].delete if @db.table_exists?(:rsence_uploads)
203
+ db_close
204
+ end
205
+
206
+ ## Restores all saved sessions from db to ram
207
+ def restore_sessions
208
+ unless @db_avail
209
+ puts "Warning: Can't restore sessions: No database!" if RSence.args[:verbose]
210
+ return
211
+ end
212
+ puts "Restoring sessions..." if RSence.args[:verbose]
213
+ db_open
214
+ @db[:rsence_session].all do |ses_row|
215
+ ses_id = ses_row[:id]
216
+ ses_data_dump = ses_row[:ses_data]
217
+
218
+ if ses_data_dump == nil
219
+ @db[:rsence_session].filter(:id => ses_id).delete
220
+ @db[:rsence_uploads].filter(:ses_id => ses_id).delete
221
+ else
222
+ ses_data = Marshal.restore( ses_data_dump )
223
+ ses_key = ses_data[:ses_key]
224
+ @sessions[ses_id] = ses_data
225
+ @session_keys[ ses_key ] = ses_id
226
+ @session_cookie_keys[ ses_data[:cookie_key] ] = ses_id
227
+ end
228
+ end
229
+ db_close
230
+ end
231
+
232
+ ## Stores all sessions to db from ram
233
+ def store_sessions
234
+ unless @db_avail
235
+ puts "Warning: Can't store sessions: No database!" if RSence.args[:verbose]
236
+ return
237
+ end
238
+ puts "Storing sessions..." if RSence.args[:verbose]
239
+ db_open
240
+ @sessions.each_key do |ses_id|
241
+ ses_data = @sessions[ ses_id ]
242
+ ses_data_dump = Marshal.dump( ses_data )
243
+ @db[:rsence_session].filter(
244
+ :id => ses_id
245
+ ).update(
246
+ :cookie_key => ses_data[:cookie_key],
247
+ :ses_key => ses_data[:ses_key],
248
+ :user_id => ses_data[:user_id],
249
+ :ses_data => ses_data_dump.to_sequel_blob,
250
+ :ses_timeout => ses_data[:timeout],
251
+ :ses_stored => Time.now.to_i
252
+ )
253
+ end
254
+ db_close
255
+ end
256
+
257
+ ## Shut-down signal, triggers store_sessions for now
258
+ def shutdown
259
+ @accept_requests = false
260
+ puts "Session shutdown in progress..." if RSence.args[:verbose]
261
+ store_sessions
262
+ puts "Session shutdown complete." if RSence.args[:verbose]
263
+ end
264
+
265
+
266
+ ## Returns a new, unique session identifier by storing the params to the database
267
+ def new_ses_id( cookie_key, ses_key, timeout_secs, user_id=0 )
268
+ unless @db_avail
269
+ @id_counter += 1
270
+ return @id_counter
271
+ end
272
+ db_open
273
+ new_id = @db[:rsence_session].insert(
274
+ :cookie_key => cookie_key,
275
+ :ses_key => ses_key,
276
+ :ses_timeout => timeout_secs,
277
+ :user_id => user_id
278
+ )
279
+ db_close
280
+ return new_id
281
+ end
282
+
283
+ ## Expires a session by its identifier
284
+ def expire_session( ses_id )
285
+
286
+ return unless @sessions.has_key? ses_id
287
+
288
+ ses_data = @sessions[ ses_id ]
289
+
290
+ # Makes the session invalid for xhr's by deleting its key
291
+ @session_keys.delete( ses_data[:ses_key] )
292
+
293
+ # Makes the session invalid for all requests by deleting its cookie key
294
+ @session_cookie_keys.delete( ses_data[:cookie_key] )
295
+
296
+ # Deletes the session data itself
297
+ @sessions.delete( ses_id )
298
+
299
+ # Removes all ticket-based storage bound to the session
300
+ @plugins[:ticketservices].expire_ses( ses_id ) if @plugins
301
+
302
+ # target -> source cleanup
303
+ if @clone_sources.has_key?( ses_id )
304
+ source_id = @clone_sources[ ses_id ]
305
+ @clone_sources.delete( ses_id ) if @clone_sources.has_key?( ses_id )
306
+ @clone_targets[ source_id ].delete( ses_id ) if @clone_targets.has_key?( source_id )
307
+ end
308
+
309
+ # source -> targets cleanup
310
+ if @clone_targets.has_key?( ses_id )
311
+ @clone_targets[ ses_id ].each do |target_id|
312
+ @clone_sources.delete( target_id ) if @clone_sources.has_key?( target_id )
313
+ end
314
+ @clone_targets.delete( ses_id ) if @clone_targets.has_key?( ses_id )
315
+ end
316
+
317
+ if @db_avail
318
+ db_open
319
+ # Deletes the session's row from the database
320
+ @db[:rsence_session].filter(:id => ses_id).delete
321
+ db_close
322
+ end
323
+
324
+ end
325
+
326
+ ## Expires all sessions that meet the timeout criteria
327
+ def expire_sessions
328
+
329
+ # Loop through all sessions in memory:
330
+ @sessions.each_key do |ses_id|
331
+
332
+ timed_out = @sessions[ ses_id ][:timeout] < Time.now.to_i
333
+
334
+ ## Deletes the session, if the session is too old
335
+ expire_session( ses_id ) if timed_out
336
+
337
+ end
338
+ end
339
+ end
340
+ end
@@ -0,0 +1,263 @@
1
+ ## RSence
2
+ # Copyright 2008 Riassence Inc.
3
+ # http://riassence.com/
4
+ #
5
+ # You should have received a copy of the GNU General Public License along
6
+ # with this software package. If not, contact licensing@riassence.com
7
+ ##
8
+
9
+
10
+ # ValueManager synchronizes value objects
11
+ require 'values/valuemanager'
12
+
13
+ # SessionManager creates, validates, stores and expires sessions
14
+ require 'session/sessionmanager'
15
+
16
+ # PluginManager handles all the plugins
17
+ require 'plugins/pluginmanager'
18
+
19
+
20
+ module RSence
21
+
22
+ # Transporter handles incoming requests targeted at RSence and distributes calls and data accordingly. It's called via {Broker}.
23
+ # @see Broker
24
+ class Transporter
25
+
26
+ # The single instance of the {ValueManager}
27
+ # @return [ValueManager]
28
+ attr_accessor :valuemanager
29
+
30
+ # The single instance of the {SessionManager}
31
+ # @return [SessionManager]
32
+ attr_accessor :sessions
33
+
34
+ # The main instance of the {PluginManager}
35
+ # @return [PluginManager]
36
+ attr_accessor :plugins
37
+
38
+ def initialize
39
+ @config = RSence.config[:transporter_conf]
40
+ @accept_req = false
41
+ @valuemanager = ValueManager.new
42
+ @sessions = SessionManager.new( self )
43
+ core_pkgs = {
44
+ :core => [:transporter, :session_storage, :session_manager, :value_manager]
45
+ }
46
+ @plugins = PluginManager.new(
47
+ RSence.config[:plugin_paths],
48
+ self,
49
+ RSence.args[:autoupdate],
50
+ false,
51
+ core_pkgs[:core],
52
+ core_pkgs
53
+ )
54
+ if RSence.launch_pid != Process.pid
55
+ Process.kill( 'TERM', RSence.launch_pid )
56
+ end
57
+ end
58
+
59
+ def online?
60
+ @accept_req
61
+ end
62
+
63
+ def online=(state)
64
+ return if @accept_req == state
65
+ if RSence.args[:verbose]
66
+ if state
67
+ puts "RSence is online now."
68
+ else
69
+ puts "RSence is offline now."
70
+ end
71
+ end
72
+ @accept_req = state
73
+ end
74
+
75
+ def shutdown
76
+ online=false
77
+ @plugins.shutdown
78
+ @sessions.shutdown
79
+ end
80
+
81
+ def servlet( request_type, request, response )
82
+ broker_urls = RSence.config[:broker_urls]
83
+ uri = request.fullpath
84
+
85
+ if @plugins.match_servlet( request_type, request, response, {} )
86
+ return true
87
+ elsif request_type == :post
88
+ ## /x handles xhr without cookies
89
+ if uri == broker_urls[:x] and @sessions.accept_requests
90
+ xhr( request, response, { :cookies => true, :servlet => false } )
91
+ return true
92
+ ## /hello handles the first xhr (with cookies, for session key)
93
+ elsif uri == broker_urls[:hello] and @sessions.accept_requests
94
+ xhr( request, response, { :cookies => true, :servlet => false } )
95
+ return true
96
+ end
97
+ end
98
+ return false
99
+ end
100
+
101
+ # wrapper for the session manager stop client functionality
102
+ def xhr_error_handler(msg,err_name,err_extra_descr='')
103
+ @sessions.stop_client_with_message( msg,
104
+ @config[:messages][err_name][:title],
105
+ @config[:messages][err_name][:descr]+err_extra_descr,
106
+ @config[:messages][err_name][:uri]
107
+ )
108
+ end
109
+
110
+ # wrapper for tracebacks in xhr
111
+ def xhr_traceback_handler(e,err_descr='Transporter::UnspecifiedError')
112
+ puts "=="*40 if RSence.args[:debug]
113
+ puts err_descr
114
+ if RSence.args[:debug]
115
+ puts "--"*40
116
+ puts e.message
117
+ puts " #{e.backtrace.join("\n ")}"
118
+ puts "=="*40
119
+ end
120
+ end
121
+
122
+ ## handles incoming XMLHttpRequests from the browser
123
+ def xhr(request, response, options = { :cookies => false, :servlet => false } )
124
+
125
+ session_conf = RSence.config[:session_conf]
126
+
127
+ options[:cookies] = false unless options.has_key?(:cookies)
128
+
129
+ if session_conf[:session_cookies] and session_conf[:trust_cookies]
130
+ options[:cookies] = true
131
+ end
132
+
133
+ # Creates the msg object, also checks or creates a new session; verifies session keys and such
134
+ msg = @sessions.init_msg( request, response, options )
135
+
136
+ response_success = true
137
+
138
+ # If the client encounters an error, display error message
139
+ if request.query.has_key?('err_msg')
140
+ response_success = false
141
+ client_error_msg = request.query['err_msg'].inspect
142
+ puts "\nCLIENT ERROR:\n#{client_error_msg}\n" if RSence.args[:debug]
143
+ xhr_error_handler(msg,:client_error,client_error_msg)
144
+ end
145
+
146
+ # If the session is valid, continue:
147
+ if msg.ses_valid and response_success
148
+
149
+ # If cookies are true, it means the url base needs to
150
+ # be changed from /hello to /x to prevent further cookie juggling.
151
+ if options[:cookies] and not options[:servlet]
152
+ conf_sync_url = RSence.config[:broker_urls][:x]
153
+ else
154
+ conf_sync_url = RSence.config[:broker_urls][:hello]
155
+ end
156
+ if msg.request.path != conf_sync_url
157
+ msg.reply("COMM.Transporter.url=#{conf_sync_url.to_json};")
158
+ end
159
+
160
+ # Appends a 'new session.' message for new sessions in RSence.args[:verbose]:
161
+ if RSence.args[:verbose]
162
+ puts "new session." if msg.new_session
163
+ puts "restored session." if msg.restored_session
164
+ puts "clone source." if msg.cloned_targets
165
+ puts "clone target." if msg.cloned_source
166
+ end
167
+
168
+ ## Pass the client XML to the value manager
169
+ if request.query.has_key?( 'values' )
170
+ syncdata_str = request.query[ 'values' ]
171
+ begin
172
+ @valuemanager.xhr( msg, syncdata_str )
173
+ rescue => e
174
+ response_success = false
175
+ xhr_error_handler( msg, :valuemanager_xhr_error, e.message )
176
+ xhr_traceback_handler( e, "Transporter::ValueManagerXHRError: @valuemanager.xhr failed." )
177
+ end
178
+ end
179
+
180
+ ## Calls the restore_ses of plugins, when a session is restored (page reload with previously active session)
181
+ if msg.restored_session
182
+ msg.session[:deps] = []
183
+
184
+ if msg.cloned_source
185
+ begin
186
+ @plugins.delegate( :cloned_target, msg, msg.cloned_source )
187
+ rescue => e
188
+ response_success = false
189
+ xhr_error_handler( msg, :plugin_delegate_cloned_target_error, e.message )
190
+ xhr_traceback_handler( e, "Transporter::PluginDelegateClonedTargetError: @plugins.delegate 'cloned_target' failed." )
191
+ end
192
+ end
193
+
194
+ begin
195
+ @plugins.delegate( :restore_ses, msg )
196
+ rescue => e
197
+ response_success = false
198
+ xhr_error_handler( msg, :plugin_delegate_restore_ses_error, e.message )
199
+ xhr_traceback_handler( e, "Transporter::PluginDelegateRestoreSesError: @plugins.delegate 'restore_ses' failed." )
200
+ end
201
+
202
+ elsif msg.new_session
203
+ begin
204
+ @plugins.delegate( :init_ses, msg )
205
+ rescue => e
206
+ response_success = false
207
+ xhr_error_handler( msg, :plugin_delegate_init_ses_error, e.message )
208
+ xhr_traceback_handler( e, "Transporter::PluginDelegateInitSesError: @plugins.delegate 'init_ses' failed." )
209
+ end
210
+ elsif msg.cloned_targets
211
+ begin
212
+ @plugins.delegate( :cloned_source, msg, msg.cloned_targets )
213
+ rescue => e
214
+ response_success = false
215
+ xhr_error_handler( msg, :plugin_delegate_cloned_source_error, e.message )
216
+ xhr_traceback_handler( e, "Transporter::PluginDelegateClonedSourceError: @plugins.delegate 'cloned_source' failed." )
217
+ end
218
+ end
219
+
220
+ ## Calls validators for changed values
221
+ begin
222
+ @valuemanager.validate( msg )
223
+ rescue => e
224
+ response_success = false
225
+ xhr_error_handler( msg, :valuemanager_validate_error, e.message )
226
+ xhr_traceback_handler( e, "Transporter::ValueManagerValidateError: @valuemanager.validate failed." )
227
+ end
228
+
229
+ ### Allows every plugin to respond to the idle call
230
+ begin
231
+ @plugins.delegate( :idle, msg )
232
+ rescue => e
233
+ response_success = false
234
+ xhr_error_handler( msg, :plugin_idle_error, e.message )
235
+ xhr_traceback_handler( e, "Transporter::PluginIdleError: @plugins.idle failed." )
236
+ end
237
+
238
+ ### Processes outgoing values to client
239
+ begin
240
+ @valuemanager.sync_client( msg )
241
+ rescue => e
242
+ response_success = false
243
+ xhr_error_handler( msg, :valuemanager_sync_client_error, e.message )
244
+ xhr_traceback_handler( e, "Transporter::ValueManagerSyncClientError: @valuemanager.sync_client failed." )
245
+ end
246
+
247
+ else
248
+
249
+ # session is not valid, the error was set in SessionManager
250
+ response_success = false
251
+
252
+ end
253
+
254
+ msg.response_success = response_success
255
+
256
+ unless options[:servlet]
257
+ msg.response_done()
258
+ end
259
+
260
+ return msg
261
+ end
262
+ end
263
+ end
@@ -0,0 +1,9 @@
1
+
2
+ require 'zlib'
3
+
4
+
5
+ # @private Implements the +write+ method for strings, used with zlib to
6
+ # use GZStrings as the target for compression.
7
+ class GZString < String
8
+ alias write <<
9
+ end
@@ -0,0 +1,18 @@
1
+
2
+ # NOTE: Ruby 1.9 isn't fully supported yet.
3
+ # There are some encoding handlers and some of the dependencies are not fully working yet.
4
+ # One should wait for Ruby 2.0 for production use anyway.
5
+
6
+ # Ruby 1.9 encoding defaults.
7
+ # This is clearly not enough but a good start for fixing the encoding madness.
8
+ Encoding.default_external = Encoding::BINARY
9
+ Encoding.default_internal = Encoding::BINARY
10
+
11
+ # Ruby 1.9 doesn't have String#each anymore.
12
+ # This is a backwards-compatible work-around.
13
+ class String
14
+ def each
15
+ self.split($/).each { |e| yield e }
16
+ end
17
+ end
18
+