rsence 2.0.0.0.pre

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 (311) hide show
  1. data/INSTALL.rdoc +295 -0
  2. data/LICENSE +622 -0
  3. data/README.rdoc +24 -0
  4. data/VERSION +1 -0
  5. data/bin/build_client.rb +254 -0
  6. data/bin/help +6 -0
  7. data/bin/launch.rb +120 -0
  8. data/bin/rdoc.sh +2 -0
  9. data/bin/restart +6 -0
  10. data/bin/rsence +120 -0
  11. data/bin/run +6 -0
  12. data/bin/run.rb +6 -0
  13. data/bin/save +6 -0
  14. data/bin/start +6 -0
  15. data/bin/status +6 -0
  16. data/bin/stop +6 -0
  17. data/conf/config.ru +5 -0
  18. data/conf/default_conf.yaml +337 -0
  19. data/conf/default_strings.yaml +77 -0
  20. data/conf/local_conf.yaml +14 -0
  21. data/conf/unicorn.conf +78 -0
  22. data/js/comm/comm/autosync/autosync.js +18 -0
  23. data/js/comm/comm/autosync/js.inc +0 -0
  24. data/js/comm/comm/comm.js +195 -0
  25. data/js/comm/comm/js.inc +0 -0
  26. data/js/comm/comm/queue/js.inc +0 -0
  27. data/js/comm/comm/queue/queue.js +183 -0
  28. data/js/comm/comm/session/js.inc +0 -0
  29. data/js/comm/comm/session/session.js +51 -0
  30. data/js/comm/comm/sessionwatcher/js.inc +0 -0
  31. data/js/comm/comm/sessionwatcher/sessionwatcher.js +43 -0
  32. data/js/comm/comm/transporter/js.inc +0 -0
  33. data/js/comm/comm/transporter/transporter.js +257 -0
  34. data/js/comm/comm/urlresponder/js.inc +0 -0
  35. data/js/comm/comm/urlresponder/urlresponder.js +148 -0
  36. data/js/comm/comm/values/js.inc +0 -0
  37. data/js/comm/comm/values/values.js +432 -0
  38. data/js/comm/jsloader/js.inc +0 -0
  39. data/js/comm/jsloader/jsloader.js +114 -0
  40. data/js/comm/reloadapp/js.inc +0 -0
  41. data/js/comm/reloadapp/reloadapp.js +150 -0
  42. data/js/comm/reloadapp/themes/default/reloadapp_warning-ie6.gif +0 -0
  43. data/js/comm/reloadapp/themes/default/reloadapp_warning.png +0 -0
  44. data/js/comm/sha/js.inc +0 -0
  45. data/js/comm/sha/sha.js +432 -0
  46. data/js/comm/values/value/js.inc +0 -0
  47. data/js/comm/values/value/value.js +182 -0
  48. data/js/comm/values/valuematrix/js.inc +0 -0
  49. data/js/comm/values/valuematrix/valuematrix.js +138 -0
  50. data/js/controls/button/button.js +57 -0
  51. data/js/controls/button/js.inc +0 -0
  52. data/js/controls/button/themes/bright/button.css +89 -0
  53. data/js/controls/button/themes/bright/button.html +7 -0
  54. data/js/controls/button/themes/bright/button_parts1-ie6.gif +0 -0
  55. data/js/controls/button/themes/bright/button_parts1.png +0 -0
  56. data/js/controls/button/themes/default/button.css +89 -0
  57. data/js/controls/button/themes/default/button.html +7 -0
  58. data/js/controls/button/themes/default/button_parts1-ie6.gif +0 -0
  59. data/js/controls/button/themes/default/button_parts1.png +0 -0
  60. data/js/controls/checkbox/checkbox.js +47 -0
  61. data/js/controls/checkbox/js.inc +0 -0
  62. data/js/controls/checkbox/themes/default/checkbox.css +69 -0
  63. data/js/controls/checkbox/themes/default/checkbox.html +5 -0
  64. data/js/controls/checkbox/themes/default/checkbox_parts1-ie6.gif +0 -0
  65. data/js/controls/checkbox/themes/default/checkbox_parts1.png +0 -0
  66. data/js/controls/datetime/calendar/calendar.js +197 -0
  67. data/js/controls/datetime/calendar/js.inc +0 -0
  68. data/js/controls/datetime/calendar/themes/default/calendar.css +108 -0
  69. data/js/controls/datetime/calendar/themes/default/calendar.html +9 -0
  70. data/js/controls/datetime/calendar/themes/default/calendar_arrows-ie6.gif +0 -0
  71. data/js/controls/datetime/calendar/themes/default/calendar_arrows.png +0 -0
  72. data/js/controls/datetime/datetimevalue/datetimevalue.js +246 -0
  73. data/js/controls/datetime/datetimevalue/js.inc +0 -0
  74. data/js/controls/datetime/timesheet/js.inc +0 -0
  75. data/js/controls/datetime/timesheet/themes/default/timesheet.css +30 -0
  76. data/js/controls/datetime/timesheet/themes/default/timesheet.html +2 -0
  77. data/js/controls/datetime/timesheet/timesheet.js +182 -0
  78. data/js/controls/datetime/timesheet_item/js.inc +0 -0
  79. data/js/controls/datetime/timesheet_item/themes/default/timesheet_item.css +42 -0
  80. data/js/controls/datetime/timesheet_item/themes/default/timesheet_item.html +8 -0
  81. data/js/controls/datetime/timesheet_item/timesheet_item.js +247 -0
  82. data/js/controls/datetime/timesheet_item_edit/js.inc +0 -0
  83. data/js/controls/datetime/timesheet_item_edit/timesheet_item_edit.js +274 -0
  84. data/js/controls/dialogs/alert_sheet/alert_sheet.js +62 -0
  85. data/js/controls/dialogs/alert_sheet/js.inc +0 -0
  86. data/js/controls/dialogs/confirm_sheet/confirm_sheet.js +36 -0
  87. data/js/controls/dialogs/confirm_sheet/js.inc +0 -0
  88. data/js/controls/dialogs/sheet/js.inc +0 -0
  89. data/js/controls/dialogs/sheet/sheet.js +83 -0
  90. data/js/controls/dialogs/sheet/themes/default/sheet.css +64 -0
  91. data/js/controls/dialogs/sheet/themes/default/sheet.html +14 -0
  92. data/js/controls/dialogs/sheet/themes/default/sheet_bg-ie6.gif +0 -0
  93. data/js/controls/dialogs/sheet/themes/default/sheet_bg.png +0 -0
  94. data/js/controls/dialogs/sheet/themes/default/sheet_dim-ie6.gif +0 -0
  95. data/js/controls/dialogs/sheet/themes/default/sheet_dim.png +0 -0
  96. data/js/controls/dialogs/sheet/themes/default/sheet_parts1-ie6.gif +0 -0
  97. data/js/controls/dialogs/sheet/themes/default/sheet_parts1.png +0 -0
  98. data/js/controls/dialogs/sheet/themes/default/sheet_parts2-ie6.gif +0 -0
  99. data/js/controls/dialogs/sheet/themes/default/sheet_parts2.png +0 -0
  100. data/js/controls/dialogs/sheet/themes/default/sheet_warning-ie6.gif +0 -0
  101. data/js/controls/dialogs/sheet/themes/default/sheet_warning.png +0 -0
  102. data/js/controls/imageview/imageview.js +108 -0
  103. data/js/controls/imageview/js.inc +0 -0
  104. data/js/controls/imageview/themes/default/blank.gif +0 -0
  105. data/js/controls/lists/checkboxlist/checkboxlist.js +170 -0
  106. data/js/controls/lists/checkboxlist/js.inc +0 -0
  107. data/js/controls/lists/listitems/js.inc +0 -0
  108. data/js/controls/lists/listitems/listitems.js +65 -0
  109. data/js/controls/lists/radiobuttonlist/js.inc +0 -0
  110. data/js/controls/lists/radiobuttonlist/radiobuttonlist.js +126 -0
  111. data/js/controls/passwordcontrol/js.inc +0 -0
  112. data/js/controls/passwordcontrol/passwordcontrol.js +22 -0
  113. data/js/controls/passwordcontrol/themes/default/passwordcontrol.css +0 -0
  114. data/js/controls/passwordcontrol/themes/default/passwordcontrol.html +18 -0
  115. data/js/controls/progress/progressbar/js.inc +0 -0
  116. data/js/controls/progress/progressbar/progressbar.js +36 -0
  117. data/js/controls/progress/progressbar/themes/default/progressbar.css +16 -0
  118. data/js/controls/progress/progressbar/themes/default/progressbar.html +2 -0
  119. data/js/controls/progress/progressindicator/js.inc +0 -0
  120. data/js/controls/progress/progressindicator/progressindicator.js +43 -0
  121. data/js/controls/radiobutton/js.inc +0 -0
  122. data/js/controls/radiobutton/radiobutton.js +41 -0
  123. data/js/controls/radiobutton/themes/default/radiobutton.css +69 -0
  124. data/js/controls/radiobutton/themes/default/radiobutton.html +5 -0
  125. data/js/controls/radiobutton/themes/default/radiobutton_parts1-ie6.gif +0 -0
  126. data/js/controls/radiobutton/themes/default/radiobutton_parts1.png +0 -0
  127. data/js/controls/sliders/slider/js.inc +0 -0
  128. data/js/controls/sliders/slider/slider.js +356 -0
  129. data/js/controls/sliders/slider/themes/default/hslider_tracks-ie6.gif +0 -0
  130. data/js/controls/sliders/slider/themes/default/hslider_tracks.png +0 -0
  131. data/js/controls/sliders/slider/themes/default/slider.css +108 -0
  132. data/js/controls/sliders/slider/themes/default/slider.html +5 -0
  133. data/js/controls/sliders/slider/themes/default/slider_thumbs-ie6.gif +0 -0
  134. data/js/controls/sliders/slider/themes/default/slider_thumbs.png +0 -0
  135. data/js/controls/sliders/vslider/js.inc +0 -0
  136. data/js/controls/sliders/vslider/themes/default/vslider.css +52 -0
  137. data/js/controls/sliders/vslider/themes/default/vslider.html +5 -0
  138. data/js/controls/sliders/vslider/themes/default/vslider_tracks-ie6.gif +0 -0
  139. data/js/controls/sliders/vslider/themes/default/vslider_tracks.png +0 -0
  140. data/js/controls/sliders/vslider/vslider.js +40 -0
  141. data/js/controls/stepper/js.inc +0 -0
  142. data/js/controls/stepper/stepper.js +212 -0
  143. data/js/controls/stepper/themes/default/stepper-ie6.gif +0 -0
  144. data/js/controls/stepper/themes/default/stepper.css +14 -0
  145. data/js/controls/stepper/themes/default/stepper.html +2 -0
  146. data/js/controls/stepper/themes/default/stepper.png +0 -0
  147. data/js/controls/stringview/js.inc +0 -0
  148. data/js/controls/stringview/stringview.js +49 -0
  149. data/js/controls/stringview/themes/default/stringview.css +8 -0
  150. data/js/controls/stringview/themes/default/stringview.html +1 -0
  151. data/js/controls/tab/js.inc +0 -0
  152. data/js/controls/tab/tab.js +276 -0
  153. data/js/controls/tab/themes/bright/tab.css +76 -0
  154. data/js/controls/tab/themes/bright/tab.html +6 -0
  155. data/js/controls/tab/themes/bright/tab_bg_color-ie6.gif +0 -0
  156. data/js/controls/tab/themes/bright/tab_bg_color.png +0 -0
  157. data/js/controls/tab/themes/bright/tab_border_pattern-ie6.gif +0 -0
  158. data/js/controls/tab/themes/bright/tab_border_pattern.png +0 -0
  159. data/js/controls/tab/themes/bright/tab_parts1-ie6.gif +0 -0
  160. data/js/controls/tab/themes/bright/tab_parts1.png +0 -0
  161. data/js/controls/tab/themes/default/tab.css +77 -0
  162. data/js/controls/tab/themes/default/tab.html +6 -0
  163. data/js/controls/tab/themes/default/tab_bg_color-ie6.gif +0 -0
  164. data/js/controls/tab/themes/default/tab_bg_color.png +0 -0
  165. data/js/controls/tab/themes/default/tab_border_pattern-ie6.gif +0 -0
  166. data/js/controls/tab/themes/default/tab_border_pattern.png +0 -0
  167. data/js/controls/tab/themes/default/tab_parts1-ie6.gif +0 -0
  168. data/js/controls/tab/themes/default/tab_parts1.png +0 -0
  169. data/js/controls/textarea/js.inc +0 -0
  170. data/js/controls/textarea/textarea.js +23 -0
  171. data/js/controls/textarea/themes/default/textarea.css +21 -0
  172. data/js/controls/textarea/themes/default/textarea.html +18 -0
  173. data/js/controls/textcontrol/js.inc +0 -0
  174. data/js/controls/textcontrol/textcontrol.js +372 -0
  175. data/js/controls/textcontrol/themes/default/textcontrol.css +107 -0
  176. data/js/controls/textcontrol/themes/default/textcontrol.html +18 -0
  177. data/js/controls/textcontrol/themes/default/textcontrol_parts1-ie6.gif +0 -0
  178. data/js/controls/textcontrol/themes/default/textcontrol_parts1.png +0 -0
  179. data/js/controls/textcontrol/themes/default/textcontrol_parts2-ie6.gif +0 -0
  180. data/js/controls/textcontrol/themes/default/textcontrol_parts2.png +0 -0
  181. data/js/controls/textcontrol/themes/default/textcontrol_parts3-ie6.gif +0 -0
  182. data/js/controls/textcontrol/themes/default/textcontrol_parts3.png +0 -0
  183. data/js/controls/uploader/js.inc +0 -0
  184. data/js/controls/uploader/themes/default/upload_progress.gif +0 -0
  185. data/js/controls/uploader/themes/default/uploader.css +108 -0
  186. data/js/controls/uploader/themes/default/uploader.html +27 -0
  187. data/js/controls/uploader/uploader.js +153 -0
  188. data/js/controls/validatorview/js.inc +0 -0
  189. data/js/controls/validatorview/themes/default/validator-ie6.gif +0 -0
  190. data/js/controls/validatorview/themes/default/validator.png +0 -0
  191. data/js/controls/validatorview/themes/default/validatorview.css +0 -0
  192. data/js/controls/validatorview/themes/default/validatorview.html +0 -0
  193. data/js/controls/validatorview/validatorview.js +55 -0
  194. data/js/controls/window/js.inc +0 -0
  195. data/js/controls/window/themes/default/window.css +219 -0
  196. data/js/controls/window/themes/default/window.html +17 -0
  197. data/js/controls/window/themes/default/window_bg_active-ie6.gif +0 -0
  198. data/js/controls/window/themes/default/window_bg_active.png +0 -0
  199. data/js/controls/window/themes/default/window_bg_inactive-ie6.gif +0 -0
  200. data/js/controls/window/themes/default/window_bg_inactive.png +0 -0
  201. data/js/controls/window/themes/default/window_buttons-ie6.gif +0 -0
  202. data/js/controls/window/themes/default/window_buttons.png +0 -0
  203. data/js/controls/window/themes/default/window_parts1-ie6.gif +0 -0
  204. data/js/controls/window/themes/default/window_parts1.png +0 -0
  205. data/js/controls/window/themes/default/window_parts2-ie6.gif +0 -0
  206. data/js/controls/window/themes/default/window_parts2.png +0 -0
  207. data/js/controls/window/window.js +284 -0
  208. data/js/core/class/class.js +317 -0
  209. data/js/core/class/js.inc +0 -0
  210. data/js/core/elem/elem.js +1376 -0
  211. data/js/core/elem/js.inc +0 -0
  212. data/js/core/event/event.js +1021 -0
  213. data/js/core/event/js.inc +0 -0
  214. data/js/core/iefix/ie_css_element.htc +5 -0
  215. data/js/core/iefix/ie_css_style.htc +5 -0
  216. data/js/core/iefix/iefix.js +359 -0
  217. data/js/core/iefix/js.inc +0 -0
  218. data/js/debugg/debugg.js +43 -0
  219. data/js/debugg/js.inc +0 -0
  220. data/js/foundation/application/application.js +209 -0
  221. data/js/foundation/application/js.inc +0 -0
  222. data/js/foundation/control/control.js +342 -0
  223. data/js/foundation/control/controldefaults/controldefaults.js +59 -0
  224. data/js/foundation/control/controldefaults/js.inc +0 -0
  225. data/js/foundation/control/dummyvalue/dummyvalue.js +50 -0
  226. data/js/foundation/control/dummyvalue/js.inc +0 -0
  227. data/js/foundation/control/dyncontrol/dyncontrol.js +494 -0
  228. data/js/foundation/control/dyncontrol/js.inc +0 -0
  229. data/js/foundation/control/dyncontrol/themes/default/dyncontrol.css +0 -0
  230. data/js/foundation/control/dyncontrol/themes/default/dyncontrol.html +0 -0
  231. data/js/foundation/control/eventresponder/eventresponder.js +713 -0
  232. data/js/foundation/control/eventresponder/js.inc +0 -0
  233. data/js/foundation/control/js.inc +0 -0
  234. data/js/foundation/control/valueresponder/js.inc +0 -0
  235. data/js/foundation/control/valueresponder/valueresponder.js +77 -0
  236. data/js/foundation/geom/point/js.inc +0 -0
  237. data/js/foundation/geom/point/point.js +202 -0
  238. data/js/foundation/geom/rect/js.inc +0 -0
  239. data/js/foundation/geom/rect/rect.js +610 -0
  240. data/js/foundation/json_renderer/js.inc +0 -0
  241. data/js/foundation/json_renderer/json_renderer.js +231 -0
  242. data/js/foundation/system/js.inc +0 -0
  243. data/js/foundation/system/system.js +369 -0
  244. data/js/foundation/thememanager/js.inc +0 -0
  245. data/js/foundation/thememanager/thememanager.js +387 -0
  246. data/js/foundation/view/js.inc +0 -0
  247. data/js/foundation/view/markupview/js.inc +0 -0
  248. data/js/foundation/view/markupview/markupview.js +113 -0
  249. data/js/foundation/view/morphanimation/js.inc +0 -0
  250. data/js/foundation/view/morphanimation/morphanimation.js +236 -0
  251. data/js/foundation/view/view.js +1804 -0
  252. data/js/foundation/view/viewdefaults/js.inc +0 -0
  253. data/js/foundation/view/viewdefaults/viewdefaults.js +25 -0
  254. data/js/views/centerview/centerview.js +45 -0
  255. data/js/views/centerview/js.inc +0 -0
  256. data/js/views/inlineview/inlineview.js +14 -0
  257. data/js/views/inlineview/js.inc +0 -0
  258. data/js/views/scrollview/js.inc +0 -0
  259. data/js/views/scrollview/scrollview.js +39 -0
  260. data/lib/conf/default.rb +220 -0
  261. data/lib/conf/wizard.rb +303 -0
  262. data/lib/daemon/daemon.rb +293 -0
  263. data/lib/http/broker.rb +102 -0
  264. data/lib/http/rackup.rb +88 -0
  265. data/lib/http/request.rb +69 -0
  266. data/lib/http/response.rb +63 -0
  267. data/lib/plugins/gui_plugin.rb +129 -0
  268. data/lib/plugins/guiparser.rb +114 -0
  269. data/lib/plugins/plugin.rb +652 -0
  270. data/lib/plugins/plugin_plugins.rb +47 -0
  271. data/lib/plugins/plugin_sqlite_db.rb +72 -0
  272. data/lib/plugins/plugin_util.rb +96 -0
  273. data/lib/plugins/pluginmanager.rb +517 -0
  274. data/lib/plugins/servlet.rb +69 -0
  275. data/lib/session/msg.rb +291 -0
  276. data/lib/session/sessionmanager.rb +491 -0
  277. data/lib/session/sessionstorage.rb +314 -0
  278. data/lib/transporter/transporter.rb +254 -0
  279. data/lib/util/gzstring.rb +5 -0
  280. data/lib/values/hvalue.rb +323 -0
  281. data/lib/values/valuemanager.rb +152 -0
  282. data/plugins/client_pkg/client_pkg.rb +186 -0
  283. data/plugins/client_pkg/info.yaml +25 -0
  284. data/plugins/client_pkg/lib/client_pkg_build.rb +569 -0
  285. data/plugins/client_pkg/lib/client_pkg_cache.rb +50 -0
  286. data/plugins/client_pkg/lib/client_pkg_serve.rb +210 -0
  287. data/plugins/client_pkg/log/build_log +0 -0
  288. data/plugins/index_html/img/loading.gif +0 -0
  289. data/plugins/index_html/img/riassence.gif +0 -0
  290. data/plugins/index_html/index_html.rb +150 -0
  291. data/plugins/index_html/tmpl/index.html +22 -0
  292. data/plugins/index_html/tmpl/startup_index.html +29 -0
  293. data/plugins/legacy/disabled +0 -0
  294. data/plugins/legacy/disabled- +0 -0
  295. data/plugins/legacy/info.yaml +22 -0
  296. data/plugins/legacy/legacy.rb +15 -0
  297. data/plugins/main/js/riassence_ns.js +87 -0
  298. data/plugins/main/main.rb +234 -0
  299. data/plugins/main/values.yaml +8 -0
  300. data/plugins/ticketservices/lib/common.rb +300 -0
  301. data/plugins/ticketservices/lib/favicon.rb +38 -0
  302. data/plugins/ticketservices/lib/file.rb +58 -0
  303. data/plugins/ticketservices/lib/img.rb +50 -0
  304. data/plugins/ticketservices/lib/objblob.rb +66 -0
  305. data/plugins/ticketservices/lib/rsrc.rb +34 -0
  306. data/plugins/ticketservices/lib/upload.rb +206 -0
  307. data/plugins/ticketservices/ticketservices.rb +268 -0
  308. data/var/db/.git_include +0 -0
  309. data/var/log/.git_include +0 -0
  310. data/var/run/.git_include +0 -0
  311. metadata +390 -0
@@ -0,0 +1,314 @@
1
+ ## Riassence Framework
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
+ require 'rubygems'
10
+ require 'sequel'
11
+
12
+ ## HValue class for session restoration
13
+ require 'values/hvalue'
14
+
15
+
16
+ module RSence
17
+
18
+ =begin
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
+ Splitted of as a separate file to reduce the complexity
24
+ of SessionManager.
25
+
26
+ =end
27
+ class SessionStorage
28
+ attr_accessor :db
29
+ def initialize
30
+ ## Session data storage (by ses_id)
31
+ @sessions = {}
32
+
33
+ ## Session id by key
34
+ @session_keys = {}
35
+
36
+ ## Session id by cookie key
37
+ @session_cookie_keys = {}
38
+
39
+ @clone_origins = {
40
+ # id => [ id, id, id ... ]
41
+ }
42
+ @clone_sources = {
43
+ # id => id
44
+ }
45
+ @clone_targets = {
46
+ # id => [ id, id, id ... ]
47
+ }
48
+
49
+ ## Disposable keys (new ses_key each request)
50
+ @config = ::RSence.config[:session_conf]
51
+
52
+ @db_uri = ::RSence.config[:database][:ses_db]
53
+
54
+ db_init
55
+
56
+ @accept_requests = true
57
+
58
+ end
59
+
60
+ attr_reader :accept_requests
61
+
62
+ def db_test
63
+ if @db.table_exists?(:rsence_test)
64
+ @db.drop_table(:rsence_test)
65
+ end
66
+ @db.create_table(:rsence_test) { primary_key :id; String :test }
67
+ test_id = @db[:rsence_test].insert( :test => 'TestFoo' )
68
+ @db[:rsence_test].filter( :id => test_id ).update( :test => 'TestFoo2' )
69
+ @db[:rsence_test].filter( :id => test_id ).delete
70
+ @db[:rsence_test].delete
71
+ @db.drop_table(:rsence_test)
72
+ end
73
+
74
+ def db_close
75
+ @db.disconnect
76
+ end
77
+
78
+ def db_open
79
+ @db = Sequel.connect(@db_uri)
80
+ end
81
+
82
+ # def db_open
83
+ # ## Tests if database has sufficient privileges
84
+ # begin
85
+ # @db = Sequel.connect(@db_uri)
86
+ # db_test
87
+ # db_close
88
+ # @db = Sequel.connect(@db_uri)
89
+ # rescue => e
90
+ # $stderr.write( "SessionStorage: error #{e.inspect}\nReverting to default database.\n" )
91
+ # @db_uri = "sqlite://#{File.join(SERVER_PATH,'var','db','rsence_ses.db')}"
92
+ # @db = Sequel.connect(@db_uri)
93
+ # db_test
94
+ # db_close
95
+ # @db = Sequel.connect(@db_uri)
96
+ # end
97
+ # end
98
+
99
+ ## Creates the 'rsence_session' table, if necessary
100
+ ## This table is used to store sessions
101
+ def create_session_table
102
+ db_open
103
+ unless @db.table_exists?(:rsence_session)
104
+ puts "Creating session table..." if $DEBUG_MODE
105
+ @db.create_table :rsence_session do
106
+ primary_key( :id )
107
+ column( :cookie_key, String )
108
+ column( :ses_key, String )
109
+ column( :ses_timeout, Integer )
110
+ column( :user_id, Integer )
111
+ column( :ses_active, TrueClass )
112
+ column( :ses_stored, Integer )
113
+ column( :ses_data, File )
114
+ end
115
+ end
116
+ db_close
117
+ end
118
+
119
+ ## Creates the 'rsence_version' table, if necessary
120
+ ## This table is used to check for the need of future database upgrades
121
+ def create_version_table
122
+ db_open
123
+ unless @db.table_exists?(:rsence_version)
124
+ puts "Creating version info table..." if $DEBUG_MODE
125
+ @db.create_table :rsence_version do
126
+ Integer :version
127
+ end
128
+ @db[:rsence_version].insert(:version => 586)
129
+ end
130
+ db_close
131
+ end
132
+
133
+ ## Creates the 'rsence_uploads' table, if necessary
134
+ ## This table is used for storing temporary uploads before processing
135
+ def create_uploads_table
136
+ db_open
137
+ unless @db.table_exists?(:rsence_uploads)
138
+ puts "Creating uploads table..." if $DEBUG_MODE
139
+ @db.create_table :rsence_uploads do
140
+ primary_key( :id )
141
+ foreign_key( :ses_id, :rsence_session )
142
+ column( :upload_date, Integer )
143
+ column( :upload_done, Integer )
144
+ column( :ticket_id, String )
145
+ column( :file_size, Integer )
146
+ column( :file_name, String )
147
+ column( :file_mime, String )
148
+ column( :file_data, File )
149
+ end
150
+ end
151
+ db_close
152
+ end
153
+
154
+ # returns the version in the rsence_version table
155
+ def table_version
156
+ db_open
157
+ rsence_version = @db[:rsence_version].select(:version).all[0][:version]
158
+ db_close
159
+ return rsence_version
160
+ end
161
+
162
+ ## Checks database connectivity and loads stored sessions from the database
163
+ def db_init
164
+
165
+ create_session_table
166
+ create_version_table
167
+ create_uploads_table
168
+
169
+ ## Used for future upgrades:
170
+ # version = table_version
171
+
172
+ if @config[:reset_sessions]
173
+ puts "Resetting all sessions..."
174
+ reset_sessions()
175
+ else
176
+ restore_sessions()
177
+ end
178
+
179
+ return true
180
+ end
181
+
182
+ ## Deletes all rows from rsence_session as well as rsence_uploads
183
+ def reset_sessions
184
+ db_open
185
+ @db[:rsence_session].delete if @db.table_exists?(:rsence_session)
186
+ @db[:rsence_uploads].delete if @db.table_exists?(:rsence_uploads)
187
+ db_close
188
+ end
189
+
190
+ ## Restores all saved sessions from db to ram
191
+ def restore_sessions
192
+ puts "Restoring sessions..." if $DEBUG_MODE
193
+ db_open
194
+ @db[:rsence_session].all do |ses_row|
195
+ ses_id = ses_row[:id]
196
+ ses_data_dump = ses_row[:ses_data]
197
+
198
+ if ses_data_dump == nil
199
+ @db[:rsence_session].filter(:id => ses_id).delete
200
+ @db[:rsence_uploads].filter(:ses_id => ses_id).delete
201
+ else
202
+ ses_data = Marshal.restore( ses_data_dump )
203
+ ses_key = ses_data[:ses_key]
204
+ @sessions[ses_id] = ses_data
205
+ @session_keys[ ses_key ] = ses_id
206
+ @session_cookie_keys[ ses_data[:cookie_key] ] = ses_id
207
+ end
208
+ end
209
+ db_close
210
+ end
211
+
212
+ ## Stores all sessions to db from ram
213
+ def store_sessions
214
+ puts "Storing sessions..." if $DEBUG_MODE
215
+ db_open
216
+ @sessions.each_key do |ses_id|
217
+ ses_data = @sessions[ ses_id ]
218
+ ses_data_dump = Marshal.dump( ses_data )
219
+ @db[:rsence_session].filter(
220
+ :id => ses_id
221
+ ).update(
222
+ :cookie_key => ses_data[:cookie_key],
223
+ :ses_key => ses_data[:ses_key],
224
+ :user_id => ses_data[:user_id],
225
+ :ses_data => ses_data_dump.to_sequel_blob,
226
+ :ses_timeout => ses_data[:timeout],
227
+ :ses_stored => Time.now.to_i
228
+ )
229
+ end
230
+ db_close
231
+ end
232
+
233
+ ## Shut-down signal, triggers store_sessions for now
234
+ def shutdown
235
+ @accept_requests = false
236
+ puts "Session shutdown in progress..." if $DEBUG_MODE
237
+ store_sessions
238
+ puts "Session shutdown complete." if $DEBUG_MODE
239
+ end
240
+
241
+
242
+ ## Returns a new, unique session identifier by storing the params to the database
243
+ def new_ses_id( cookie_key, ses_key, timeout_secs, user_id=0 )
244
+ db_open
245
+ new_id = @db[:rsence_session].insert(
246
+ :cookie_key => cookie_key,
247
+ :ses_key => ses_key,
248
+ :ses_timeout => timeout_secs,
249
+ :user_id => user_id
250
+ )
251
+ db_close
252
+ return new_id
253
+ end
254
+
255
+ ## Expires a session by its identifier
256
+ def expire_session( ses_id )
257
+
258
+ return unless @sessions.has_key? ses_id
259
+
260
+ ses_data = @sessions[ ses_id ]
261
+
262
+ # Makes the session invalid for xhr's by deleting its key
263
+ @session_keys.delete( ses_data[:ses_key] )
264
+
265
+ # Makes the session invalid for all requests by deleting its cookie key
266
+ @session_cookie_keys.delete( ses_data[:cookie_key] )
267
+
268
+ # Deletes the session data itself
269
+ @sessions.delete( ses_id )
270
+
271
+ # Removes all ticket-based storage bound to the session
272
+ @plugins[:ticketservices].expire_ses( ses_id ) if @plugins
273
+
274
+ # target -> source cleanup
275
+ if @clone_sources.has_key?( ses_id )
276
+ source_id = @clone_sources[ ses_id ]
277
+ @clone_sources.delete( ses_id ) if @clone_sources.has_key?( ses_id )
278
+ @clone_targets[ source_id ].delete( ses_id ) if @clone_targets.has_key?( source_id )
279
+ end
280
+
281
+ # source -> targets cleanup
282
+ if @clone_targets.has_key?( ses_id )
283
+ @clone_targets[ ses_id ].each do |target_id|
284
+ @clone_sources.delete( target_id ) if @clone_sources.has_key?( target_id )
285
+ end
286
+ @clone_targets.delete( ses_id ) if @clone_targets.has_key?( ses_id )
287
+ end
288
+
289
+ db_open
290
+ # Deletes the session's row from the database
291
+ @db[:rsence_session].filter(:id => ses_id).delete
292
+ db_close
293
+
294
+ end
295
+
296
+ ## Expires all sessions that meet the timeout criteria
297
+ def expire_sessions
298
+
299
+ # Loop through all sessions in memory:
300
+ @sessions.each_key do |ses_id|
301
+
302
+ timed_out = @sessions[ ses_id ][:timeout] < Time.now.to_i
303
+
304
+ ## Deletes the session, if the session is too old
305
+ expire_session( ses_id ) if timed_out
306
+
307
+ end
308
+ end
309
+
310
+ end
311
+
312
+ end
313
+
314
+
@@ -0,0 +1,254 @@
1
+ #--
2
+ ## Riassence Framework
3
+ # Copyright 2008 Riassence Inc.
4
+ # http://riassence.com/
5
+ #
6
+ # You should have received a copy of the GNU General Public License along
7
+ # with this software package. If not, contact licensing@riassence.com
8
+ ##
9
+ #++
10
+
11
+
12
+ module RSence
13
+
14
+ =begin
15
+ Transporter is the counterpart to the client's HTransporter xhr engine.
16
+ =end
17
+
18
+ class Transporter
19
+
20
+ # ValueManager syncronizes value objects
21
+ require 'values/valuemanager'
22
+
23
+ # SessionManager creates, validates, stores and expires sessions
24
+ require 'session/sessionmanager'
25
+
26
+ # PluginManager handles all the plugins
27
+ require 'plugins/pluginmanager'
28
+
29
+ attr_accessor :valuemanager, :sessions, :plugins
30
+
31
+ def initialize
32
+ @config = ::RSence.config[:transporter_conf]
33
+
34
+ @valuemanager = ValueManager.new
35
+ @sessions = SessionManager.new( self )
36
+ @plugins = PluginManager.new( ::RSence.config[:plugin_paths], self, $DEBUG_MODE )
37
+
38
+ # Used by:
39
+ # plugins/main/main.rb
40
+ $SESSION = @sessions
41
+
42
+ end
43
+
44
+ def servlet( request_type, request, response )
45
+ broker_urls = ::RSence.config[:broker_urls]
46
+ uri = request.fullpath
47
+ # if $DEBUG_MODE and uri == $config[:index_html][:respond_address] and request_type == :get
48
+ # unless ARGV.include?('-no-rescan') or ARGV.include?('--no-rescan')
49
+ # puts "Reloading plugins."
50
+ # if ARGV.include?('-say')
51
+ # Thread.new do
52
+ # Thread.pass
53
+ # system('say "Reloading plugins."')
54
+ # end
55
+ # end
56
+ # @plugins.rescan
57
+ # puts "Plugins reloaded."
58
+ # if ARGV.include?('-say')
59
+ # Thread.new do
60
+ # Thread.pass
61
+ # system('say "Plugins reloaded."')
62
+ # end
63
+ # end
64
+ # end
65
+ # end
66
+
67
+ if request_type == :post
68
+ ## /x handles xhr without cookies
69
+ if uri == broker_urls[:x] and @sessions.accept_requests
70
+ xhr( request, response, { :cookies => true, :servlet => false } )
71
+ return true
72
+ ## /hello handles the first xhr (with cookies, for session key)
73
+ elsif uri == broker_urls[:hello] and @sessions.accept_requests
74
+ xhr( request, response, { :cookies => true, :servlet => false } )
75
+ return true
76
+ else
77
+ session = {}
78
+ return @plugins.match_servlet( request_type, request, response, session )
79
+ ## /SOAP handles SOAP Requests
80
+ # elsif uri == broker_urls[:soap]
81
+ # soap( request, response )
82
+ # return true
83
+ end
84
+ else
85
+ session = {}
86
+ return @plugins.match_servlet( request_type, request, response, session )
87
+ end
88
+ end
89
+
90
+ ## handles incoming SOAP requests
91
+ # def soap(request, response)
92
+ # PluginManager.soap( request, response )
93
+ # end
94
+
95
+ # wrapper for the session manager stop client functionality
96
+ def xhr_error_handler(msg,err_name,err_extra_descr='')
97
+ @sessions.stop_client_with_message( msg,
98
+ @config[:messages][err_name][:title],
99
+ @config[:messages][err_name][:descr]+err_extra_descr,
100
+ @config[:messages][err_name][:uri]
101
+ )
102
+ end
103
+
104
+ # wrapper for tracebacks in xhr
105
+ def xhr_traceback_handler(e,err_descr='Transporter::UnspecifiedError')
106
+ puts "=="*40 if $DEBUG_MODE
107
+ puts err_descr
108
+ if $DEBUG_MODE
109
+ puts "--"*40
110
+ puts e.message
111
+ puts " #{e.backtrace.join("\n ")}"
112
+ puts "=="*40
113
+ end
114
+ end
115
+
116
+ ## handles incoming XMLHttpRequests from the browser
117
+ def xhr(request, response, options = { :cookies => false, :servlet => false } )
118
+
119
+ session_conf = ::RSence.config[:session_conf]
120
+
121
+ options[:cookies] = false unless options.has_key?(:cookies)
122
+
123
+ if session_conf[:session_cookies] and session_conf[:trust_cookies]
124
+ options[:cookies] = true
125
+ end
126
+
127
+ # Creates the msg object, also checks or creates a new session; verifies session keys and such
128
+ msg = @sessions.init_msg( request, response, options )
129
+
130
+ response_success = true
131
+
132
+ # If the client encounters an error, display error message
133
+ if request.query.has_key?('err_msg')
134
+ response_success = false
135
+ client_error_msg = request.query['err_msg'].inspect
136
+ puts "\nCLIENT ERROR:\n#{client_error_msg}\n" if $DEBUG_MODE
137
+ xhr_error_handler(msg,:client_error,client_error_msg)
138
+ end
139
+
140
+ # If the session is valid, continue:
141
+ if msg.ses_valid and response_success
142
+
143
+ # If cookies are true, it means the url base needs to
144
+ # be changed from /hello to /x to prevent further cookie juggling.
145
+ if options[:cookies] and not options[:servlet]
146
+ msg.reply("COMM.Transporter.url=#{::RSence.config[:broker_urls][:x].to_json};")
147
+ end
148
+
149
+ # Appends a 'new session.' message for new sessions in $DEBUG_MODE:
150
+ puts "new session." if msg.new_session and $DEBUG_MODE
151
+ puts "restored session." if msg.restored_session and $DEBUG_MODE
152
+ puts "clone source." if msg.cloned_targets and $DEBUG_MODE
153
+ puts "clone target." if msg.cloned_source and $DEBUG_MODE
154
+
155
+ ## Pass the client XML to the value manager
156
+ if request.query.has_key?( 'values' )
157
+ syncdata_str = request.query[ 'values' ]
158
+ begin
159
+ @valuemanager.xhr( msg, syncdata_str )
160
+ rescue => e
161
+ response_success = false
162
+ xhr_error_handler( msg, :valuemanager_xhr_error, e.message )
163
+ xhr_traceback_handler( e, "Transporter::ValueManagerXHRError: @valuemanager.xhr failed." )
164
+ end
165
+ end
166
+
167
+ ## Calls the restore_ses of plugins, when a session is restored (page reload with previously active session)
168
+ if msg.restored_session
169
+
170
+ msg.session[:deps] = []
171
+
172
+ if msg.cloned_source
173
+ begin
174
+ @plugins.delegate( :cloned_target, msg, msg.cloned_source )
175
+ rescue => e
176
+ response_success = false
177
+ xhr_error_handler( msg, :plugin_delegate_cloned_target_error, e.message )
178
+ xhr_traceback_handler( e, "Transporter::PluginDelegateClonedTargetError: @plugins.delegate 'cloned_target' failed." )
179
+ end
180
+ end
181
+
182
+ begin
183
+ @plugins.delegate( :restore_ses, msg )
184
+ rescue => e
185
+ response_success = false
186
+ xhr_error_handler( msg, :plugin_delegate_restore_ses_error, e.message )
187
+ xhr_traceback_handler( e, "Transporter::PluginDelegateRestoreSesError: @plugins.delegate 'restore_ses' failed." )
188
+ end
189
+
190
+ elsif msg.new_session
191
+ begin
192
+ @plugins.delegate( :init_ses, msg )
193
+ rescue => e
194
+ response_success = false
195
+ xhr_error_handler( msg, :plugin_delegate_init_ses_error, e.message )
196
+ xhr_traceback_handler( e, "Transporter::PluginDelegateInitSesError: @plugins.delegate 'init_ses' failed." )
197
+ end
198
+ elsif msg.cloned_targets
199
+ begin
200
+ @plugins.delegate( :cloned_source, msg, msg.cloned_targets )
201
+ rescue => e
202
+ response_success = false
203
+ xhr_error_handler( msg, :plugin_delegate_cloned_source_error, e.message )
204
+ xhr_traceback_handler( e, "Transporter::PluginDelegateClonedSourceError: @plugins.delegate 'cloned_source' failed." )
205
+ end
206
+ end
207
+
208
+ ## Calls validators for changed values
209
+ begin
210
+ @valuemanager.validate( msg )
211
+ rescue => e
212
+ response_success = false
213
+ xhr_error_handler( msg, :valuemanager_validate_error, e.message )
214
+ xhr_traceback_handler( e, "Transporter::ValueManagerValidateError: @valuemanager.validate failed." )
215
+ end
216
+
217
+ ### Allows every plugin to respond to the idle call
218
+ begin
219
+ @plugins.delegate( :idle, msg )
220
+ rescue => e
221
+ response_success = false
222
+ xhr_error_handler( msg, :plugin_idle_error, e.message )
223
+ xhr_traceback_handler( e, "Transporter::PluginIdleError: @plugins.idle failed." )
224
+ end
225
+
226
+ ### Processes outgoing values to client
227
+ begin
228
+ @valuemanager.sync_client( msg )
229
+ rescue => e
230
+ response_success = false
231
+ xhr_error_handler( msg, :valuemanager_sync_client_error, e.message )
232
+ xhr_traceback_handler( e, "Transporter::ValueManagerSyncClientError: @valuemanager.sync_client failed." )
233
+ end
234
+
235
+ else
236
+
237
+ # session is not valid, the error was set in SessionManager
238
+ response_success = false
239
+
240
+ end
241
+
242
+ msg.response_success = response_success
243
+
244
+ unless options[:servlet]
245
+ msg.response_done()
246
+ end
247
+
248
+ return msg
249
+
250
+ end
251
+
252
+ end
253
+
254
+ end