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.
- data/.yardopts +10 -0
- data/INSTALL.rdoc +330 -0
- data/LICENSE.txt +622 -0
- data/README.rdoc +98 -0
- data/VERSION +1 -0
- data/bin/rsence +25 -0
- data/bin/rsence-pre +25 -0
- data/conf/default_conf.yaml +346 -0
- data/conf/default_strings.yaml +76 -0
- data/conf/rsence_command_strings.yaml +444 -0
- data/docs/ExampleGuiPlugin.rdoc +193 -0
- data/docs/JavascriptBundles.rdoc +0 -0
- data/docs/PluginBundleInfo.rdoc +173 -0
- data/docs/PluginBundles.rdoc +96 -0
- data/docs/Values.rdoc +163 -0
- data/js/comm/autosync/autosync.js +17 -0
- data/js/comm/autosync/js.inc +0 -0
- data/js/comm/comm.js +203 -0
- data/js/comm/js.inc +0 -0
- data/js/comm/jsloader/js.inc +0 -0
- data/js/comm/jsloader/jsloader.js +112 -0
- data/js/comm/queue/js.inc +0 -0
- data/js/comm/queue/queue.js +184 -0
- data/js/comm/session/js.inc +0 -0
- data/js/comm/session/session.js +52 -0
- data/js/comm/sessionwatcher/js.inc +0 -0
- data/js/comm/sessionwatcher/sessionwatcher.js +44 -0
- data/js/comm/transporter/js.inc +0 -0
- data/js/comm/transporter/transporter.js +261 -0
- data/js/comm/urlresponder/js.inc +0 -0
- data/js/comm/urlresponder/urlresponder.js +149 -0
- data/js/comm/values/js.inc +0 -0
- data/js/comm/values/values.js +433 -0
- data/js/controls/button/button.js +72 -0
- data/js/controls/button/js.inc +0 -0
- data/js/controls/button/themes/bright/button.css +89 -0
- data/js/controls/button/themes/bright/button.html +7 -0
- data/js/controls/button/themes/bright/button_parts1-ie6.gif +0 -0
- data/js/controls/button/themes/bright/button_parts1.png +0 -0
- data/js/controls/button/themes/default/button.css +89 -0
- data/js/controls/button/themes/default/button.html +7 -0
- data/js/controls/button/themes/default/button_parts1-ie6.gif +0 -0
- data/js/controls/button/themes/default/button_parts1.png +0 -0
- data/js/controls/checkbox/checkbox.js +49 -0
- data/js/controls/checkbox/js.inc +0 -0
- data/js/controls/checkbox/themes/default/checkbox.css +69 -0
- data/js/controls/checkbox/themes/default/checkbox.html +5 -0
- data/js/controls/checkbox/themes/default/checkbox_parts1-ie6.gif +0 -0
- data/js/controls/checkbox/themes/default/checkbox_parts1.png +0 -0
- data/js/controls/dialogs/alert_sheet/alert_sheet.js +63 -0
- data/js/controls/dialogs/alert_sheet/js.inc +0 -0
- data/js/controls/dialogs/confirm_sheet/confirm_sheet.js +37 -0
- data/js/controls/dialogs/confirm_sheet/js.inc +0 -0
- data/js/controls/dialogs/sheet/js.inc +0 -0
- data/js/controls/dialogs/sheet/sheet.js +84 -0
- data/js/controls/dialogs/sheet/themes/default/sheet.css +64 -0
- data/js/controls/dialogs/sheet/themes/default/sheet.html +14 -0
- data/js/controls/dialogs/sheet/themes/default/sheet_bg-ie6.gif +0 -0
- data/js/controls/dialogs/sheet/themes/default/sheet_bg.png +0 -0
- data/js/controls/dialogs/sheet/themes/default/sheet_dim-ie6.gif +0 -0
- data/js/controls/dialogs/sheet/themes/default/sheet_dim.png +0 -0
- data/js/controls/dialogs/sheet/themes/default/sheet_parts1-ie6.gif +0 -0
- data/js/controls/dialogs/sheet/themes/default/sheet_parts1.png +0 -0
- data/js/controls/dialogs/sheet/themes/default/sheet_parts2-ie6.gif +0 -0
- data/js/controls/dialogs/sheet/themes/default/sheet_parts2.png +0 -0
- data/js/controls/dialogs/sheet/themes/default/sheet_warning-ie6.gif +0 -0
- data/js/controls/dialogs/sheet/themes/default/sheet_warning.png +0 -0
- data/js/controls/imageview/imageview.js +109 -0
- data/js/controls/imageview/js.inc +0 -0
- data/js/controls/imageview/themes/default/blank.gif +0 -0
- data/js/controls/passwordcontrol/js.inc +0 -0
- data/js/controls/passwordcontrol/passwordcontrol.js +23 -0
- data/js/controls/passwordcontrol/themes/default/passwordcontrol.css +0 -0
- data/js/controls/passwordcontrol/themes/default/passwordcontrol.html +18 -0
- data/js/controls/progress/progressbar/js.inc +0 -0
- data/js/controls/progress/progressbar/progressbar.js +40 -0
- data/js/controls/progress/progressbar/themes/default/progressbar.css +16 -0
- data/js/controls/progress/progressbar/themes/default/progressbar.html +2 -0
- data/js/controls/progress/progressindicator/js.inc +0 -0
- data/js/controls/progress/progressindicator/progressindicator.js +44 -0
- data/js/controls/radiobutton/js.inc +0 -0
- data/js/controls/radiobutton/radiobutton.js +43 -0
- data/js/controls/radiobutton/themes/default/radiobutton.css +69 -0
- data/js/controls/radiobutton/themes/default/radiobutton.html +5 -0
- data/js/controls/radiobutton/themes/default/radiobutton_parts1-ie6.gif +0 -0
- data/js/controls/radiobutton/themes/default/radiobutton_parts1.png +0 -0
- data/js/controls/sliders/slider/js.inc +0 -0
- data/js/controls/sliders/slider/slider.js +357 -0
- data/js/controls/sliders/slider/themes/default/hslider_tracks-ie6.gif +0 -0
- data/js/controls/sliders/slider/themes/default/hslider_tracks.png +0 -0
- data/js/controls/sliders/slider/themes/default/slider.css +108 -0
- data/js/controls/sliders/slider/themes/default/slider.html +5 -0
- data/js/controls/sliders/slider/themes/default/slider_thumbs-ie6.gif +0 -0
- data/js/controls/sliders/slider/themes/default/slider_thumbs.png +0 -0
- data/js/controls/sliders/vslider/js.inc +0 -0
- data/js/controls/sliders/vslider/themes/default/vslider.css +52 -0
- data/js/controls/sliders/vslider/themes/default/vslider.html +5 -0
- data/js/controls/sliders/vslider/themes/default/vslider_tracks-ie6.gif +0 -0
- data/js/controls/sliders/vslider/themes/default/vslider_tracks.png +0 -0
- data/js/controls/sliders/vslider/vslider.js +41 -0
- data/js/controls/stepper/js.inc +0 -0
- data/js/controls/stepper/stepper.js +213 -0
- data/js/controls/stepper/themes/default/stepper-ie6.gif +0 -0
- data/js/controls/stepper/themes/default/stepper.css +14 -0
- data/js/controls/stepper/themes/default/stepper.html +2 -0
- data/js/controls/stepper/themes/default/stepper.png +0 -0
- data/js/controls/stringview/js.inc +0 -0
- data/js/controls/stringview/stringview.js +49 -0
- data/js/controls/stringview/themes/default/stringview.css +8 -0
- data/js/controls/stringview/themes/default/stringview.html +1 -0
- data/js/controls/tab/js.inc +0 -0
- data/js/controls/tab/tab.js +280 -0
- data/js/controls/tab/themes/bright/tab.css +76 -0
- data/js/controls/tab/themes/bright/tab.html +6 -0
- data/js/controls/tab/themes/bright/tab_bg_color-ie6.gif +0 -0
- data/js/controls/tab/themes/bright/tab_bg_color.png +0 -0
- data/js/controls/tab/themes/bright/tab_border_pattern-ie6.gif +0 -0
- data/js/controls/tab/themes/bright/tab_border_pattern.png +0 -0
- data/js/controls/tab/themes/bright/tab_parts1-ie6.gif +0 -0
- data/js/controls/tab/themes/bright/tab_parts1.png +0 -0
- data/js/controls/tab/themes/default/tab.css +77 -0
- data/js/controls/tab/themes/default/tab.html +6 -0
- data/js/controls/tab/themes/default/tab_bg_color-ie6.gif +0 -0
- data/js/controls/tab/themes/default/tab_bg_color.png +0 -0
- data/js/controls/tab/themes/default/tab_border_pattern-ie6.gif +0 -0
- data/js/controls/tab/themes/default/tab_border_pattern.png +0 -0
- data/js/controls/tab/themes/default/tab_parts1-ie6.gif +0 -0
- data/js/controls/tab/themes/default/tab_parts1.png +0 -0
- data/js/controls/textarea/js.inc +0 -0
- data/js/controls/textarea/textarea.js +24 -0
- data/js/controls/textarea/themes/default/textarea.css +21 -0
- data/js/controls/textarea/themes/default/textarea.html +18 -0
- data/js/controls/textcontrol/js.inc +0 -0
- data/js/controls/textcontrol/textcontrol.js +374 -0
- data/js/controls/textcontrol/themes/default/textcontrol.css +107 -0
- data/js/controls/textcontrol/themes/default/textcontrol.html +18 -0
- data/js/controls/textcontrol/themes/default/textcontrol_parts1-ie6.gif +0 -0
- data/js/controls/textcontrol/themes/default/textcontrol_parts1.png +0 -0
- data/js/controls/textcontrol/themes/default/textcontrol_parts2-ie6.gif +0 -0
- data/js/controls/textcontrol/themes/default/textcontrol_parts2.png +0 -0
- data/js/controls/textcontrol/themes/default/textcontrol_parts3-ie6.gif +0 -0
- data/js/controls/textcontrol/themes/default/textcontrol_parts3.png +0 -0
- data/js/controls/uploader/js.inc +0 -0
- data/js/controls/uploader/themes/default/upload_progress.gif +0 -0
- data/js/controls/uploader/themes/default/uploader.css +108 -0
- data/js/controls/uploader/themes/default/uploader.html +27 -0
- data/js/controls/uploader/uploader.js +154 -0
- data/js/controls/validatorview/js.inc +0 -0
- data/js/controls/validatorview/themes/default/validator-ie6.gif +0 -0
- data/js/controls/validatorview/themes/default/validator.png +0 -0
- data/js/controls/validatorview/themes/default/validatorview.css +0 -0
- data/js/controls/validatorview/themes/default/validatorview.html +0 -0
- data/js/controls/validatorview/validatorview.js +62 -0
- data/js/controls/window/js.inc +0 -0
- data/js/controls/window/themes/default/window.css +219 -0
- data/js/controls/window/themes/default/window.html +17 -0
- data/js/controls/window/themes/default/window_bg_active-ie6.gif +0 -0
- data/js/controls/window/themes/default/window_bg_active.png +0 -0
- data/js/controls/window/themes/default/window_bg_inactive-ie6.gif +0 -0
- data/js/controls/window/themes/default/window_bg_inactive.png +0 -0
- data/js/controls/window/themes/default/window_buttons-ie6.gif +0 -0
- data/js/controls/window/themes/default/window_buttons.png +0 -0
- data/js/controls/window/themes/default/window_parts1-ie6.gif +0 -0
- data/js/controls/window/themes/default/window_parts1.png +0 -0
- data/js/controls/window/themes/default/window_parts2-ie6.gif +0 -0
- data/js/controls/window/themes/default/window_parts2.png +0 -0
- data/js/controls/window/window.js +286 -0
- data/js/core/class/class.js +318 -0
- data/js/core/class/js.inc +0 -0
- data/js/core/elem/elem.js +1383 -0
- data/js/core/elem/js.inc +0 -0
- data/js/core/event/event.js +153 -0
- data/js/core/event/js.inc +0 -0
- data/js/core/iefix/ie_css_element.htc +5 -0
- data/js/core/iefix/ie_css_style.htc +5 -0
- data/js/core/iefix/iefix.js +359 -0
- data/js/core/iefix/js.inc +0 -0
- data/js/core/rsence_ns/js.inc +0 -0
- data/js/core/rsence_ns/rsence_ns.js +21 -0
- data/js/datetime/calendar/calendar.js +198 -0
- data/js/datetime/calendar/js.inc +0 -0
- data/js/datetime/calendar/themes/default/calendar.css +108 -0
- data/js/datetime/calendar/themes/default/calendar.html +9 -0
- data/js/datetime/calendar/themes/default/calendar_arrows-ie6.gif +0 -0
- data/js/datetime/calendar/themes/default/calendar_arrows.png +0 -0
- data/js/datetime/datetimevalue/datetimevalue.js +247 -0
- data/js/datetime/datetimevalue/js.inc +0 -0
- data/js/datetime/timesheet/js.inc +0 -0
- data/js/datetime/timesheet/themes/default/timesheet.css +30 -0
- data/js/datetime/timesheet/themes/default/timesheet.html +2 -0
- data/js/datetime/timesheet/timesheet.js +183 -0
- data/js/datetime/timesheet_item/js.inc +0 -0
- data/js/datetime/timesheet_item/themes/default/timesheet_item.css +42 -0
- data/js/datetime/timesheet_item/themes/default/timesheet_item.html +8 -0
- data/js/datetime/timesheet_item/timesheet_item.js +248 -0
- data/js/datetime/timesheet_item_edit/js.inc +0 -0
- data/js/datetime/timesheet_item_edit/timesheet_item_edit.js +274 -0
- data/js/foundation/application/application.js +208 -0
- data/js/foundation/application/js.inc +0 -0
- data/js/foundation/control/control.js +339 -0
- data/js/foundation/control/controldefaults/controldefaults.js +56 -0
- data/js/foundation/control/controldefaults/js.inc +0 -0
- data/js/foundation/control/dummyvalue/dummyvalue.js +51 -0
- data/js/foundation/control/dummyvalue/js.inc +0 -0
- data/js/foundation/control/dyncontrol/dyncontrol.js +500 -0
- data/js/foundation/control/dyncontrol/js.inc +0 -0
- data/js/foundation/control/dyncontrol/themes/default/dyncontrol.css +0 -0
- data/js/foundation/control/dyncontrol/themes/default/dyncontrol.html +0 -0
- data/js/foundation/control/eventresponder/eventresponder.js +750 -0
- data/js/foundation/control/eventresponder/js.inc +0 -0
- data/js/foundation/control/js.inc +0 -0
- data/js/foundation/control/valuematrix/js.inc +0 -0
- data/js/foundation/control/valuematrix/valuematrix.js +135 -0
- data/js/foundation/control/valueresponder/js.inc +0 -0
- data/js/foundation/control/valueresponder/valueresponder.js +79 -0
- data/js/foundation/eventmanager/eventmanager.js +991 -0
- data/js/foundation/eventmanager/js.inc +0 -0
- data/js/foundation/geom/point/js.inc +0 -0
- data/js/foundation/geom/point/point.js +202 -0
- data/js/foundation/geom/rect/js.inc +0 -0
- data/js/foundation/geom/rect/rect.js +651 -0
- data/js/foundation/json_renderer/js.inc +0 -0
- data/js/foundation/json_renderer/json_renderer.js +246 -0
- data/js/foundation/system/js.inc +0 -0
- data/js/foundation/system/system.js +381 -0
- data/js/foundation/thememanager/js.inc +0 -0
- data/js/foundation/thememanager/thememanager.js +393 -0
- data/js/foundation/value/js.inc +0 -0
- data/js/foundation/value/value.js +183 -0
- data/js/foundation/view/js.inc +0 -0
- data/js/foundation/view/markupview/js.inc +0 -0
- data/js/foundation/view/markupview/markupview.js +114 -0
- data/js/foundation/view/morphanimation/js.inc +0 -0
- data/js/foundation/view/morphanimation/morphanimation.js +237 -0
- data/js/foundation/view/view.js +1812 -0
- data/js/foundation/view/viewdefaults/js.inc +0 -0
- data/js/foundation/view/viewdefaults/viewdefaults.js +26 -0
- data/js/lists/checkboxlist/checkboxlist.js +171 -0
- data/js/lists/checkboxlist/js.inc +0 -0
- data/js/lists/listitems/js.inc +0 -0
- data/js/lists/listitems/listitems.js +88 -0
- data/js/lists/propertylist/js.inc +0 -0
- data/js/lists/propertylist/propertylist.js +326 -0
- data/js/lists/radiobuttonlist/js.inc +0 -0
- data/js/lists/radiobuttonlist/radiobuttonlist.js +116 -0
- data/js/util/reloadapp/js.inc +0 -0
- data/js/util/reloadapp/reloadapp.js +152 -0
- data/js/util/reloadapp/themes/default/reloadapp_warning-ie6.gif +0 -0
- data/js/util/reloadapp/themes/default/reloadapp_warning.png +0 -0
- data/js/util/sha/js.inc +0 -0
- data/js/util/sha/sha.js +426 -0
- data/js/views/centerview/centerview.js +75 -0
- data/js/views/centerview/js.inc +0 -0
- data/js/views/inlineview/inlineview.js +15 -0
- data/js/views/inlineview/js.inc +0 -0
- data/js/views/scrollview/js.inc +0 -0
- data/js/views/scrollview/scrollview.js +40 -0
- data/lib/conf/argv.rb +850 -0
- data/lib/conf/default.rb +219 -0
- data/lib/daemon/daemon.rb +387 -0
- data/lib/daemon/sigcomm.rb +64 -0
- data/lib/http/broker.rb +150 -0
- data/lib/http/rackup.rb +91 -0
- data/lib/http/request.rb +66 -0
- data/lib/http/response.rb +65 -0
- data/lib/plugins/dependencies.rb +285 -0
- data/lib/plugins/gui_plugin.rb +160 -0
- data/lib/plugins/guiparser.rb +123 -0
- data/lib/plugins/plugin.rb +438 -0
- data/lib/plugins/plugin_base.rb +162 -0
- data/lib/plugins/plugin_plugins.rb +81 -0
- data/lib/plugins/plugin_sqlite_db.rb +98 -0
- data/lib/plugins/pluginmanager.rb +635 -0
- data/lib/plugins/plugins.rb +169 -0
- data/lib/plugins/servlet.rb +108 -0
- data/lib/rsence.rb +32 -0
- data/lib/session/msg.rb +327 -0
- data/lib/session/sessionmanager.rb +522 -0
- data/lib/session/sessionstorage.rb +340 -0
- data/lib/transporter/transporter.rb +263 -0
- data/lib/util/gzstring.rb +9 -0
- data/lib/util/ruby19_fixes.rb +18 -0
- data/lib/values/hvalue.rb +378 -0
- data/lib/values/valuemanager.rb +172 -0
- data/plugins/client_pkg/client_pkg.rb +157 -0
- data/plugins/client_pkg/info.yaml +25 -0
- data/plugins/client_pkg/lib/client_pkg_build.rb +561 -0
- data/plugins/client_pkg/lib/client_pkg_cache.rb +50 -0
- data/plugins/client_pkg/lib/client_pkg_serve.rb +218 -0
- data/plugins/index_html/img/loading.gif +0 -0
- data/plugins/index_html/img/riassence.gif +0 -0
- data/plugins/index_html/index_html.rb +120 -0
- data/plugins/index_html/info.yaml +18 -0
- data/plugins/index_html/tmpl/index.html +15 -0
- data/plugins/main/info.yaml +18 -0
- data/plugins/main/js/main.js +84 -0
- data/plugins/main/main.rb +255 -0
- data/plugins/main/values.yaml +8 -0
- data/plugins/ticket/info.yaml +21 -0
- data/plugins/ticket/lib/common.rb +392 -0
- data/plugins/ticket/lib/favicon.rb +39 -0
- data/plugins/ticket/lib/file.rb +58 -0
- data/plugins/ticket/lib/img.rb +50 -0
- data/plugins/ticket/lib/objblob.rb +66 -0
- data/plugins/ticket/lib/rsrc.rb +34 -0
- data/plugins/ticket/lib/upload.rb +236 -0
- data/plugins/ticket/ticket.rb +333 -0
- data/setup/welcome/gui/welcome.yaml +92 -0
- data/setup/welcome/info.yaml +13 -0
- data/setup/welcome/text/welcome.html +9 -0
- data/setup/welcome/values.yaml +9 -0
- data/setup/welcome/welcome.rb +54 -0
- 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('<','<').gsub('>','>').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
|
+
|