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,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,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
|
+
|