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,522 @@
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 'json'
15
+
16
+ ## Shared messaging-object:
17
+ require 'session/msg'
18
+
19
+ ## Unique random number generator:
20
+ require 'randgen'
21
+
22
+ ## SessionStorage is the superclass of SessionManager
23
+ require 'session/sessionstorage'
24
+
25
+ require 'digest/sha1'
26
+
27
+ # SessionManager does session creation, validation, expiration and storage duties.
28
+ class SessionManager < SessionStorage
29
+
30
+ include Digest
31
+
32
+ attr_reader :randgen
33
+
34
+ ## Makes everything ready to run
35
+ def initialize( transporter )
36
+
37
+ super()
38
+
39
+ @transporter = transporter
40
+
41
+ @valuemanager = @transporter.valuemanager
42
+
43
+ @plugins = @transporter.plugins
44
+
45
+ ## 'Unique' Random String generator for ses_key:s and cookie_key:s
46
+ @randgen = RandGen.new( @config[:key_length] )
47
+
48
+ # regex to match ipv4 addresses
49
+ @ipv4_reg = /^([1][0-9][0-9]|[2][0-5][0-9]|[1-9][0-9]|[1-9])\.([1][0-9][0-9]|[2][0-5][0-9]|[1-9][0-9]|[0-9])\.([1][0-9][0-9]|[2][0-5][0-9]|[1-9][0-9]|[0-9])\.([1][0-9][0-9]|[2][0-5][0-9]|[1-9][0-9]|[0-9])$/
50
+
51
+ end
52
+
53
+ ### Creates a new session
54
+ def init_ses( msg, ses_seed )
55
+
56
+ ## Assigns new timeout for the session
57
+ time_now = Time.now.to_i # seconds since epoch
58
+ timeout = time_now + @config[:timeout_secs]
59
+
60
+ ## Creates a new session key
61
+ ses_key = @randgen.gen
62
+
63
+ ## Creates a new cookie key
64
+ cookie_key = @randgen.gen_many(@config[:cookie_key_multiplier]).join('')
65
+
66
+ ## Makes a new database row for the session, returns its id
67
+ ses_id = new_ses_id( cookie_key, ses_key, timeout )
68
+
69
+ ses_sha = SHA1.hexdigest(ses_key+ses_seed)
70
+
71
+ ### Default session data structure,
72
+ ### Please don't mess with it, unless you know exactly what you are doing.
73
+ ses_data = {
74
+
75
+ # the time, when the session will time out
76
+ :timeout => timeout,
77
+
78
+ # session id, used internally
79
+ :ses_id => ses_id,
80
+
81
+ # session key, used externally (client xhr)
82
+ :ses_key => ses_sha,
83
+
84
+ # session key, used externally (client cookies)
85
+ :cookie_key => cookie_key,
86
+
87
+ # user id, map to your own user management code
88
+ :user_id => 0,
89
+
90
+ # valuemanager data
91
+ :values => {
92
+ :sync => [], # value id's to sync to client
93
+ :check => [], # value id's to validate in server (from client)
94
+ :by_id => {} # values by id
95
+ }
96
+ }
97
+
98
+ # bind the session data to @sessions by its id
99
+ @sessions[ ses_id ] = ses_data
100
+
101
+ # map the key back to the id
102
+ @session_keys[ ses_sha ] = ses_id
103
+
104
+ # map the ses_id to cookie key
105
+ @session_cookie_keys[ cookie_key ] = ses_id
106
+
107
+ ### Tell the client what the new key is
108
+ msg.ses_key = ses_key
109
+
110
+ ### Set the session data and id to the message object
111
+ msg.session = ses_data
112
+
113
+ # Flag the session as new, so associated
114
+ # plugins know when to create new data
115
+ msg.new_session = true
116
+
117
+ # Returns the cookie key, so it can be sent in the response header
118
+ return cookie_key
119
+
120
+ end
121
+
122
+ def refresh_ses( msg, ses_data, ses_id, ses_key, ses_seed )
123
+ # new time-out
124
+ ses_data[:timeout] = Time.now.to_i + @config[:timeout_secs]
125
+
126
+ # re-generates the ses_key for each xhr
127
+ if @config[:disposable_keys]
128
+
129
+ # disposes the old (current) ses_key:
130
+ @session_keys.delete( ses_key )
131
+
132
+ unless ses_seed
133
+ ses_seed = ses_key
134
+ end
135
+
136
+ # gets a new ses_key:
137
+ ses_key = @randgen.gen
138
+
139
+ ses_sha = SHA1.hexdigest(ses_key+ses_seed)
140
+
141
+ # re-maps the session id to the new key
142
+ @session_keys[ses_sha] = ses_id
143
+
144
+ # changes the session key in the session data
145
+ ses_data[:ses_key] = ses_sha
146
+
147
+ # tell the client what its new session key is
148
+ msg.ses_key = ses_key
149
+ end
150
+
151
+ if @config[:clone_cookie_sessions] and @clone_targets.has_key? ses_id
152
+ targets = []
153
+ @clone_targets[ ses_id ].length.times do |n|
154
+ target_id = @clone_targets[ ses_id ].shift
155
+ # warn "target_id: #{target_id}"
156
+ target_ses = @sessions[ target_id ]
157
+ if @sessions.has_key?( target_id ) and @sessions[ target_id ].class == Hash
158
+ targets.push( target_ses )
159
+ end
160
+ end
161
+ @clone_targets.delete( ses_id ) if @clone_targets[ ses_id ].empty?
162
+ msg.cloned_targets = targets unless targets.empty?
163
+ end
164
+
165
+ ### Bind the session data and id to the message object
166
+ msg.session = ses_data
167
+
168
+ end
169
+
170
+ def clone_ses( msg, old_data, old_id, old_key, ses_seed )
171
+ ses_data = Marshal.restore( Marshal.dump( old_data ) )
172
+ old_data[:timeout] = Time.now.to_i + @config[:cloned_session_expires_in]
173
+ timeout = Time.now.to_i + @config[:timeout_secs]
174
+ cookie_key = @randgen.gen_many(@config[:cookie_key_multiplier]).join('')
175
+ ses_key = @randgen.gen
176
+ ses_sha = SHA1.hexdigest(ses_key+ses_seed)
177
+ ses_data[:timeout] = timeout
178
+ ses_data[:ses_key] = ses_key
179
+ ses_data[:cookie_key] = cookie_key
180
+ ses_id = new_ses_id( cookie_key, ses_key, timeout )
181
+ ses_data[:ses_id] = ses_id
182
+ @sessions[ ses_id ] = ses_data
183
+ @session_keys[ ses_sha ] = ses_id
184
+ @session_cookie_keys.delete( old_data[:cookie_key] )
185
+ @session_cookie_keys[ cookie_key ] = ses_id
186
+ msg.ses_key = ses_key
187
+ msg.session = ses_data
188
+ if @clone_targets.has_key? old_id
189
+ @clone_targets[ old_id ].push( ses_id )
190
+ else
191
+ @clone_targets[ old_id ] = [ ses_id ]
192
+ end
193
+ @clone_sources[ ses_id ] = old_id
194
+ msg.cloned_source = old_data
195
+ msg.new_session = false
196
+ msg.restored_session = true
197
+ end
198
+
199
+ ### Returns the current session data, if the session is valid.
200
+ ### Otherwise stops the client and returns false.
201
+ def check_ses( msg, ses_key, ses_seed=false )
202
+
203
+ # first, check if the session key exists (xhr)
204
+ if @session_keys.has_key?( ses_key )
205
+
206
+ # get the session's id based on its key
207
+ ses_id = @session_keys[ ses_key ]
208
+
209
+ # get the session's data based on its id
210
+ ses_data = @sessions[ ses_id ]
211
+
212
+ if @config[:clone_cookie_sessions] and ses_seed
213
+ clone_ses( msg, ses_data, ses_id, ses_key, ses_seed )
214
+ return [true, true]
215
+ else
216
+ refresh_ses( msg, ses_data, ses_id, ses_key, ses_seed )
217
+ return [true, false]
218
+ end
219
+
220
+
221
+ ## The session was either faked or expired:
222
+ else
223
+ ### Tells the client to stop connecting with its session key and reload instead to get a new one.
224
+ stop_client_with_message( msg,
225
+ @config[:messages][:invalid_session][:title],
226
+ @config[:messages][:invalid_session][:descr],
227
+ @config[:messages][:invalid_session][:uri]
228
+ )
229
+
230
+ ## Return failure
231
+ return [false, false]
232
+ end
233
+
234
+ end
235
+
236
+ def js_str( str )
237
+ return str.to_json.gsub('<','&lt;').gsub('>','&gt;').gsub(/\[\[(.*?)\]\]/,'<\1>')
238
+ end
239
+
240
+ ## Displays error message and stops the client
241
+ def stop_client_with_message( msg,
242
+ title = 'Unknown Issue',
243
+ descr = 'No issue description given.',
244
+ uri = RSence.config[:index_html][:respond_address] )
245
+ msg.error_msg( [
246
+ "jsLoader.load('default_theme');",
247
+ "jsLoader.load('controls');",
248
+ "jsLoader.load('servermessage');",
249
+ "ReloadApp.nu( #{js_str(title)}, #{js_str(descr)}, #{js_str(uri)} );"
250
+ ] )
251
+ end
252
+
253
+ ### Checks / Sets cookies
254
+ def check_cookie( msg, ses_seed )
255
+
256
+ # default to no cookie key found:
257
+ cookie_key = false
258
+
259
+ # gets the cookie array from the request object
260
+ cookie_raw = msg.request.cookies
261
+
262
+ # checks, if a cookie named 'ses_key' is found
263
+ if cookie_raw.has_key?('ses_key')
264
+
265
+ # gets just the data itself (discards comment, domain, expiration etc)
266
+ cookie_key = cookie_raw['ses_key'].split(';')[0]
267
+
268
+ end
269
+
270
+ # if a cookie key is found (non-false), checks if it's valid
271
+ if cookie_key
272
+
273
+ # checks for validity by looking the key up in @session_cookie_keys
274
+ cookie_key_exist = @session_cookie_keys.has_key?( cookie_key )
275
+
276
+ # sets the cookie key to false, if it doesn't exist
277
+ cookie_key = false unless cookie_key_exist
278
+
279
+ end
280
+
281
+ # at this point, the cookie key seems valid:
282
+ if cookie_key and cookie_key_exist
283
+
284
+ # get the session identifier
285
+ ses_id = @session_cookie_keys[ cookie_key ]
286
+
287
+ # get the last session key from session data
288
+ ses_key = @sessions[ses_id][:ses_key]
289
+
290
+ # make additional checks on the session validity (expiry etc)
291
+ (ses_status, ses_cloned) = check_ses( msg, ses_key, ses_seed )
292
+
293
+ if ses_status and ses_cloned
294
+ ses_id = msg.ses_id
295
+ ses_key = msg.session[:ses_key]
296
+ cookie_key = msg.session[:cookie_key]
297
+ @valuemanager.resend_session_values( msg )
298
+ elsif ses_status
299
+ # delete the old cookie key:
300
+ @session_cookie_keys.delete( cookie_key )
301
+
302
+ # get a new cookie key
303
+ cookie_key = @randgen.gen_many(@config[:cookie_key_multiplier]).join('')
304
+
305
+ # map the new cookie key to the old session identifier
306
+ @session_cookie_keys[ cookie_key ] = ses_id
307
+
308
+ # binds the new cookie key to the old session data
309
+ @sessions[ses_id][:cookie_key] = cookie_key
310
+
311
+ # Sets the restored_session flag of msg to true
312
+ # It signals plugins to re-set data
313
+ msg.restored_session = true
314
+
315
+ # Sets the new_session flag of msg to false
316
+ # It signals plugins to not create new server-side values
317
+ msg.new_session = false
318
+
319
+ # tells ValueManager to re-send client-side HValue objects
320
+ # with data to the client
321
+ @valuemanager.resend_session_values( msg )
322
+
323
+ # if the session is not valid, make sure to mark the
324
+ # cookie key as invalid (false)
325
+ else
326
+ cookie_key = false
327
+ end
328
+ end
329
+
330
+ # if the cookie key failed validation in the
331
+ # tests above, create a new session instead
332
+ unless cookie_key
333
+ cookie_key = init_ses( msg, ses_seed )
334
+ ses_status = true
335
+ end
336
+
337
+ renew_cookie( msg, cookie_key )
338
+
339
+ ## Return the session status. Actually,
340
+ ## the value is always true, but future
341
+ ## versions might not accept invalid
342
+ ## cookies as new sessions.
343
+ return ses_status
344
+ end
345
+
346
+ def renew_cookie( msg, cookie_key )
347
+ # Uses a cookie comment to tell the user what the
348
+ # cookie is for, change it to anything valid in the
349
+ # configuration.
350
+ ses_cookie_comment = @config[:ses_cookie_comment]
351
+
352
+ ## mod_rewrite changes the host header to x-forwarded-host:
353
+ if msg.request.header.has_key?('x-forwarded-host')
354
+ domain = msg.request.header['x-forwarded-host']
355
+
356
+ ## direct access just uses host (at least mongrel
357
+ ## does mod_rewrite header translation):
358
+ else
359
+ domain = msg.request.host
360
+ end
361
+
362
+ if domain == 'localhost'
363
+ warn "Warning: Cookies won't be set for 'localhost'. Use '127.0.0.1' instead." if RSence.args[:debug]
364
+ return
365
+ end
366
+
367
+ server_port = msg.request.port
368
+
369
+ ## if the host address is a real domain
370
+ ## (not just hostname or 'localhost'),
371
+ ## but not an ip-address, prepend it with
372
+ ## a dot to accept wildcards (useful for
373
+ ## dns-load-balanced server configurations)
374
+ if not @ipv4_reg.match(domain) and domain.include?('.')
375
+ ses_cookie_domain = ".#{domain}"
376
+ ## Otherwise, use the domain as-is
377
+ else
378
+ ses_cookie_domain = domain
379
+ end
380
+
381
+ ## uses the timeout to declare the max age
382
+ ## of the cookie, allows the browser to delete
383
+ ## it, when it expires.
384
+ ses_cookie_max_age = @config[:timeout_secs]
385
+
386
+ ## Only match the handshaking address of rsence,
387
+ ## prevents unnecessary cookie-juggling in xhr's
388
+ if @config[:trust_cookies]
389
+ ses_cookie_path = '/'
390
+ else
391
+ ses_cookie_path = RSence.config[:broker_urls][:hello]
392
+ end
393
+
394
+ ## Formats the cookie to string
395
+ ## (through array, to keep it readable in the source)
396
+ ses_cookie_arr = [
397
+ "ses_key=#{cookie_key}",
398
+ "Path=#{ses_cookie_path}",
399
+ "Port=#{server_port}",
400
+ "Max-Age=#{ses_cookie_max_age}",
401
+ "Comment=#{ses_cookie_comment}",
402
+ "Domain=#{ses_cookie_domain}"
403
+ ]
404
+
405
+ ### Sets the set-cookie header
406
+ msg.response['Set-Cookie'] = ses_cookie_arr.join('; ')
407
+ end
408
+
409
+ def expire_ses_by_req( req, res )
410
+
411
+ cookie_raw = req.cookies
412
+
413
+ # checks, if a cookie named 'ses_key' is found
414
+ if cookie_raw.has_key?('ses_key')
415
+
416
+ # gets just the data itself (discards comment, domain, expiration etc)
417
+ cookie_key = cookie_raw['ses_key'].split(';')[0]
418
+
419
+ end
420
+
421
+ # if a cookie key is found (non-false), checks if it's valid
422
+ if cookie_key
423
+
424
+ # checks for validity by looking the key up in @session_cookie_keys
425
+ cookie_key_exist = @session_cookie_keys.has_key?( cookie_key )
426
+
427
+ # sets the cookie key to false, if it doesn't exist
428
+ cookie_key = false unless cookie_key_exist
429
+
430
+ end
431
+
432
+ # at this point, the cookie key seems valid:
433
+ if cookie_key and cookie_key_exist
434
+
435
+ # get the session identifier
436
+ ses_id = @session_cookie_keys[ cookie_key ]
437
+
438
+ # Expire the session
439
+ expire_session( ses_id )
440
+
441
+ return true
442
+
443
+ end
444
+
445
+ return false
446
+ end
447
+
448
+ ### Creates a message and checks the session
449
+ def init_msg( request, response, options = { :cookies => false, :servlet => false } )
450
+
451
+ cookies = options[:cookies]
452
+
453
+ if options.has_key?(:query)
454
+ query = options[:query]
455
+ else
456
+ query = request.query
457
+ end
458
+
459
+ ## Perform old-session cleanup on all xhr:s
460
+ expire_sessions
461
+
462
+ ## The 'ses_id' request query key is required.
463
+ ## The client defaults to '0', which means the
464
+ ## client needs to be initialized.
465
+ ## The client's ses_id is the server's ses_key.
466
+ if not query.has_key?( 'ses_key' )
467
+ return Message.new( @transporter, request, response, options )
468
+ else
469
+
470
+ ## get the ses_key from the request query:
471
+ ses_key = query[ 'ses_key' ]
472
+ # puts "ses key: #{ses_key}"
473
+ ## The message object binds request, response
474
+ ## and all user/session -related data to one
475
+ ## object, which is passed around where
476
+ ## request/response/user/session -related
477
+ ## data is needed.
478
+ msg = Message.new( @transporter, request, response, options )
479
+
480
+ ## The client tells that its ses_key is '0',
481
+ ## until the server tells it otherwise.
482
+ (req_num, ses_seed) = ses_key.split(':.o.:')
483
+
484
+ if req_num == '0'
485
+
486
+ # If Broker encounters a '/hello' request, it
487
+ # sets cookies to true.
488
+ #
489
+ # It means that a session should have its cookies
490
+ # checked.
491
+ #
492
+ if cookies
493
+ ses_status = check_cookie( msg, ses_seed )
494
+ # Otherwise, a new session is created:
495
+ else
496
+ init_ses( msg, ses_seed )
497
+ ses_status = true
498
+ end
499
+
500
+ # for non-'0' ses_keys:
501
+ else
502
+
503
+ ## Validate the session key
504
+ ses_status = check_ses( msg, ses_seed )[0]
505
+
506
+ ## Renew the cookie even when the request is a "x" (not "hello")
507
+ if @config[:session_cookies] and ses_status
508
+ renew_cookie( msg, msg.session[:cookie_key] )
509
+ end
510
+
511
+ end # /ses_key
512
+
513
+ ## msg.ses_valid is false by default, meaning
514
+ ## it's not valid or hasn't been initialized.
515
+ msg.ses_valid = ses_status
516
+
517
+ return msg
518
+ end # /ses_key
519
+ end # /init_msg
520
+ end
521
+ end
522
+