rsence-pre 2.1.0.1.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 (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
+